182 lines
4.7 KiB
C
182 lines
4.7 KiB
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 <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];
|
|
DWORD 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 */
|