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
typedef struct {\r
ChessSquare piece; \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
static HWND hwndPause; /* pause button */\r
static HBITMAP pieceBitmap[3][(int) BlackPawn]; /* [HGM] nr of bitmaps referred to bP in stead of wK */\r
static HBRUSH lightSquareBrush, darkSquareBrush,\r
+ blackSquareBrush, /* [HGM] for band between board and holdings */\r
whitePieceBrush, blackPieceBrush, iconBkgndBrush, outlineBrush;\r
static POINT gridEndpoints[(BOARD_SIZE + 1) * 4];\r
static DWORD gridVertexCounts[(BOARD_SIZE + 1) * 2];\r
BOOL EngineOutputIsUp();\r
VOID EngineOutputUpdate( FrontEndProgramStats * stats );\r
\r
-VOID GothicPopUp(char *title);\r
+VOID GothicPopUp(char *title, char up);\r
/*\r
* Setting "frozen" should disable all user input other than deleting\r
* the window. We do this while engines are initializing themselves.\r
} else {\r
GetCurrentDirectory(MSG_SIZ, installDir);\r
}\r
+ gameInfo.boardWidth = gameInfo.boardHeight = 8; // [HGM] won't have open window otherwise\r
InitAppData(lpCmdLine); /* Get run-time parameters */\r
if (appData.debugMode) {\r
debugFP = fopen(appData.nameOfDebugFile, "w");\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
+\r
if (hwndConsole) {\r
#if AOT_CONSOLE\r
SetWindowPos(hwndConsole, alwaysOnTop ? HWND_TOPMOST : HWND_NOTOPMOST,\r
{ "engineOutputW", ArgInt, (LPVOID) &wpEngineOutput.width, TRUE },\r
{ "engineOutputH", ArgInt, (LPVOID) &wpEngineOutput.height, TRUE },\r
\r
- /* [HGM] User-selectable board size */\r
+ /* [HGM] board-size, adjudication and misc. options */\r
{ "boardWidth", ArgInt, (LPVOID) &appData.NrFiles, TRUE },\r
{ "boardHeight", ArgInt, (LPVOID) &appData.NrRanks, TRUE },\r
- { "matchPause", ArgInt, (LPVOID) &appData.matchPause, FALSE },\r
+ { "holdingsSize", ArgInt, (LPVOID) &appData.holdingsSize, TRUE },\r
+ { "matchPause", ArgInt, (LPVOID) &appData.matchPause, TRUE },\r
+ { "pieceToCharTable", ArgString, (LPVOID) &appData.pieceToCharTable, FALSE },\r
+ { "flipBlack", ArgBoolean, (LPVOID) &appData.allWhite, 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
\r
InitWindowPlacement( &wpEvalGraph );\r
InitWindowPlacement( &wpEngineOutput );\r
\r
- /* [HGM] User-selectable board size */\r
- appData.NrFiles = 8;\r
- appData.NrRanks = 8;\r
- appData.matchPause = 10000;\r
- appData.testClaims = FALSE;\r
- appData.ruleMoves = 51;\r
- appData.drawRepeats = 6;\r
+ /* [HGM] User-selectable board size, adjudication control, miscellaneous */\r
+ appData.NrFiles = -1;\r
+ appData.NrRanks = -1;\r
+ appData.holdingsSize = -1;\r
+ appData.testClaims = FALSE;\r
+ appData.checkMates = FALSE;\r
+ appData.materialDraws= FALSE;\r
+ appData.trivialDraws = FALSE;\r
+ appData.ruleMoves = 51;\r
+ appData.drawRepeats = 6;\r
+ appData.matchPause = 10000;\r
+ appData.alphaRank = FALSE;\r
+ appData.allWhite = FALSE;\r
+ appData.upsideDown = FALSE;\r
\r
#ifdef ZIPPY\r
appData.zippyTalk = ZIPPY_TALK;\r
PM_WN = (int) WhiteKnight, \r
PM_WB = (int) WhiteBishop, \r
PM_WR = (int) WhiteRook, \r
-#ifdef FAIRY\r
- PM_WA = (int) WhiteCardinal, \r
- PM_WC = (int) WhiteMarshall, \r
- PM_WFP = (int) WhiteFairyPawn, \r
- PM_WFN = (int) WhiteFairyKnight, \r
- PM_WFB = (int) WhiteFairyBishop, \r
- PM_WFR = (int) WhiteFairyRook, \r
- PM_WFA = (int) WhiteFairyCardinal, \r
- PM_WFC = (int) WhiteFairyMarshall, \r
- PM_WFQ = (int) WhiteFairyQueen, \r
- PM_WFK = (int) WhiteFairyKing, \r
-#endif\r
PM_WQ = (int) WhiteQueen, \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_WC = (int) WhiteMarshall, \r
+ PM_WG = (int) WhiteGrasshopper, \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
-#ifdef FAIRY\r
- PM_BA = (int) BlackCardinal, \r
- PM_BC = (int) BlackMarshall, \r
- PM_BFP = (int) BlackFairyPawn, \r
- PM_BFN = (int) BlackFairyKnight, \r
- PM_BFB = (int) BlackFairyBishop, \r
- PM_BFR = (int) BlackFairyRook, \r
- PM_BFA = (int) BlackFairyCardinal, \r
- PM_BFC = (int) BlackFairyMarshall, \r
- PM_BFQ = (int) BlackFairyQueen, \r
- PM_BFK = (int) BlackFairyKing,\r
-#endif\r
PM_BQ = (int) BlackQueen, \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_BC = (int) BlackMarshall, \r
+ PM_BG = (int) BlackGrasshopper, \r
PM_BK = (int) BlackKing\r
};\r
\r
static HBITMAP hPieceFace[(int) EmptySquare];\r
static int fontBitmapSquareSize = 0;\r
static char pieceToFontChar[(int) EmptySquare] =\r
- { 'p', 'n', 'b', 'r',\r
-#ifdef FAIRY\r
+ { 'p', 'n', 'b', 'r', 'q', \r
'n', 'b', 'p', 'n', 'b', 'r', 'b', 'r', 'q', 'k',\r
-#endif\r
- 'q', 'k', 'o', 'm', 'v', 't', \r
-#ifdef FAIRY\r
+ 'k', 'o', 'm', 'v', 't', 'w', \r
'v', 't', 'o', 'm', 'v', 't', 'v', 't', 'w', 'l',\r
-#endif\r
- 'w', '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-2; i++ ) {\r
- pieceToFontChar[i] = map[i];\r
- pieceToFontChar[i + (int)BlackPawn - (int) WhitePawn] = map[i+NrPieces/2];\r
- }\r
- pieceToFontChar[(int) WhiteQueen] = map[NrPieces/2-2];\r
- pieceToFontChar[(int) WhiteKing] = map[NrPieces/2-1];\r
- pieceToFontChar[(int) BlackQueen] = map[NrPieces-2];\r
- pieceToFontChar[(int) BlackKing] = map[NrPieces-1];\r
+ 'l' };\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_BA;\r
case BlackMarshall:\r
return PM_BC;\r
- case BlackFairyPawn:\r
- return PM_BFP;\r
- case BlackFairyKnight:\r
- return PM_BFN;\r
- case BlackFairyBishop:\r
- return PM_BFB;\r
- case BlackFairyRook:\r
- return PM_BFR;\r
- case BlackFairyCardinal:\r
- return PM_BFA;\r
- case BlackFairyMarshall:\r
- return PM_BFC;\r
- case BlackFairyQueen:\r
- return PM_BFQ;\r
- case BlackFairyKing:\r
- return PM_BFK;\r
+ case BlackFerz:\r
+ return PM_BF;\r
+ case BlackNightrider:\r
+ return PM_BH;\r
+ case BlackAlfil:\r
+ return PM_BE;\r
+ case BlackWazir:\r
+ return PM_BW;\r
+ case BlackUnicorn:\r
+ return PM_BU;\r
+ case BlackCannon:\r
+ return PM_BO;\r
+ case BlackGrasshopper:\r
+ return PM_BG;\r
+ case BlackMan:\r
+ return PM_BM;\r
case WhiteCardinal:\r
return PM_WA;\r
case WhiteMarshall:\r
return PM_WC;\r
- case WhiteFairyPawn:\r
- return PM_WFP;\r
- case WhiteFairyKnight:\r
- return PM_WFN;\r
- case WhiteFairyBishop:\r
- return PM_WFB;\r
- case WhiteFairyRook:\r
- return PM_WFR;\r
- case WhiteFairyCardinal:\r
- return PM_WFA;\r
- case WhiteFairyMarshall:\r
- return PM_WFC;\r
- case WhiteFairyQueen:\r
- return PM_WFQ;\r
- case WhiteFairyKing:\r
- return PM_WFK;\r
+ case WhiteFerz:\r
+ return PM_WF;\r
+ case WhiteNightrider:\r
+ return PM_WH;\r
+ case WhiteAlfil:\r
+ return PM_WE;\r
+ case WhiteWazir:\r
+ return PM_WW;\r
+ case WhiteUnicorn:\r
+ return PM_WU;\r
+ case WhiteCannon:\r
+ return PM_WO;\r
+ case WhiteGrasshopper:\r
+ return PM_WG;\r
+ case WhiteMan:\r
+ return PM_WM;\r
#endif\r
}\r
\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, "PNBRQFWEMOUHACGSKpnbrqfwemouhacgsk");\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
#ifdef FAIRY\r
CreatePieceMaskFromFont( hdc_window, hdc, PM_WA );\r
CreatePieceMaskFromFont( hdc_window, hdc, PM_WC );\r
- CreatePieceMaskFromFont( hdc_window, hdc, PM_WFP );\r
- CreatePieceMaskFromFont( hdc_window, hdc, PM_WFN );\r
- CreatePieceMaskFromFont( hdc_window, hdc, PM_WFB );\r
- CreatePieceMaskFromFont( hdc_window, hdc, PM_WFR );\r
- CreatePieceMaskFromFont( hdc_window, hdc, PM_WFA );\r
- CreatePieceMaskFromFont( hdc_window, hdc, PM_WFC );\r
- CreatePieceMaskFromFont( hdc_window, hdc, PM_WFQ );\r
- CreatePieceMaskFromFont( hdc_window, hdc, PM_WFK );\r
+ CreatePieceMaskFromFont( hdc_window, hdc, PM_WF );\r
+ CreatePieceMaskFromFont( hdc_window, hdc, PM_WH );\r
+ CreatePieceMaskFromFont( hdc_window, hdc, PM_WE );\r
+ CreatePieceMaskFromFont( hdc_window, hdc, PM_WW );\r
+ CreatePieceMaskFromFont( hdc_window, hdc, PM_WU );\r
+ CreatePieceMaskFromFont( hdc_window, hdc, PM_WO );\r
+ CreatePieceMaskFromFont( hdc_window, hdc, PM_WG );\r
+ CreatePieceMaskFromFont( hdc_window, hdc, PM_WM );\r
CreatePieceMaskFromFont( hdc_window, hdc, PM_BA );\r
CreatePieceMaskFromFont( hdc_window, hdc, PM_BC );\r
- CreatePieceMaskFromFont( hdc_window, hdc, PM_BFP );\r
- CreatePieceMaskFromFont( hdc_window, hdc, PM_BFN );\r
- CreatePieceMaskFromFont( hdc_window, hdc, PM_BFB );\r
- CreatePieceMaskFromFont( hdc_window, hdc, PM_BFR );\r
- CreatePieceMaskFromFont( hdc_window, hdc, PM_BFA );\r
- CreatePieceMaskFromFont( hdc_window, hdc, PM_BFC );\r
- CreatePieceMaskFromFont( hdc_window, hdc, PM_BFQ );\r
- CreatePieceMaskFromFont( hdc_window, hdc, PM_BFK );\r
+ CreatePieceMaskFromFont( hdc_window, hdc, PM_BF );\r
+ CreatePieceMaskFromFont( hdc_window, hdc, PM_BH );\r
+ CreatePieceMaskFromFont( hdc_window, hdc, PM_BE );\r
+ CreatePieceMaskFromFont( hdc_window, hdc, PM_BW );\r
+ CreatePieceMaskFromFont( hdc_window, hdc, PM_BU );\r
+ CreatePieceMaskFromFont( hdc_window, hdc, PM_BO );\r
+ CreatePieceMaskFromFont( hdc_window, hdc, PM_BG );\r
+ CreatePieceMaskFromFont( hdc_window, hdc, PM_BM );\r
#endif\r
\r
SelectObject( hdc, hfont_old );\r
hPal = CreatePalette((LPLOGPALETTE) pLogPal);\r
\r
lightSquareBrush = CreateSolidBrush(lightSquareColor);\r
+ blackSquareBrush = CreateSolidBrush(blackPieceColor);\r
darkSquareBrush = CreateSolidBrush(darkSquareColor);\r
whitePieceBrush = CreateSolidBrush(whitePieceColor);\r
blackPieceBrush = CreateSolidBrush(blackPieceColor);\r
int offby;\r
LOGBRUSH logbrush;\r
\r
+ /* [HGM] call with -1 uses old size (for if nr of files, ranks changes) */\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
+#ifdef GOTHIC\r
+ /* [HGM] Gothic licensing requirement */\r
+ GothicPopUp( GOTHIC, gameInfo.variant == VariantGothic );\r
+#endif\r
+\r
+/* if (boardSize == oldBoardSize) return; [HGM] variant might have changed */\r
oldBoardSize = boardSize;\r
oldTinyLayout = tinyLayout;\r
\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( !strcmp(appData.variant, "shogi") && (squareSize==72 || squareSize==49)) {\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][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
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
+ 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][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][WhiteCardinal] = DoLoadBitmap(hInst, "a", squareSize, "s");\r
- pieceBitmap[0][WhiteMarshall] = DoLoadBitmap(hInst, "c", squareSize, "s");\r
- pieceBitmap[0][WhiteFairyPawn] = DoLoadBitmap(hInst, "f", squareSize, "s");\r
- pieceBitmap[0][WhiteFairyKnight] = DoLoadBitmap(hInst, "h", squareSize, "s");\r
- pieceBitmap[0][WhiteFairyBishop] = DoLoadBitmap(hInst, "e", squareSize, "s");\r
- pieceBitmap[0][WhiteFairyRook] = DoLoadBitmap(hInst, "w", squareSize, "s");\r
- pieceBitmap[0][WhiteFairyQueen] = DoLoadBitmap(hInst, "g", squareSize, "s");\r
- pieceBitmap[0][WhiteFairyCardinal] = DoLoadBitmap(hInst, "u", squareSize, "s");\r
- pieceBitmap[0][WhiteFairyMarshall] = DoLoadBitmap(hInst, "o", squareSize, "s");\r
- pieceBitmap[0][WhiteFairyKing] = DoLoadBitmap(hInst, "m", squareSize, "s");\r
pieceBitmap[1][WhiteCardinal] = DoLoadBitmap(hInst, "a", squareSize, "o");\r
- pieceBitmap[1][WhiteMarshall] = DoLoadBitmap(hInst, "c", squareSize, "o");\r
- pieceBitmap[1][WhiteFairyPawn] = DoLoadBitmap(hInst, "f", squareSize, "o");\r
- pieceBitmap[1][WhiteFairyKnight] = DoLoadBitmap(hInst, "h", squareSize, "o");\r
- pieceBitmap[1][WhiteFairyBishop] = DoLoadBitmap(hInst, "e", squareSize, "o");\r
- pieceBitmap[1][WhiteFairyRook] = DoLoadBitmap(hInst, "w", squareSize, "o");\r
- pieceBitmap[1][WhiteFairyQueen] = DoLoadBitmap(hInst, "g", squareSize, "o");\r
- pieceBitmap[1][WhiteFairyCardinal] = DoLoadBitmap(hInst, "u", squareSize, "o");\r
- pieceBitmap[1][WhiteFairyMarshall] = DoLoadBitmap(hInst, "o", squareSize, "o");\r
- pieceBitmap[1][WhiteFairyKing] = DoLoadBitmap(hInst, "m", squareSize, "o");\r
pieceBitmap[2][WhiteCardinal] = DoLoadBitmap(hInst, "a", squareSize, "w");\r
+ if(gameInfo.variant == VariantShogi) { /* promoted Gold represemtations */\r
+ pieceBitmap[0][WhiteUnicorn] = DoLoadBitmap(hInst, "wp", squareSize, "s");\r
+ pieceBitmap[1][WhiteUnicorn] = DoLoadBitmap(hInst, "wp", squareSize, "o");\r
+ pieceBitmap[2][WhiteUnicorn] = 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][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][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][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
+ pieceBitmap[0][WhiteSilver] = DoLoadBitmap(hInst, "l", squareSize, "s");\r
+ pieceBitmap[1][WhiteSilver] = DoLoadBitmap(hInst, "l", squareSize, "o");\r
+ pieceBitmap[2][WhiteSilver] = DoLoadBitmap(hInst, "l", squareSize, "w");\r
+ }\r
+ if(gameInfo.variant != VariantCrazyhouse && gameInfo.variant != VariantShogi) {\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
- pieceBitmap[2][WhiteFairyPawn] = DoLoadBitmap(hInst, "f", squareSize, "w");\r
- pieceBitmap[2][WhiteFairyKnight] = DoLoadBitmap(hInst, "h", squareSize, "w");\r
- pieceBitmap[2][WhiteFairyBishop] = DoLoadBitmap(hInst, "e", squareSize, "w");\r
- pieceBitmap[2][WhiteFairyRook] = DoLoadBitmap(hInst, "w", squareSize, "w");\r
- pieceBitmap[2][WhiteFairyQueen] = DoLoadBitmap(hInst, "g", squareSize, "w");\r
- pieceBitmap[2][WhiteFairyCardinal] = DoLoadBitmap(hInst, "u", squareSize, "w");\r
- pieceBitmap[2][WhiteFairyMarshall] = DoLoadBitmap(hInst, "o", squareSize, "w");\r
- pieceBitmap[2][WhiteFairyKing] = DoLoadBitmap(hInst, "m", 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
+ } 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][WhiteMarshall] = DoLoadBitmap(hInst, "r", minorSize, "s");\r
+ pieceBitmap[1][WhiteMarshall] = DoLoadBitmap(hInst, "r", minorSize, "o");\r
+ pieceBitmap[2][WhiteMarshall] = 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
-#endif\r
-\r
}\r
\r
HBITMAP\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)\r
+ StretchBlt(hdc, x, 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)\r
+ StretchBlt(hdc, x, 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)\r
+ StretchBlt(hdc, x, 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
\r
square_color = ((column + row) % 2) == 1;\r
if(!strcmp(appData.variant, "xiangqi") ) {\r
- square_color = 1;\r
- if( (row < 3 || row > BOARD_HEIGHT-4) &&\r
- column < (BOARD_WIDTH + 4)/2 &&\r
- column > (BOARD_WIDTH - 5)/2 ) square_color = 0;\r
+ square_color = !InPalace(row, column);\r
+ if(BOARD_HEIGHT&1) { if(row==BOARD_HEIGHT/2) square_color ^= 1; }\r
+ else if(row < BOARD_HEIGHT/2) square_color ^= 1;\r
}\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
+ square_color = 1;\r
+ else {\r
+ DisplayHoldingsCount(hdc, x, y, 0, 0); /* black out */\r
+ continue;\r
+ }\r
+ } else\r
+ if(column == BOARD_RGHT + 1 ) {\r
+ if( row < gameInfo.holdingsSize )\r
+ square_color = 1;\r
+ else {\r
+ DisplayHoldingsCount(hdc, x, y, 0, 0); \r
+ continue;\r
+ }\r
+ }\r
+ if(column == BOARD_LEFT-1 ) /* left align */\r
+ DisplayHoldingsCount(hdc, x, y, 0, (int) board[row][column]);\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
else {\r
- oldBrush = SelectObject(hdc, square_color ?\r
- lightSquareBrush : darkSquareBrush);\r
+ HBRUSH brush = square_color ? lightSquareBrush : darkSquareBrush;\r
+\r
+ oldBrush = SelectObject(hdc, brush );\r
BitBlt(hdc, x, y, squareSize, squareSize, 0, 0, 0, PATCOPY);\r
SelectObject(hdc, oldBrush);\r
if (piece != EmptySquare)\r
hdcmem = CreateCompatibleDC(hdc);\r
tmphdc = CreateCompatibleDC(hdc);\r
\r
+ /* If dragging is in progress, we temporarely remove the piece */\r
+ /* [HGM] or temporarily decrease count if stacked */\r
+ /* !! Moved to before board compare !! */\r
+ if (dragInfo.from.x >= 0 && dragInfo.pos.x >= 0) {\r
+ dragged_piece = board[dragInfo.from.y][dragInfo.from.x];\r
+ if(dragInfo.from.x == BOARD_LEFT-2 ) {\r
+ if(--board[dragInfo.from.y][dragInfo.from.x+1] == 0 )\r
+ board[dragInfo.from.y][dragInfo.from.x] = EmptySquare;\r
+ } else \r
+ if(dragInfo.from.x == BOARD_RGHT+1) {\r
+ if(--board[dragInfo.from.y][dragInfo.from.x-1] == 0 )\r
+ board[dragInfo.from.y][dragInfo.from.x] = EmptySquare;\r
+ } else \r
+ board[dragInfo.from.y][dragInfo.from.x] = EmptySquare;\r
+ }\r
+\r
/* Figure out which squares need updating by comparing the \r
* newest board with the last drawn board and checking if\r
* flipping has changed.\r
}\r
}\r
\r
- /* If dragging is in progress, we temporarely remove the piece */\r
- if (dragInfo.from.x >= 0 && dragInfo.pos.x >= 0) {\r
- dragged_piece = board[dragInfo.from.y][dragInfo.from.x];\r
- board[dragInfo.from.y][dragInfo.from.x] = EmptySquare;\r
- }\r
-\r
/* Are we animating a move? \r
* If so, \r
* - remove the piece from the board (temporarely)\r
\r
DrawCoordsOnDC(hdcmem);\r
\r
- /* Put the dragged piece back into place and draw it */\r
- if (dragged_piece != EmptySquare) {\r
+ CopyBoard(lastDrawn, board); /* [HGM] Moved to here from end of routine, */\r
+ /* to make sure lastDrawn contains what is actually drawn */\r
+\r
+ /* Put the dragged piece back into place and draw it (out of place!) */\r
+ if (dragged_piece != EmptySquare) {\r
+ /* [HGM] or restack */\r
+ if(dragInfo.from.x == BOARD_LEFT-2 )\r
+ board[dragInfo.from.y][dragInfo.from.x+1]++;\r
+ else\r
+ if(dragInfo.from.x == BOARD_RGHT+1 )\r
+ board[dragInfo.from.y][dragInfo.from.x-1]++;\r
board[dragInfo.from.y][dragInfo.from.x] = dragged_piece;\r
x = dragInfo.pos.x - squareSize / 2;\r
y = dragInfo.pos.y - squareSize / 2;\r
CheckMenuItem(GetMenu(hwndMain),IDM_FlipView, MF_BYCOMMAND|MF_UNCHECKED);\r
}\r
\r
- CopyBoard(lastDrawn, board);\r
+/* CopyBoard(lastDrawn, board);*/\r
lastDrawnHighlight = highlightInfo;\r
lastDrawnPremove = premoveHighlightInfo;\r
lastDrawnFlipView = flipView;\r
BOOLEAN saveAnimate;\r
BOOLEAN forceFullRepaint = IsFullRepaintPreferrable(); /* [AS] */\r
static BOOLEAN sameAgain = FALSE;\r
+ ChessMove moveType;\r
\r
if (recursive) {\r
if (message == WM_MBUTTONUP) {\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
dragInfo.start.x = dragInfo.start.y = -1;\r
dragInfo.from = dragInfo.start;\r
break;\r
- } else if (x < 0 || y < 0) {\r
+ } else if (x < 0 || y < 0\r
+ /* [HGM] block clicks between board and holdings */\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
/* Downclick on same square again */\r
ClearHighlights();\r
DrawPosition(forceFullRepaint || FALSE, NULL);\r
sameAgain = TRUE; \r
- } else if (fromX != -1) {\r
- /* Downclick on different square */\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
+ } else if (fromX != -1 &&\r
+ x != BOARD_LEFT-2 && x != BOARD_RGHT+1 \r
+ ) {\r
+ /* Downclick on different square. */\r
+ /* [HGM] if on holdings file, should count as new first click ! */\r
+ { /* [HGM] <sameColor> now always do UserMoveTest(), and check colors there */\r
toX = x;\r
toY = y;\r
- if (IsPromotion(fromX, fromY, toX, toY)) {\r
- if (appData.alwaysPromoteToQueen) {\r
- UserMoveEvent(fromX, fromY, toX, toY, 'q');\r
- if (!appData.highlightLastMove) {\r
- ClearHighlights();\r
- DrawPosition(forceFullRepaint || FALSE, NULL);\r
- }\r
- } else {\r
- SetHighlights(fromX, fromY, toX, toY);\r
- DrawPosition(forceFullRepaint || FALSE, NULL);\r
- PromotionPopup(hwnd);\r
- }\r
- } else { /* not a promotion */\r
- if (appData.animate || appData.highlightLastMove) {\r
- SetHighlights(fromX, fromY, toX, toY);\r
- } else {\r
- ClearHighlights();\r
- }\r
- UserMoveEvent(fromX, fromY, toX, toY, NULLCHAR);\r
- if (appData.animate && !appData.highlightLastMove) {\r
- ClearHighlights();\r
- DrawPosition(forceFullRepaint || FALSE, NULL);\r
- }\r
- }\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
+ /* [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
+ 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
+ } else { /* not a promotion */\r
+ if (appData.animate || appData.highlightLastMove) {\r
+ SetHighlights(fromX, fromY, toX, toY);\r
+ } else {\r
+ ClearHighlights();\r
+ }\r
+ FinishMove(moveType, fromX, fromY, toX, toY, NULLCHAR);\r
+ if (appData.animate && !appData.highlightLastMove) {\r
+ ClearHighlights();\r
+ DrawPosition(forceFullRepaint || FALSE, NULL);\r
+ }\r
+ }\r
+ }\r
if (gotPremove) SetPremoveHighlights(fromX, fromY, toX, toY);\r
fromX = fromY = -1;\r
break;\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
break;\r
} else {\r
- /* Finish drag move */\r
+ /* Finish drag move. */\r
+ if (appData.debugMode) {\r
+ fprintf(debugFP, "release\n");\r
+ }\r
dragInfo.from.x = dragInfo.from.y = -1;\r
toX = x;\r
toY = y;\r
saveAnimate = appData.animate; /* sorry, Hawk :) */\r
appData.animate = appData.animate && !appData.animateDragging;\r
- if (IsPromotion(fromX, fromY, toX, toY)) {\r
- if (appData.alwaysPromoteToQueen) {\r
- UserMoveEvent(fromX, fromY, toX, toY, 'q');\r
- } else {\r
- DrawPosition(forceFullRepaint || FALSE, NULL);\r
- PromotionPopup(hwnd);\r
- }\r
- } else {\r
- UserMoveEvent(fromX, fromY, toX, toY, NULLCHAR);\r
+ moveType = UserMoveTest(fromX, fromY, toX, toY, NULLCHAR);\r
+ if(moveType != ImpossibleMove) {\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
appData.animate = saveAnimate;\r
{\r
BOOL full_repaint = FALSE;\r
\r
+ sameAgain = FALSE; /* [HGM] if we drag something around, do keep square selected */\r
if (appData.animateDragging) {\r
dragInfo.pos = pt;\r
}\r
if (appData.highlightDragging) {\r
SetHighlights(fromX, fromY, x, y);\r
- if( IsDrawArrowEnabled() && (x < 0 || x >= BOARD_WIDTH || y < 0 || y > BOARD_WIDTH) ) {\r
+ if( IsDrawArrowEnabled() && (x < 0 || x >= BOARD_WIDTH || y < 0 || y >= BOARD_HEIGHT) ) {\r
full_repaint = TRUE;\r
}\r
}\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(WhiteCardinal) != '.' ||\r
+ PieceToChar(BlackCardinal) != '.' ) ?\r
SW_SHOW : SW_HIDE);\r
ShowWindow(GetDlgItem(hDlg, PB_Chancellor), \r
- (gameInfo.variant == VariantCapablanca || \r
- gameInfo.variant == VariantGothic) ?\r
+ (PieceToChar(WhiteMarshall) != '.' ||\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(BlackCardinal);\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
}\r
EndDialog(hDlg, TRUE); /* Exit the dialog */\r
- UserMoveEvent(fromX, fromY, toX, toY, promoChar);\r
+ /* [HGM] <popupFix> Call FinishMove rather than UserMoveEvent, as we\r
+ only show the popup when we are already sure the move is valid or\r
+ legal. We pass a faulty move type, but the kludge is that FinishMove\r
+ will figure out it is a promotion from the promoChar. */\r
+ FinishMove(NormalMove, fromX, fromY, toX, toY, promoChar);\r
if (!appData.highlightLastMove) {\r
ClearHighlights();\r
DrawPosition(FALSE, NULL);\r
}\r
break;\r
\r
+ case IDM_NewVariant:\r
+ NewVariantPopup(hwnd);\r
+ break;\r
+\r
case IDM_LoadGame:\r
LoadGameDialog(hwnd, "Load Game from File");\r
break;\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(WhiteCardinal, 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(BlackCardinal, 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
#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, char up)\r
{\r
FARPROC lpProc;\r
char *p, *q;\r
\r
strncpy(errorTitle, title, sizeof(errorTitle));\r
errorTitle[sizeof(errorTitle) - 1] = '\0';\r
- \r
+\r
+ if(up && gothicDialog == NULL) {\r
lpProc = MakeProcInstance((FARPROC)GothicDialog, hInst);\r
CreateDialog(hInst, MAKEINTRESOURCE(DLG_Error),\r
hwndMain, (DLGPROC)lpProc);\r
FreeProcInstance(lpProc);\r
+ } else if(!up && gothicDialog != NULL) {\r
+ DestroyWindow(gothicDialog);\r
+ gothicDialog = NULL;\r
+ }\r
}\r
#endif\r
\r
\r
\r
void\r
+DisplayHoldingsCount(HDC hdc, int x, int y, int rightAlign, int copyNumber)\r
+{\r
+ char buf[100];\r
+ char *str;\r
+ COLORREF oldFg, oldBg;\r
+ HFONT oldFont;\r
+ RECT rect;\r
+\r
+ if(copyNumber > 1) sprintf(buf, "%d", copyNumber); else buf[0] = 0;\r
+\r
+ oldFg = SetTextColor(hdc, RGB(255, 255, 255)); /* white */\r
+ oldBg = SetBkColor(hdc, RGB(0, 0, 0)); /* black */\r
+ oldFont = SelectObject(hdc, font[boardSize][CLOCK_FONT]->hf);\r
+\r
+ rect.left = x;\r
+ rect.right = x + squareSize;\r
+ rect.top = y;\r
+ rect.bottom = y + squareSize;\r
+ str = buf;\r
+\r
+ ExtTextOut(hdc, x + MESSAGE_LINE_LEFTMARGIN\r
+ + (rightAlign ? (squareSize*2)/3 : 0),\r
+ y, ETO_CLIPPED|ETO_OPAQUE,\r
+ &rect, str, strlen(str), NULL);\r
+\r
+ (void) SetTextColor(hdc, oldFg);\r
+ (void) SetBkColor(hdc, oldBg);\r
+ (void) SelectObject(hdc, oldFont);\r
+}\r
+\r
+void\r
DisplayAClock(HDC hdc, int timeRemaining, int highlight,\r
RECT *rect, char *color, char *flagFell)\r
{\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