From d2f53a79d8d3326b03b1677da57bfc706a6fc8f9 Mon Sep 17 00:00:00 2001 From: Richard Campbell Date: Thu, 6 Mar 2003 21:13:17 +0000 Subject: [PATCH] Added WineMine svn path=/trunk/; revision=4253 --- rosapps/games/winemine/.cvsignore | 5 + rosapps/games/winemine/Makefile | 19 + rosapps/games/winemine/README | 21 + rosapps/games/winemine/dialog.c | 132 +++ rosapps/games/winemine/dialog.h | 29 + rosapps/games/winemine/main.c | 1055 ++++++++++++++++++++++++ rosapps/games/winemine/main.h | 181 ++++ rosapps/games/winemine/rc/faces.bmp | Bin 0 -> 1558 bytes rosapps/games/winemine/rc/leds.bmp | Bin 0 -> 2326 bytes rosapps/games/winemine/rc/mines.bmp | Bin 0 -> 2166 bytes rosapps/games/winemine/rc/winemine.ico | Bin 0 -> 766 bytes rosapps/games/winemine/resource.h | 54 ++ rosapps/games/winemine/winemine.rc | 115 +++ 13 files changed, 1611 insertions(+) create mode 100644 rosapps/games/winemine/.cvsignore create mode 100644 rosapps/games/winemine/Makefile create mode 100644 rosapps/games/winemine/README create mode 100644 rosapps/games/winemine/dialog.c create mode 100644 rosapps/games/winemine/dialog.h create mode 100644 rosapps/games/winemine/main.c create mode 100644 rosapps/games/winemine/main.h create mode 100644 rosapps/games/winemine/rc/faces.bmp create mode 100644 rosapps/games/winemine/rc/leds.bmp create mode 100644 rosapps/games/winemine/rc/mines.bmp create mode 100644 rosapps/games/winemine/rc/winemine.ico create mode 100644 rosapps/games/winemine/resource.h create mode 100644 rosapps/games/winemine/winemine.rc diff --git a/rosapps/games/winemine/.cvsignore b/rosapps/games/winemine/.cvsignore new file mode 100644 index 00000000000..7e878167e8e --- /dev/null +++ b/rosapps/games/winemine/.cvsignore @@ -0,0 +1,5 @@ +*.o +*.d +*.exe +*.coff +*.sym diff --git a/rosapps/games/winemine/Makefile b/rosapps/games/winemine/Makefile new file mode 100644 index 00000000000..13969f900a0 --- /dev/null +++ b/rosapps/games/winemine/Makefile @@ -0,0 +1,19 @@ +# $Id: Makefile,v 1.1 2003/03/06 21:13:17 rcampbell Exp $ + +PATH_TO_TOP = ../../.. + +TARGET_TYPE = program + +TARGET_APPTYPE = windows + +TARGET_NAME = winemine + +TARGET_SDKLIBS = kernel32.a gdi32.a + +TARGET_OBJECTS = main.o dialog.o + +include $(PATH_TO_TOP)/rules.mak + +include $(TOOLS_PATH)/helper.mk + +# EOF diff --git a/rosapps/games/winemine/README b/rosapps/games/winemine/README new file mode 100644 index 00000000000..31d7b277fa9 --- /dev/null +++ b/rosapps/games/winemine/README @@ -0,0 +1,21 @@ +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. + + Starting a new game causes the window to drop one pixel (Peter Hunnisett) + I don't know if it's a window manager problem (KDE) + +UNKNOWN BUGS: + ??? diff --git a/rosapps/games/winemine/dialog.c b/rosapps/games/winemine/dialog.c new file mode 100644 index 00000000000..b7acda3fa7f --- /dev/null +++ b/rosapps/games/winemine/dialog.c @@ -0,0 +1,132 @@ +/* + * WineMine (dialog.c) + * + * Copyright 2000 Joshua Thielen + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#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/rosapps/games/winemine/dialog.h b/rosapps/games/winemine/dialog.h new file mode 100644 index 00000000000..b4e0fc4a457 --- /dev/null +++ b/rosapps/games/winemine/dialog.h @@ -0,0 +1,29 @@ +/* + * WineMine (dialog.h) + * + * Copyright 2000 Joshua Thielen + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + +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/rosapps/games/winemine/main.c b/rosapps/games/winemine/main.c new file mode 100644 index 00000000000..1b338985417 --- /dev/null +++ b/rosapps/games/winemine/main.c @@ -0,0 +1,1055 @@ +/* + * WineMine (main.c) + * + * Copyright 2000 Joshua Thielen + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include +#include +#include +#include "main.h" +#include "dialog.h" +#include "resource.h" + +/* Work around a Wine bug which defines handles as UINT rather than LPVOID */ +#ifdef WINE_STRICT +#define NULL_HANDLE NULL +#else +#define NULL_HANDLE 0 +#endif + +#ifdef DUMB_DEBUG +#include +#define DEBUG(x) fprintf(stderr,x) +#else +#define DEBUG(x) +#endif + +#define SZ_APPNAME "ROSMine" +int WINAPI WinMain( HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR cmdline, int cmdshow ) +{ + MSG msg; + WNDCLASS wc; + HWND hWnd; + HACCEL haccel; + /* + char appname[9]; + LoadString doesn't appear to work properly under ROS + 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, SZ_APPNAME ); + wc.hCursor = LoadCursor( NULL_HANDLE, IDI_APPLICATION ); + wc.hbrBackground = (HBRUSH) GetStockObject( BLACK_BRUSH ); + wc.lpszMenuName = "MENU_WINEMINE"; + wc.lpszClassName = SZ_APPNAME; + + if (!RegisterClass(&wc)) exit(1); + hWnd = CreateWindow( SZ_APPNAME, SZ_APPNAME, + WS_OVERLAPPEDWINDOW & ~WS_THICKFRAME & ~WS_MAXIMIZEBOX, + CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, + NULL_HANDLE, NULL_HANDLE, hInst, NULL ); + + if (!hWnd) exit(1); + + ShowWindow( hWnd, cmdshow ); + UpdateWindow( hWnd ); + + haccel = LoadAccelerators( hInst, SZ_APPNAME ); + SetTimer( hWnd, ID_TIMER, 1000, NULL ); + + while( GetMessage(&msg, NULL_HANDLE, 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 hMemDC; + + DEBUG("WM_PAINT\n"); + hdc = BeginPaint( hWnd, &ps ); + hMemDC = CreateCompatibleDC( hdc ); + + DrawBoard( hdc, hMemDC, &ps, &board ); + + DeleteDC( hMemDC ); + EndPaint( hWnd, &ps ); + + return 0; + } + + case WM_MOVE: + DEBUG("WM_MOVE\n"); + board.pos.x = (unsigned) LOWORD(lParam); + board.pos.y = (unsigned) HIWORD(lParam); + return 0; + + case WM_DESTROY: + SaveBoard( &board ); + DestroyBoard( &board ); + PostQuitMessage( 0 ); + return 0; + + case WM_TIMER: + if( board.status == PLAYING ) { + board.time++; + RedrawWindow( hWnd, &board.timer_rect, NULL_HANDLE, + RDW_INVALIDATE | RDW_UPDATENOW ); + } + return 0; + + case WM_LBUTTONDOWN: + DEBUG("WM_LBUTTONDOWN\n"); + if( wParam & MK_RBUTTON ) + msg = WM_MBUTTONDOWN; + TestBoard( hWnd, &board, LOWORD(lParam), HIWORD(lParam), msg ); + SetCapture( hWnd ); + return 0; + + case WM_LBUTTONUP: + DEBUG("WM_LBUTTONUP\n"); + if( wParam & MK_RBUTTON ) + msg = WM_MBUTTONUP; + TestBoard( hWnd, &board, LOWORD(lParam), HIWORD(lParam), msg ); + ReleaseCapture(); + return 0; + + case WM_RBUTTONDOWN: + DEBUG("WM_RBUTTONDOWN\n"); + 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: + DEBUG("WM_RBUTTONUP\n"); + if( wParam & MK_LBUTTON ) + msg = WM_MBUTTONUP; + TestBoard( hWnd, &board, LOWORD(lParam), HIWORD(lParam), msg ); + return 0; + + case WM_MBUTTONDOWN: + DEBUG("WM_MBUTTONDOWN\n"); + TestBoard( hWnd, &board, LOWORD(lParam), HIWORD(lParam), msg ); + return 0; + + case WM_MBUTTONUP: + DEBUG("WM_MBUTTONUP\n"); + TestBoard( hWnd, &board, LOWORD(lParam), HIWORD(lParam), msg ); + return 0; + + case WM_MOUSEMOVE: + { + if( (wParam & MK_LBUTTON) && (wParam & MK_RBUTTON) ) { + msg = WM_MBUTTONDOWN; + } + else if( wParam & MK_LBUTTON ) { + msg = WM_LBUTTONDOWN; + } + else { + return 0; + } + + TestBoard( hWnd, &board, LOWORD(lParam), HIWORD(lParam), msg ); + + 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; + default: + DEBUG("Unknown WM_COMMAND command message received\n"); + break; + } + } + return( DefWindowProc( hWnd, msg, wParam, lParam )); +} + +void InitBoard( BOARD *p_board ) +{ + HMENU hMenu; + + p_board->hMinesBMP = LoadBitmap( p_board->hInst, (LPCSTR) IDB_MINES); + p_board->hFacesBMP = LoadBitmap( p_board->hInst, (LPCSTR) IDB_FACES); + p_board->hLedsBMP = LoadBitmap( p_board->hInst, (LPCSTR) IDB_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.y = atoi( data ); + else + p_board->pos.y = 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\\Wine\\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, strlen(data)+1 ); + + wsprintf( data, "%d", p_board->pos.x ); + RegSetValueEx( hkey, "Ypos", 0, REG_SZ, (LPBYTE) data, strlen(data)+1 ); + + wsprintf( data, "%d", (int) p_board->difficulty ); + RegSetValueEx( hkey, "Difficulty", 0, REG_SZ, (LPBYTE) data, strlen(data)+1 ); + + wsprintf( data, "%d", p_board->rows ); + RegSetValueEx( hkey, "Rows", 0, REG_SZ, (LPBYTE) data, strlen(data)+1 ); + + wsprintf( data, "%d", p_board->cols ); + RegSetValueEx( hkey, "Cols", 0, REG_SZ, (LPBYTE) data, strlen(data)+1 ); + + wsprintf( data, "%d", p_board->mines ); + RegSetValueEx( hkey, "Mines", 0, REG_SZ, (LPBYTE) data, strlen(data)+1 ); + + wsprintf( data, "%d", (int) p_board->IsMarkQ ); + RegSetValueEx( hkey, "MarkQ", 0, REG_SZ, (LPBYTE) data, strlen(data)+1 ); + + 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, strlen(data)+1 ); + } + + 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, strlen(data)+1 ); + } + RegCloseKey( hkey ); +} + +void DestroyBoard( BOARD *p_board ) +{ + DeleteObject( p_board->hFacesBMP ); + DeleteObject( p_board->hLedsBMP ); + DeleteObject( p_board->hMinesBMP ); +} + +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_HANDLE, + 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, HDC hMemDC, BOARD *p_board ) +{ + HGDIOBJ hOldObj; + unsigned col, row; + hOldObj = SelectObject (hMemDC, p_board->hMinesBMP); + + for( row = 1; row <= p_board->rows; row++ ) { + for( col = 1; col <= p_board->cols; col++ ) { + DrawMine( hdc, hMemDC, p_board, col, row, FALSE ); + } + } + SelectObject( hMemDC, hOldObj ); +} + +void DrawMine( HDC hdc, HDC hMemDC, BOARD *p_board, unsigned col, unsigned row, BOOL IsPressed ) +{ + 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; + break; + case COMPLETE: + /* Do nothing */ + break; + default: + DEBUG("Unknown FlagType during game over in DrawMine\n"); + break; + } + } + } 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; + break; + case COMPLETE: + /* Do nothing */ + break; + default: + DEBUG("Unknown FlagType while playing in DrawMine\n"); + break; + } + } + + if( p_board->box[col][row].FlagType == COMPLETE + && !p_board->box[col][row].IsMine ) + offset = (MINEBMP_OFFSET) p_board->box[col][row].NumMines; + + 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 ); +} + +void DrawLeds( HDC hdc, HDC hMemDC, BOARD *p_board, int number, int x, int y ) +{ + HGDIOBJ hOldObj; + 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; + + hOldObj = SelectObject (hMemDC, p_board->hLedsBMP); + + for( i = 0; i < 3; i++ ) { + BitBlt( hdc, + i * LED_WIDTH + x, + y, + LED_WIDTH, + LED_HEIGHT, + hMemDC, + 0, + led[i] * LED_HEIGHT, + SRCCOPY); + } + + SelectObject( hMemDC, hOldObj ); +} + + +void DrawFace( HDC hdc, HDC hMemDC, BOARD *p_board ) +{ + HGDIOBJ hOldObj; + + hOldObj = SelectObject (hMemDC, p_board->hFacesBMP); + + 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); + + SelectObject( hMemDC, hOldObj ); +} + + +void DrawBoard( HDC hdc, HDC hMemDC, PAINTSTRUCT *ps, BOARD *p_board ) +{ + RECT tmp_rect; + + if( IntersectRect( &tmp_rect, &ps->rcPaint, &p_board->counter_rect ) ) + DrawLeds( hdc, hMemDC, 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, hMemDC, 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, hMemDC, p_board ); + + if( IntersectRect( &tmp_rect, &ps->rcPaint, &p_board->mines_rect ) ) + DrawMines( hdc, hMemDC, 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 ); + p_board->status = PLAYING; + break; + default: + DEBUG("Unknown message type received in TestMines\n"); + break; + } + + if( draw ) + { + RedrawWindow( p_board->hWnd, NULL, NULL_HANDLE, + 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; + } + else if( p_board->status == GAMEOVER ) + p_board->face_bmp = DEAD_BMP; + else 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_HANDLE, + 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; + HGDIOBJ hOldObj; + HDC hMemDC; + + hdc = GetDC( p_board->hWnd ); + hMemDC = CreateCompatibleDC( hdc ); + hOldObj = SelectObject (hMemDC, p_board->hMinesBMP); + + DrawMine( hdc, hMemDC, p_board, col, row, TRUE ); + + SelectObject( hMemDC, hOldObj ); + DeleteDC( hMemDC ); + 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; + HGDIOBJ hOldObj; + HDC hMemDC; + + hdc = GetDC( p_board->hWnd ); + hMemDC = CreateCompatibleDC( hdc ); + hOldObj = SelectObject( hMemDC, p_board->hMinesBMP ); + + DrawMine( hdc, hMemDC, p_board, col, row, FALSE ); + + SelectObject( hMemDC, hOldObj ); + DeleteDC( hMemDC ); + 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/rosapps/games/winemine/main.h b/rosapps/games/winemine/main.h new file mode 100644 index 00000000000..1f8b4cca91a --- /dev/null +++ b/rosapps/games/winemine/main.h @@ -0,0 +1,181 @@ +/* + * Copyright 2000 Joshua Thielen + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include + +#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 DestroyBoard( 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, HDC hMemDC, PAINTSTRUCT *ps, BOARD *p_board ); + +void DrawMines( HDC hdc, HDC hMemDC, BOARD *p_board ); + +void DrawMine( HDC hdc, HDC hMemDC, 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, HDC hMemDC, BOARD *p_board, int number, int x, int y); + +void DrawFace( HDC hdc, HDC hMemDC, 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/rosapps/games/winemine/rc/faces.bmp b/rosapps/games/winemine/rc/faces.bmp new file mode 100644 index 0000000000000000000000000000000000000000..77f20f441156df2bae0f34bd4f4440e7d60b83e4 GIT binary patch literal 1558 zcmc&zu};J=3^fW+q)3d2PhhN+@iun;rP4`+?fNNvLL|m4H}Fq4miO$WiO}8YhC{eb z`eeI~^K8GqJ>84SJN6f>XRHsb8@a_U@_8rn{b)-S>o$wvm3g)gc0k$h_xRGV=qt-Y zgoTGHY_XF=hv`=&p2I%pFZiiXhKz=N67eulpW%~W00yFbU5=AazWO&TS+T~npye!K z_>uz+CAX=&%h2Hpkx!FDgUixU60gZm1}`ON<*M)_)F-F>B;G}gE0BOI7v6Bmv~mKM ziUpC(hhdUfOltWnVd%;lC92-~M+23!bRH~+i6@lY{*Ry5!+q^o)1&jHJyZLHwXVH!3b&c^HdEST zXdZ|^J73r7pItX>sB@L&D4wP19}IIY@RRC!$ATSdNRFrvj`O0}jbW2B4A8p}0)ALA v3@e7A;L(jB#{7YuVF|<=i_bs-=V=baH6IwDHa)%+^)dJhTW53MH5lU$d2kz` literal 0 HcmV?d00001 diff --git a/rosapps/games/winemine/rc/leds.bmp b/rosapps/games/winemine/rc/leds.bmp new file mode 100644 index 0000000000000000000000000000000000000000..5473cc3569b8e7d64caa4539266373ffd936b6db GIT binary patch literal 2326 zcmc(fK~BUl3`IQ^3#bGu#JXa|IoNX@);&tsIYk%TtGw?x1*DFYhR#f;u@g`1{5U^; z|9E*YZ=c9F`Xl}MWOlMUw@>$GUr)KaVHKkppN(TyNQO4gGg^Nv{@Jo+I2sTBhLWveQUH42EP)gk9n`y_*ZL|YyT35Fd3ihzgw{fZn?;>dY_5)!gX!j zTRZ`Gb)JWeyW>I!9eU+kp6`!C48@5&-X!0U)$a}7R%;+TzjxyHchQvZ4Srt|_hCHQ zz|Hyhzmwp}jp|7k@ARttZn|IcEs_N%7n(R8(0`0YeqtS4ErLtx z+5jF~S+CbX3VXd|zvm7Me+-&D*AFbok%0-^-0Tf5L3*b8{7I)t5z&i*; zCK%ok;d*4=9rJ?K5Aa(upa1of+CBQw?w<=NBVZ80Q)S!{pOSLJ37-)7CDgX54*k>k zFR#u&$;W)!;e7wdeZGJG=^SV8he%abQ>t)NzCVfsKB_7$eogm!O*-p;dA>ASiSHPY z^`|^fItA@N2!QkR@r?8L|ML9pcKgD5xEIzd4){RV`I>CHa@X18n)#c}X05gOK~42X z+;t7&da literal 0 HcmV?d00001 diff --git a/rosapps/games/winemine/rc/winemine.ico b/rosapps/games/winemine/rc/winemine.ico new file mode 100644 index 0000000000000000000000000000000000000000..bc2a24f361433252dccd4261b61c59b0ef8b4fda GIT binary patch literal 766 zcmc&wI}XAy41KMT(hVkN%S$;1N2*w0jF>o9j>E_e!i&?ECh9<0aQw-OofpSI!zFS+ zl4lDX8Ba8!ooNkr^c3dS#RF7$p94L&G>;Gh6VVhgrX7td9ntAeBJ8EOh>A$cv~I%U zt^;+ZAjT5+13v+GnK~%3=!}g4ZJ)|nFR4i}Fgh00SabdU)!nULGoNAO)6CC2*-Y|# lADsHd!?$Bv#oc_jz&zhHkCpmr-u%S;+VtvoaXF2D?B75GSfc;{ literal 0 HcmV?d00001 diff --git a/rosapps/games/winemine/resource.h b/rosapps/games/winemine/resource.h new file mode 100644 index 00000000000..8348e92bb56 --- /dev/null +++ b/rosapps/games/winemine/resource.h @@ -0,0 +1,54 @@ +/* + * WineMine (resource.h) + * + * Copyright 2000 Joshua Thielen + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + +#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 + +#define IDI_WINEMINE 1201 + +#define IDB_FACES 1301 +#define IDB_LEDS 1302 +#define IDB_MINES 1303 \ No newline at end of file diff --git a/rosapps/games/winemine/winemine.rc b/rosapps/games/winemine/winemine.rc new file mode 100644 index 00000000000..18577efb620 --- /dev/null +++ b/rosapps/games/winemine/winemine.rc @@ -0,0 +1,115 @@ +/* + * WineMine (rsrc.rc) + * + * Copyright 2000 Joshua Thielen + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include "resource.h" + +IDI_WINEMINE ICON MOVEABLE "rc/winemine.ico" + +IDB_FACES BITMAP MOVEABLE "rc/faces.bmp" + +IDB_LEDS BITMAP MOVEABLE "rc/leds.bmp" + +IDB_MINES BITMAP MOVEABLE "rc/mines.bmp" + +/* 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 */