int FinishMove P((ChessMove moveType, int fromX, int fromY, int toX, int toY,\r
/*char*/int promoChar));\r
void DisplayMove P((int moveNumber));\r
-Boolean ParseFEN P((Board board, int *blackPlaysFirst, char *fen));\r
void ChatPopUp P((char *s));\r
typedef struct {\r
ChessSquare piece; \r
&& (boardSize < SizePetite || boardSize > SizeBulky) // Archbishop and Chancellor available in entire middle range\r
|| (v == VariantShogi && boardSize != SizeModerate) // Japanese-style Shogi\r
|| v == VariantKnightmate || v == VariantSChess || v == VariantXiangqi || v == VariantSpartan\r
- || v == VariantShatranj || v == VariantMakruk || v == VariantGreat || v == VariantFairy ) {\r
+ || v == VariantShatranj || v == VariantMakruk || v == VariantGreat || v == VariantFairy || v == VariantLion ) {\r
if(boardSize < SizeMediocre) boardSize = SizePetite; else\r
if(boardSize > SizeModerate) boardSize = SizeBulky; else\r
boardSize = SizeMiddling;\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][WhiteLion] = DoLoadBitmap(hInst, "ln", squareSize, "s");\r
+ pieceBitmap[1][WhiteLion] = DoLoadBitmap(hInst, "ln", squareSize, "o");\r
+ pieceBitmap[2][WhiteLion] = DoLoadBitmap(hInst, "ln", squareSize, "w");\r
\r
if(gameInfo.variant == VariantShogi) { /* promoted Gold represemtations */\r
pieceBitmap[0][WhiteCannon] = DoLoadBitmap(hInst, "wp", squareSize, "s");\r
}\r
\r
return result;\r
+\r
+\r
+\r
}\r
\r
BOOL IsDrawArrowEnabled()\r
DisplayHoldingsCount(hdc, x, y, flipView, (int) board[row][column]);\r
else if( column == BOARD_RGHT) /* right align */\r
DisplayHoldingsCount(hdc, x, y, !flipView, (int) board[row][column]);\r
+ else if( piece == DarkSquare) DisplayHoldingsCount(hdc, x, y, 0, 0);\r
else\r
if (appData.monoMode) {\r
if (piece == EmptySquare) {\r
} else if (PtInRect((LPRECT) &blackRect, pt)) {\r
ClockClick(!flipClock); break;\r
}\r
+ if(dragging) { // [HGM] lion: don't destroy dragging info if we are already dragging\r
dragInfo.start.x = dragInfo.start.y = -1;\r
dragInfo.from = dragInfo.start;\r
+ }\r
if(fromX == -1 && frozen) { // not sure where this is for\r
fromX = fromY = -1; \r
DrawPosition(forceFullRepaint || FALSE, NULL); /* [AS] */\r
if(PromoScroll(pt.x - boardRect.left, pt.y - boardRect.top)) break;\r
MovePV(pt.x - boardRect.left, pt.y - boardRect.top, boardRect.bottom - boardRect.top);\r
if ((appData.animateDragging || appData.highlightDragging)\r
- && (wParam & MK_LBUTTON)\r
+ && (wParam & MK_LBUTTON || dragging == 2)\r
&& dragInfo.from.x >= 0) \r
{\r
BOOL full_repaint = FALSE;\r
return CallWindowProc(buttonDesc[i].wndproc, hwnd, message, wParam, lParam);\r
}\r
\r
+static int promoStyle;\r
+\r
/* Process messages for Promotion dialog box */\r
LRESULT CALLBACK\r
Promotion(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\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
- if(gameInfo.variant == VariantShogi) {\r
+ ShowWindow(GetDlgItem(hDlg, PB_Rook), !style ? SW_SHOW : SW_HIDE);\r
+ ShowWindow(GetDlgItem(hDlg, PB_Bishop), !style ? SW_SHOW : SW_HIDE);\r
+ if(style) {\r
SetDlgItemText(hDlg, PB_Queen, "YES");\r
SetDlgItemText(hDlg, PB_Knight, "NO");\r
SetWindowText(hDlg, "Promote?");\r
promoChar = gameInfo.variant == VariantSuper ? PieceToChar(BlackSilver) : PieceToChar(BlackKing);\r
break;\r
case PB_Queen:\r
- promoChar = gameInfo.variant == VariantShogi ? '+' : ToLower(PieceToChar(WhiteOnMove(currentMove) ? WhiteQueen : BlackQueen));\r
+ promoChar = style ? '+' : ToLower(PieceToChar(WhiteOnMove(currentMove) ? WhiteQueen : BlackQueen));\r
break;\r
case PB_Rook:\r
promoChar = ToLower(PieceToChar(WhiteOnMove(currentMove) ? WhiteRook : BlackRook));\r
promoChar = ToLower(PieceToChar(WhiteOnMove(currentMove) ? WhiteAngel : BlackAngel));\r
break;\r
case PB_Knight:\r
- promoChar = gameInfo.variant == VariantShogi ? '=' : PieceToChar(WhiteOnMove(currentMove) ? WhiteKnight : BlackKnight);\r
+ promoChar = gameInfo.variant == VariantShogi ? '=' : style ? NULLCHAR : \r
+ ToLower(PieceToChar(WhiteOnMove(currentMove) ? WhiteKnight : BlackKnight));\r
break;\r
default:\r
return FALSE;\r
}\r
\r
void\r
-PromotionPopUp()\r
+PromotionPopUp(char choice)\r
{\r
+ promoStyle = (choice == '+');\r
DrawPosition(TRUE, NULL);\r
PromotionPopup(hwndMain);\r
}\r
break;\r
\r
case IDM_Rematch:\r
+\r
RematchEvent();\r
break;\r
\r
SwapEngines(singleList); // temporarily swap first and second, to load a second 'first', ...\r
ParseArgs(StringGet, &p);\r
SwapEngines(singleList); // ... and then make it 'second'\r
+\r
appData.noChessProgram = FALSE;\r
appData.icsActive = FALSE;\r
} else if (IsDlgButtonChecked(hDlg, OPT_ChessServer)) {\r
static char *history[HISTORY_SIZE];\r
int histIn = 0, histP = 0;\r
\r
+\r
VOID\r
SaveInHistory(char *cmd)\r
{\r
histIn = (histIn + 1) % HISTORY_SIZE;\r
if (history[histIn] != NULL) {\r
free(history[histIn]);\r
+\r
history[histIn] = NULL;\r
}\r
histP = histIn;\r
}\r
\r
\r
+int\r
+Roar()\r
+{\r
+ MyPlaySound(&sounds[(int)SoundRoar]);\r
+ return 1;\r
+}\r
+\r
VOID\r
RingBell()\r
{\r
HDC hdc;\r
char *flag = blackFlag && gameMode == TwoMachinesPlay ? "(!)" : "";\r
\r
+\r
if(appData.noGUI) return;\r
hdc = GetDC(hwndMain);\r
if (!IsIconic(hwndMain)) {\r
int toY;\r
{\r
ChessSquare piece;\r
+ int x = toX, y = toY;\r
POINT start, finish, mid;\r
POINT frames[kFactor * 2 + 1];\r
int nFrames, n;\r
\r
+ if(killX >= 0 && IS_LION(board[fromY][fromX])) Roar();\r
+\r
if (!appData.animate) return;\r
if (doingSizing) return;\r
if (fromY < 0 || fromX < 0) return;\r
piece = board[fromY][fromX];\r
if (piece >= EmptySquare) return;\r
\r
+ if(killX >= 0) toX = killX, toY = killY; // [HGM] lion: first to kill square\r
+\r
+again:\r
+\r
ScreenSquare(fromX, fromY, &start);\r
ScreenSquare(toX, toY, &finish);\r
\r
}\r
animInfo.pos = finish;\r
DrawPosition(FALSE, NULL);\r
+\r
+ if(toX != x || toY != y) { fromX = toX; fromY = toY; toX = x; toY = y; goto again; } // second leg\r
+\r
animInfo.piece = EmptySquare;\r
Explode(board, fromX, fromY, toX, toY);\r
}\r