\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
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
\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
{ "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
+ { "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
{ "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.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
+ 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
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_RGHT - BOARD_LEFT; i++) {\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
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
}\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
-#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
+ 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
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
- (PieceToChar(WhiteCardinal) >= 'A' &&\r
- PieceToChar(WhiteCardinal) != '~' ||\r
- PieceToChar(BlackCardinal) >= 'A' &&\r
- PieceToChar(BlackCardinal) != '~' ) ?\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
(PieceToChar(WhiteMarshall) >= 'A' &&\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
promoChar = PieceToChar(BlackMarshall);\r
break;\r
case PB_Archbishop:\r
- promoChar = PieceToChar(BlackCardinal);\r
+ promoChar = PieceToChar(BlackAngel);\r
break;\r
case PB_Knight:\r
promoChar = gameInfo.variant == VariantShogi ? '=' : PieceToChar(BlackKnight);\r
VOID\r
ToggleShowThinking()\r
{\r
- ShowThinkingEvent(!appData.showThinking);\r
+ appData.showThinking = !appData.showThinking;\r
+ ShowThinkingEvent();
}\r
\r
VOID\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
}\r
else {\r
EngineOutputPopUp();\r
- }\r
+ }
break;\r
\r
/* [AS] User adjudication */\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
\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
\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
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 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