Added winemine app.
diff --git a/configure b/configure
index e696ef3..f625d26 100755
--- a/configure
+++ b/configure
@@ -6267,6 +6267,7 @@
programs/regapi/Makefile
programs/view/Makefile
programs/wcmd/Makefile
+programs/winemine/Makefile
programs/winhelp/Makefile
programs/winver/Makefile
rc/Makefile
@@ -6482,6 +6483,7 @@
programs/regapi/Makefile
programs/view/Makefile
programs/wcmd/Makefile
+programs/winemine/Makefile
programs/winhelp/Makefile
programs/winver/Makefile
rc/Makefile
diff --git a/configure.in b/configure.in
index adde21a..ef8024d 100644
--- a/configure.in
+++ b/configure.in
@@ -1029,6 +1029,7 @@
programs/regapi/Makefile
programs/view/Makefile
programs/wcmd/Makefile
+programs/winemine/Makefile
programs/winhelp/Makefile
programs/winver/Makefile
rc/Makefile
diff --git a/programs/Makefile.in b/programs/Makefile.in
index 7caf1f2..f9dcd57 100644
--- a/programs/Makefile.in
+++ b/programs/Makefile.in
@@ -10,6 +10,7 @@
regtest \
view \
wcmd \
+ winemine \
winhelp \
winver
diff --git a/programs/winemine/.cvsignore b/programs/winemine/.cvsignore
new file mode 100644
index 0000000..5315ee1
--- /dev/null
+++ b/programs/winemine/.cvsignore
@@ -0,0 +1,4 @@
+Makefile
+rsrc.s
+winemine
+winemine.spec.c
diff --git a/programs/winemine/Makefile.in b/programs/winemine/Makefile.in
new file mode 100644
index 0000000..2afd0e0
--- /dev/null
+++ b/programs/winemine/Makefile.in
@@ -0,0 +1,39 @@
+DEFS = -DWINELIB
+TOPSRCDIR = @top_srcdir@
+TOPOBJDIR = ../..
+SRCDIR = @srcdir@
+VPATH = @srcdir@
+MODULE = none
+PROGRAMS = winemine
+ALL_LIBS = $(WINELIB) $(X_LIBS) $(XLIB) $(LIBS)
+WRCEXTRA = -s -p winemine
+
+LICENSELANG = En
+
+C_SRCS = \
+ main.c \
+ dialog.c
+
+
+SPEC_SRCS = winemine.spec
+
+RC_SRCS = rsrc.rc
+
+all: check_wrc check_winestub $(PROGRAMS)
+
+@MAKE_RULES@
+
+# Override resource compiler rules
+.rc.s:
+ $(CPP) $(DEFS) $(OPTIONS) $(DIVINCL) -DRC_INVOKED -P -x c $< | $(WRC) $(WRCFLAGS) $(WRCEXTRA) -o $*.s
+
+winemine: $(OBJS)
+ $(CC) -o winemine $(OBJS) $(LDOPTIONS) $(ALL_LIBS)
+
+install::
+ $(INSTALL_PROGRAM) winemine $(bindir)/winemine
+
+uninstall::
+ $(RM) $(bindir)/winemine
+
+### Dependencies:
diff --git a/programs/winemine/README b/programs/winemine/README
new file mode 100644
index 0000000..102f480
--- /dev/null
+++ b/programs/winemine/README
@@ -0,0 +1,18 @@
+WineMine README
+
+WineMine, copyright March 2000, Joshua Thielen
+WineMine is to be distributed under the Wine License
+See the Wine License for further information.
+
+
+This is minesweeper for wine...
+Enjoy. I wrote it because it rhymes ;).
+
+KNOWN BUGS:
+ Chokes on fastest times names greater than 16 characters long, must have
+ something to do with GetDlgItemText.
+
+ No help file.
+
+UNKNOWN BUGS:
+ ???
diff --git a/programs/winemine/dialog.c b/programs/winemine/dialog.c
new file mode 100644
index 0000000..eba8297
--- /dev/null
+++ b/programs/winemine/dialog.c
@@ -0,0 +1,120 @@
+/*
+ * WineMine (dialog.c)
+ *
+ * Copyright 2000 Joshua Thielen <jt85296@ltu.edu>
+ * To be distributed under the Wine License
+ */
+
+
+#include <windows.h>
+#include "main.h"
+#include "dialog.h"
+#include "resource.h"
+
+BOOL CALLBACK CustomDlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
+{
+ BOOL IsRet;
+ static BOARD *p_board;
+
+ switch( uMsg ) {
+ case WM_INITDIALOG:
+ p_board = (BOARD*) lParam;
+ SetDlgItemInt( hDlg, IDC_EDITROWS, p_board->rows, FALSE );
+ SetDlgItemInt( hDlg, IDC_EDITCOLS, p_board->cols, FALSE );
+ SetDlgItemInt( hDlg, IDC_EDITMINES, p_board->mines, FALSE );
+ return TRUE;
+
+ case WM_COMMAND:
+ switch( LOWORD( wParam ) ) {
+ case IDOK:
+ p_board->rows = GetDlgItemInt( hDlg, IDC_EDITROWS, &IsRet, FALSE );
+ p_board->cols = GetDlgItemInt( hDlg, IDC_EDITCOLS, &IsRet, FALSE );
+ p_board->mines = GetDlgItemInt( hDlg, IDC_EDITMINES, &IsRet, FALSE );
+ CheckLevel( p_board );
+ EndDialog( hDlg, 0 );
+ return TRUE;
+
+ case IDCANCEL:
+ EndDialog( hDlg, 0 );
+ return TRUE;
+ }
+ break;
+ }
+ return FALSE;
+}
+
+BOOL CALLBACK CongratsDlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
+{
+ static BOARD *p_board;
+
+ switch( uMsg ) {
+ case WM_INITDIALOG:
+ p_board = (BOARD*) lParam;
+ SetDlgItemText( hDlg, IDC_EDITNAME,
+ p_board->best_name[p_board->difficulty] );
+ return TRUE;
+
+ case WM_COMMAND:
+ switch( LOWORD( wParam ) ) {
+ case IDOK:
+ GetDlgItemText( hDlg, IDC_EDITNAME,
+ p_board->best_name[p_board->difficulty],
+ sizeof( p_board->best_name[p_board->difficulty] ) );
+ EndDialog( hDlg, 0 );
+ return TRUE;
+
+ case IDCANCEL:
+ EndDialog( hDlg, 0 );
+ return TRUE;
+ }
+ break;
+ }
+ return FALSE;
+}
+
+BOOL CALLBACK TimesDlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
+{
+ static BOARD *p_board;
+ unsigned i;
+
+ switch( uMsg ) {
+ case WM_INITDIALOG:
+ p_board = (BOARD*) lParam;
+
+ /* set best names */
+ for( i = 0; i < 3; i++ )
+ SetDlgItemText( hDlg, (IDC_NAME1) + i, p_board->best_name[i] );
+
+ /* set best times */
+ for( i = 0; i < 3; i++ )
+ SetDlgItemInt( hDlg, (IDC_TIME1) + i, p_board->best_time[i], FALSE );
+ return TRUE;
+
+ case WM_COMMAND:
+ switch( LOWORD( wParam ) ) {
+ case IDOK:
+ EndDialog( hDlg, 0 );
+ return TRUE;
+ }
+ break;
+ }
+ return FALSE;
+}
+
+BOOL CALLBACK AboutDlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
+{
+ switch( uMsg ) {
+ case WM_INITDIALOG:
+ return TRUE;
+
+ case WM_COMMAND:
+ switch( LOWORD( wParam ) ) {
+ case IDOK:
+ EndDialog( hDlg, 0 );
+ return TRUE;
+ }
+ break;
+ }
+ return FALSE;
+}
+
diff --git a/programs/winemine/dialog.h b/programs/winemine/dialog.h
new file mode 100644
index 0000000..b74e567
--- /dev/null
+++ b/programs/winemine/dialog.h
@@ -0,0 +1,16 @@
+/*
+ * WineMine (dialog.h)
+ *
+ * Copyright 2000 Joshua Thielen <jt85296@ltu.edu>
+ * To be distributed under the Wine License
+ */
+
+
+BOOL CALLBACK CustomDlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam );
+
+BOOL CALLBACK CongratsDlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam );
+
+BOOL CALLBACK TimesDlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam );
+
+BOOL CALLBACK AboutDlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam );
+
diff --git a/programs/winemine/main.c b/programs/winemine/main.c
new file mode 100644
index 0000000..b072bbe
--- /dev/null
+++ b/programs/winemine/main.c
@@ -0,0 +1,970 @@
+/*
+ * WineMine (main.c)
+ *
+ * Copyright 2000 Joshua Thielen <jt85296@ltu.edu>
+ * To be distributed under the Wine License
+ */
+
+
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <windows.h>
+#include "main.h"
+#include "dialog.h"
+#include "resource.h"
+
+
+int WINAPI WinMain( HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR cmdline, int cmdshow )
+{
+ MSG msg;
+ WNDCLASS wc;
+ HWND hWnd;
+ HACCEL haccel;
+ char appname[9];
+
+ LoadString( hInst, IDS_APPNAME, appname, sizeof(appname));
+
+ wc.style = 0;
+ wc.lpfnWndProc = MainProc;
+ wc.cbClsExtra = 0;
+ wc.cbWndExtra = 0;
+ wc.hInstance = hInst;
+ wc.hIcon = LoadIcon( hInst, appname );
+ wc.hCursor = LoadCursor( NULL, IDI_APPLICATION );
+ wc.hbrBackground = (HBRUSH) GetStockObject( BLACK_BRUSH );
+ wc.lpszMenuName = "MENU_WINEMINE";
+ wc.lpszClassName = appname;
+
+ if (!RegisterClass(&wc)) exit(1);
+ hWnd = CreateWindow( appname, appname,
+ WS_OVERLAPPEDWINDOW & ~WS_THICKFRAME & ~WS_MAXIMIZEBOX,
+ CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
+ NULL, NULL, hInst, NULL );
+
+ if (!hWnd) exit(1);
+
+ ShowWindow( hWnd, cmdshow );
+ UpdateWindow( hWnd );
+
+ SetTimer( hWnd, ID_TIMER, 1000, NULL );
+ haccel = LoadAccelerators( hInst, appname );
+
+ while( GetMessage(&msg, NULL, 0, 0) ) {
+ if (!TranslateAccelerator( hWnd, haccel, &msg ))
+ TranslateMessage( &msg );
+
+ DispatchMessage( &msg );
+ }
+ return msg.wParam;
+}
+
+LRESULT WINAPI MainProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ HDC hdc;
+ PAINTSTRUCT ps;
+ HMENU hMenu;
+ static BOARD board;
+
+ switch( msg ) {
+ case WM_CREATE:
+ board.hInst = ((LPCREATESTRUCT) lParam)->hInstance;
+ board.hWnd = hWnd;
+ InitBoard( &board );
+ CreateBoard( &board );
+ return 0;
+
+ case WM_PAINT:
+ hdc = BeginPaint( hWnd, &ps );
+ DrawBoard( hdc, &ps, &board );
+ EndPaint( hWnd, &ps );
+ return 0;
+
+ case WM_MOVE:
+ board.pos.x = (unsigned) LOWORD(lParam);
+ board.pos.y = (unsigned) HIWORD(lParam);
+ return 0;
+
+ case WM_DESTROY:
+ SaveBoard( &board );
+ PostQuitMessage( 0 );
+ return 0;
+
+ case WM_TIMER:
+ if( board.status == PLAYING ) {
+ board.time++;
+ RedrawWindow( hWnd, &board.timer_rect, NULL,
+ RDW_INVALIDATE | RDW_UPDATENOW );
+ }
+ return 0;
+
+ case WM_LBUTTONDOWN:
+ if( wParam & MK_RBUTTON )
+ msg = WM_MBUTTONDOWN;
+ TestBoard( hWnd, &board, LOWORD(lParam), HIWORD(lParam), msg );
+ SetCapture( hWnd );
+ return 0;
+
+ case WM_LBUTTONUP:
+ if( wParam & MK_RBUTTON )
+ msg = WM_MBUTTONUP;
+ TestBoard( hWnd, &board, LOWORD(lParam), HIWORD(lParam), msg );
+ ReleaseCapture();
+ return 0;
+
+ case WM_RBUTTONDOWN:
+ if( wParam & MK_LBUTTON ) {
+ board.press.x = 0;
+ board.press.y = 0;
+ msg = WM_MBUTTONDOWN;
+ }
+ TestBoard( hWnd, &board, LOWORD(lParam), HIWORD(lParam), msg );
+ return 0;
+
+ case WM_RBUTTONUP:
+ if( wParam & MK_LBUTTON )
+ msg = WM_MBUTTONUP;
+ TestBoard( hWnd, &board, LOWORD(lParam), HIWORD(lParam), msg );
+ return 0;
+
+ case WM_MOUSEMOVE:
+ if( wParam & MK_LBUTTON )
+ TestBoard( hWnd, &board, LOWORD(lParam), HIWORD(lParam), WM_LBUTTONDOWN );
+ if( (wParam & MK_LBUTTON) && (wParam & MK_RBUTTON) )
+ TestBoard( hWnd, &board, LOWORD(lParam), HIWORD(lParam), WM_MBUTTONDOWN );
+ return 0;
+
+ case WM_COMMAND:
+ switch(LOWORD(wParam)) {
+ case IDM_NEW:
+ CreateBoard( &board );
+ return 0;
+
+ case IDM_MARKQ:
+ hMenu = GetMenu( hWnd );
+ board.IsMarkQ = !board.IsMarkQ;
+ if( board.IsMarkQ )
+ CheckMenuItem( hMenu, IDM_MARKQ, MF_CHECKED );
+ else
+ CheckMenuItem( hMenu, IDM_MARKQ, MF_UNCHECKED );
+ return 0;
+
+ case IDM_BEGINNER:
+ SetDifficulty( &board, BEGINNER );
+ CreateBoard( &board );
+ return 0;
+
+ case IDM_ADVANCED:
+ SetDifficulty( &board, ADVANCED );
+ CreateBoard( &board );
+ return 0;
+
+ case IDM_EXPERT:
+ SetDifficulty( &board, EXPERT );
+ CreateBoard( &board );
+ return 0;
+
+ case IDM_CUSTOM:
+ SetDifficulty( &board, CUSTOM );
+ CreateBoard( &board );
+ return 0;
+
+ case IDM_EXIT:
+ SendMessage( hWnd, WM_CLOSE, 0, 0);
+ return 0;
+
+ case IDM_TIMES:
+ DialogBoxParam( board.hInst, "DLG_TIMES", hWnd,
+ TimesDlgProc, (LPARAM) &board);
+ return 0;
+
+ case IDM_ABOUT:
+ DialogBox( board.hInst, "DLG_ABOUT", hWnd, AboutDlgProc );
+ return 0;
+ }
+ break;
+ }
+ return( DefWindowProc( hWnd, msg, wParam, lParam ));
+}
+
+void InitBoard( BOARD *p_board )
+{
+ HMENU hMenu;
+
+ p_board->hMinesBMP = LoadBitmap( p_board->hInst, "mines");
+ p_board->hFacesBMP = LoadBitmap( p_board->hInst, "faces");
+ p_board->hLedsBMP = LoadBitmap( p_board->hInst, "leds");
+
+ LoadBoard( p_board );
+
+ if( p_board->pos.x < (unsigned) GetSystemMetrics( SM_CXFIXEDFRAME ))
+ p_board->pos.x = GetSystemMetrics( SM_CXFIXEDFRAME );
+
+ if( p_board->pos.x > (unsigned) (GetSystemMetrics( SM_CXSCREEN )
+ - GetSystemMetrics( SM_CXFIXEDFRAME ))) {
+ p_board->pos.x = GetSystemMetrics( SM_CXSCREEN )
+ - GetSystemMetrics( SM_CXFIXEDFRAME );
+ }
+
+ if( p_board->pos.y < (unsigned) (GetSystemMetrics( SM_CYMENU )
+ + GetSystemMetrics( SM_CYCAPTION )
+ + GetSystemMetrics( SM_CYFIXEDFRAME ))) {
+ p_board->pos.y = GetSystemMetrics( SM_CYMENU ) +
+ GetSystemMetrics( SM_CYCAPTION ) +
+ GetSystemMetrics( SM_CYFIXEDFRAME );
+ }
+
+ if( p_board->pos.y > (unsigned) (GetSystemMetrics( SM_CYSCREEN )
+ - GetSystemMetrics( SM_CYFIXEDFRAME ))) {
+ p_board->pos.y = GetSystemMetrics( SM_CYSCREEN )
+ - GetSystemMetrics( SM_CYFIXEDFRAME );
+ }
+
+ hMenu = GetMenu( p_board->hWnd );
+ CheckMenuItem( hMenu, IDM_BEGINNER + (unsigned) p_board->difficulty,
+ MF_CHECKED );
+ if( p_board->IsMarkQ )
+ CheckMenuItem( hMenu, IDM_MARKQ, MF_CHECKED );
+ else
+ CheckMenuItem( hMenu, IDM_MARKQ, MF_UNCHECKED );
+ CheckLevel( p_board );
+}
+
+void LoadBoard( BOARD *p_board )
+{
+ DWORD size;
+ DWORD type;
+ HKEY hkey;
+ char data[16];
+ char key_name[8];
+ unsigned i;
+
+
+ RegOpenKeyEx( HKEY_LOCAL_MACHINE, "Software\\Wine\\WineMine",
+ 0, KEY_QUERY_VALUE, &hkey );
+
+ size = sizeof( data );
+ if( RegQueryValueEx( hkey, "Xpos", NULL, (LPDWORD) &type,
+ (LPBYTE) data, (LPDWORD) &size ) == ERROR_SUCCESS ) {
+ p_board->pos.x = atoi( data );
+ }
+ else
+ p_board->pos.x = GetSystemMetrics( SM_CXFIXEDFRAME );
+
+ size = sizeof( data );
+ if( RegQueryValueEx( hkey, "Ypos", NULL, (LPDWORD) &type,
+ (LPBYTE) data, (LPDWORD) &size ) == ERROR_SUCCESS )
+ p_board->pos.x = atoi( data );
+ else
+ p_board->pos.x = GetSystemMetrics( SM_CYMENU )
+ + GetSystemMetrics( SM_CYCAPTION )
+ + GetSystemMetrics( SM_CYFIXEDFRAME );
+
+ size = sizeof( data );
+ if( RegQueryValueEx( hkey, "Rows", NULL, (LPDWORD) &type,
+ (LPBYTE) data, (LPDWORD) &size ) == ERROR_SUCCESS )
+ p_board->rows = atoi( data );
+ else
+ p_board->rows = BEGINNER_ROWS;
+
+ size = sizeof( data );
+ if( RegQueryValueEx( hkey, "Cols", NULL, (LPDWORD) &type,
+ (LPBYTE) data, (LPDWORD) &size ) == ERROR_SUCCESS )
+ p_board->cols = atoi( data );
+ else
+ p_board->cols = BEGINNER_COLS;
+
+ size = sizeof( data );
+ if( RegQueryValueEx( hkey, "Mines", NULL, (LPDWORD) &type,
+ (LPBYTE) data, (LPDWORD) &size ) == ERROR_SUCCESS )
+ p_board->mines = atoi( data );
+ else
+ p_board->rows = BEGINNER_ROWS;
+
+ size = sizeof( data );
+ if( RegQueryValueEx( hkey, "Difficulty", NULL, (LPDWORD) &type,
+ (LPBYTE) data, (LPDWORD) &size ) == ERROR_SUCCESS )
+ p_board->difficulty = (DIFFICULTY) atoi( data );
+ else
+ p_board->difficulty = BEGINNER;
+
+ size = sizeof( data );
+ if( RegQueryValueEx( hkey, "MarkQ", NULL, (LPDWORD) &type,
+ (LPBYTE) data, (LPDWORD) &size ) == ERROR_SUCCESS )
+ p_board->IsMarkQ = atoi( data );
+ else
+ p_board->IsMarkQ = TRUE;
+
+ for( i = 0; i < 3; i++ ) {
+ wsprintf( key_name, "Name%d", i );
+ size = sizeof( data );
+ if( RegQueryValueEx( hkey, key_name, NULL, (LPDWORD) &type,
+ (LPBYTE) data,
+ (LPDWORD) &size ) == ERROR_SUCCESS )
+ strncpy( p_board->best_name[i], data, sizeof( data ) );
+ else
+ wsprintf( p_board->best_name[i], "Nobody");
+ }
+
+ for( i = 0; i < 3; i++ ) {
+ wsprintf( key_name, "Time%d", i );
+ size = sizeof( data );
+ if( RegQueryValueEx( hkey, key_name, NULL, (LPDWORD) &type,
+ (LPBYTE) data,
+ (LPDWORD) &size ) == ERROR_SUCCESS )
+ p_board->best_time[i] = atoi( data );
+ else
+ p_board->best_time[i] = 999;
+ }
+ RegCloseKey( hkey );
+}
+
+void SaveBoard( BOARD *p_board )
+{
+ DWORD disp;
+ HKEY hkey;
+ SECURITY_ATTRIBUTES sa;
+ unsigned i;
+ char data[16];
+ char key_name[8];
+
+ if( RegCreateKeyEx( HKEY_LOCAL_MACHINE,
+ "Software\\The WINE team\\WineMine", 0, NULL,
+ REG_OPTION_NON_VOLATILE, KEY_WRITE, &sa,
+ &hkey, &disp ) != ERROR_SUCCESS)
+ return;
+
+ wsprintf( data, "%d", p_board->pos.x );
+ RegSetValueEx( hkey, "Xpos", 0, REG_SZ, (LPBYTE) data,
+ sizeof( data ));
+
+ wsprintf( data, "%d", p_board->pos.x );
+ RegSetValueEx( hkey, "Ypos", 0, REG_SZ, (LPBYTE) data,
+ sizeof( data ));
+
+ wsprintf( data, "%d", (int) p_board->difficulty );
+ RegSetValueEx( hkey, "Difficulty", 0, REG_SZ, (LPBYTE) data,
+ sizeof( data ));
+
+ wsprintf( data, "%d", p_board->rows );
+ RegSetValueEx( hkey, "Rows", 0, REG_SZ, (LPBYTE) data,
+ sizeof( data ));
+
+ wsprintf( data, "%d", p_board->cols );
+ RegSetValueEx( hkey, "Cols", 0, REG_SZ, (LPBYTE) data,
+ sizeof( data ));
+
+ wsprintf( data, "%d", p_board->mines );
+ RegSetValueEx( hkey, "Mines", 0, REG_SZ, (LPBYTE) data,
+ sizeof( data ));
+
+ wsprintf( data, "%d", (int) p_board->IsMarkQ );
+ RegSetValueEx( hkey, "MarkQ", 0, REG_SZ, (LPBYTE) data,
+ sizeof( data ));
+
+ for( i = 0; i < 3; i++ ) {
+ wsprintf( key_name, "Name%u", i );
+ strncpy( data, p_board->best_name[i], sizeof( data ) );
+ RegSetValueEx( hkey, key_name, 0, REG_SZ, (LPBYTE) data,
+ sizeof( data ));
+ }
+
+ for( i = 0; i < 3; i++ ) {
+ wsprintf( key_name, "Time%u", i );
+ wsprintf( data, "%d", p_board->best_time[i] );
+ RegSetValueEx( hkey, key_name, 0, REG_SZ, (LPBYTE) data,
+ sizeof( data ));
+ }
+ RegCloseKey( hkey );
+}
+
+void SetDifficulty( BOARD *p_board, DIFFICULTY difficulty )
+{
+ HMENU hMenu = GetMenu( p_board->hWnd );
+
+ CheckMenuItem( hMenu, IDM_BEGINNER + p_board->difficulty, MF_UNCHECKED );
+ p_board->difficulty = difficulty;
+ CheckMenuItem( hMenu, IDM_BEGINNER + difficulty, MF_CHECKED );
+
+ switch( difficulty ) {
+ case BEGINNER:
+ p_board->cols = BEGINNER_COLS;
+ p_board->rows = BEGINNER_ROWS;
+ p_board->mines = BEGINNER_MINES;
+ break;
+
+ case ADVANCED:
+ p_board->cols = ADVANCED_COLS;
+ p_board->rows = ADVANCED_ROWS;
+ p_board->mines = ADVANCED_MINES;
+ break;
+
+ case EXPERT:
+ p_board->cols = EXPERT_COLS;
+ p_board->rows = EXPERT_ROWS;
+ p_board->mines = EXPERT_MINES;
+ break;
+
+ case CUSTOM:
+ DialogBoxParam( p_board->hInst, "DLG_CUSTOM", p_board->hWnd,
+ CustomDlgProc, (LPARAM) p_board);
+ break;
+ }
+}
+
+void CreateBoard( BOARD *p_board )
+{
+ int left, top, bottom, right, wnd_x, wnd_y, wnd_width, wnd_height;
+
+ p_board->mb = MB_NONE;
+ p_board->boxes_left = p_board->cols * p_board->rows - p_board->mines;
+ p_board->num_flags = 0;
+
+ CreateBoxes( p_board );
+
+ p_board->width = p_board->cols * MINE_WIDTH + BOARD_WMARGIN * 2;
+
+ p_board->height = p_board->rows * MINE_HEIGHT + LED_HEIGHT
+ + BOARD_HMARGIN * 3;
+
+ wnd_x = p_board->pos.x - GetSystemMetrics( SM_CXFIXEDFRAME );
+ wnd_y = p_board->pos.y - GetSystemMetrics( SM_CYMENU )
+ - GetSystemMetrics( SM_CYCAPTION )
+ - GetSystemMetrics( SM_CYFIXEDFRAME );
+ wnd_width = p_board->width
+ + GetSystemMetrics( SM_CXFIXEDFRAME ) * 2;
+ wnd_height = p_board->height
+ + GetSystemMetrics( SM_CYMENU )
+ + GetSystemMetrics( SM_CYCAPTION )
+ + GetSystemMetrics( SM_CYFIXEDFRAME ) * 2;
+
+ /* setting the mines rectangle boundary */
+ left = BOARD_WMARGIN;
+ top = BOARD_HMARGIN * 2 + LED_HEIGHT;
+ right = left + p_board->cols * MINE_WIDTH;
+ bottom = top + p_board->rows * MINE_HEIGHT;
+ SetRect( &p_board->mines_rect, left, top, right, bottom );
+
+ /* setting the face rectangle boundary */
+ left = p_board->width / 2 - FACE_WIDTH / 2;
+ top = BOARD_HMARGIN;
+ right = left + FACE_WIDTH;
+ bottom = top + FACE_HEIGHT;
+ SetRect( &p_board->face_rect, left, top, right, bottom );
+
+ /* setting the timer rectangle boundary */
+ left = BOARD_WMARGIN;
+ top = BOARD_HMARGIN;
+ right = left + LED_WIDTH * 3;
+ bottom = top + LED_HEIGHT;
+ SetRect( &p_board->timer_rect, left, top, right, bottom );
+
+ /* setting the counter rectangle boundary */
+ left = p_board->width - BOARD_WMARGIN - LED_WIDTH * 3;
+ top = BOARD_HMARGIN;
+ right = p_board->width - BOARD_WMARGIN;
+ bottom = top + LED_HEIGHT;
+ SetRect( &p_board->counter_rect, left, top, right, bottom );
+
+ p_board->status = WAITING;
+ p_board->face_bmp = SMILE_BMP;
+ p_board->time = 0;
+
+ MoveWindow( p_board->hWnd, wnd_x, wnd_y, wnd_width, wnd_height, TRUE );
+ RedrawWindow( p_board->hWnd, NULL, NULL,
+ RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE );
+}
+
+
+void CheckLevel( BOARD *p_board )
+{
+ if( p_board->rows < BEGINNER_ROWS )
+ p_board->rows = BEGINNER_ROWS;
+
+ if( p_board->rows > MAX_ROWS )
+ p_board->rows = MAX_ROWS;
+
+ if( p_board->cols < BEGINNER_COLS )
+ p_board->cols = BEGINNER_COLS;
+
+ if( p_board->cols > MAX_COLS )
+ p_board->cols = MAX_COLS;
+
+ if( p_board->mines < BEGINNER_MINES )
+ p_board->mines = BEGINNER_MINES;
+
+ if( p_board->mines > p_board->cols * p_board->rows - 1 )
+ p_board->mines = p_board->cols * p_board->rows - 1;
+}
+
+
+void CreateBoxes( BOARD *p_board )
+{
+ int i, j;
+ unsigned col, row;
+
+ srand( (unsigned) time( NULL ) );
+
+ /* Create the boxes...
+ * We actually create them with an empty border,
+ * so special care doesn't have to be taken on the edges
+ */
+
+ for( col = 0; col <= p_board->cols + 1; col++ )
+ for( row = 0; row <= p_board->rows + 1; row++ ) {
+ p_board->box[col][row].IsPressed = FALSE;
+ p_board->box[col][row].IsMine = FALSE;
+ p_board->box[col][row].FlagType = NORMAL;
+ p_board->box[col][row].NumMines = 0;
+ }
+
+ /* create mines */
+ i = 0;
+ while( (unsigned) i < p_board->mines ) {
+ col = (int) (p_board->cols * (float) rand() / RAND_MAX + 1);
+ row = (int) (p_board->rows * (float) rand() / RAND_MAX + 1);
+
+ if( !p_board->box[col][row].IsMine ) {
+ i++;
+ p_board->box[col][row].IsMine = TRUE;
+ }
+ }
+
+ /*
+ * Now we label the remaining boxes with the
+ * number of mines surrounding them.
+ */
+
+ for( col = 1; col < p_board->cols + 1; col++ )
+ for( row = 1; row < p_board->rows + 1; row++ ) {
+ for( i = -1; i <= 1; i++ )
+ for( j = -1; j <= 1; j++ ) {
+ if( p_board->box[col + i][row + j].IsMine ) {
+ p_board->box[col][row].NumMines++ ;
+ }
+ }
+ }
+}
+
+void DrawMines ( HDC hdc, BOARD *p_board )
+{
+ unsigned col, row;
+
+ for( row = 1; row < p_board->rows + 1; row++ )
+ for( col = 1; col < p_board->cols + 1; col++ )
+ DrawMine( hdc, p_board, col, row, FALSE );
+}
+
+void DrawMine( HDC hdc, BOARD *p_board, unsigned col, unsigned row, BOOL IsPressed )
+{
+ BITMAP bm ;
+ HDC hMemDC ;
+ MINEBMP_OFFSET offset = BOX_BMP;
+
+
+ if( col == 0 || col > p_board->cols || row == 0 || row > p_board->rows )
+ return;
+
+ if( p_board->status == GAMEOVER ) {
+ if( p_board->box[col][row].IsMine ) {
+ switch( p_board->box[col][row].FlagType ) {
+ case FLAG:
+ offset = FLAG_BMP;
+ break;
+ case COMPLETE:
+ offset = EXPLODE_BMP;
+ break;
+ case NORMAL:
+ offset = MINE_BMP;
+ }
+ }
+ else {
+ switch( p_board->box[col][row].FlagType ) {
+ case QUESTION:
+ offset = QUESTION_BMP;
+ break;
+ case FLAG:
+ offset = WRONG_BMP;
+ break;
+ case NORMAL:
+ offset = BOX_BMP;
+ }
+ }
+ }
+ else { /* WAITING or PLAYING */
+ switch( p_board->box[col][row].FlagType ) {
+ case QUESTION:
+ if( !IsPressed )
+ offset = QUESTION_BMP;
+ else
+ offset = QPRESS_BMP;
+ break;
+ case FLAG:
+ offset = FLAG_BMP;
+ break;
+ case NORMAL:
+ if( !IsPressed )
+ offset = BOX_BMP;
+ else
+ offset = MPRESS_BMP;
+ }
+ }
+
+ if( p_board->box[col][row].FlagType == COMPLETE
+ && !p_board->box[col][row].IsMine )
+ offset = (MINEBMP_OFFSET) p_board->box[col][row].NumMines;
+
+ hMemDC = CreateCompatibleDC( hdc );
+ SelectObject (hMemDC, p_board->hMinesBMP);
+ GetObject (p_board->hMinesBMP, sizeof (BITMAP), (PSTR) &bm);
+
+ BitBlt( hdc,
+ (col - 1) * MINE_WIDTH + p_board->mines_rect.left,
+ (row - 1) * MINE_HEIGHT + p_board->mines_rect.top,
+ MINE_WIDTH, MINE_HEIGHT,
+ hMemDC, 0, offset * MINE_HEIGHT, SRCCOPY);
+
+ DeleteDC( hMemDC );
+}
+
+void DrawLeds( HDC hdc, BOARD *p_board, int number, int x, int y )
+{
+ HDC hMemDC;
+ BITMAP bm ;
+ unsigned led[3], i;
+ int count;
+
+ count = number;
+ if( count < 1000 ) {
+ if( count >= 0 ) {
+ led[0] = count / 100 ;
+ count -= led[0] * 100;
+ }
+ else {
+ led[0] = 10; /* negative sign */
+ count = -count;
+ }
+ led[1] = count / 10;
+ count -= led[1] * 10;
+ led[2] = count;
+ }
+ else {
+ for( i = 0; i < 3; i++ )
+ led[i] = 10;
+ }
+
+ /* use unlit led if not playing */
+ if( p_board->status == WAITING )
+ for( i = 0; i < 3; i++ )
+ led[i] = 11;
+
+ hMemDC = CreateCompatibleDC( hdc );
+ SelectObject (hMemDC, p_board->hLedsBMP);
+ GetObject (p_board->hLedsBMP, sizeof (BITMAP), (PSTR) &bm);
+
+ for( i = 0; i < 3; i++ ) {
+ BitBlt( hdc,
+ i * LED_WIDTH + x,
+ y,
+ LED_WIDTH,
+ LED_HEIGHT,
+ hMemDC,
+ 0,
+ led[i] * LED_HEIGHT,
+ SRCCOPY);
+ }
+ DeleteDC( hMemDC );
+}
+
+
+void DrawFace( HDC hdc, BOARD *p_board )
+{
+ BITMAP bm ;
+ HDC hMemDC ;
+
+ hMemDC = CreateCompatibleDC( hdc );
+ SelectObject (hMemDC, p_board->hFacesBMP);
+ GetObject (p_board->hFacesBMP, sizeof (BITMAP), (PSTR) &bm);
+
+ BitBlt( hdc,
+ p_board->face_rect.left,
+ p_board->face_rect.top,
+ FACE_WIDTH,
+ FACE_HEIGHT,
+ hMemDC, 0, p_board->face_bmp * FACE_HEIGHT, SRCCOPY);
+
+ DeleteDC( hMemDC );
+}
+
+
+void DrawBoard( HDC hdc, PAINTSTRUCT *ps, BOARD *p_board )
+{
+ RECT tmp_rect;
+
+ if( IntersectRect( &tmp_rect, &ps->rcPaint, &p_board->counter_rect ) )
+ DrawLeds( hdc, p_board, p_board->mines - p_board->num_flags,
+ p_board->counter_rect.left,
+ p_board->counter_rect.top );
+
+ if( IntersectRect( &tmp_rect, &ps->rcPaint, &p_board->timer_rect ) )
+ DrawLeds( hdc, p_board, p_board->time,
+ p_board->timer_rect.left,
+ p_board->timer_rect.top );
+
+ if( IntersectRect( &tmp_rect, &ps->rcPaint, &p_board->face_rect ) )
+ DrawFace( hdc, p_board );
+
+ if( IntersectRect( &tmp_rect, &ps->rcPaint, &p_board->mines_rect ) )
+ DrawMines( hdc, p_board );
+}
+
+
+void TestBoard( HWND hWnd, BOARD *p_board, unsigned x, unsigned y, int msg )
+{
+ POINT pt;
+
+
+ pt.x = x;
+ pt.y = y;
+
+ if( PtInRect( &p_board->mines_rect, pt ) && p_board->status != GAMEOVER
+ && p_board->status != WON )
+ TestMines( p_board, pt, msg );
+ else {
+ UnpressBoxes( p_board,
+ p_board->press.x,
+ p_board->press.y );
+ p_board->press.x = 0;
+ p_board->press.y = 0;
+ }
+
+ if( p_board->boxes_left == 0 ) {
+ p_board->status = WON;
+
+ if( p_board->difficulty != CUSTOM &&
+ p_board->time < p_board->best_time[p_board->difficulty] ) {
+ p_board->best_time[p_board->difficulty] = p_board->time;
+
+ DialogBoxParam( p_board->hInst, "DLG_CONGRATS", hWnd,
+ CongratsDlgProc, (LPARAM) p_board);
+
+ DialogBoxParam( p_board->hInst, "DLG_TIMES", hWnd,
+ TimesDlgProc, (LPARAM) p_board);
+ }
+ }
+ TestFace( p_board, pt, msg );
+}
+
+void TestMines( BOARD *p_board, POINT pt, int msg )
+{
+ BOOL draw = TRUE;
+ unsigned col, row;
+
+ col = (pt.x - p_board->mines_rect.left) / MINE_WIDTH + 1;
+ row = (pt.y - p_board->mines_rect.top ) / MINE_HEIGHT + 1;
+
+ switch ( msg ) {
+ case WM_LBUTTONDOWN:
+ if( p_board->press.x != col || p_board->press.y != row ) {
+ UnpressBox( p_board,
+ p_board->press.x, p_board->press.y );
+ p_board->press.x = col;
+ p_board->press.y = row;
+ PressBox( p_board, col, row );
+ }
+ draw = FALSE;
+ break;
+
+ case WM_LBUTTONUP:
+ if( p_board->press.x != col || p_board->press.y != row )
+ UnpressBox( p_board,
+ p_board->press.x, p_board->press.y );
+ p_board->press.x = 0;
+ p_board->press.y = 0;
+ if( p_board->box[col][row].FlagType != FLAG )
+ p_board->status = PLAYING;
+ CompleteBox( p_board, col, row );
+ break;
+
+ case WM_MBUTTONDOWN:
+ PressBoxes( p_board, col, row );
+ draw = FALSE;
+ break;
+
+ case WM_MBUTTONUP:
+ if( p_board->press.x != col || p_board->press.y != row )
+ UnpressBoxes( p_board,
+ p_board->press.x, p_board->press.y );
+ p_board->press.x = 0;
+ p_board->press.y = 0;
+ CompleteBoxes( p_board, col, row );
+ break;
+
+ case WM_RBUTTONDOWN:
+ AddFlag( p_board, col, row );
+ break;
+ }
+ if( draw )
+ {
+ RedrawWindow( p_board->hWnd, NULL, NULL,
+ RDW_INVALIDATE | RDW_UPDATENOW );
+ }
+}
+
+
+void TestFace( BOARD *p_board, POINT pt, int msg )
+{
+ if( p_board->status == PLAYING || p_board->status == WAITING ) {
+ if( msg == WM_LBUTTONDOWN || msg == WM_MBUTTONDOWN )
+ p_board->face_bmp = OOH_BMP;
+ else p_board->face_bmp = SMILE_BMP;
+ }
+
+ if( p_board->status == GAMEOVER )
+ p_board->face_bmp = DEAD_BMP;
+
+ if( p_board->status == WON )
+ p_board->face_bmp = COOL_BMP;
+
+ if( PtInRect( &p_board->face_rect, pt ) ) {
+ if( msg == WM_LBUTTONDOWN )
+ p_board->face_bmp = SPRESS_BMP;
+
+ if( msg == WM_LBUTTONUP )
+ CreateBoard( p_board );
+ }
+ RedrawWindow( p_board->hWnd, &p_board->face_rect, NULL,
+ RDW_INVALIDATE | RDW_UPDATENOW );
+}
+
+
+void CompleteBox( BOARD *p_board, unsigned col, unsigned row )
+{
+ int i, j;
+
+ if( p_board->box[col][row].FlagType != COMPLETE &&
+ p_board->box[col][row].FlagType != FLAG &&
+ col > 0 && col < p_board->cols + 1 &&
+ row > 0 && row < p_board->rows + 1 ) {
+ p_board->box[col][row].FlagType = COMPLETE;
+
+ if( p_board->box[col][row].IsMine ) {
+ p_board->face_bmp = DEAD_BMP;
+ p_board->status = GAMEOVER;
+ }
+ else if( p_board->status != GAMEOVER )
+ p_board->boxes_left--;
+
+ if( p_board->box[col][row].NumMines == 0 )
+ {
+ for( i = -1; i <= 1; i++ )
+ for( j = -1; j <= 1; j++ )
+ CompleteBox( p_board, col + i, row + j );
+ }
+ }
+}
+
+
+void CompleteBoxes( BOARD *p_board, unsigned col, unsigned row )
+{
+ unsigned numFlags = 0;
+ int i, j;
+
+ if( p_board->box[col][row].FlagType == COMPLETE ) {
+ for( i = -1; i <= 1; i++ )
+ for( j = -1; j <= 1; j++ ) {
+ if( p_board->box[col+i][row+j].FlagType == FLAG )
+ numFlags++;
+ }
+
+ if( numFlags == p_board->box[col][row].NumMines ) {
+ for( i = -1; i <= 1; i++ )
+ for( j = -1; j <= 1; j++ ) {
+ if( p_board->box[col+i][row+j].FlagType != FLAG )
+ CompleteBox( p_board, col+i, row+j );
+ }
+ }
+ }
+}
+
+
+void AddFlag( BOARD *p_board, unsigned col, unsigned row )
+{
+ if( p_board->box[col][row].FlagType != COMPLETE ) {
+ switch( p_board->box[col][row].FlagType ) {
+ case FLAG:
+ if( p_board->IsMarkQ )
+ p_board->box[col][row].FlagType = QUESTION;
+ else
+ p_board->box[col][row].FlagType = NORMAL;
+ p_board->num_flags--;
+ break;
+
+ case QUESTION:
+ p_board->box[col][row].FlagType = NORMAL;
+ break;
+
+ default:
+ p_board->box[col][row].FlagType = FLAG;
+ p_board->num_flags++;
+ }
+ }
+}
+
+
+void PressBox( BOARD *p_board, unsigned col, unsigned row )
+{
+ HDC hdc;
+
+ hdc = GetDC( p_board->hWnd );
+ DrawMine( hdc, p_board, col, row, TRUE );
+ ReleaseDC( p_board->hWnd, hdc );
+}
+
+
+void PressBoxes( BOARD *p_board, unsigned col, unsigned row )
+{
+ int i, j;
+
+ for( i = -1; i <= 1; i++ )
+ for( j = -1; j <= 1; j++ ) {
+ p_board->box[col + i][row + j].IsPressed = TRUE;
+ PressBox( p_board, col + i, row + j );
+ }
+
+ for( i = -1; i <= 1; i++ )
+ for( j = -1; j <= 1; j++ ) {
+ if( !p_board->box[p_board->press.x + i][p_board->press.y + j].IsPressed )
+ UnpressBox( p_board, p_board->press.x + i, p_board->press.y + j );
+ }
+
+ for( i = -1; i <= 1; i++ )
+ for( j = -1; j <= 1; j++ ) {
+ p_board->box[col + i][row + j].IsPressed = FALSE;
+ PressBox( p_board, col + i, row + j );
+ }
+
+ p_board->press.x = col;
+ p_board->press.y = row;
+}
+
+
+void UnpressBox( BOARD *p_board, unsigned col, unsigned row )
+{
+ HDC hdc;
+
+ hdc = GetDC( p_board->hWnd );
+ DrawMine( hdc, p_board, col, row, FALSE );
+ ReleaseDC( p_board->hWnd, hdc );
+}
+
+
+void UnpressBoxes( BOARD *p_board, unsigned col, unsigned row )
+{
+ int i, j;
+
+ for( i = -1; i <= 1; i++ )
+ for( j = -1; j <= 1; j++ ) {
+ UnpressBox( p_board, col + i, row + j );
+ }
+}
diff --git a/programs/winemine/main.h b/programs/winemine/main.h
new file mode 100644
index 0000000..795b247
--- /dev/null
+++ b/programs/winemine/main.h
@@ -0,0 +1,161 @@
+#include <windows.h>
+
+#define BEGINNER_MINES 10
+#define BEGINNER_COLS 8
+#define BEGINNER_ROWS 8
+
+#define ADVANCED_MINES 40
+#define ADVANCED_COLS 16
+#define ADVANCED_ROWS 16
+
+#define EXPERT_MINES 99
+#define EXPERT_COLS 30
+#define EXPERT_ROWS 16
+
+#define MAX_COLS 30
+#define MAX_ROWS 24
+
+#define BOTTOM_MARGIN 20
+#define BOARD_WMARGIN 5
+#define BOARD_HMARGIN 5
+
+/* mine defines */
+#define MINE_WIDTH 16
+#define MINE_HEIGHT 16
+#define LED_WIDTH 12
+#define LED_HEIGHT 23
+#define FACE_WIDTH 24
+#define FACE_HEIGHT 24
+
+typedef enum { SPRESS_BMP, COOL_BMP, DEAD_BMP, OOH_BMP, SMILE_BMP } FACE_BMP;
+
+typedef enum { WAITING, PLAYING, GAMEOVER, WON } GAME_STATUS;
+
+typedef enum {
+ MPRESS_BMP, ONE_BMP, TWO_BMP, THREE_BMP, FOUR_BMP, FIVE_BMP, SIX_BMP,
+ SEVEN_BMP, EIGHT_BMP, BOX_BMP, FLAG_BMP, QUESTION_BMP, EXPLODE_BMP,
+ WRONG_BMP, MINE_BMP, QPRESS_BMP
+} MINEBMP_OFFSET;
+
+typedef enum { BEGINNER, ADVANCED, EXPERT, CUSTOM } DIFFICULTY;
+
+typedef struct tagBOARD
+{
+ BOOL IsMarkQ;
+ HDC hdc;
+ HINSTANCE hInst;
+ HWND hWnd;
+ HBITMAP hMinesBMP;
+ HBITMAP hFacesBMP;
+ HBITMAP hLedsBMP;
+ RECT mines_rect;
+ RECT face_rect;
+ RECT timer_rect;
+ RECT counter_rect;
+
+ unsigned width;
+ unsigned height;
+ POINT pos;
+
+ unsigned time;
+ unsigned num_flags;
+ unsigned boxes_left;
+ unsigned num_mines;
+
+ /* difficulty info */
+ unsigned rows;
+ unsigned cols;
+ unsigned mines;
+ char best_name [3][16];
+ unsigned best_time [3];
+ DIFFICULTY difficulty;
+
+ POINT press;
+
+ /* defines for mb */
+ #define MB_NONE 0
+ #define MB_LEFTDOWN 1
+ #define MB_LEFTUP 2
+ #define MB_RIGHTDOWN 3
+ #define MB_RIGHTUP 4
+ #define MB_BOTHDOWN 5
+ #define MB_BOTHUP 6
+ unsigned mb;
+
+ FACE_BMP face_bmp;
+ GAME_STATUS status;
+ struct BOX_STRUCT
+ {
+ unsigned IsMine : 1;
+ unsigned IsPressed : 1;
+ unsigned FlagType : 2;
+ unsigned NumMines : 4;
+ } box [MAX_COLS + 2] [MAX_ROWS + 2];
+
+ /* defines for FlagType */
+ #define NORMAL 0
+ #define QUESTION 1
+ #define FLAG 2
+ #define COMPLETE 3
+
+} BOARD;
+
+void ExitApp( int error );
+
+void InitBoard( BOARD *p_board );
+
+void LoadBoard( BOARD *p_board );
+
+void SaveBoard( BOARD *p_board );
+
+void SetDifficulty( BOARD *p_board, DIFFICULTY difficulty );
+
+void CheckLevel( BOARD *p_board );
+
+void CreateBoard( BOARD *p_board );
+
+void CreateBoxes( BOARD *p_board );
+
+void TestBoard( HWND hWnd, BOARD *p_board, unsigned x, unsigned y, int msg );
+
+void TestMines( BOARD *p_board, POINT pt, int msg );
+
+void TestFace( BOARD *p_board, POINT pt, int msg );
+
+void DrawBoard( HDC hdc, PAINTSTRUCT *ps, BOARD *p_board );
+
+void DrawMines( HDC hdc, BOARD *p_board );
+
+void DrawMine( HDC hdc, BOARD *p_board, unsigned col, unsigned row, BOOL IsPressed );
+
+void AddFlag( BOARD *p_board, unsigned col, unsigned row );
+
+void CompleteBox( BOARD *p_board, unsigned col, unsigned row );
+
+void CompleteBoxes( BOARD *p_board, unsigned col, unsigned row );
+
+void PressBox( BOARD *p_board, unsigned col, unsigned row );
+
+void PressBoxes( BOARD *p_board, unsigned col, unsigned row );
+
+void UnpressBox( BOARD *p_board, unsigned col, unsigned row );
+
+void UnpressBoxes( BOARD *p_board, unsigned col, unsigned row );
+
+void UpdateTimer( BOARD *p_board );
+
+void DrawLeds( HDC hdc, BOARD *p_board, int number, int x, int y);
+
+void DrawFace( HDC hdc, BOARD *p_board );
+
+LRESULT WINAPI MainProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
+
+BOOL CALLBACK CustomDlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam );
+
+BOOL CALLBACK CongratsDlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam );
+
+BOOL CALLBACK TimesDlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam );
+
+BOOL CALLBACK AboutDlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam );
+
+/* end of header */
diff --git a/programs/winemine/resource.h b/programs/winemine/resource.h
new file mode 100644
index 0000000..17bb4d6
--- /dev/null
+++ b/programs/winemine/resource.h
@@ -0,0 +1,35 @@
+/*
+ * WineMine (resource.h)
+ *
+ * Copyright 2000 Joshua Thielen <jt85296@ltu.edu>
+ * To be distributed under the Wine License
+ */
+
+
+#define ID_TIMER 1000
+
+/* menu defines */
+#define IDM_NEW 1001
+#define IDM_EXIT 1002
+#define IDM_TIMES 1003
+#define IDM_ABOUT 1004
+#define IDM_BEGINNER 1005
+#define IDM_ADVANCED 1006
+#define IDM_EXPERT 1007
+#define IDM_CUSTOM 1008
+#define IDM_MARKQ 1009
+
+#define IDC_TIME1 1011
+#define IDC_TIME2 1012
+#define IDC_TIME3 1013
+#define IDC_NAME1 1014
+#define IDC_NAME2 1015
+#define IDC_NAME3 1016
+
+#define IDC_EDITNAME 1021
+
+#define IDC_EDITCOLS 1031
+#define IDC_EDITROWS 1032
+#define IDC_EDITMINES 1033
+
+#define IDS_APPNAME 1101
diff --git a/programs/winemine/rsrc.rc b/programs/winemine/rsrc.rc
new file mode 100644
index 0000000..f6ddf84
--- /dev/null
+++ b/programs/winemine/rsrc.rc
@@ -0,0 +1,539 @@
+/*
+ * WineMine (rsrc.rc)
+ *
+ * Copyright 2000 Joshua Thielen <jt85296@ltu.edu>
+ * To be distributed under the Wine License
+ */
+
+#include <windows.h>
+#include "resource.h"
+
+WINEMINE ICON MOVEABLE
+{
+ '00 00 01 00 01 00 20 20 10 00 00 00 00 00 E8 02'
+ '00 00 16 00 00 00 28 00 00 00 20 00 00 00 40 00'
+ '00 00 01 00 04 00 00 00 00 00 00 02 00 00 00 00'
+ '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+ '00 00 00 00 80 00 00 80 00 00 00 80 80 00 80 00'
+ '00 00 80 00 80 00 80 80 00 00 80 80 80 00 C0 C0'
+ 'C0 00 00 00 FF 00 00 FF 00 00 00 FF FF 00 FF 00'
+ '00 00 FF 00 FF 00 FF FF 00 00 FF FF FF 00 22 22'
+ '22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22'
+ '22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22'
+ '22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22'
+ '22 22 22 22 20 00 00 02 22 22 22 22 22 22 22 22'
+ '22 22 22 22 22 00 00 22 22 22 22 22 22 22 22 22'
+ '22 22 22 22 22 20 02 22 22 22 22 22 22 22 22 22'
+ '22 22 22 22 22 20 02 22 22 22 22 22 22 22 22 22'
+ '22 22 22 22 22 20 02 22 22 22 22 22 22 22 22 22'
+ '22 22 22 22 22 20 02 22 22 22 22 22 22 22 22 22'
+ '22 22 20 07 77 70 07 77 70 02 22 22 22 22 22 22'
+ '22 22 20 07 77 00 07 77 70 02 22 22 22 22 22 22'
+ '22 22 27 70 00 00 00 00 07 72 22 22 22 22 22 22'
+ '22 22 27 70 00 00 00 00 07 72 22 22 22 22 22 22'
+ '20 22 27 70 00 00 00 00 07 72 22 02 22 22 22 22'
+ '00 02 27 00 00 00 00 00 07 72 20 00 22 22 22 20'
+ '00 00 00 00 00 00 00 00 00 00 00 00 02 22 22 20'
+ '00 00 00 00 00 00 00 00 00 00 00 00 02 22 22 22'
+ '00 02 27 00 00 00 0F F0 08 82 20 00 22 22 22 22'
+ '20 22 27 70 00 00 0F F0 08 82 20 02 22 22 22 22'
+ '22 22 27 70 00 00 00 F0 08 82 22 22 22 22 22 22'
+ '22 22 27 70 00 00 00 00 08 82 22 22 22 22 22 22'
+ '22 22 20 07 77 00 00 88 80 02 22 22 22 22 22 22'
+ '22 22 20 07 78 80 08 88 80 02 22 22 22 22 22 22'
+ '22 22 22 22 22 20 02 22 22 22 22 22 22 22 22 22'
+ '22 22 22 22 22 20 02 22 22 22 22 22 22 22 22 22'
+ '22 22 22 22 22 20 02 22 22 22 22 22 22 22 22 22'
+ '22 22 22 22 22 20 02 22 22 22 22 22 22 22 22 22'
+ '22 22 22 22 22 00 00 22 22 22 22 22 22 22 22 22'
+ '22 22 22 22 20 00 00 02 22 22 22 22 22 22 22 22'
+ '22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22'
+ '22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22'
+ '22 22 22 22 22 22 22 22 22 22 22 22 22 22 00 00'
+ '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+ '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+ '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+ '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+ '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+ '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+ '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+ '00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+}
+
+FACES BITMAP MOVEABLE
+{
+ '42 4D 16 06 00 00 00 00 00 00 76 00 00 00 28 00'
+ '00 00 18 00 00 00 78 00 00 00 01 00 04 00 00 00'
+ '00 00 A0 05 00 00 C4 0E 00 00 C4 0E 00 00 00 00'
+ '00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 80'
+ '00 00 00 80 80 00 80 00 00 00 80 00 80 00 80 80'
+ '00 00 C0 C0 C0 00 80 80 80 00 00 00 FF 00 00 FF'
+ '00 00 00 FF FF 00 FF 00 00 00 FF 00 FF 00 FF FF'
+ '00 00 FF FF FF 00 77 77 77 77 77 77 77 77 77 77'
+ '77 77 F7 77 77 77 77 77 77 77 77 77 77 77 FF 00'
+ '00 00 00 00 00 00 00 00 00 77 FF 00 00 00 00 00'
+ '00 00 00 00 00 77 FF 00 00 00 00 00 00 00 00 00'
+ '00 77 FF 00 00 00 0B BB BB B3 00 00 00 77 FF 00'
+ '00 00 BB BB BB BB 30 00 00 77 FF 00 00 0B B0 00'
+ '00 0B B3 00 00 77 FF 00 00 BB 0B BB BB B0 BB 30'
+ '00 77 FF 00 0B BB BB BB BB BB BB B3 00 77 FF 00'
+ '0B BB BB BB BB BB BB B3 00 77 FF 00 0B BB BB BB'
+ 'BB BB BB B3 00 77 FF 00 0B BB BB BB BB BB BB B3'
+ '00 77 FF 00 0B BB B0 0B B0 0B BB B3 00 77 FF 00'
+ '0B BB B0 0B B0 0B BB B3 00 77 FF 00 00 BB B0 0B'
+ 'B0 0B BB 30 00 77 FF 00 00 0B BB BB BB BB B3 00'
+ '00 77 FF 00 00 00 BB BB BB BB 30 00 00 77 FF 00'
+ '00 00 0B BB BB B3 00 00 00 77 FF 00 70 00 00 00'
+ '00 00 00 00 00 77 FF 00 07 00 00 00 00 00 00 00'
+ '00 77 FF 00 00 00 00 00 00 00 00 00 00 77 FF FF'
+ 'FF FF FF FF FF FF FF FF FF F7 FF FF FF FF FF FF'
+ 'FF FF FF FF FF FF 77 77 77 77 77 77 77 77 77 77'
+ '77 77 F7 77 77 77 77 77 77 77 77 77 77 77 FF 00'
+ '00 00 00 00 00 00 00 00 00 77 FF 00 00 00 00 00'
+ '00 00 00 00 00 77 FF 00 00 00 00 00 00 00 00 00'
+ '00 77 FF 00 00 00 0B BB BB B3 00 00 00 77 FF 00'
+ '00 00 BB BB BB BB 30 00 00 77 FF 00 00 0B BB 00'
+ '00 BB B3 00 00 77 FF 00 00 0B B0 00 00 0B BB 30'
+ '00 77 FF 00 0B 00 BB 00 00 BB B0 03 00 77 FF 00'
+ '0B B0 BB BB BB BB 00 B3 00 77 FF 00 0B B0 0B BB'
+ 'BB B0 0B B3 00 77 FF 00 0B BB 00 BB BB B0 BB B3'
+ '00 77 FF 00 0B BB B0 BB BB 00 BB B3 00 77 FF 00'
+ '0B BB 00 0B B0 00 0B B3 00 77 FF 00 00 BB 00 00'
+ 'B0 00 BB 30 00 77 FF 00 00 0B B0 00 B0 0B B3 00'
+ '00 77 FF 00 00 00 BB BB BB BB 30 00 00 77 FF 00'
+ '70 00 0B BB BB B3 00 00 00 77 FF 00 07 00 00 00'
+ '00 00 00 00 00 77 FF 00 00 00 00 00 00 00 00 00'
+ '00 77 FF 00 00 00 00 00 00 00 00 00 00 77 FF FF'
+ 'FF FF FF FF FF FF FF FF FF F7 FF FF FF FF FF FF'
+ 'FF FF FF FF FF FF 77 77 77 77 77 77 77 77 77 77'
+ '77 77 F7 77 77 77 77 77 77 77 77 77 77 77 FF 00'
+ '00 00 00 00 00 00 00 00 00 77 FF 00 00 00 00 00'
+ '00 00 00 00 00 77 FF 00 00 00 00 00 00 00 00 00'
+ '00 77 FF 00 00 00 07 77 77 73 00 00 00 77 FF 00'
+ '00 00 77 77 77 77 30 00 00 77 FF 00 00 07 70 77'
+ '77 07 73 00 00 77 FF 00 00 77 77 00 00 77 77 30'
+ '00 77 FF 00 07 77 77 77 77 77 77 73 00 77 FF 00'
+ '07 77 77 77 77 77 77 73 00 77 FF 00 07 77 77 77'
+ '77 77 77 73 00 77 FF 00 07 77 77 77 77 77 77 73'
+ '00 77 FF 00 07 77 07 07 70 70 77 73 00 77 FF 00'
+ '07 77 70 77 77 07 77 73 00 77 FF 00 00 77 07 07'
+ '70 70 77 30 00 77 FF 00 00 07 77 77 77 77 73 00'
+ '00 77 FF 00 00 00 77 77 77 77 30 00 00 77 FF 00'
+ '70 00 07 77 77 73 00 00 00 77 FF 00 07 00 00 00'
+ '00 00 00 00 00 77 FF 00 00 00 00 00 00 00 00 00'
+ '00 77 FF 00 00 00 00 00 00 00 00 00 00 77 FF FF'
+ 'FF FF FF FF FF FF FF FF FF F7 FF FF FF FF FF FF'
+ 'FF FF FF FF FF FF 77 77 77 77 77 77 77 77 77 77'
+ '77 77 F7 77 77 77 77 77 77 77 77 77 77 77 FF 00'
+ '00 00 00 00 00 00 00 00 00 77 FF 00 00 00 00 00'
+ '00 00 00 00 00 77 FF 00 00 00 00 00 00 00 00 00'
+ '00 77 FF 00 00 00 0B BB BB B3 00 00 00 77 FF 00'
+ '00 00 BB BB BB BB 30 00 00 77 FF 00 00 0B B0 00'
+ '00 0B B3 00 00 77 FF 00 00 BB 0B BB BB B0 BB 30'
+ '00 77 FF 00 0B B0 BB BB BB BB 0B B3 00 77 FF 00'
+ '0B BB BB BB BB BB BB B3 00 77 FF 00 0B BB BB BB'
+ 'BB BB BB B3 00 77 FF 00 0B BB BB BB BB BB BB B3'
+ '00 77 FF 00 0B BB B0 0B B0 0B BB B3 00 77 FF 00'
+ '0B BB B0 0B B0 0B BB B3 00 77 FF 00 00 B0 00 00'
+ '00 00 0B 30 00 77 FF 00 00 0B BB BB BB BB B3 00'
+ '00 77 FF 00 00 00 BB BB BB BB 30 00 00 77 FF 00'
+ '70 00 0B BB BB B3 00 00 00 77 FF 00 07 00 00 00'
+ '00 00 00 00 00 77 FF 00 00 00 00 00 00 00 00 00'
+ '00 77 FF 00 00 00 00 00 00 00 00 00 00 77 FF FF'
+ 'FF FF FF FF FF FF FF FF FF F7 FF FF FF FF FF FF'
+ 'FF FF FF FF FF FF 7F FF FF FF FF FF FF FF FF FF'
+ 'FF FF 77 00 00 00 00 00 00 00 00 00 00 FF 77 00'
+ '00 00 00 00 00 00 00 00 00 FF 77 00 00 00 00 00'
+ '00 00 00 80 00 FF 77 00 00 00 00 00 00 00 00 08'
+ '00 FF 77 00 00 00 0B BB BB B0 00 00 00 FF 77 00'
+ '00 00 BB BB BB BB 00 00 00 FF 77 00 00 03 30 00'
+ '00 0B B0 00 00 FF 77 00 00 33 03 BB BB B0 BB 00'
+ '00 FF 77 00 03 30 33 3B BB BB 0B B0 00 FF 77 00'
+ '03 33 33 33 BB BB BB B0 00 FF 77 00 03 33 33 33'
+ '3B BB BB B0 00 FF 77 00 03 33 33 33 33 BB BB B0'
+ '00 FF 77 00 03 33 30 03 30 0B BB B0 00 FF 77 00'
+ '03 33 30 03 30 03 BB B0 00 FF 77 00 00 33 30 03'
+ '30 03 3B 00 00 FF 77 00 00 03 33 33 33 33 30 00'
+ '00 FF 77 00 00 00 33 33 33 33 00 00 00 FF 77 00'
+ '00 00 03 33 33 30 00 00 00 FF 77 00 00 00 00 00'
+ '00 00 00 00 00 FF 77 00 00 00 00 00 00 00 00 00'
+ '00 FF 77 00 00 00 00 00 00 00 00 00 00 FF 77 77'
+ '77 77 77 77 77 77 77 77 77 7F 77 77 77 77 77 77'
+ '77 77 77 77 77 77'
+}
+
+LEDS BITMAP MOVEABLE
+{
+ '42 4D 16 09 00 00 00 00 00 00 76 00 00 00 28 00'
+ '00 00 0D 00 00 00 14 01 00 00 01 00 04 00 00 00'
+ '00 00 A0 08 00 00 C4 0E 00 00 C4 0E 00 00 00 00'
+ '00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 80'
+ '00 00 00 80 80 00 80 00 00 00 80 00 80 00 80 80'
+ '00 00 C0 C0 C0 00 80 80 80 00 00 00 FF 00 00 FF'
+ '00 00 00 FF FF 00 FF 00 00 00 FF 00 FF 00 FF FF'
+ '00 00 FF FF FF 00 00 00 00 00 00 00 00 00 00 22'
+ '22 22 22 20 00 00 00 02 22 22 22 00 00 00 02 00'
+ '00 00 00 02 00 00 02 20 00 00 00 22 00 00 02 20'
+ '00 00 00 22 00 00 02 20 00 00 00 22 00 00 02 20'
+ '00 00 00 22 00 00 02 20 00 00 00 22 00 00 02 20'
+ '00 00 00 22 00 00 02 00 00 00 00 02 00 00 00 00'
+ '00 00 00 00 00 00 02 00 00 00 00 02 00 00 02 20'
+ '00 00 00 22 00 00 02 20 00 00 00 22 00 00 02 20'
+ '00 00 00 22 00 00 02 20 00 00 00 22 00 00 02 20'
+ '00 00 00 22 00 00 02 20 00 00 00 22 00 00 02 00'
+ '00 00 00 02 00 00 00 02 22 22 22 00 00 00 00 22'
+ '22 22 22 20 00 00 00 00 00 00 00 00 00 00 00 00'
+ '00 00 00 00 00 00 00 22 22 22 22 20 00 00 00 02'
+ '22 22 22 00 00 00 02 00 00 00 00 02 00 00 02 20'
+ '00 00 00 22 00 00 02 20 00 00 00 22 00 00 02 20'
+ '00 00 00 22 00 00 02 20 00 00 00 22 00 00 02 20'
+ '00 00 00 22 00 00 02 20 00 00 00 22 00 00 02 00'
+ 'AA AA A0 02 00 00 00 0A AA AA AA 00 00 00 02 00'
+ 'AA AA A0 02 00 00 02 20 00 00 00 22 00 00 02 20'
+ '00 00 00 22 00 00 02 20 00 00 00 22 00 00 02 20'
+ '00 00 00 22 00 00 02 20 00 00 00 22 00 00 02 20'
+ '00 00 00 22 00 00 02 00 00 00 00 02 00 00 00 02'
+ '22 22 22 00 00 00 00 22 22 22 22 20 00 00 00 00'
+ '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 AA'
+ 'AA AA AA A0 00 00 00 0A AA AA AA 00 00 00 02 00'
+ '00 00 00 0A 00 00 02 20 00 00 00 AA 00 00 02 20'
+ '00 00 00 AA 00 00 02 20 00 00 00 AA 00 00 02 20'
+ '00 00 00 AA 00 00 02 20 00 00 00 AA 00 00 02 20'
+ '00 00 00 AA 00 00 02 00 AA AA A0 0A 00 00 00 0A'
+ 'AA AA AA 00 00 00 0A 00 AA AA A0 0A 00 00 0A A0'
+ '00 00 00 AA 00 00 0A A0 00 00 00 AA 00 00 0A A0'
+ '00 00 00 AA 00 00 0A A0 00 00 00 AA 00 00 0A A0'
+ '00 00 00 AA 00 00 0A A0 00 00 00 AA 00 00 0A 00'
+ '00 00 00 0A 00 00 00 0A AA AA AA 00 00 00 00 AA'
+ 'AA AA AA A0 00 00 00 00 00 00 00 00 00 00 00 00'
+ '00 00 00 00 00 00 00 AA AA AA AA A0 00 00 00 0A'
+ 'AA AA AA 00 00 00 0A 00 00 00 00 0A 00 00 0A A0'
+ '00 00 00 AA 00 00 0A A0 00 00 00 AA 00 00 0A A0'
+ '00 00 00 AA 00 00 0A A0 00 00 00 AA 00 00 0A A0'
+ '00 00 00 AA 00 00 0A A0 00 00 00 AA 00 00 0A 00'
+ 'AA AA A0 0A 00 00 00 0A AA AA AA 00 00 00 0A 00'
+ 'AA AA A0 0A 00 00 0A A0 00 00 00 AA 00 00 0A A0'
+ '00 00 00 AA 00 00 0A A0 00 00 00 AA 00 00 0A A0'
+ '00 00 00 AA 00 00 0A A0 00 00 00 AA 00 00 0A A0'
+ '00 00 00 AA 00 00 0A 00 00 00 00 0A 00 00 00 0A'
+ 'AA AA AA 00 00 00 00 AA AA AA AA A0 00 00 00 00'
+ '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 22'
+ '22 22 22 20 00 00 00 02 22 22 22 00 00 00 02 00'
+ '00 00 00 0A 00 00 02 20 00 00 00 AA 00 00 02 20'
+ '00 00 00 AA 00 00 02 20 00 00 00 AA 00 00 02 20'
+ '00 00 00 AA 00 00 02 20 00 00 00 AA 00 00 02 20'
+ '00 00 00 AA 00 00 02 00 22 22 20 0A 00 00 00 02'
+ '22 22 22 00 00 00 02 00 22 22 20 0A 00 00 02 20'
+ '00 00 00 AA 00 00 02 20 00 00 00 AA 00 00 02 20'
+ '00 00 00 AA 00 00 02 20 00 00 00 AA 00 00 02 20'
+ '00 00 00 AA 00 00 02 20 00 00 00 AA 00 00 02 00'
+ '00 00 00 0A 00 00 00 0A AA AA AA 00 00 00 00 AA'
+ 'AA AA AA A0 00 00 00 00 00 00 00 00 00 00 00 00'
+ '00 00 00 00 00 00 00 AA AA AA AA A0 00 00 00 0A'
+ 'AA AA AA 00 00 00 0A 00 00 00 00 0A 00 00 0A A0'
+ '00 00 00 AA 00 00 0A A0 00 00 00 AA 00 00 0A A0'
+ '00 00 00 AA 00 00 0A A0 00 00 00 AA 00 00 0A A0'
+ '00 00 00 AA 00 00 0A A0 00 00 00 AA 00 00 0A 00'
+ 'AA AA A0 0A 00 00 00 0A AA AA AA 00 00 00 0A 00'
+ 'AA AA A0 02 00 00 0A A0 00 00 00 22 00 00 0A A0'
+ '00 00 00 22 00 00 0A A0 00 00 00 22 00 00 0A A0'
+ '00 00 00 22 00 00 0A A0 00 00 00 22 00 00 0A A0'
+ '00 00 00 22 00 00 0A 00 00 00 00 02 00 00 00 0A'
+ 'AA AA AA 00 00 00 00 AA AA AA AA A0 00 00 00 00'
+ '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 AA'
+ 'AA AA AA A0 00 00 00 0A AA AA AA 00 00 00 02 00'
+ '00 00 00 0A 00 00 02 20 00 00 00 AA 00 00 02 20'
+ '00 00 00 AA 00 00 02 20 00 00 00 AA 00 00 02 20'
+ '00 00 00 AA 00 00 02 20 00 00 00 AA 00 00 02 20'
+ '00 00 00 AA 00 00 02 00 AA AA A0 0A 00 00 00 0A'
+ 'AA AA AA 00 00 00 0A 00 AA AA A0 02 00 00 0A A0'
+ '00 00 00 22 00 00 0A A0 00 00 00 22 00 00 0A A0'
+ '00 00 00 22 00 00 0A A0 00 00 00 22 00 00 0A A0'
+ '00 00 00 22 00 00 0A A0 00 00 00 22 00 00 0A 00'
+ '00 00 00 02 00 00 00 0A AA AA AA 00 00 00 00 AA'
+ 'AA AA AA A0 00 00 00 00 00 00 00 00 00 00 00 00'
+ '00 00 00 00 00 00 00 22 22 22 22 20 00 00 00 02'
+ '22 22 22 00 00 00 02 00 00 00 00 0A 00 00 02 20'
+ '00 00 00 AA 00 00 02 20 00 00 00 AA 00 00 02 20'
+ '00 00 00 AA 00 00 02 20 00 00 00 AA 00 00 02 20'
+ '00 00 00 AA 00 00 02 20 00 00 00 AA 00 00 02 00'
+ 'AA AA A0 0A 00 00 00 0A AA AA AA 00 00 00 0A 00'
+ 'AA AA A0 0A 00 00 0A A0 00 00 00 AA 00 00 0A A0'
+ '00 00 00 AA 00 00 0A A0 00 00 00 AA 00 00 0A A0'
+ '00 00 00 AA 00 00 0A A0 00 00 00 AA 00 00 0A A0'
+ '00 00 00 AA 00 00 0A 00 00 00 00 0A 00 00 00 02'
+ '22 22 22 00 00 00 00 22 22 22 22 20 00 00 00 00'
+ '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 AA'
+ 'AA AA AA A0 00 00 00 0A AA AA AA 00 00 00 02 00'
+ '00 00 00 0A 00 00 02 20 00 00 00 AA 00 00 02 20'
+ '00 00 00 AA 00 00 02 20 00 00 00 AA 00 00 02 20'
+ '00 00 00 AA 00 00 02 20 00 00 00 AA 00 00 02 20'
+ '00 00 00 AA 00 00 02 00 AA AA A0 0A 00 00 00 0A'
+ 'AA AA AA 00 00 00 02 00 AA AA A0 0A 00 00 02 20'
+ '00 00 00 AA 00 00 02 20 00 00 00 AA 00 00 02 20'
+ '00 00 00 AA 00 00 02 20 00 00 00 AA 00 00 02 20'
+ '00 00 00 AA 00 00 02 20 00 00 00 AA 00 00 02 00'
+ '00 00 00 0A 00 00 00 0A AA AA AA 00 00 00 00 AA'
+ 'AA AA AA A0 00 00 00 00 00 00 00 00 00 00 00 00'
+ '00 00 00 00 00 00 00 AA AA AA AA A0 00 00 00 0A'
+ 'AA AA AA 00 00 00 0A 00 00 00 00 02 00 00 0A A0'
+ '00 00 00 22 00 00 0A A0 00 00 00 22 00 00 0A A0'
+ '00 00 00 22 00 00 0A A0 00 00 00 22 00 00 0A A0'
+ '00 00 00 22 00 00 0A A0 00 00 00 22 00 00 0A 00'
+ 'AA AA A0 02 00 00 00 0A AA AA AA 00 00 00 02 00'
+ 'AA AA A0 0A 00 00 02 20 00 00 00 AA 00 00 02 20'
+ '00 00 00 AA 00 00 02 20 00 00 00 AA 00 00 02 20'
+ '00 00 00 AA 00 00 02 20 00 00 00 AA 00 00 02 20'
+ '00 00 00 AA 00 00 02 00 00 00 00 0A 00 00 00 0A'
+ 'AA AA AA 00 00 00 00 AA AA AA AA A0 00 00 00 00'
+ '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 22'
+ '22 22 22 20 00 00 00 02 22 22 22 00 00 00 02 00'
+ '00 00 00 0A 00 00 02 20 00 00 00 AA 00 00 02 20'
+ '00 00 00 AA 00 00 02 20 00 00 00 AA 00 00 02 20'
+ '00 00 00 AA 00 00 02 20 00 00 00 AA 00 00 02 20'
+ '00 00 00 AA 00 00 02 00 22 22 20 0A 00 00 00 02'
+ '22 22 22 00 00 00 02 00 22 22 20 0A 00 00 02 20'
+ '00 00 00 AA 00 00 02 20 00 00 00 AA 00 00 02 20'
+ '00 00 00 AA 00 00 02 20 00 00 00 AA 00 00 02 20'
+ '00 00 00 AA 00 00 02 20 00 00 00 AA 00 00 02 00'
+ '00 00 00 0A 00 00 00 02 22 22 22 00 00 00 00 22'
+ '22 22 22 20 00 00 00 00 00 00 00 00 00 00 00 00'
+ '00 00 00 00 00 00 00 AA AA AA AA A0 00 00 00 0A'
+ 'AA AA AA 00 00 00 0A 00 00 00 00 0A 00 00 0A A0'
+ '00 00 00 AA 00 00 0A A0 00 00 00 AA 00 00 0A A0'
+ '00 00 00 AA 00 00 0A A0 00 00 00 AA 00 00 0A A0'
+ '00 00 00 AA 00 00 0A A0 00 00 00 AA 00 00 0A 00'
+ '22 22 20 0A 00 00 00 02 22 22 22 00 00 00 0A 00'
+ '22 22 20 0A 00 00 0A A0 00 00 00 AA 00 00 0A A0'
+ '00 00 00 AA 00 00 0A A0 00 00 00 AA 00 00 0A A0'
+ '00 00 00 AA 00 00 0A A0 00 00 00 AA 00 00 0A A0'
+ '00 00 00 AA 00 00 0A 00 00 00 00 0A 00 00 00 0A'
+ 'AA AA AA 00 00 00 00 AA AA AA AA A0 00 00 00 00'
+ '00 00 00 00 00 00'
+}
+
+MINES BITMAP MOVEABLE
+{
+ '42 4D 76 08 00 00 00 00 00 00 76 00 00 00 28 00'
+ '00 00 10 00 00 00 00 01 00 00 01 00 04 00 00 00'
+ '00 00 00 08 00 00 CE 0E 00 00 D8 0E 00 00 00 00'
+ '00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 80'
+ '00 00 00 80 80 00 80 00 00 00 80 00 80 00 80 80'
+ '00 00 C0 C0 C0 00 80 80 80 00 00 00 FF 00 00 FF'
+ '00 00 00 FF FF 00 FF 00 00 00 FF 00 FF 00 FF FF'
+ '00 00 FF FF FF 00 70 70 70 70 70 70 70 70 00 00'
+ '00 00 00 00 00 07 00 00 00 00 00 00 00 00 00 00'
+ '00 00 00 00 00 07 00 00 00 00 00 E0 00 00 00 00'
+ 'E0 00 00 00 00 07 00 00 00 00 00 E0 00 00 00 00'
+ 'E0 00 00 EE E0 07 00 00 EE E0 00 00 E0 00 00 00'
+ '00 E0 00 00 E0 07 00 00 00 E0 0E 00 E0 00 00 0E'
+ '00 E0 0E 00 E0 07 00 0E 00 E0 0E EE E0 00 00 0E'
+ 'EE E0 00 00 00 07 00 00 00 00 00 00 00 00 00 00'
+ '00 00 00 00 00 07 22 22 22 22 22 22 22 22 22 22'
+ '22 22 22 22 22 22 22 22 22 00 02 22 22 22 22 22'
+ '22 20 22 22 22 22 22 22 22 20 22 22 22 22 22 22'
+ '08 80 88 02 22 22 22 22 80 00 00 82 22 22 22 02'
+ '80 00 00 82 02 22 20 00 00 00 00 00 00 22 22 02'
+ '80 00 00 82 02 22 22 22 80 00 00 82 22 22 22 22'
+ '08 80 88 02 22 22 22 22 22 20 22 22 22 22 22 22'
+ '22 20 22 22 22 22 22 22 22 00 02 22 22 22 22 22'
+ '22 22 22 22 22 22 70 70 70 70 70 70 70 70 22 22'
+ '22 22 22 22 22 27 29 92 22 00 02 22 99 20 22 99'
+ '22 20 22 29 92 27 22 29 92 20 22 99 22 20 22 22'
+ '99 80 89 92 22 27 22 22 89 90 99 82 22 20 22 02'
+ '80 99 90 82 02 27 20 00 00 99 90 00 00 20 22 02'
+ '89 90 99 82 02 27 22 22 99 00 09 92 22 20 22 29'
+ '98 80 88 99 22 27 22 99 22 20 22 29 92 20 29 92'
+ '22 20 22 22 99 27 22 22 22 00 02 22 22 20 22 22'
+ '22 22 22 22 22 27 70 70 70 70 70 70 70 70 99 99'
+ '99 99 99 99 99 97 99 99 99 00 09 99 99 90 99 99'
+ '99 90 99 99 99 97 99 99 99 90 99 99 99 90 99 99'
+ '08 80 88 09 99 97 99 99 80 00 00 89 99 90 99 09'
+ '80 00 00 89 09 97 90 00 00 00 00 00 00 90 99 09'
+ '80 00 00 89 09 97 99 99 80 00 00 89 99 90 99 99'
+ '08 80 88 09 99 97 99 99 99 90 99 99 99 90 99 99'
+ '99 90 99 99 99 97 99 99 99 00 09 99 99 90 99 99'
+ '99 99 99 99 99 97 00 00 00 00 00 00 00 00 A2 22'
+ '22 22 22 22 22 20 A2 22 22 22 22 22 22 20 A2 22'
+ '22 22 22 E2 22 20 A2 22 E2 22 22 22 22 20 A2 22'
+ '22 22 22 E2 22 20 A2 22 E2 22 22 EE E2 20 A2 22'
+ 'EE E2 22 22 E2 20 A2 22 22 E2 22 22 E2 20 A2 22'
+ '22 E2 2E 22 E2 20 A2 2E 22 E2 2E 22 E2 20 A2 2E'
+ '22 E2 2E EE E2 20 A2 2E EE E2 22 22 22 20 A2 22'
+ '22 22 22 22 22 20 A2 22 22 22 22 22 22 20 AA AA'
+ 'AA AA AA AA AA AA 00 00 00 00 00 00 00 00 A4 44'
+ '44 44 44 44 44 40 A2 22 22 22 22 22 22 40 A2 20'
+ '00 00 00 07 22 40 A2 22 00 00 02 27 22 40 A2 22'
+ '22 00 02 27 22 40 A2 22 22 22 22 27 22 40 A2 22'
+ '22 22 22 27 22 40 A2 29 99 99 99 90 22 40 A2 29'
+ '99 99 99 90 22 40 A2 29 99 99 99 90 22 40 A2 29'
+ '99 99 99 90 22 40 A2 29 99 99 99 90 22 40 A2 22'
+ '22 22 22 22 22 40 A2 22 22 22 22 22 22 40 AA AA'
+ 'AA AA AA AA AA A0 00 00 00 00 00 00 00 00 A4 44'
+ '44 44 44 44 44 40 A2 22 22 22 22 22 22 40 A2 22'
+ '22 22 22 22 22 40 A2 22 22 22 22 22 22 40 A2 22'
+ '22 22 22 22 22 40 A2 22 22 22 22 22 22 40 A2 22'
+ '22 22 22 22 22 40 A2 22 22 22 22 22 22 40 A2 22'
+ '22 22 22 22 22 40 A2 22 22 22 22 22 22 40 A2 22'
+ '22 22 22 22 22 40 A2 22 22 22 22 22 22 40 A2 22'
+ '22 22 22 22 22 40 A2 22 22 22 22 22 22 40 AA AA'
+ 'AA AA AA AA AA A0 70 70 70 70 70 70 70 70 00 00'
+ '00 00 00 00 00 07 00 00 00 00 00 00 00 00 00 00'
+ '00 00 00 00 00 07 00 00 77 77 77 70 00 00 00 00'
+ '70 00 00 70 00 07 00 00 70 00 00 70 00 00 00 00'
+ '70 00 00 70 00 07 00 00 07 77 77 00 00 00 00 00'
+ '70 00 00 70 00 07 00 00 70 00 00 70 00 00 00 00'
+ '70 00 00 70 00 07 00 00 77 77 77 70 00 00 00 00'
+ '00 00 00 00 00 07 00 00 00 00 00 00 00 00 00 00'
+ '00 00 00 00 00 07 70 70 70 70 70 70 70 70 00 00'
+ '00 00 00 00 00 07 00 00 00 00 00 00 00 00 00 00'
+ '00 00 00 00 00 07 00 00 00 90 00 00 00 00 00 00'
+ '00 90 00 00 00 07 00 00 00 90 00 00 00 00 00 00'
+ '00 90 00 00 00 07 00 00 00 09 00 00 00 00 00 00'
+ '00 00 90 00 00 07 00 00 00 00 09 00 00 00 00 00'
+ '00 00 00 90 00 07 00 00 99 99 99 90 00 00 00 00'
+ '00 00 00 00 00 07 00 00 00 00 00 00 00 00 00 00'
+ '00 00 00 00 00 07 70 70 70 70 70 70 70 70 00 00'
+ '00 00 00 00 00 07 00 00 00 00 00 00 00 00 00 00'
+ '00 00 00 00 00 07 00 00 DD DD DD D0 00 00 00 00'
+ 'D0 00 00 D0 00 07 00 00 D0 00 00 D0 00 00 00 00'
+ 'D0 00 00 D0 00 07 00 00 DD DD DD D0 00 00 00 00'
+ 'D0 00 00 00 00 07 00 00 D0 00 00 00 00 00 00 00'
+ 'D0 00 00 00 00 07 00 00 DD DD DD D0 00 00 00 00'
+ '00 00 00 00 00 07 00 00 00 00 00 00 00 00 00 00'
+ '00 00 00 00 00 07 70 70 70 70 70 70 70 70 00 00'
+ '00 00 00 00 00 07 00 00 00 00 00 00 00 00 00 00'
+ '00 00 00 00 00 07 00 00 CC CC CC C0 00 00 00 00'
+ '00 00 00 C0 00 07 00 00 00 00 00 C0 00 00 00 00'
+ '00 00 00 C0 00 07 00 00 CC CC CC C0 00 00 00 00'
+ 'C0 00 00 00 00 07 00 00 C0 00 00 00 00 00 00 00'
+ 'C0 00 00 00 00 07 00 00 CC CC CC C0 00 00 00 00'
+ '00 00 00 00 00 07 00 00 00 00 00 00 00 00 00 00'
+ '00 00 00 00 00 07 70 70 70 70 70 70 70 70 00 00'
+ '00 00 00 00 00 07 00 00 00 00 00 00 00 00 00 00'
+ '00 00 00 00 00 07 00 00 00 00 00 B0 00 00 00 00'
+ '00 00 00 B0 00 07 00 00 00 00 00 B0 00 00 00 00'
+ '00 00 00 B0 00 07 00 00 BB BB BB B0 00 00 00 00'
+ 'B0 00 00 B0 00 07 00 00 B0 00 00 B0 00 00 00 00'
+ 'B0 00 00 B0 00 07 00 00 B0 00 00 B0 00 00 00 00'
+ '00 00 00 00 00 07 00 00 00 00 00 00 00 00 00 00'
+ '00 00 00 00 00 07 70 70 70 70 70 70 70 70 00 00'
+ '00 00 00 00 00 07 00 00 00 00 00 00 00 00 00 00'
+ '00 00 00 00 00 07 00 00 EE EE EE E0 00 00 00 00'
+ '00 00 00 E0 00 07 00 00 00 00 00 E0 00 00 00 00'
+ '00 00 00 E0 00 07 00 00 EE EE EE E0 00 00 00 00'
+ '00 00 00 E0 00 07 00 00 00 00 00 E0 00 00 00 00'
+ '00 00 00 E0 00 07 00 00 EE EE EE E0 00 00 00 00'
+ '00 00 00 00 00 07 00 00 00 00 00 00 00 00 00 00'
+ '00 00 00 00 00 07 70 70 70 70 70 70 70 70 00 00'
+ '00 00 00 00 00 07 00 00 00 00 00 00 00 00 00 00'
+ '00 00 00 00 00 07 00 00 FF FF FF F0 00 00 00 00'
+ 'F0 00 00 00 00 07 00 00 F0 00 00 00 00 00 00 00'
+ 'F0 00 00 00 00 07 00 00 FF FF FF F0 00 00 00 00'
+ '00 00 00 F0 00 07 00 00 00 00 00 F0 00 00 00 00'
+ '00 00 00 F0 00 07 00 00 FF FF FF F0 00 00 00 00'
+ '00 00 00 00 00 07 00 00 00 00 00 00 00 00 00 00'
+ '00 00 00 00 00 07 70 70 70 70 70 70 70 70 00 00'
+ '00 00 00 00 00 07 00 00 00 00 00 00 00 00 00 00'
+ '00 00 00 00 00 07 00 00 AA AA AA 00 00 00 00 00'
+ '00 0A 00 00 00 07 00 00 00 0A 00 00 00 00 00 00'
+ '00 0A 00 00 00 07 00 00 00 0A 00 00 00 00 00 00'
+ '00 0A 00 00 00 07 00 00 00 0A 00 00 00 00 00 00'
+ '00 0A 00 00 00 07 00 00 0A AA 00 00 00 00 00 00'
+ '00 00 00 00 00 07 00 00 00 00 00 00 00 00 00 00'
+ '00 00 00 00 00 07 FF FF FF FF FF FF FF FF 00 00'
+ '00 00 00 00 00 0F 00 00 00 00 00 00 00 0F 00 00'
+ '00 00 00 00 00 0F 00 00 00 00 00 00 00 0F 00 00'
+ '00 00 00 00 00 0F 00 00 00 00 00 00 00 0F 00 00'
+ '00 00 00 00 00 0F 00 00 00 00 00 00 00 0F 00 00'
+ '00 00 00 00 00 0F 00 00 00 00 00 00 00 0F 00 00'
+ '00 00 00 00 00 0F 00 00 00 00 00 00 00 0F 00 00'
+ '00 00 00 00 00 0F 00 00 00 00 00 00 00 0F 00 00'
+ '00 00 00 00 00 0F'
+}
+
+/* English-US Resources */
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
+
+STRINGTABLE {
+ IDS_APPNAME, "WineMine"
+
+}
+
+MENU_WINEMINE MENU DISCARDABLE
+{
+ POPUP "&Options" {
+ MENUITEM "&New", IDM_NEW
+ MENUITEM SEPARATOR
+ MENUITEM "&Mark Question", IDM_MARKQ
+ MENUITEM SEPARATOR
+ MENUITEM "&Beginner", IDM_BEGINNER
+ MENUITEM "&Advanced", IDM_ADVANCED
+ MENUITEM "&Expert", IDM_EXPERT
+ MENUITEM "&Custom", IDM_CUSTOM
+ MENUITEM SEPARATOR
+ MENUITEM "E&xit", IDM_EXIT
+ }
+ POPUP "&Info" {
+ MENUITEM "&Fastest Times", IDM_TIMES
+ MENUITEM "&About", IDM_ABOUT
+ }
+}
+
+DLG_TIMES DIALOG DISCARDABLE 0, 0, 160, 80
+STYLE DS_MODALFRAME | DS_3DLOOK |
+ WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP
+CAPTION "Fastest Times"
+{
+ GROUPBOX "Fastest Times", IDIGNORE, 10, 10, 140, 45
+ LTEXT "Beginner", IDIGNORE, 20, 20, 40, 8
+ LTEXT "Advanced", IDIGNORE, 20, 30, 40, 8
+ LTEXT "Expert", IDIGNORE, 20, 40, 40, 8
+ LTEXT "999", IDC_TIME1, 70, 20, 15, 8
+ LTEXT "999", IDC_TIME2, 70, 30, 15, 8
+ LTEXT "999", IDC_TIME3, 70, 40, 15, 8
+ LTEXT "", IDC_NAME1, 90, 20, 55, 8
+ LTEXT "", IDC_NAME2, 90, 30, 55, 8
+ LTEXT "", IDC_NAME3, 90, 40, 55, 8
+ DEFPUSHBUTTON "OK", IDOK, 55, 60, 50, 15
+}
+
+DLG_CONGRATS DIALOG DISCARDABLE 0, 0, 160, 60
+STYLE DS_MODALFRAME | DS_3DLOOK |
+ WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP
+CAPTION "Congratulations!"
+{
+ LTEXT "Please enter your name", IDIGNORE, 10, 10, 150, 10
+ EDITTEXT IDC_EDITNAME, 25, 20, 110, 12
+ DEFPUSHBUTTON "Ok", IDOK, 60, 40, 40, 15
+}
+
+DLG_CUSTOM DIALOG DISCARDABLE 0, 0, 100, 100
+STYLE DS_MODALFRAME | DS_3DLOOK |
+ WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP
+CAPTION "Custom Game"
+{
+ LTEXT "Rows", IDIGNORE, 5, 5, 30, 10
+ LTEXT "Cols", IDIGNORE, 5, 35, 30, 10
+ LTEXT "Mines", IDIGNORE, 5, 65, 30, 10
+ EDITTEXT IDC_EDITROWS, 5, 15, 20, 12, ES_NUMBER
+ EDITTEXT IDC_EDITCOLS, 5, 45, 20, 12, ES_NUMBER
+ EDITTEXT IDC_EDITMINES, 5, 75, 20, 12, ES_NUMBER
+ DEFPUSHBUTTON "Ok", IDOK, 40, 30, 50, 15
+ PUSHBUTTON "Cancel", IDCANCEL, 40, 50, 50, 15
+}
+
+DLG_ABOUT DIALOG DISCARDABLE 0, 0, 145, 80
+STYLE DS_MODALFRAME | DS_3DLOOK |
+ WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP
+CAPTION "About"
+{
+ LTEXT "Winemine", IDIGNORE, 10, 10, 35, 10
+ LTEXT "Copyright 2000, Joshua Thielen", IDIGNORE, 35, 25, 100, 10
+ LTEXT "under the Wine license", IDIGNORE, 35, 35, 100, 10
+ ICON "WINEMINE", IDIGNORE, 10, 25, 20, 20
+ DEFPUSHBUTTON "Ok", IDOK, 50, 60, 55, 15
+}
+
+/* End of English-US Resources */
+
diff --git a/programs/winemine/winemine.spec b/programs/winemine/winemine.spec
new file mode 100644
index 0000000..6425621
--- /dev/null
+++ b/programs/winemine/winemine.spec
@@ -0,0 +1,5 @@
+name winemine
+mode guiexe
+type win32
+init WinMain
+rsrc winemine