\r
#include "wsnap.h"\r
\r
-void InitEngineUCI( const char * iniDir, ChessProgramState * cps );\r
+//void InitEngineUCI( const char * iniDir, ChessProgramState * cps );\r
\r
int myrandom(void);\r
void mysrandom(unsigned int seed);\r
\r
InitBackEnd1();\r
\r
- InitEngineUCI( installDir, &first );\r
- InitEngineUCI( installDir, &second );\r
+// InitEngineUCI( installDir, &first ); // [HGM] incorporated in InitBackEnd1()\r
+// InitEngineUCI( installDir, &second );\r
\r
/* Create a main window for this application instance. */\r
hwnd = CreateWindow(szAppName, szTitle,\r
{ "flipBlack", ArgBoolean, (LPVOID) &appData.upsideDown, TRUE },\r
{ "allWhite", ArgBoolean, (LPVOID) &appData.allWhite, TRUE },\r
{ "alphaRank", ArgBoolean, (LPVOID) &appData.alphaRank, FALSE },\r
+ { "firstAlphaRank", ArgBoolean, (LPVOID) &first.alphaRank, FALSE },\r
+ { "secondAlphaRank", ArgBoolean, (LPVOID) &second.alphaRank, FALSE },\r
{ "testClaims", ArgBoolean, (LPVOID) &appData.testClaims, TRUE },\r
{ "checkMates", ArgBoolean, (LPVOID) &appData.checkMates, TRUE },\r
{ "materialDraws", ArgBoolean, (LPVOID) &appData.materialDraws, TRUE },\r
{ "autoKibitz", ArgTrue, (LPVOID) &appData.autoKibitz, FALSE },\r
{ "engineDebugOutput", ArgInt, (LPVOID) &appData.engineComments, FALSE },\r
{ "userName", ArgString, (LPVOID) &appData.userName, FALSE },\r
+ { "rewindIndex", ArgInt, (LPVOID) &appData.rewindIndex, FALSE },\r
+ { "sameColorGames", ArgInt, (LPVOID) &appData.sameColorGames, FALSE },\r
+ { "smpCores", ArgInt, (LPVOID) &appData.smpCores, TRUE },\r
+ { "egtFormats", ArgString, (LPVOID) &appData.egtFormats, TRUE },\r
\r
#ifdef ZIPPY\r
{ "zippyTalk", ArgBoolean, (LPVOID) &appData.zippyTalk, FALSE },\r
appData.firstNPS = -1; // [HGM] nps: use wall-clock time\r
appData.secondNPS = -1;\r
appData.engineComments = 1;\r
-\r
+ appData.smpCores = 1; // [HGM] SMP: max nr of cores\r
+ appData.egtFormats = "";\r
\r
#ifdef ZIPPY\r
appData.zippyTalk = ZIPPY_TALK;\r
PM_WH = (int) WhiteNightrider, \r
PM_WA = (int) WhiteAngel, \r
PM_WC = (int) WhiteMarshall, \r
+ PM_WAB = (int) WhiteCardinal, \r
+ PM_WD = (int) WhiteDragon, \r
+ PM_WL = (int) WhiteLance, \r
+ PM_WS = (int) WhiteCobra, \r
+ PM_WV = (int) WhiteFalcon, \r
+ PM_WSG = (int) WhiteSilver, \r
PM_WG = (int) WhiteGrasshopper, \r
PM_WK = (int) WhiteKing,\r
PM_BP = (int) BlackPawn, \r
PM_BA = (int) BlackAngel, \r
PM_BC = (int) BlackMarshall, \r
PM_BG = (int) BlackGrasshopper, \r
+ PM_BAB = (int) BlackCardinal,\r
+ PM_BD = (int) BlackDragon,\r
+ PM_BL = (int) BlackLance,\r
+ PM_BS = (int) BlackCobra,\r
+ PM_BV = (int) BlackFalcon,\r
+ PM_BSG = (int) BlackSilver,\r
PM_BK = (int) BlackKing\r
};\r
\r
POINT pt;\r
int backColor = whitePieceColor; \r
int foreColor = blackPieceColor;\r
- int shapeIndex = index < 6 ? index+6 : index;\r
\r
- if( index < 6 && appData.fontBackColorWhite != appData.fontForeColorWhite ) {\r
+ if( index < (int)BlackPawn && appData.fontBackColorWhite != appData.fontForeColorWhite ) {\r
backColor = appData.fontBackColorWhite;\r
foreColor = appData.fontForeColorWhite;\r
}\r
- else if( index >= 6 && appData.fontBackColorBlack != appData.fontForeColorBlack ) {\r
+ else if( index >= (int)BlackPawn && appData.fontBackColorBlack != appData.fontForeColorBlack ) {\r
backColor = appData.fontBackColorBlack;\r
foreColor = appData.fontForeColorBlack;\r
}\r
\r
SelectObject( hdc, GetStockObject(WHITE_BRUSH) );\r
/* Step 3: the area outside the piece is filled with white */\r
- FloodFill( hdc, 0, 0, chroma );\r
+// FloodFill( hdc, 0, 0, chroma );\r
+ ExtFloodFill( hdc, 0, 0, 0, FLOODFILLSURFACE );\r
+ ExtFloodFill( hdc, 0, squareSize-1, 0, FLOODFILLSURFACE ); // [HGM] fill from all 4 corners, for if piece too big\r
+ ExtFloodFill( hdc, squareSize-1, 0, 0, FLOODFILLSURFACE );\r
+ ExtFloodFill( hdc, squareSize-1, squareSize-1, 0, FLOODFILLSURFACE );\r
SelectObject( hdc, GetStockObject(BLACK_BRUSH) );\r
/* \r
Step 4: this is the tricky part, the area inside the piece is filled with black,\r
There should be a better way to do this... if we could create a region or path\r
from the fill operation we would be fine for example.\r
*/\r
- FloodFill( hdc, squareSize / 2, squareSize / 2, RGB(0xFF,0xFF,0xFF) );\r
+// FloodFill( hdc, squareSize / 2, squareSize / 2, RGB(0xFF,0xFF,0xFF) );\r
+ ExtFloodFill( hdc, squareSize / 2, squareSize / 2, RGB(0xFF,0xFF,0xFF), FLOODFILLBORDER );\r
+\r
+ { /* [HGM] shave off edges of mask, in an attempt to correct for the fact that FloodFill does not work correctly under Win XP */\r
+ HDC dc2 = CreateCompatibleDC( hdc_window );\r
+ HBITMAP bm2 = CreateCompatibleBitmap( hdc_window, squareSize, squareSize );\r
+\r
+ SelectObject( dc2, bm2 );\r
+ BitBlt( dc2, 0, 0, squareSize, squareSize, hdc, 0, 0, SRCCOPY ); // make copy\r
+ BitBlt( hdc, 0, 1, squareSize-2, squareSize-2, dc2, 1, 1, SRCPAINT );\r
+ BitBlt( hdc, 2, 1, squareSize-2, squareSize-2, dc2, 1, 1, SRCPAINT );\r
+ BitBlt( hdc, 1, 0, squareSize-2, squareSize-2, dc2, 1, 1, SRCPAINT );\r
+ BitBlt( hdc, 1, 2, squareSize-2, squareSize-2, dc2, 1, 1, SRCPAINT );\r
+\r
+ DeleteDC( dc2 );\r
+ DeleteObject( bm2 );\r
+ }\r
\r
SetTextColor( hdc, 0 );\r
/* \r
return PM_WQ;\r
case WhiteKing:\r
return PM_WK;\r
+\r
case BlackAngel:\r
return PM_BA;\r
case BlackMarshall:\r
return PM_BG;\r
case BlackMan:\r
return PM_BM;\r
+ case BlackSilver:\r
+ return PM_BSG;\r
+ case BlackLance:\r
+ return PM_BL;\r
+ case BlackFalcon:\r
+ return PM_BV;\r
+ case BlackCobra:\r
+ return PM_BS;\r
+ case BlackCardinal:\r
+ return PM_BAB;\r
+ case BlackDragon:\r
+ return PM_BD;\r
+\r
case WhiteAngel:\r
return PM_WA;\r
case WhiteMarshall:\r
return PM_WG;\r
case WhiteMan:\r
return PM_WM;\r
+ case WhiteSilver:\r
+ return PM_WSG;\r
+ case WhiteLance:\r
+ return PM_WL;\r
+ case WhiteFalcon:\r
+ return PM_WV;\r
+ case WhiteCobra:\r
+ return PM_WS;\r
+ case WhiteCardinal:\r
+ return PM_WAB;\r
+ case WhiteDragon:\r
+ return PM_WD;\r
}\r
\r
return 0;\r
DeleteObject( hPieceFont );\r
}\r
else {\r
- for( i=0; i<12; i++ ) {\r
+ for( i=0; i<=(int)BlackKing; i++ ) {\r
hPieceMask[i] = NULL;\r
hPieceFace[i] = NULL;\r
}\r
\r
/* Create bitmaps */\r
hfont_old = SelectObject( hdc, hPieceFont );\r
-\r
+#if 0\r
CreatePieceMaskFromFont( hdc_window, hdc, PM_WP );\r
CreatePieceMaskFromFont( hdc_window, hdc, PM_WN );\r
CreatePieceMaskFromFont( hdc_window, hdc, PM_WB );\r
CreatePieceMaskFromFont( hdc_window, hdc, PM_BR );\r
CreatePieceMaskFromFont( hdc_window, hdc, PM_BQ );\r
CreatePieceMaskFromFont( hdc_window, hdc, PM_BK );\r
-#ifdef FAIRY\r
+\r
CreatePieceMaskFromFont( hdc_window, hdc, PM_WA );\r
CreatePieceMaskFromFont( hdc_window, hdc, PM_WC );\r
CreatePieceMaskFromFont( hdc_window, hdc, PM_WF );\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_WSG );\r
+ CreatePieceMaskFromFont( hdc_window, hdc, PM_WV );\r
+ CreatePieceMaskFromFont( hdc_window, hdc, PM_WAB );\r
+ CreatePieceMaskFromFont( hdc_window, hdc, PM_WD );\r
+ CreatePieceMaskFromFont( hdc_window, hdc, PM_WL );\r
+ CreatePieceMaskFromFont( hdc_window, hdc, PM_WS );\r
CreatePieceMaskFromFont( hdc_window, hdc, PM_BA );\r
CreatePieceMaskFromFont( hdc_window, hdc, PM_BC );\r
CreatePieceMaskFromFont( hdc_window, hdc, PM_BF );\r
CreatePieceMaskFromFont( hdc_window, hdc, PM_BO );\r
CreatePieceMaskFromFont( hdc_window, hdc, PM_BG );\r
CreatePieceMaskFromFont( hdc_window, hdc, PM_BM );\r
+ CreatePieceMaskFromFont( hdc_window, hdc, PM_BSG );\r
+ CreatePieceMaskFromFont( hdc_window, hdc, PM_BV );\r
+ CreatePieceMaskFromFont( hdc_window, hdc, PM_BAB );\r
+ CreatePieceMaskFromFont( hdc_window, hdc, PM_BD );\r
+ CreatePieceMaskFromFont( hdc_window, hdc, PM_BL );\r
+ CreatePieceMaskFromFont( hdc_window, hdc, PM_BS );\r
+#else\r
+ for(i=(int)WhitePawn; i<(int)EmptySquare; i++) /* [HGM] made a loop for this */\r
+ if(PieceToChar((ChessSquare)i) != '.') /* skip unused pieces */\r
+ CreatePieceMaskFromFont( hdc_window, hdc, i );\r
#endif\r
-\r
SelectObject( hdc, hfont_old );\r
\r
fontBitmapSquareSize = squareSize;\r
if (IsIconic(hwndMain)) return;\r
if (recurse > 0) return;\r
recurse++;\r
- while (newSize > 0 &&\r
- (newSizeX < sizeInfo[newSize].cliWidth ||\r
- newSizeY < sizeInfo[newSize].cliHeight)) {\r
+ while (newSize > 0) {\r
+ InitDrawingSizes(newSize, 0);\r
+ if(newSizeX >= sizeInfo[newSize].cliWidth ||\r
+ newSizeY >= sizeInfo[newSize].cliHeight) break;\r
newSize--;\r
} \r
boardSize = newSize;\r
}\r
}\r
\r
+ fontBitmapSquareSize = 0; /* [HGM] render: make sure pieces will be recreated, as we might need others now */\r
// Orthodox Chess pieces\r
pieceBitmap[0][WhitePawn] = DoLoadBitmap(hInst, "p", squareSize, "s");\r
pieceBitmap[0][WhiteKnight] = DoLoadBitmap(hInst, "n", squareSize, "s");\r
\r
/* [AS] Initialize background textures if needed */\r
if( liteBackTexture != NULL || darkBackTexture != NULL ) {\r
- if( backTextureSquareSize != squareSize ) {\r
+ static int backTextureBoardSize; /* [HGM] boardsize: also new texture if board format changed */\r
+ if( backTextureSquareSize != squareSize \r
+ || backTextureBoardSize != BOARD_WIDTH+BOARD_SIZE*BOARD_HEIGHT) {\r
+ backTextureBoardSize = BOARD_WIDTH+BOARD_SIZE*BOARD_HEIGHT;\r
backTextureSquareSize = squareSize;\r
RebuildTextureSquareInfo();\r
}\r
}\r
}\r
if(column == BOARD_LEFT-1 ) /* left align */\r
- DisplayHoldingsCount(hdc, x, y, 0, (int) board[row][column]);\r
+ DisplayHoldingsCount(hdc, x, y, flipView, (int) board[row][column]);\r
else if( column == BOARD_RGHT) /* right align */\r
- DisplayHoldingsCount(hdc, x, y, 1, (int) board[row][column]);\r
+ DisplayHoldingsCount(hdc, x, y, !flipView, (int) board[row][column]);\r
else\r
if (appData.monoMode) {\r
if (piece == EmptySquare) {\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
BOOLEAN needsRedraw = FALSE;\r
BOOLEAN saveAnimate;\r
BOOLEAN forceFullRepaint = IsFullRepaintPreferrable(); /* [AS] */\r
- static BOOLEAN sameAgain = FALSE;\r
+ static BOOLEAN sameAgain = FALSE, promotionChoice = FALSE;\r
ChessMove moveType;\r
\r
if (recursive) {\r
\r
switch (message) {\r
case WM_LBUTTONDOWN:\r
+ if(promotionChoice) { // we are waiting for a click to indicate promotion piece\r
+ promotionChoice = FALSE; // only one chance: if click not OK it is interpreted as cancel\r
+ if(appData.debugMode) fprintf(debugFP, "promotion click, x=%d, y=%d\n", x, y);\r
+ if(gameInfo.holdingsWidth && \r
+ (WhiteOnMove(currentMove) \r
+ ? x == BOARD_WIDTH-1 && y < gameInfo.holdingsSize && y > 0\r
+ : x == 0 && y >= BOARD_HEIGHT - gameInfo.holdingsSize && y < BOARD_HEIGHT-1) ) {\r
+ // click in right holdings, for determining promotion piece\r
+ ChessSquare p = boards[currentMove][y][x];\r
+ if(appData.debugMode) fprintf(debugFP, "square contains %d\n", (int)p);\r
+ if(p != EmptySquare) {\r
+ FinishMove(WhitePromotionQueen, fromX, fromY, toX, toY, ToLower(PieceToChar(p)));\r
+ fromX = fromY = -1;\r
+ break;\r
+ }\r
+ }\r
+ DrawPosition(FALSE, boards[currentMove]);\r
+ break;\r
+ }\r
ErrorPopDown();\r
sameAgain = FALSE;\r
if (y == -2) {\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 == AmbiguousMove) { /* [HGM] Edit-Position move executed */\r
+ fromX = fromY = -1; \r
+ ClearHighlights();\r
+ DrawPosition(FALSE, boards[currentMove]);\r
+ break; \r
+ } else \r
if(moveType != ImpossibleMove) {\r
/* [HGM] We use PromotionToKnight in Shogi to indicate frorced promotion */\r
if (moveType == WhitePromotionKnight || moveType == BlackPromotionKnight ||\r
DrawPosition(forceFullRepaint || FALSE, NULL);\r
/* [HGM] <popupFix> Popup calls FinishMove now.\r
If promotion to Q is legal, all are legal! */\r
+ if(gameInfo.variant == VariantSuper)\r
+ { ChessSquare p = boards[currentMove][fromY][fromX], q = boards[currentMove][toY][toX];\r
+ // kludge to temporarily execute move on display, wthout promotng yet\r
+ promotionChoice = TRUE;\r
+ boards[currentMove][fromY][fromX] = EmptySquare; // move Pawn to 8th rank\r
+ boards[currentMove][toY][toX] = p;\r
+ DrawPosition(FALSE, boards[currentMove]);\r
+ boards[currentMove][fromY][fromX] = p; // take back, but display stays\r
+ boards[currentMove][toY][toX] = q;\r
+ } else\r
PromotionPopup(hwnd);\r
} else { /* not a promotion */\r
if (appData.animate || appData.highlightLastMove) {\r
ClearHighlights();\r
}\r
FinishMove(moveType, fromX, fromY, toX, toY, NULLCHAR);\r
+ fromX = fromY = -1;\r
if (appData.animate && !appData.highlightLastMove) {\r
ClearHighlights();\r
DrawPosition(forceFullRepaint || FALSE, NULL);\r
saveAnimate = appData.animate; /* sorry, Hawk :) */\r
appData.animate = appData.animate && !appData.animateDragging;\r
moveType = UserMoveTest(fromX, fromY, toX, toY, NULLCHAR);\r
+ if(moveType == AmbiguousMove) { /* [HGM] Edit-Position move executed */\r
+ fromX = fromY = -1; \r
+ ClearHighlights();\r
+ DrawPosition(FALSE, boards[currentMove]);\r
+ break; \r
+ } else \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
else \r
if (moveType == WhitePromotionQueen || moveType == BlackPromotionQueen ) {\r
DrawPosition(forceFullRepaint || FALSE, NULL);\r
+ if(gameInfo.variant == VariantSuper)\r
+ { ChessSquare p = boards[currentMove][fromY][fromX], q = boards[currentMove][toY][toX];\r
+ // kludge to temporarily execute move on display, wthout promotng yet\r
+ promotionChoice = TRUE;\r
+ boards[currentMove][fromY][fromX] = EmptySquare; // move Pawn to 8th rank\r
+ boards[currentMove][toY][toX] = p;\r
+ DrawPosition(FALSE, boards[currentMove]);\r
+ boards[currentMove][fromY][fromX] = p; // take back, but display stays\r
+ boards[currentMove][toY][toX] = q;\r
+ break;\r
+ } else\r
PromotionPopup(hwnd); /* [HGM] Popup now calls FinishMove */\r
} else FinishMove(moveType, fromX, fromY, toX, toY, NULLCHAR);\r
}\r
CenterWindow(hDlg, GetWindow(hDlg, GW_OWNER));\r
ShowWindow(GetDlgItem(hDlg, PB_King), \r
(!appData.testLegality || gameInfo.variant == VariantSuicide ||\r
- gameInfo.variant == VariantGiveaway) ?\r
+ gameInfo.variant == VariantGiveaway || gameInfo.variant == VariantSuper ) ?\r
SW_SHOW : SW_HIDE);\r
/* [HGM] Only allow C & A promotions if these pieces are defined */\r
ShowWindow(GetDlgItem(hDlg, PB_Archbishop),\r
ShowWindow(GetDlgItem(hDlg, IDC_No), \r
gameInfo.variant == VariantShogi ?\r
SW_SHOW : SW_HIDE);\r
+ ShowWindow(GetDlgItem(hDlg, IDC_Centaur), \r
+ gameInfo.variant == VariantSuper ?\r
+ SW_SHOW : SW_HIDE);\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 = PieceToChar(BlackKing);\r
+ promoChar = gameInfo.variant == VariantSuper ? PieceToChar(BlackSilver) : PieceToChar(BlackKing);\r
break;\r
case PB_Queen:\r
promoChar = gameInfo.variant == VariantShogi ? '+' : PieceToChar(BlackQueen);\r
VOID\r
ToggleShowThinking()\r
{\r
- ShowThinkingEvent(!appData.showThinking);\r
+ appData.showThinking = !appData.showThinking;\r
+ ShowThinkingEvent();
}\r
\r
VOID\r
}\r
else {\r
EngineOutputPopUp();\r
- }\r
+ }
break;\r
\r
/* [AS] User adjudication */\r
\r
/* [AS] Snapping */\r
case WM_ENTERSIZEMOVE:\r
+ if(appData.debugMode) { fprintf(debugFP, "size-move\n"); }\r
if (hwnd == hwndMain) {\r
doingSizing = TRUE;\r
lastSizing = 0;\r
break;\r
\r
case WM_SIZING:\r
+ if(appData.debugMode) { fprintf(debugFP, "sizing\n"); }\r
if (hwnd == hwndMain) {\r
lastSizing = wParam;\r
}\r
break;\r
\r
case WM_MOVING:\r
+ if(appData.debugMode) { fprintf(debugFP, "moving\n"); }\r
return OnMoving( &sd, hwnd, wParam, lParam );\r
\r
case WM_EXITSIZEMOVE:\r
+ if(appData.debugMode) { fprintf(debugFP, "exit size-move, size = %d\n", squareSize); }\r
if (hwnd == hwndMain) {\r
RECT client;\r
doingSizing = FALSE;\r
GetClientRect(hwnd, &client);\r
ResizeBoard(client.right, client.bottom, lastSizing);\r
lastSizing = 0;\r
+ if(appData.debugMode) { fprintf(debugFP, "square size = %d\n", squareSize); }\r
}\r
return OnExitSizeMove( &sd, hwnd, wParam, lParam );\r
break;\r