mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
966 lines
19 KiB
966 lines
19 KiB
/****************************************************************************
|
|
|
|
PROGRAM: WinMine (a.k.a. Mines, BombSquad, MineSweeper...)
|
|
|
|
****************************************************************************/
|
|
|
|
#define _WINDOWS
|
|
#include <windows.h>
|
|
#include <port1632.h>
|
|
|
|
#include "main.h"
|
|
#include "rtns.h"
|
|
#include "grafix.h"
|
|
#include "res.h"
|
|
#include "pref.h"
|
|
#include "util.h"
|
|
#include "sound.h"
|
|
#include "context.h"
|
|
#include "string.h"
|
|
#include "stdio.h"
|
|
#include "dos.h"
|
|
|
|
#ifndef WM_ENTERMENULOOP
|
|
#define WM_ENTERMENULOOP 0x0211
|
|
#define WM_EXITMENULOOP 0x0212
|
|
#endif
|
|
|
|
BOOL bInitMinimized; /* Bug #13328: HACK! Don't permit MoveWindow or */
|
|
/* InvalidateRect when initially minimized. */
|
|
/* 19 September 1991 Clark R. Cyr */
|
|
|
|
HANDLE hInst;
|
|
HWND hwndMain;
|
|
HMENU hMenu;
|
|
|
|
BOOL fButton1Down = fFalse;
|
|
BOOL fBlock = fFalse;
|
|
BOOL fIgnoreClick = fFalse;
|
|
|
|
INT dypCaption;
|
|
INT dypMenu;
|
|
INT dypBorder;
|
|
INT dxpBorder;
|
|
|
|
INT fStatus = (fDemo + fIcon);
|
|
BOOL fLocalPause = fFalse;
|
|
BOOL fEGA;
|
|
|
|
CHAR szClass[cchNameMax];
|
|
#define szWindowTitle szClass
|
|
|
|
CHAR szTime[cchNameMax];
|
|
CHAR szDefaultName[cchNameMax];
|
|
|
|
|
|
extern BOOL fUpdateIni;
|
|
|
|
extern INT xCur;
|
|
extern INT yCur;
|
|
extern INT iButtonCur;
|
|
|
|
extern INT xBoxMac;
|
|
extern INT yBoxMac;
|
|
|
|
extern PREF Preferences;
|
|
extern INT cBoxVisit;
|
|
|
|
INT dxWindow;
|
|
INT dyWindow;
|
|
INT dypCaption;
|
|
INT dypMenu;
|
|
INT dypAdjust;
|
|
|
|
|
|
BOOL fEGA; /* TRUE if running on EGA display */
|
|
|
|
INT idRadCurr = 0;
|
|
|
|
#define iPrefMax 3
|
|
#define idRadMax 3
|
|
|
|
INT rgPrefEditID[iPrefMax] =
|
|
{ID_EDIT_MINES, ID_EDIT_HEIGHT, ID_EDIT_WIDTH};
|
|
|
|
INT rgLevelData[idRadMax][iPrefMax] = {
|
|
{10, 8, 8, },
|
|
{40, 16, 16,},
|
|
{99, 16, 30,}
|
|
};
|
|
|
|
|
|
#ifndef DEBUG
|
|
#define XYZZY
|
|
#define cchXYZZY 5
|
|
INT iXYZZY = 0;
|
|
CHAR szXYZZY[cchXYZZY] = "XYZZY";
|
|
extern CHAR rgBlk[cBlkMax];
|
|
#endif
|
|
|
|
|
|
LONG APIENTRY MainWndProc(HWND, UINT, WPARAM, LONG);
|
|
BOOL APIENTRY PrefDlgProc(HWND, WORD, WPARAM, LONG);
|
|
BOOL APIENTRY BestDlgProc(HWND, WORD, WPARAM, LONG);
|
|
BOOL APIENTRY EnterDlgProc(HWND, WORD, WPARAM, LONG);
|
|
|
|
|
|
|
|
|
|
|
|
/****** W I N M A I N ******/
|
|
|
|
MMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow)
|
|
/* { */
|
|
MSG msg;
|
|
HANDLE hAccel;
|
|
|
|
hInst = hInstance;
|
|
|
|
InitConst();
|
|
|
|
bInitMinimized = (nCmdShow == SW_SHOWMINNOACTIVE) ||
|
|
(nCmdShow == SW_SHOWMINIMIZED) ;
|
|
|
|
#ifdef WIN16
|
|
if (hPrevInstance)
|
|
{
|
|
HWND hWnd = FindWindow(szClass, NULL);
|
|
hWnd = GetLastActivePopup(hWnd);
|
|
BringWindowToTop(hWnd);
|
|
if (!bInitMinimized && IsIconic(hWnd))
|
|
SendMessage(hwnd, WM_SYSCOMMAND, SC_RESTORE, 0L);
|
|
return fFalse;
|
|
}
|
|
#endif
|
|
|
|
#ifdef NOSERVER /*** Not in final release ***/
|
|
{
|
|
CHAR szFile[256];
|
|
|
|
GetModuleFileName(hInst, szFile, 250);
|
|
|
|
if (szFile[0] > 'C')
|
|
{
|
|
szFile[0] = 'X';
|
|
if (!strcmp(szFile, "X:\\WINGAMES\\WINMINE\\WINMINE.EXE"))
|
|
{
|
|
MessageBox(GetFocus(),
|
|
"Please copy winmine.exe and aboutwep.dll to your machine and run it from there.",
|
|
"NO NO NO NO NO",
|
|
MB_OK);
|
|
return fFalse;
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
|
|
|
|
#ifdef EXPIRE /*** Not in final release ***/
|
|
{
|
|
struct dosdate_t ddt;
|
|
|
|
_dos_getdate(&ddt);
|
|
|
|
if ((ddt.month + ddt.year*12) > (9 + 1990*12))
|
|
{
|
|
MessageBox(GetFocus(),
|
|
"This game has expired. Please obtain an official copy from the Windows Entertainment Package.",
|
|
"SORRY",
|
|
MB_OK);
|
|
return fFalse;
|
|
}
|
|
}
|
|
#endif
|
|
|
|
|
|
{
|
|
WNDCLASS wc;
|
|
|
|
wc.style = 0;
|
|
wc.lpfnWndProc = MainWndProc;
|
|
wc.cbClsExtra = 0;
|
|
wc.cbWndExtra = 0;
|
|
wc.hInstance = hInst;
|
|
wc.hIcon = LoadIcon(hInst, MAKEINTRESOURCE(ID_ICON_MAIN));
|
|
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
|
|
#ifdef JAPAN
|
|
//2/9/1993:Color is LiteGray on NEC display
|
|
wc.hbrBackground = GetSystemMetrics(SM_CYSCREEN)<351 ? CreateSolidBrush(RGB(128, 128, 128)) : GetStockObject(LTGRAY_BRUSH);
|
|
#else
|
|
wc.hbrBackground = fEGA ? CreateSolidBrush(RGB(128, 128, 128))
|
|
: GetStockObject(LTGRAY_BRUSH);
|
|
#endif
|
|
wc.lpszMenuName = NULL;
|
|
wc.lpszClassName = szClass;
|
|
|
|
if (!RegisterClass(&wc))
|
|
return fFalse;
|
|
}
|
|
|
|
hMenu = LoadMenu(hInst, MAKEINTRESOURCE(ID_MENU));
|
|
hAccel = LoadAccelerators(hInst, MAKEINTRESOURCE(ID_MENU_ACCEL));
|
|
|
|
ReadPreferences();
|
|
|
|
AdjustWindow(fCalc);
|
|
|
|
hwndMain = CreateWindow(szClass, szWindowTitle,
|
|
WS_OVERLAPPED | WS_MINIMIZEBOX | WS_CAPTION | WS_SYSMENU,
|
|
Preferences.xWindow-dxpBorder, Preferences.yWindow-dypAdjust,
|
|
dxWindow+dxpBorder, dyWindow +dypAdjust,
|
|
NULL, NULL, hInst, NULL);
|
|
|
|
if (!hwndMain)
|
|
{
|
|
ReportErr(1000);
|
|
return fFalse;
|
|
}
|
|
|
|
if (SetTimer(hwndMain, ID_TIMER, 1000 , NULL) == 0)
|
|
{
|
|
ReportErr(ID_ERR_TIMER);
|
|
return fFalse;
|
|
}
|
|
|
|
if (!FInitLocal())
|
|
{
|
|
ReportErr(ID_ERR_MEM);
|
|
return fFalse;
|
|
}
|
|
|
|
SetMenuBar(Preferences.fMenu);
|
|
|
|
StartGame();
|
|
|
|
ShowWindow(hwndMain, SW_SHOWNORMAL);
|
|
UpdateWindow(hwndMain);
|
|
|
|
bInitMinimized = FALSE;
|
|
|
|
while (GetMessage(&msg, NULL, 0, 0))
|
|
{
|
|
if (!TranslateAccelerator(hwndMain, hAccel, &msg))
|
|
{
|
|
TranslateMessage(&msg);
|
|
DispatchMessage(&msg);
|
|
}
|
|
}
|
|
|
|
CleanUp();
|
|
|
|
if (fUpdateIni)
|
|
WritePreferences();
|
|
|
|
return (msg.wParam);
|
|
}
|
|
|
|
|
|
/****** F L O C A L B U T T O N ******/
|
|
|
|
BOOL FLocalButton(LONG lParam)
|
|
{
|
|
BOOL fDown = fTrue;
|
|
RECT rcCapt;
|
|
MSG msg;
|
|
|
|
msg.pt.x = LOWORD(lParam);
|
|
msg.pt.y = HIWORD(lParam);
|
|
|
|
rcCapt.right = dxButton + (rcCapt.left = (dxWindow-dxButton) >> 1);
|
|
rcCapt.bottom = dyButton + (rcCapt.top = dyTopLed);
|
|
|
|
if (!PtInRect(&rcCapt, msg.pt))
|
|
return fFalse;
|
|
|
|
SetCapture(hwndMain);
|
|
|
|
DisplayButton(iButtonDown);
|
|
|
|
ClientToScreen(hwndMain, (LPPOINT) &rcCapt.left);
|
|
ClientToScreen(hwndMain, (LPPOINT) &rcCapt.right);
|
|
|
|
while (fTrue)
|
|
{
|
|
if (PeekMessage(&msg, hwndMain, WM_MOUSEFIRST, WM_MOUSELAST, PM_REMOVE))
|
|
{
|
|
|
|
switch (msg.message)
|
|
{
|
|
case WM_LBUTTONUP:
|
|
if (fDown)
|
|
{
|
|
if (PtInRect(&rcCapt, msg.pt))
|
|
{
|
|
DisplayButton(iButtonCur = iButtonHappy);
|
|
StartGame();
|
|
}
|
|
}
|
|
ReleaseCapture();
|
|
return fTrue;
|
|
|
|
case WM_MOUSEMOVE:
|
|
if (PtInRect(&rcCapt, msg.pt))
|
|
{
|
|
if (!fDown)
|
|
{
|
|
fDown = fTrue;
|
|
DisplayButton(iButtonDown);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (fDown)
|
|
{
|
|
fDown = fFalse;
|
|
DisplayButton(iButtonCur);
|
|
}
|
|
}
|
|
default:
|
|
;
|
|
} /* switch */
|
|
}
|
|
|
|
} /* while */
|
|
}
|
|
|
|
|
|
|
|
/****** F I X M E N U S ******/
|
|
|
|
VOID FixMenus(VOID)
|
|
{
|
|
CheckEm(IDM_BEGIN, Preferences.wGameType == wGameBegin);
|
|
CheckEm(IDM_INTER, Preferences.wGameType == wGameInter);
|
|
CheckEm(IDM_EXPERT, Preferences.wGameType == wGameExpert);
|
|
CheckEm(IDM_CUSTOM, Preferences.wGameType == wGameOther);
|
|
|
|
CheckEm(IDM_COLOR, Preferences.fColor);
|
|
CheckEm(IDM_MARK, Preferences.fMark);
|
|
|
|
#ifdef NOISEY
|
|
CheckEm(IDM_SOUND, Preferences.fSound);
|
|
#endif
|
|
}
|
|
|
|
|
|
|
|
/****** D O P R E F ******/
|
|
|
|
VOID DoPref(VOID)
|
|
{
|
|
FARPROC lpProcPref = MakeProcInstance((FARPROC)PrefDlgProc, hInst);
|
|
|
|
DialogBox(hInst, MAKEINTRESOURCE(ID_DLG_PREF), hwndMain, (WNDPROC)lpProcPref);
|
|
FreeProcInstance(lpProcPref);
|
|
Preferences.wGameType = wGameOther;
|
|
FixMenus();
|
|
fUpdateIni = fTrue;
|
|
StartGame();
|
|
}
|
|
|
|
|
|
/****** D O E N T E R N A M E ******/
|
|
|
|
VOID DoEnterName(VOID)
|
|
{
|
|
FARPROC lpProcEnter = MakeProcInstance((FARPROC)EnterDlgProc, hInst);
|
|
DialogBox(hInst, MAKEINTRESOURCE(ID_DLG_ENTER), hwndMain, (WNDPROC)lpProcEnter);
|
|
FreeProcInstance(lpProcEnter);
|
|
fUpdateIni = fTrue;
|
|
}
|
|
|
|
|
|
/****** D O D I S P L A Y B E S T ******/
|
|
|
|
VOID DoDisplayBest(VOID)
|
|
{
|
|
FARPROC lpProcBest = MakeProcInstance((FARPROC)BestDlgProc, hInst);
|
|
DialogBox(hInst, MAKEINTRESOURCE(ID_DLG_BEST), hwndMain, (WNDPROC)lpProcBest);
|
|
FreeProcInstance(lpProcBest);
|
|
}
|
|
|
|
|
|
/****** M A I N W N D P R O C ******/
|
|
|
|
LONG APIENTRY MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LONG lParam)
|
|
{
|
|
|
|
switch (message)
|
|
{
|
|
case WM_MOVE:
|
|
if (!fStatusIcon)
|
|
{
|
|
Preferences.xWindow = 1+LOWORD(lParam);
|
|
Preferences.yWindow = 1+HIWORD(lParam);
|
|
}
|
|
break;
|
|
|
|
case WM_SYSCOMMAND:
|
|
switch (wParam & 0xFFF0)
|
|
{
|
|
case SC_MINIMIZE:
|
|
PauseGame();
|
|
SetStatusPause;
|
|
SetStatusIcon;
|
|
break;
|
|
|
|
case SC_RESTORE:
|
|
ClrStatusPause;
|
|
ClrStatusIcon;
|
|
ResumeGame();
|
|
|
|
//Japan Bug fix: 1/19/93 Enable the first click after restoring from icon.
|
|
fIgnoreClick = fFalse;
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
case WM_COMMAND:
|
|
{
|
|
switch(GET_WM_COMMAND_ID(wParam, lParam)) {
|
|
|
|
case IDM_NEW:
|
|
StartGame();
|
|
break;
|
|
|
|
/** IDM_NEW **/
|
|
case IDM_EXIT:
|
|
ShowWindow(hwndMain, SW_HIDE);
|
|
#ifdef ORGCODE
|
|
goto LExit;
|
|
#else
|
|
SendMessage(hwndMain, WM_SYSCOMMAND, SC_CLOSE, 0);
|
|
return(0);
|
|
#endif
|
|
/** IDM_SKILL **/
|
|
case IDM_BEGIN:
|
|
case IDM_INTER:
|
|
case IDM_EXPERT:
|
|
Preferences.wGameType = (WORD)(GET_WM_COMMAND_ID(wParam, lParam) - IDM_BEGIN);
|
|
Preferences.Mines = rgLevelData[Preferences.wGameType][0];
|
|
Preferences.Height = rgLevelData[Preferences.wGameType][1];
|
|
Preferences.Width = rgLevelData[Preferences.wGameType][2];
|
|
StartGame();
|
|
goto LUpdateMenu;
|
|
|
|
case IDM_CUSTOM:
|
|
DoPref();
|
|
break;
|
|
|
|
#ifdef NOISEY
|
|
/** IDM_OPTIONS **/
|
|
case IDM_SOUND:
|
|
if (Preferences.fSound)
|
|
{
|
|
EndTunes();
|
|
Preferences.fSound = fFalse;
|
|
}
|
|
else
|
|
{
|
|
Preferences.fSound = FInitTunes();
|
|
}
|
|
goto LUpdateMenu;
|
|
#endif
|
|
|
|
case IDM_COLOR:
|
|
Preferences.fColor = !Preferences.fColor;
|
|
FreeBitmaps();
|
|
if (!FLoadBitmaps())
|
|
{
|
|
ReportErr(ID_ERR_MEM);
|
|
#ifdef ORGCODE
|
|
goto LExit;
|
|
#else
|
|
SendMessage(hwndMain, WM_SYSCOMMAND, SC_CLOSE, 0);
|
|
return(0);
|
|
#endif
|
|
}
|
|
DisplayScreen();
|
|
goto LUpdateMenu;
|
|
|
|
case IDM_MARK:
|
|
Preferences.fMark = !Preferences.fMark;
|
|
/* IE goto LUpdateMenu; */
|
|
|
|
LUpdateMenu:
|
|
fUpdateIni = fTrue;
|
|
FixMenus();
|
|
break;
|
|
|
|
case IDM_BEST:
|
|
DoDisplayBest();
|
|
break;
|
|
|
|
|
|
/** IDM_HELP **/
|
|
case IDM_INDEX:
|
|
DoHelp(HELP_INDEX, 0L);
|
|
break;
|
|
|
|
case IDM_HOW2PLAY:
|
|
DoHelp(HELP_CONTEXT, HLP_HOWTOPLAY);
|
|
break;
|
|
|
|
case IDM_COMMANDS:
|
|
DoHelp(HELP_CONTEXT, HLP_COMMANDS);
|
|
break;
|
|
|
|
case IDM_HELP_HELP:
|
|
DoHelp(HELP_HELPONHELP, 0L);
|
|
break;
|
|
|
|
case IDM_HELP_ABOUT:
|
|
DoAbout();
|
|
return 0;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
} /**** END OF MENUS ****/
|
|
|
|
break;
|
|
|
|
|
|
|
|
case WM_KEYDOWN:
|
|
switch (wParam)
|
|
{
|
|
case VK_ESCAPE:
|
|
SetStatusPanic;
|
|
PostMessage(hwndMain, WM_SYSCOMMAND, SC_MINIMIZE, 0L);
|
|
break;
|
|
|
|
#if 0
|
|
case VK_F1:
|
|
DoHelp(HELP_INDEX, 0L);
|
|
break;
|
|
|
|
case VK_F2:
|
|
StartGame();
|
|
break;
|
|
|
|
case VK_F3:
|
|
break;
|
|
|
|
#endif
|
|
case VK_F4:
|
|
if (FSoundSwitchable())
|
|
if (FSoundOn())
|
|
{
|
|
EndTunes();
|
|
Preferences.fSound = fsoundOff;
|
|
}
|
|
else
|
|
Preferences.fSound = FInitTunes();
|
|
break;
|
|
|
|
case VK_F5:
|
|
if (FMenuSwitchable())
|
|
SetMenuBar(fmenuOff);
|
|
break;
|
|
|
|
case VK_F6:
|
|
if (FMenuSwitchable())
|
|
SetMenuBar(fmenuOn);
|
|
break;
|
|
|
|
#ifdef XYZZY
|
|
case VK_SHIFT:
|
|
if (iXYZZY >= cchXYZZY)
|
|
iXYZZY ^= 20;
|
|
break;
|
|
|
|
default:
|
|
if (iXYZZY < cchXYZZY)
|
|
iXYZZY = (szXYZZY[iXYZZY] == (CHAR) wParam) ? iXYZZY+1 : 0;
|
|
break;
|
|
|
|
#else
|
|
default:
|
|
break;
|
|
#endif
|
|
}
|
|
break;
|
|
|
|
/* case WM_QUERYENDSESSION: SHOULDNT BE USED (JAP)*/
|
|
|
|
case WM_DESTROY:
|
|
//LExit:
|
|
KillTimer(hwndMain, ID_TIMER);
|
|
DoHelp(HELP_QUIT, 0L);
|
|
PostQuitMessage(0);
|
|
break;
|
|
|
|
case WM_MBUTTONDOWN:
|
|
if (fIgnoreClick)
|
|
{
|
|
fIgnoreClick = fFalse;
|
|
return 0;
|
|
}
|
|
|
|
if (!fStatusPlay)
|
|
break;
|
|
|
|
fBlock = fTrue;
|
|
goto LBigStep;
|
|
|
|
case WM_LBUTTONDOWN:
|
|
|
|
if (fIgnoreClick)
|
|
{
|
|
fIgnoreClick = fFalse;
|
|
return 0;
|
|
}
|
|
|
|
if (FLocalButton(lParam))
|
|
return 0;
|
|
|
|
if (!fStatusPlay)
|
|
break;
|
|
fBlock = (wParam & (MK_SHIFT | MK_RBUTTON)) ? fTrue : fFalse;
|
|
|
|
LBigStep:
|
|
SetCapture(hWnd);
|
|
fButton1Down = fTrue;
|
|
|
|
xCur = -1;
|
|
yCur = -1;
|
|
DisplayButton(iButtonCaution);
|
|
|
|
case WM_MOUSEMOVE:
|
|
if (fButton1Down)
|
|
{
|
|
if (fStatus & fPlay)
|
|
TrackMouse(xBoxFromXpos(LOWORD(lParam)), yBoxFromYpos(HIWORD(lParam)) );
|
|
else
|
|
goto LFixTimeOut;
|
|
}
|
|
#ifdef XYZZY
|
|
else if (iXYZZY != 0)
|
|
if (((iXYZZY == cchXYZZY) && (wParam & MK_CONTROL))
|
|
||(iXYZZY > cchXYZZY))
|
|
{
|
|
xCur = xBoxFromXpos(LOWORD(lParam));
|
|
yCur = yBoxFromYpos(HIWORD(lParam));
|
|
if (fInRange(xCur, yCur))
|
|
{
|
|
HDC hDC = GetDC(GetDesktopWindow());
|
|
SetPixel(hDC, 0, 0, fISBOMB(xCur, yCur) ? 0L : 0x00FFFFFFL);
|
|
ReleaseDC(GetDesktopWindow(), hDC);
|
|
}
|
|
}
|
|
#endif
|
|
break;
|
|
|
|
case WM_RBUTTONUP:
|
|
case WM_MBUTTONUP:
|
|
case WM_LBUTTONUP:
|
|
if (fButton1Down)
|
|
{
|
|
LFixTimeOut:
|
|
fButton1Down = fFalse;
|
|
ReleaseCapture();
|
|
if (fStatus & fPlay)
|
|
DoButton1Up();
|
|
else
|
|
TrackMouse(-2,-2);
|
|
}
|
|
break;
|
|
|
|
case WM_RBUTTONDOWN:
|
|
if (fIgnoreClick)
|
|
{
|
|
fIgnoreClick = fFalse;
|
|
return 0;
|
|
}
|
|
|
|
if(!fStatusPlay)
|
|
break;
|
|
|
|
if (fButton1Down)
|
|
{
|
|
TrackMouse(-3,-3);
|
|
fBlock = fTrue;
|
|
PostMessage(hwndMain, WM_MOUSEMOVE, wParam, lParam);
|
|
}
|
|
else if (wParam & MK_LBUTTON)
|
|
goto LBigStep;
|
|
else if (!fLocalPause)
|
|
MakeGuess(xBoxFromXpos(LOWORD(lParam)), yBoxFromYpos(HIWORD(lParam)) );
|
|
return 0;
|
|
|
|
case WM_ACTIVATE:
|
|
/* Window is being activated by a mouse click */
|
|
if (GET_WM_ACTIVATE_STATE(wParam, lParam) == 2)
|
|
fIgnoreClick = fTrue;
|
|
break;
|
|
|
|
case WM_TIMER:
|
|
#ifdef CHEAT
|
|
if (!fLocalPause)
|
|
#endif
|
|
DoTimer();
|
|
return 0;
|
|
|
|
case WM_ENTERMENULOOP:
|
|
fLocalPause = fTrue;
|
|
break;
|
|
|
|
case WM_EXITMENULOOP:
|
|
fLocalPause = fFalse;
|
|
break;
|
|
|
|
case WM_PAINT:
|
|
{
|
|
PAINTSTRUCT ps;
|
|
HDC hDC = BeginPaint(hWnd,&ps);
|
|
|
|
DrawScreen(hDC);
|
|
|
|
EndPaint(hWnd, &ps);
|
|
}
|
|
return 0;
|
|
|
|
default:
|
|
break;
|
|
|
|
}
|
|
|
|
return (DefWindowProc(hWnd, message, wParam, lParam));
|
|
}
|
|
|
|
|
|
|
|
|
|
/****** DIALOG PROCEDURES ******/
|
|
|
|
/*** P R E F D L G P R O C ***/
|
|
|
|
BOOL APIENTRY PrefDlgProc(HWND hDlg, WORD message, WPARAM wParam, LONG lParam)
|
|
{
|
|
switch (message)
|
|
{
|
|
case WM_INITDIALOG:
|
|
SetDlgItemInt(hDlg, ID_EDIT_HEIGHT, Preferences.Height ,fFalse);
|
|
SetDlgItemInt(hDlg, ID_EDIT_WIDTH, Preferences.Width ,fFalse);
|
|
SetDlgItemInt(hDlg, ID_EDIT_MINES, Preferences.Mines ,fFalse);
|
|
return (fTrue);
|
|
|
|
case WM_COMMAND:
|
|
switch(GET_WM_COMMAND_ID(wParam, lParam)) {
|
|
case ID_BTN_OK:
|
|
case IDOK:
|
|
{
|
|
|
|
#ifdef JAPAN
|
|
//1/19/93: Change the window size as the title bar can be displayed.
|
|
Preferences.Height = GetDlgInt(hDlg, ID_EDIT_HEIGHT, 8, fEGA ? 16 : 22);
|
|
#else
|
|
Preferences.Height = GetDlgInt(hDlg, ID_EDIT_HEIGHT, 8, fEGA ? 16 : 24);
|
|
#endif
|
|
Preferences.Width = GetDlgInt(hDlg, ID_EDIT_WIDTH, 8, 30);
|
|
Preferences.Mines = GetDlgInt(hDlg, ID_EDIT_MINES, 10,
|
|
min(999, (Preferences.Height-1) * (Preferences.Width-1) ) );
|
|
|
|
}
|
|
|
|
/* Fall Through & Exit */
|
|
|
|
case ID_BTN_CANCEL:
|
|
case IDCANCEL:
|
|
EndDialog(hDlg, fTrue); /* Exits the dialog box */
|
|
return fTrue;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
return (fFalse); /* Didn't process a message */
|
|
(lParam);
|
|
}
|
|
|
|
|
|
/*** S E T D T E X T ***/
|
|
|
|
VOID SetDText(HWND hDlg, INT id, INT time, CHAR FAR * szName)
|
|
{
|
|
CHAR sz[cchNameMax];
|
|
|
|
wsprintf(sz, szTime, time);
|
|
SetDlgItemText(hDlg, id, (LPSTR) sz);
|
|
SetDlgItemText(hDlg, id+1, szName);
|
|
}
|
|
|
|
|
|
/****** B E S T D L G P R O C ******/
|
|
|
|
BOOL APIENTRY BestDlgProc(HWND hDlg, WORD message, WPARAM wParam, LONG lParam)
|
|
{
|
|
switch (message)
|
|
{
|
|
case WM_INITDIALOG:
|
|
LReset:
|
|
SetDText(hDlg, ID_TIME_BEGIN, Preferences.rgTime[wGameBegin], (LPSTR) Preferences.szBegin);
|
|
SetDText(hDlg, ID_TIME_INTER, Preferences.rgTime[wGameInter], (LPSTR) Preferences.szInter);
|
|
SetDText(hDlg, ID_TIME_EXPERT, Preferences.rgTime[wGameExpert], (LPSTR) Preferences.szExpert);
|
|
return (fTrue);
|
|
|
|
case WM_COMMAND:
|
|
switch(GET_WM_COMMAND_ID(wParam, lParam)) {
|
|
case ID_BTN_RESET:
|
|
Preferences.rgTime[wGameBegin] = Preferences.rgTime[wGameInter]
|
|
= Preferences.rgTime[wGameExpert] = 999;
|
|
lstrcpy((LPSTR) Preferences.szBegin, (LPSTR) szDefaultName);
|
|
lstrcpy((LPSTR) Preferences.szInter, (LPSTR) szDefaultName);
|
|
lstrcpy((LPSTR) Preferences.szExpert, (LPSTR) szDefaultName);
|
|
fUpdateIni = fTrue;
|
|
goto LReset;
|
|
|
|
case ID_BTN_OK:
|
|
case IDOK:
|
|
case ID_BTN_CANCEL:
|
|
case IDCANCEL:
|
|
EndDialog(hDlg, fTrue); /* Exits the dialog box */
|
|
return fTrue;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
return (fFalse); /* Didn't process a message */
|
|
(lParam);
|
|
}
|
|
|
|
|
|
|
|
/****** E N T E R D L G P R O C ******/
|
|
|
|
BOOL APIENTRY EnterDlgProc(HWND hDlg, WORD message, WPARAM wParam, LONG lParam)
|
|
{
|
|
|
|
switch (message)
|
|
{
|
|
case WM_INITDIALOG:
|
|
{
|
|
CHAR sz[cchMsgMax];
|
|
|
|
LoadSz((WORD)(Preferences.wGameType+ID_MSG_BEGIN), sz);
|
|
|
|
SetDlgItemText(hDlg, ID_TEXT_BEST, sz);
|
|
|
|
SetDlgItemText(hDlg, ID_EDIT_NAME,
|
|
(Preferences.wGameType == wGameBegin) ? (LPSTR) Preferences.szBegin :
|
|
(Preferences.wGameType == wGameInter) ? (LPSTR) Preferences.szInter :
|
|
(LPSTR) Preferences.szExpert);
|
|
}
|
|
return (fTrue);
|
|
|
|
case WM_COMMAND:
|
|
switch(GET_WM_COMMAND_ID(wParam, lParam)) {
|
|
case ID_BTN_OK:
|
|
case IDOK:
|
|
case ID_BTN_CANCEL:
|
|
case IDCANCEL:
|
|
|
|
GetDlgItemText(hDlg, ID_EDIT_NAME,
|
|
(Preferences.wGameType == wGameBegin) ? (LPSTR) Preferences.szBegin :
|
|
(Preferences.wGameType == wGameInter) ? (LPSTR) Preferences.szInter :
|
|
(LPSTR) Preferences.szExpert, cchNameMax);
|
|
|
|
EndDialog(hDlg, fTrue); /* Exits the dialog box */
|
|
return fTrue;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
return (fFalse); /* Didn't process a message */
|
|
(lParam);
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/****** A D J U S T W I N D O W ******/
|
|
|
|
VOID AdjustWindow(INT fAdjust)
|
|
{
|
|
REGISTER t;
|
|
RECT rect;
|
|
|
|
dypAdjust = dypCaption;
|
|
if (FMenuOn())
|
|
#ifdef JAPAN
|
|
{
|
|
dypAdjust += dypMenu;
|
|
|
|
//menu double line case
|
|
//1/19/93: Change the window size as the title bar can be displayed.
|
|
if (Preferences.Width < 10){
|
|
TEXTMETRIC tm;
|
|
HDC hdc;
|
|
|
|
hdc = GetDC(NULL);
|
|
GetTextMetrics(hdc, &tm);
|
|
ReleaseDC(NULL, hdc);
|
|
if(tm.tmHeight > 13)
|
|
//13 point sys-font can be on 1 line menu.
|
|
dypAdjust += dypMenu;
|
|
}
|
|
}
|
|
#else
|
|
dypAdjust += dypMenu;
|
|
#endif
|
|
|
|
dxWindow = dxBlk * xBoxMac + dxGridOff + dxRightSpace;
|
|
dyWindow = dyBlk * yBoxMac + dyGridOff + dyBottomSpace;
|
|
|
|
if ((t = Preferences.xWindow+dxWindow - GetSystemMetrics(SM_CXSCREEN)) > 0)
|
|
{
|
|
fAdjust |= fResize;
|
|
Preferences.xWindow -= t;
|
|
}
|
|
|
|
if ((t = Preferences.yWindow+dyWindow - GetSystemMetrics(SM_CYSCREEN)) > 0)
|
|
{
|
|
fAdjust |= fResize;
|
|
Preferences.yWindow -= t;
|
|
}
|
|
|
|
if (!bInitMinimized)
|
|
{
|
|
if (fAdjust & fResize)
|
|
{
|
|
#ifdef JAPAN
|
|
//1/19/93: Change the window size as the title bar can be displayed.
|
|
//Set the start position of Y upper 0
|
|
int yStartPos;
|
|
if((yStartPos = Preferences.yWindow - dypAdjust) < 0)
|
|
yStartPos = 0;
|
|
MoveWindow(hwndMain, Preferences.xWindow - dxpBorder,
|
|
yStartPos,
|
|
dxWindow+dxpBorder, dyWindow + dypAdjust, fTrue);
|
|
#else
|
|
MoveWindow(hwndMain, Preferences.xWindow - dxpBorder,
|
|
Preferences.yWindow - dypAdjust,
|
|
dxWindow+dxpBorder, dyWindow + dypAdjust, fTrue);
|
|
#endif
|
|
}
|
|
|
|
if (fAdjust & fDisplay)
|
|
{
|
|
SetRect(&rect, 0, 0, dxWindow, dyWindow);
|
|
InvalidateRect(hwndMain, &rect, fTrue);
|
|
}
|
|
}
|
|
}
|