ReactOS 0.4.15-dev-7788-g1ad9096
main.c
Go to the documentation of this file.
1/*
2 * WineMine (main.c)
3 *
4 * Copyright 2000 Joshua Thielen
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19 */
20
21#include "main.h"
22
23#include <winbase.h>
24#include <winreg.h>
25#include <wingdi.h>
26#include <time.h>
27#include <stdlib.h>
28#include <shellapi.h>
29
30#include <wine/debug.h>
31
33
34static const DWORD wnd_style = WS_OVERLAPPEDWINDOW & ~WS_THICKFRAME & ~WS_MAXIMIZEBOX;
35static const WCHAR registry_key[] = {'S','o','f','t','w','a','r','e','\\',
36 'M','i','c','r','o','s','o','f','t','\\',
37 'W','i','n','M','i','n','e',0};
38
39static const WCHAR xposW[] = {'X','p','o','s',0};
40static const WCHAR yposW[] = {'Y','p','o','s',0};
41static const WCHAR heightW[] = {'H','e','i','g','h','t',0};
42static const WCHAR widthW[] = {'W','i','d','t','h',0};
43static const WCHAR minesW[] = {'M','i','n','e','s',0};
44static const WCHAR difficultyW[] = {'D','i','f','f','i','c','u','l','t','y',0};
45static const WCHAR markW[] = {'M','a','r','k',0};
46static const WCHAR nameW[] = {'N','a','m','e','%','u',0};
47static const WCHAR timeW[] = {'T','i','m','e','%','u',0};
48
49void CheckLevel( BOARD *p_board )
50{
51 if( p_board->rows < BEGINNER_ROWS )
52 p_board->rows = BEGINNER_ROWS;
53
54 if( p_board->rows > MAX_ROWS )
55 p_board->rows = MAX_ROWS;
56
57 if( p_board->cols < BEGINNER_COLS )
58 p_board->cols = BEGINNER_COLS;
59
60 if( p_board->cols > MAX_COLS )
61 p_board->cols = MAX_COLS;
62
63 if( p_board->mines < BEGINNER_MINES )
64 p_board->mines = BEGINNER_MINES;
65
66 if( p_board->mines > ( p_board->cols - 1 ) * ( p_board->rows - 1 ) )
67 p_board->mines = ( p_board->cols - 1 ) * ( p_board->rows - 1 );
68}
69
70static void LoadBoard( BOARD *p_board )
71{
72 DWORD size;
73 DWORD type;
74 HKEY hkey;
76 WCHAR key_name[8];
77 unsigned i;
78
80
81 size = sizeof( p_board->pos.x );
82 if( RegQueryValueExW( hkey, xposW, NULL, &type, (BYTE*) &p_board->pos.x, &size ) )
83 p_board->pos.x = 0;
84
85 size = sizeof( p_board->pos.y );
86 if( RegQueryValueExW( hkey, yposW, NULL, &type, (BYTE*) &p_board->pos.y, &size ) )
87 p_board->pos.y = 0;
88
89 size = sizeof( p_board->rows );
90 if( RegQueryValueExW( hkey, heightW, NULL, &type, (BYTE*) &p_board->rows, &size ) )
91 p_board->rows = BEGINNER_ROWS;
92
93 size = sizeof( p_board->cols );
94 if( RegQueryValueExW( hkey, widthW, NULL, &type, (BYTE*) &p_board->cols, &size ) )
95 p_board->cols = BEGINNER_COLS;
96
97 size = sizeof( p_board->mines );
98 if( RegQueryValueExW( hkey, minesW, NULL, &type, (BYTE*) &p_board->mines, &size ) )
99 p_board->mines = BEGINNER_MINES;
100
101 size = sizeof( p_board->difficulty );
102 if( RegQueryValueExW( hkey, difficultyW, NULL, &type, (BYTE*) &p_board->difficulty, &size ) )
103 p_board->difficulty = BEGINNER;
104
105 size = sizeof( p_board->IsMarkQ );
106 if( RegQueryValueExW( hkey, markW, NULL, &type, (BYTE*) &p_board->IsMarkQ, &size ) )
107 p_board->IsMarkQ = TRUE;
108
109 for( i = 0; i < 3; i++ ) {
110 wsprintfW( key_name, nameW, i+1 );
111 size = sizeof( data );
112 if( RegQueryValueExW( hkey, key_name, NULL, &type,
113 (LPBYTE) data, &size ) == ERROR_SUCCESS )
114 lstrcpynW( p_board->best_name[i], data, sizeof(p_board->best_name[i])/sizeof(WCHAR) );
115 else
116 LoadStringW( p_board->hInst, IDS_NOBODY, p_board->best_name[i], MAX_PLAYER_NAME_SIZE+1 );
117 }
118
119 for( i = 0; i < 3; i++ ) {
120 wsprintfW( key_name, timeW, i+1 );
121 size = sizeof( p_board->best_time[i] );
122 if( RegQueryValueExW( hkey, key_name, NULL, &type, (BYTE*) &p_board->best_time[i], &size ) )
123 p_board->best_time[i] = 999;
124 }
125 RegCloseKey( hkey );
126}
127
128static void InitBoard( BOARD *p_board )
129{
130 HMENU hMenu;
131
132 p_board->hMinesBMP = LoadBitmapW( p_board->hInst, MAKEINTRESOURCEW(IDI_MINES));
133 p_board->hFacesBMP = LoadBitmapW( p_board->hInst, MAKEINTRESOURCEW(IDI_FACES));
134 p_board->hLedsBMP = LoadBitmapW( p_board->hInst, MAKEINTRESOURCEW(IDI_LEDS));
135
136 LoadBoard( p_board );
137
138 hMenu = GetMenu( p_board->hWnd );
139 CheckMenuItem( hMenu, IDM_BEGINNER + (unsigned) p_board->difficulty,
140 MF_CHECKED );
141 if( p_board->IsMarkQ )
143 else
145 CheckLevel( p_board );
146}
147
148static void SaveBoard( BOARD *p_board )
149{
150 HKEY hkey;
151 unsigned i;
153 WCHAR key_name[8];
154
156 0, NULL,
158 &hkey, NULL ) != ERROR_SUCCESS)
159 return;
160
161 RegSetValueExW( hkey, xposW, 0, REG_DWORD, (LPBYTE) &p_board->pos.x, sizeof(p_board->pos.x) );
162 RegSetValueExW( hkey, yposW, 0, REG_DWORD, (LPBYTE) &p_board->pos.y, sizeof(p_board->pos.y) );
163 RegSetValueExW( hkey, difficultyW, 0, REG_DWORD, (LPBYTE) &p_board->difficulty, sizeof(p_board->difficulty) );
164 RegSetValueExW( hkey, heightW, 0, REG_DWORD, (LPBYTE) &p_board->rows, sizeof(p_board->rows) );
165 RegSetValueExW( hkey, widthW, 0, REG_DWORD, (LPBYTE) &p_board->cols, sizeof(p_board->cols) );
166 RegSetValueExW( hkey, minesW, 0, REG_DWORD, (LPBYTE) &p_board->mines, sizeof(p_board->mines) );
167 RegSetValueExW( hkey, markW, 0, REG_DWORD, (LPBYTE) &p_board->IsMarkQ, sizeof(p_board->IsMarkQ) );
168
169 for( i = 0; i < 3; i++ ) {
170 wsprintfW( key_name, nameW, i+1 );
171 lstrcpynW( data, p_board->best_name[i], sizeof(data)/sizeof(WCHAR) );
172 RegSetValueExW( hkey, key_name, 0, REG_SZ, (LPBYTE) data, (lstrlenW(data)+1) * sizeof(WCHAR) );
173 }
174
175 for( i = 0; i < 3; i++ ) {
176 wsprintfW( key_name, timeW, i+1 );
177 RegSetValueExW( hkey, key_name, 0, REG_DWORD, (LPBYTE) &p_board->best_time[i], sizeof(p_board->best_time[i]) );
178 }
179 RegCloseKey( hkey );
180}
181
182static void DestroyBoard( BOARD *p_board )
183{
184 DeleteObject( p_board->hFacesBMP );
185 DeleteObject( p_board->hLedsBMP );
186 DeleteObject( p_board->hMinesBMP );
187}
188
189static void SetDifficulty( BOARD *p_board, DIFFICULTY difficulty )
190{
191 HMENU hMenu;
192
193 if ( difficulty == CUSTOM )
194 if (DialogBoxParamW( p_board->hInst, MAKEINTRESOURCEW(DLG_CUSTOM), p_board->hWnd,
195 CustomDlgProc, (LPARAM) p_board) != 0)
196 return;
197
198 hMenu = GetMenu( p_board->hWnd );
200 p_board->difficulty = difficulty;
201 CheckMenuItem( hMenu, IDM_BEGINNER + difficulty, MF_CHECKED );
202
203 switch( difficulty ) {
204 case BEGINNER:
205 p_board->cols = BEGINNER_COLS;
206 p_board->rows = BEGINNER_ROWS;
207 p_board->mines = BEGINNER_MINES;
208 break;
209
210 case ADVANCED:
211 p_board->cols = ADVANCED_COLS;
212 p_board->rows = ADVANCED_ROWS;
213 p_board->mines = ADVANCED_MINES;
214 break;
215
216 case EXPERT:
217 p_board->cols = EXPERT_COLS;
218 p_board->rows = EXPERT_ROWS;
219
220 p_board->mines = EXPERT_MINES;
221 break;
222
223 case CUSTOM:
224 break;
225 }
226}
227
228static void ShiftBetween(LONG* x, LONG* y, LONG a, LONG b)
229{
230 if (*x < a) {
231 *y += a - *x;
232 *x = a;
233 }
234 else if (*y > b) {
235 *x -= *y - b;
236 *y = b;
237 }
238}
239
240static void MoveOnScreen(RECT* rect)
241{
242 HMONITOR hMonitor;
244
245 /* find the nearest monitor ... */
246 hMonitor = MonitorFromRect(rect, MONITOR_DEFAULTTONEAREST);
247
248 /* ... and move it into the work area (ie excluding task bar)*/
249 mi.cbSize = sizeof(mi);
250 GetMonitorInfoW(hMonitor, &mi);
251
252 ShiftBetween(&rect->left, &rect->right, mi.rcWork.left, mi.rcWork.right);
253 ShiftBetween(&rect->top, &rect->bottom, mi.rcWork.top, mi.rcWork.bottom);
254}
255
256static void CreateBoard( BOARD *p_board )
257{
258 int left, top, bottom, right;
259 unsigned col, row;
260 RECT wnd_rect;
261
262 p_board->mb = MB_NONE;
263 p_board->boxes_left = p_board->cols * p_board->rows - p_board->mines;
264 p_board->num_flags = 0;
265
266 /* Create the boxes...
267 * We actually create them with an empty border,
268 * so special care doesn't have to be taken on the edges
269 */
270 for( col = 0; col <= p_board->cols + 1; col++ )
271 for( row = 0; row <= p_board->rows + 1; row++ ) {
272 p_board->box[col][row].IsPressed = FALSE;
273 p_board->box[col][row].IsMine = FALSE;
274 p_board->box[col][row].FlagType = NORMAL;
275 p_board->box[col][row].NumMines = 0;
276 }
277
278 p_board->width = p_board->cols * MINE_WIDTH + BOARD_WMARGIN * 2;
279
280 p_board->height = p_board->rows * MINE_HEIGHT + LED_HEIGHT
281 + BOARD_HMARGIN * 3;
282
283 /* setting the mines rectangle boundary */
286 right = left + p_board->cols * MINE_WIDTH;
287 bottom = top + p_board->rows * MINE_HEIGHT;
288 SetRect( &p_board->mines_rect, left, top, right, bottom );
289
290 /* setting the face rectangle boundary */
291 left = p_board->width / 2 - FACE_WIDTH / 2;
295 SetRect( &p_board->face_rect, left, top, right, bottom );
296
297 /* setting the timer rectangle boundary */
300 right = left + LED_WIDTH * 3;
302 SetRect( &p_board->timer_rect, left, top, right, bottom );
303
304 /* setting the counter rectangle boundary */
305 left = p_board->width - BOARD_WMARGIN - LED_WIDTH * 3;
307 right = p_board->width - BOARD_WMARGIN;
309 SetRect( &p_board->counter_rect, left, top, right, bottom );
310
311 p_board->status = WAITING;
312 p_board->face_bmp = SMILE_BMP;
313 p_board->time = 0;
314
315 SetRect(&wnd_rect, p_board->pos.x, p_board->pos.y, p_board->pos.x + p_board->width,
316 p_board->pos.y + p_board->height);
317 AdjustWindowRect(&wnd_rect, wnd_style, TRUE);
318
319 /* Make sure the window is completely on the screen */
320 MoveOnScreen(&wnd_rect);
321 MoveWindow( p_board->hWnd, wnd_rect.left, wnd_rect.top,
322 wnd_rect.right - wnd_rect.left,
323 wnd_rect.bottom - wnd_rect.top,
324 TRUE );
325 RedrawWindow( p_board->hWnd, NULL, 0,
327}
328
329
330/* Randomly places mines everywhere except the selected box. */
331static void PlaceMines ( BOARD *p_board, int selected_col, int selected_row )
332{
333 int i, j;
334 unsigned col, row;
335
336 srand( (unsigned) time( NULL ) );
337
338 /* Temporarily place a mine at the selected box until all the other
339 * mines are placed, this avoids checking in the mine creation loop. */
340 p_board->box[selected_col][selected_row].IsMine = TRUE;
341
342 /* create mines */
343 i = 0;
344 while( (unsigned) i < p_board->mines ) {
345 col = rand() % p_board->cols + 1;
346 row = rand() % p_board->rows + 1;
347
348 if( !p_board->box[col][row].IsMine ) {
349 i++;
350 p_board->box[col][row].IsMine = TRUE;
351 }
352 }
353
354 /* Remove temporarily placed mine for selected box */
355 p_board->box[selected_col][selected_row].IsMine = FALSE;
356
357 /*
358 * Now we label the remaining boxes with the
359 * number of mines surrounding them.
360 */
361 for( col = 1; col < p_board->cols + 1; col++ )
362 for( row = 1; row < p_board->rows + 1; row++ ) {
363 for( i = -1; i <= 1; i++ )
364 for( j = -1; j <= 1; j++ ) {
365 if( p_board->box[col + i][row + j].IsMine ) {
366 p_board->box[col][row].NumMines++ ;
367 }
368 }
369 }
370}
371
372static void DrawMine( HDC hdc, HDC hMemDC, BOARD *p_board, unsigned col, unsigned row, BOOL IsPressed )
373{
375
376 if( col == 0 || col > p_board->cols || row == 0 || row > p_board->rows )
377 return;
378
379 if( p_board->status == GAMEOVER ) {
380 if( p_board->box[col][row].IsMine ) {
381 switch( p_board->box[col][row].FlagType ) {
382 case FLAG:
384 break;
385 case COMPLETE:
387 break;
388 case QUESTION:
389 /* fall through */
390 case NORMAL:
392 }
393 } else {
394 switch( p_board->box[col][row].FlagType ) {
395 case QUESTION:
397 break;
398 case FLAG:
400 break;
401 case NORMAL:
402 offset = BOX_BMP;
403 break;
404 case COMPLETE:
405 /* Do nothing */
406 break;
407 default:
408 WINE_TRACE("Unknown FlagType during game over in DrawMine\n");
409 break;
410 }
411 }
412 } else { /* WAITING or PLAYING */
413 switch( p_board->box[col][row].FlagType ) {
414 case QUESTION:
415 if( !IsPressed )
417 else
419 break;
420 case FLAG:
422 break;
423 case NORMAL:
424 if( !IsPressed )
425 offset = BOX_BMP;
426 else
428 break;
429 case COMPLETE:
430 /* Do nothing */
431 break;
432 default:
433 WINE_TRACE("Unknown FlagType while playing in DrawMine\n");
434 break;
435 }
436 }
437
438 if( p_board->box[col][row].FlagType == COMPLETE
439 && !p_board->box[col][row].IsMine )
440 offset = (MINEBMP_OFFSET) p_board->box[col][row].NumMines;
441
442 BitBlt( hdc,
443 (col - 1) * MINE_WIDTH + p_board->mines_rect.left,
444 (row - 1) * MINE_HEIGHT + p_board->mines_rect.top,
446 hMemDC, 0, offset * MINE_HEIGHT, SRCCOPY );
447}
448
449static void DrawMines ( HDC hdc, HDC hMemDC, BOARD *p_board )
450{
451 HGDIOBJ hOldObj;
452 unsigned col, row;
453 hOldObj = SelectObject (hMemDC, p_board->hMinesBMP);
454
455 for( row = 1; row <= p_board->rows; row++ ) {
456 for( col = 1; col <= p_board->cols; col++ ) {
457 DrawMine( hdc, hMemDC, p_board, col, row, FALSE );
458 }
459 }
460 SelectObject( hMemDC, hOldObj );
461}
462
463static void DrawLeds( HDC hdc, HDC hMemDC, BOARD *p_board, int number, int x, int y )
464{
465 HGDIOBJ hOldObj;
466 unsigned led[3], i;
467 int count;
468
469 count = number;
470 if( count < 1000 ) {
471 if( count >= 0 ) {
472 led[0] = count / 100 ;
473 count -= led[0] * 100;
474 }
475 else {
476 led[0] = 10; /* negative sign */
477 count = -count;
478 }
479 led[1] = count / 10;
480 count -= led[1] * 10;
481 led[2] = count;
482 }
483 else {
484 for( i = 0; i < 3; i++ )
485 led[i] = 10;
486 }
487
488 hOldObj = SelectObject (hMemDC, p_board->hLedsBMP);
489
490 for( i = 0; i < 3; i++ ) {
491 BitBlt( hdc,
492 i * LED_WIDTH + x,
493 y,
494 LED_WIDTH,
496 hMemDC,
497 0,
498 led[i] * LED_HEIGHT,
499 SRCCOPY);
500 }
501
502 SelectObject( hMemDC, hOldObj );
503}
504
505
506static void DrawFace( HDC hdc, HDC hMemDC, BOARD *p_board )
507{
508 HGDIOBJ hOldObj;
509
510 hOldObj = SelectObject (hMemDC, p_board->hFacesBMP);
511
512 BitBlt( hdc,
513 p_board->face_rect.left,
514 p_board->face_rect.top,
517 hMemDC, 0, p_board->face_bmp * FACE_HEIGHT, SRCCOPY);
518
519 SelectObject( hMemDC, hOldObj );
520}
521
522
523static void DrawBoard( HDC hdc, HDC hMemDC, PAINTSTRUCT *ps, BOARD *p_board )
524{
525 RECT tmp_rect;
526
527 if( IntersectRect( &tmp_rect, &ps->rcPaint, &p_board->counter_rect ) )
528 DrawLeds( hdc, hMemDC, p_board, p_board->mines - p_board->num_flags,
529 p_board->counter_rect.left,
530 p_board->counter_rect.top );
531
532 if( IntersectRect( &tmp_rect, &ps->rcPaint, &p_board->timer_rect ) )
533 DrawLeds( hdc, hMemDC, p_board, p_board->time,
534 p_board->timer_rect.left,
535 p_board->timer_rect.top );
536
537 if( IntersectRect( &tmp_rect, &ps->rcPaint, &p_board->face_rect ) )
538 DrawFace( hdc, hMemDC, p_board );
539
540 if( IntersectRect( &tmp_rect, &ps->rcPaint, &p_board->mines_rect ) )
541 DrawMines( hdc, hMemDC, p_board );
542}
543
544
545static void AddFlag( BOARD *p_board, unsigned col, unsigned row )
546{
547 if( p_board->box[col][row].FlagType != COMPLETE ) {
548 switch( p_board->box[col][row].FlagType ) {
549 case FLAG:
550 if( p_board->IsMarkQ )
551 p_board->box[col][row].FlagType = QUESTION;
552 else
553 p_board->box[col][row].FlagType = NORMAL;
554 p_board->num_flags--;
555 break;
556
557 case QUESTION:
558 p_board->box[col][row].FlagType = NORMAL;
559 break;
560
561 default:
562 p_board->box[col][row].FlagType = FLAG;
563 p_board->num_flags++;
564 }
565 }
566}
567
568
569static void UnpressBox( BOARD *p_board, unsigned col, unsigned row )
570{
571 HDC hdc;
572 HGDIOBJ hOldObj;
573 HDC hMemDC;
574
575 hdc = GetDC( p_board->hWnd );
576 hMemDC = CreateCompatibleDC( hdc );
577 hOldObj = SelectObject( hMemDC, p_board->hMinesBMP );
578
579 DrawMine( hdc, hMemDC, p_board, col, row, FALSE );
580
581 SelectObject( hMemDC, hOldObj );
582 DeleteDC( hMemDC );
583 ReleaseDC( p_board->hWnd, hdc );
584}
585
586
587static void UnpressBoxes( BOARD *p_board, unsigned col, unsigned row )
588{
589 int i, j;
590
591 for( i = -1; i <= 1; i++ )
592 for( j = -1; j <= 1; j++ ) {
593 UnpressBox( p_board, col + i, row + j );
594 }
595}
596
597
598static void PressBox( BOARD *p_board, unsigned col, unsigned row )
599{
600 HDC hdc;
601 HGDIOBJ hOldObj;
602 HDC hMemDC;
603
604 hdc = GetDC( p_board->hWnd );
605 hMemDC = CreateCompatibleDC( hdc );
606 hOldObj = SelectObject (hMemDC, p_board->hMinesBMP);
607
608 DrawMine( hdc, hMemDC, p_board, col, row, TRUE );
609
610 SelectObject( hMemDC, hOldObj );
611 DeleteDC( hMemDC );
612 ReleaseDC( p_board->hWnd, hdc );
613}
614
615
616static void PressBoxes( BOARD *p_board, unsigned col, unsigned row )
617{
618 int i, j;
619
620 for( i = -1; i <= 1; i++ )
621 for( j = -1; j <= 1; j++ ) {
622 p_board->box[col + i][row + j].IsPressed = TRUE;
623 PressBox( p_board, col + i, row + j );
624 }
625
626 for( i = -1; i <= 1; i++ )
627 for( j = -1; j <= 1; j++ ) {
628 if( !p_board->box[p_board->press.x + i][p_board->press.y + j].IsPressed )
629 UnpressBox( p_board, p_board->press.x + i, p_board->press.y + j );
630 }
631
632 for( i = -1; i <= 1; i++ )
633 for( j = -1; j <= 1; j++ ) {
634 p_board->box[col + i][row + j].IsPressed = FALSE;
635 PressBox( p_board, col + i, row + j );
636 }
637
638 p_board->press.x = col;
639 p_board->press.y = row;
640}
641
642
643static void CompleteBox( BOARD *p_board, unsigned col, unsigned row )
644{
645 int i, j;
646
647 if( p_board->box[col][row].FlagType != COMPLETE &&
648 p_board->box[col][row].FlagType != FLAG &&
649 col > 0 && col < p_board->cols + 1 &&
650 row > 0 && row < p_board->rows + 1 ) {
651 p_board->box[col][row].FlagType = COMPLETE;
652
653 if( p_board->box[col][row].IsMine ) {
654 p_board->face_bmp = DEAD_BMP;
655 p_board->status = GAMEOVER;
656 }
657 else if( p_board->status != GAMEOVER )
658 p_board->boxes_left--;
659
660 if( p_board->box[col][row].NumMines == 0 )
661 {
662 for( i = -1; i <= 1; i++ )
663 for( j = -1; j <= 1; j++ )
664 CompleteBox( p_board, col + i, row + j );
665 }
666 }
667}
668
669
670static void CompleteBoxes( BOARD *p_board, unsigned col, unsigned row )
671{
672 unsigned numFlags = 0;
673 int i, j;
674
675 if( p_board->box[col][row].FlagType == COMPLETE ) {
676 for( i = -1; i <= 1; i++ )
677 for( j = -1; j <= 1; j++ ) {
678 if( p_board->box[col+i][row+j].FlagType == FLAG )
679 numFlags++;
680 }
681
682 if( numFlags == p_board->box[col][row].NumMines ) {
683 for( i = -1; i <= 1; i++ )
684 for( j = -1; j <= 1; j++ ) {
685 if( p_board->box[col+i][row+j].FlagType != FLAG )
686 CompleteBox( p_board, col+i, row+j );
687 }
688 }
689 }
690}
691
692
693static void TestMines( BOARD *p_board, POINT pt, int msg )
694{
695 BOOL draw = TRUE;
696 int col, row;
697
698 col = (pt.x - p_board->mines_rect.left) / MINE_WIDTH + 1;
699 row = (pt.y - p_board->mines_rect.top ) / MINE_HEIGHT + 1;
700
701 switch ( msg ) {
702 case WM_LBUTTONDOWN:
703 if( p_board->press.x != col || p_board->press.y != row ) {
704 UnpressBox( p_board,
705 p_board->press.x, p_board->press.y );
706 p_board->press.x = col;
707 p_board->press.y = row;
708 PressBox( p_board, col, row );
709 }
710 draw = FALSE;
711 break;
712
713 case WM_LBUTTONUP:
714 if( p_board->press.x != col || p_board->press.y != row )
715 UnpressBox( p_board,
716 p_board->press.x, p_board->press.y );
717 p_board->press.x = 0;
718 p_board->press.y = 0;
719 if( p_board->box[col][row].FlagType != FLAG
720 && p_board->status != PLAYING )
721 {
722 p_board->status = PLAYING;
723 PlaceMines( p_board, col, row );
724 }
725 CompleteBox( p_board, col, row );
726 break;
727
728 case WM_MBUTTONDOWN:
729 PressBoxes( p_board, col, row );
730 draw = FALSE;
731 break;
732
733 case WM_MBUTTONUP:
734 if( p_board->press.x != col || p_board->press.y != row )
735 UnpressBoxes( p_board,
736 p_board->press.x, p_board->press.y );
737 p_board->press.x = 0;
738 p_board->press.y = 0;
739 CompleteBoxes( p_board, col, row );
740 break;
741
742 case WM_RBUTTONDOWN:
743 AddFlag( p_board, col, row );
744 break;
745 default:
746 WINE_TRACE("Unknown message type received in TestMines\n");
747 break;
748 }
749
750 if( draw )
751 {
752 RedrawWindow( p_board->hWnd, NULL, 0,
754 }
755}
756
757
758static void TestFace( BOARD *p_board, POINT pt, int msg )
759{
760 if( p_board->status == PLAYING || p_board->status == WAITING ) {
761 if( msg == WM_LBUTTONDOWN || msg == WM_MBUTTONDOWN )
762 p_board->face_bmp = OOH_BMP;
763 else p_board->face_bmp = SMILE_BMP;
764 }
765 else if( p_board->status == GAMEOVER )
766 p_board->face_bmp = DEAD_BMP;
767 else if( p_board->status == WON )
768 p_board->face_bmp = COOL_BMP;
769
770 if( PtInRect( &p_board->face_rect, pt ) ) {
771 if( msg == WM_LBUTTONDOWN )
772 p_board->face_bmp = SPRESS_BMP;
773
774 if( msg == WM_LBUTTONUP )
775 CreateBoard( p_board );
776 }
777
778 RedrawWindow( p_board->hWnd, &p_board->face_rect, 0,
780}
781
782
783static void TestBoard( HWND hWnd, BOARD *p_board, int x, int y, int msg )
784{
785 POINT pt;
786 unsigned col,row;
787
788 pt.x = x;
789 pt.y = y;
790
791 if( PtInRect( &p_board->mines_rect, pt ) && p_board->status != GAMEOVER
792 && p_board->status != WON )
793 TestMines( p_board, pt, msg );
794 else {
795 UnpressBoxes( p_board,
796 p_board->press.x,
797 p_board->press.y );
798 p_board->press.x = 0;
799 p_board->press.y = 0;
800 }
801
802 if( p_board->boxes_left == 0 ) {
803 p_board->status = WON;
804
805 if (p_board->num_flags < p_board->mines) {
806 for( row = 1; row <= p_board->rows; row++ ) {
807 for( col = 1; col <= p_board->cols; col++ ) {
808 if (p_board->box[col][row].IsMine && p_board->box[col][row].FlagType != FLAG)
809 p_board->box[col][row].FlagType = FLAG;
810 }
811 }
812
813 p_board->num_flags = p_board->mines;
814
815 RedrawWindow( p_board->hWnd, NULL, 0,
817 }
818
819 if( p_board->difficulty != CUSTOM &&
820 p_board->time < p_board->best_time[p_board->difficulty] ) {
821 p_board->best_time[p_board->difficulty] = p_board->time;
822
824 CongratsDlgProc, (LPARAM) p_board);
826 TimesDlgProc, (LPARAM) p_board);
827 }
828 }
829 TestFace( p_board, pt, msg );
830}
831
832
834{
835 HDC hdc;
836 PAINTSTRUCT ps;
837 HMENU hMenu;
838 static BOARD board;
839
840 switch( msg ) {
841 case WM_CREATE:
842 board.hInst = ((LPCREATESTRUCTW) lParam)->hInstance;
843 board.hWnd = hWnd;
844 InitBoard( &board );
845 CreateBoard( &board );
846 return 0;
847
848 case WM_PAINT:
849 {
850 HDC hMemDC;
851
852 WINE_TRACE("WM_PAINT\n");
853 hdc = BeginPaint( hWnd, &ps );
854 hMemDC = CreateCompatibleDC( hdc );
855
856 DrawBoard( hdc, hMemDC, &ps, &board );
857
858 DeleteDC( hMemDC );
859 EndPaint( hWnd, &ps );
860
861 return 0;
862 }
863
864 case WM_MOVE:
865 WINE_TRACE("WM_MOVE\n");
866 board.pos.x = (short)LOWORD(lParam);
867 board.pos.y = (short)HIWORD(lParam);
868 return 0;
869
870 case WM_DESTROY:
871 SaveBoard( &board );
872 DestroyBoard( &board );
873 PostQuitMessage( 0 );
874 return 0;
875
876 case WM_TIMER:
877 if( board.status == PLAYING ) {
878 board.time++;
879 RedrawWindow( hWnd, &board.timer_rect, 0,
881 }
882 return 0;
883
884 case WM_LBUTTONDOWN:
885 WINE_TRACE("WM_LBUTTONDOWN\n");
886 if( wParam & ( MK_RBUTTON | MK_SHIFT ) )
888 TestBoard( hWnd, &board, (short)LOWORD(lParam), (short)HIWORD(lParam), msg );
889 SetCapture( hWnd );
890 return 0;
891
892 case WM_LBUTTONUP:
893 WINE_TRACE("WM_LBUTTONUP\n");
894 if( wParam & ( MK_RBUTTON | MK_SHIFT ) )
896 TestBoard( hWnd, &board, (short)LOWORD(lParam), (short)HIWORD(lParam), msg );
898 return 0;
899
900 case WM_RBUTTONDOWN:
901 WINE_TRACE("WM_RBUTTONDOWN\n");
902 if( wParam & MK_LBUTTON ) {
903 board.press.x = 0;
904 board.press.y = 0;
906 }
907 TestBoard( hWnd, &board, (short)LOWORD(lParam), (short)HIWORD(lParam), msg );
908 return 0;
909
910 case WM_RBUTTONUP:
911 WINE_TRACE("WM_RBUTTONUP\n");
912 if( wParam & MK_LBUTTON )
914 TestBoard( hWnd, &board, (short)LOWORD(lParam), (short)HIWORD(lParam), msg );
915 return 0;
916
917 case WM_MBUTTONDOWN:
918 WINE_TRACE("WM_MBUTTONDOWN\n");
919 TestBoard( hWnd, &board, (short)LOWORD(lParam), (short)HIWORD(lParam), msg );
920 return 0;
921
922 case WM_MBUTTONUP:
923 WINE_TRACE("WM_MBUTTONUP\n");
924 TestBoard( hWnd, &board, (short)LOWORD(lParam), (short)HIWORD(lParam), msg );
925 return 0;
926
927 case WM_MOUSEMOVE:
928 {
929 if( ( wParam & MK_MBUTTON ) ||
930 ( ( wParam & MK_LBUTTON ) && ( wParam & MK_RBUTTON ) ) ) {
932 }
933 else if( wParam & MK_LBUTTON ) {
935 }
936 else {
937 return 0;
938 }
939
940 TestBoard( hWnd, &board, (short)LOWORD(lParam), (short)HIWORD(lParam), msg );
941
942 return 0;
943 }
944
945 case WM_COMMAND:
946 switch(LOWORD(wParam)) {
947 case IDM_NEW:
948 CreateBoard( &board );
949 return 0;
950
951 case IDM_MARKQ:
952 hMenu = GetMenu( hWnd );
953 board.IsMarkQ = !board.IsMarkQ;
954 if( board.IsMarkQ )
956 else
958 return 0;
959
960 case IDM_BEGINNER:
961 SetDifficulty( &board, BEGINNER );
962 CreateBoard( &board );
963 return 0;
964
965 case IDM_ADVANCED:
966 SetDifficulty( &board, ADVANCED );
967 CreateBoard( &board );
968 return 0;
969
970 case IDM_EXPERT:
971 SetDifficulty( &board, EXPERT );
972 CreateBoard( &board );
973 return 0;
974
975 case IDM_CUSTOM:
976 SetDifficulty( &board, CUSTOM );
977 CreateBoard( &board );
978 return 0;
979
980 case IDM_EXIT:
981 SendMessageW( hWnd, WM_CLOSE, 0, 0);
982 return 0;
983
984 case IDM_TIMES:
986 TimesDlgProc, (LPARAM) &board);
987 return 0;
988
989 case IDM_ABOUT:
990 {
991 WCHAR appname[256], other[256];
992 LoadStringW( board.hInst, IDS_APPNAME, appname, sizeof(appname)/sizeof(WCHAR) );
993 LoadStringW( board.hInst, IDS_ABOUT, other, sizeof(other)/sizeof(WCHAR) );
994 ShellAboutW( hWnd, appname, other,
996 return 0;
997 }
998 default:
999 WINE_TRACE("Unknown WM_COMMAND command message received\n");
1000 break;
1001 }
1002 }
1003 return DefWindowProcW( hWnd, msg, wParam, lParam );
1004}
1005
1006int WINAPI wWinMain( HINSTANCE hInst, HINSTANCE hPrevInst, LPWSTR cmdline, int cmdshow )
1007{
1008 MSG msg;
1009 WNDCLASSEXW wc;
1010 HWND hWnd;
1011 HACCEL haccel;
1012 WCHAR appname[20];
1013
1014 LoadStringW( hInst, IDS_APPNAME, appname, sizeof(appname)/sizeof(WCHAR));
1015
1016 wc.cbSize = sizeof(wc);
1017 wc.style = 0;
1018 wc.lpfnWndProc = MainProc;
1019 wc.cbClsExtra = 0;
1020 wc.cbWndExtra = 0;
1021 wc.hInstance = hInst;
1024 wc.hbrBackground = GetSysColorBrush(COLOR_BTNFACE); //MOD for ROS
1026 wc.lpszClassName = appname;
1029
1030 if (!RegisterClassExW(&wc)) ExitProcess(1);
1031 hWnd = CreateWindowW( appname, appname,
1032 wnd_style,
1034 0, 0, hInst, NULL );
1035
1036 if (!hWnd) ExitProcess(1);
1037
1038 ShowWindow( hWnd, cmdshow );
1039 UpdateWindow( hWnd );
1040
1042 SetTimer( hWnd, ID_TIMER, 1000, NULL );
1043
1044 while( GetMessageW(&msg, 0, 0, 0) ) {
1045 if (!TranslateAcceleratorW( hWnd, haccel, &msg ))
1047
1049 }
1050 return msg.wParam;
1051}
#define msg(x)
Definition: auth_time.c:54
#define IDS_ABOUT
Definition: resource.h:29
HWND hWnd
Definition: settings.c:17
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
int WINAPI wWinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPWSTR cmdline, int cmdshow)
Definition: main.c:419
INT_PTR CALLBACK CustomDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: dialog.c:23
INT_PTR CALLBACK CongratsDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: dialog.c:55
INT_PTR CALLBACK TimesDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: dialog.c:83
static void SetDifficulty(BOARD *p_board, DIFFICULTY difficulty)
Definition: main.c:189
static void TestBoard(HWND hWnd, BOARD *p_board, int x, int y, int msg)
Definition: main.c:783
static const WCHAR minesW[]
Definition: main.c:43
static const WCHAR widthW[]
Definition: main.c:42
static const WCHAR nameW[]
Definition: main.c:46
static void MoveOnScreen(RECT *rect)
Definition: main.c:240
static void PressBox(BOARD *p_board, unsigned col, unsigned row)
Definition: main.c:598
static const WCHAR difficultyW[]
Definition: main.c:44
static void DrawMines(HDC hdc, HDC hMemDC, BOARD *p_board)
Definition: main.c:449
static void DrawLeds(HDC hdc, HDC hMemDC, BOARD *p_board, int number, int x, int y)
Definition: main.c:463
static void SaveBoard(BOARD *p_board)
Definition: main.c:148
static const WCHAR xposW[]
Definition: main.c:39
static void TestMines(BOARD *p_board, POINT pt, int msg)
Definition: main.c:693
static void TestFace(BOARD *p_board, POINT pt, int msg)
Definition: main.c:758
static const WCHAR yposW[]
Definition: main.c:40
static void DrawFace(HDC hdc, HDC hMemDC, BOARD *p_board)
Definition: main.c:506
static void DrawBoard(HDC hdc, HDC hMemDC, PAINTSTRUCT *ps, BOARD *p_board)
Definition: main.c:523
static void CompleteBoxes(BOARD *p_board, unsigned col, unsigned row)
Definition: main.c:670
static void ShiftBetween(LONG *x, LONG *y, LONG a, LONG b)
Definition: main.c:228
static void PressBoxes(BOARD *p_board, unsigned col, unsigned row)
Definition: main.c:616
static void UnpressBox(BOARD *p_board, unsigned col, unsigned row)
Definition: main.c:569
static void LoadBoard(BOARD *p_board)
Definition: main.c:70
static const DWORD wnd_style
Definition: main.c:34
static const WCHAR heightW[]
Definition: main.c:41
static const WCHAR markW[]
Definition: main.c:45
static void InitBoard(BOARD *p_board)
Definition: main.c:128
static void PlaceMines(BOARD *p_board, int selected_col, int selected_row)
Definition: main.c:331
void CheckLevel(BOARD *p_board)
Definition: main.c:49
static LRESULT WINAPI MainProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
Definition: main.c:833
static const WCHAR timeW[]
Definition: main.c:47
static void CreateBoard(BOARD *p_board)
Definition: main.c:256
static void DrawMine(HDC hdc, HDC hMemDC, BOARD *p_board, unsigned col, unsigned row, BOOL IsPressed)
Definition: main.c:372
static void CompleteBox(BOARD *p_board, unsigned col, unsigned row)
Definition: main.c:643
static void DestroyBoard(BOARD *p_board)
Definition: main.c:182
static void UnpressBoxes(BOARD *p_board, unsigned col, unsigned row)
Definition: main.c:587
static void AddFlag(BOARD *p_board, unsigned col, unsigned row)
Definition: main.c:545
#define BOARD_HMARGIN
Definition: main.h:47
#define NORMAL
Definition: main.h:125
#define QUESTION
Definition: main.h:126
#define BEGINNER_ROWS
Definition: main.h:32
#define FACE_WIDTH
Definition: main.h:54
#define BEGINNER_COLS
Definition: main.h:31
#define MAX_PLAYER_NAME_SIZE
Definition: main.h:57
#define ADVANCED_MINES
Definition: main.h:34
#define BEGINNER_MINES
Definition: main.h:30
@ GAMEOVER
Definition: main.h:61
@ WON
Definition: main.h:61
@ WAITING
Definition: main.h:61
@ PLAYING
Definition: main.h:61
#define COMPLETE
Definition: main.h:128
#define MINE_WIDTH
Definition: main.h:50
MINEBMP_OFFSET
Definition: main.h:63
@ MPRESS_BMP
Definition: main.h:64
@ QUESTION_BMP
Definition: main.h:65
@ BOX_BMP
Definition: main.h:65
@ MINE_BMP
Definition: main.h:66
@ WRONG_BMP
Definition: main.h:66
@ EXPLODE_BMP
Definition: main.h:65
@ QPRESS_BMP
Definition: main.h:66
@ FLAG_BMP
Definition: main.h:65
#define MAX_COLS
Definition: main.h:42
@ DEAD_BMP
Definition: main.h:59
@ SPRESS_BMP
Definition: main.h:59
@ OOH_BMP
Definition: main.h:59
@ SMILE_BMP
Definition: main.h:59
@ COOL_BMP
Definition: main.h:59
#define LED_WIDTH
Definition: main.h:52
#define ADVANCED_ROWS
Definition: main.h:36
#define ADVANCED_COLS
Definition: main.h:35
#define EXPERT_COLS
Definition: main.h:39
#define EXPERT_MINES
Definition: main.h:38
DIFFICULTY
Definition: main.h:69
@ ADVANCED
Definition: main.h:69
@ EXPERT
Definition: main.h:69
@ BEGINNER
Definition: main.h:69
@ CUSTOM
Definition: main.h:69
#define MB_NONE
Definition: main.h:105
#define MINE_HEIGHT
Definition: main.h:51
#define EXPERT_ROWS
Definition: main.h:40
#define LED_HEIGHT
Definition: main.h:53
#define BOARD_WMARGIN
Definition: main.h:46
#define FACE_HEIGHT
Definition: main.h:55
#define FLAG
Definition: main.h:127
#define IDM_WINEMINE
Definition: resource.h:55
#define IDI_LEDS
Definition: resource.h:59
#define IDM_MARKQ
Definition: resource.h:34
#define ID_TIMER
Definition: resource.h:23
#define IDM_ABOUT
Definition: resource.h:29
#define IDM_CUSTOM
Definition: resource.h:33
#define IDM_EXIT
Definition: resource.h:27
#define IDI_MINES
Definition: resource.h:60
#define IDS_APPNAME
Definition: resource.h:49
#define IDM_ADVANCED
Definition: resource.h:31
#define IDI_FACES
Definition: resource.h:58
#define IDA_WINEMINE
Definition: resource.h:53
#define IDM_BEGINNER
Definition: resource.h:30
#define IDM_TIMES
Definition: resource.h:28
#define IDI_WINEMINE
Definition: resource.h:57
#define DLG_CUSTOM
Definition: resource.h:64
#define IDM_EXPERT
Definition: resource.h:32
#define DLG_TIMES
Definition: resource.h:62
#define IDS_NOBODY
Definition: resource.h:50
#define IDM_NEW
Definition: resource.h:26
#define DLG_CONGRATS
Definition: resource.h:63
#define RegCloseKey(hKey)
Definition: registry.h:49
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
#define ERROR_SUCCESS
Definition: deptool.c:10
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
LONG WINAPI RegCreateKeyExW(_In_ HKEY hKey, _In_ LPCWSTR lpSubKey, _In_ DWORD Reserved, _In_opt_ LPWSTR lpClass, _In_ DWORD dwOptions, _In_ REGSAM samDesired, _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, _Out_ PHKEY phkResult, _Out_opt_ LPDWORD lpdwDisposition)
Definition: reg.c:1096
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3362
LONG WINAPI RegSetValueExW(_In_ HKEY hKey, _In_ LPCWSTR lpValueName, _In_ DWORD Reserved, _In_ DWORD dwType, _In_ CONST BYTE *lpData, _In_ DWORD cbData)
Definition: reg.c:4911
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
Definition: reg.c:4132
#define lstrcpynW
Definition: compat.h:738
#define lstrlenW
Definition: compat.h:750
VOID WINAPI ExitProcess(IN UINT uExitCode)
Definition: proc.c:1487
struct png_info_def *typedef unsigned char **typedef struct png_info_def *typedef struct png_info_def *typedef struct png_info_def *typedef unsigned char ** row
Definition: typeof.h:78
unsigned short(__cdecl typeof(TIFFCurrentDirectory))(struct tiff *)
Definition: typeof.h:94
#define pt(x, y)
Definition: drawing.c:79
static VOID NTAPI BitBlt(_In_ ULONG Left, _In_ ULONG Top, _In_ ULONG Width, _In_ ULONG Height, _In_reads_bytes_(Delta *Height) PUCHAR Buffer, _In_ ULONG BitsPerPixel, _In_ ULONG Delta)
Definition: common.c:49
HINSTANCE hInst
Definition: dxdiag.c:13
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
pKey DeleteObject()
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLsizeiptr size
Definition: glext.h:5919
GLdouble GLdouble GLdouble GLdouble top
Definition: glext.h:10859
GLdouble GLdouble right
Definition: glext.h:10859
GLboolean GLboolean GLboolean b
Definition: glext.h:6204
GLint left
Definition: glext.h:7726
GLint GLint bottom
Definition: glext.h:7726
GLboolean GLboolean GLboolean GLboolean a
Definition: glext.h:6204
GLintptr offset
Definition: glext.h:5920
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
Definition: glfuncs.h:250
void __cdecl srand(_In_ unsigned int _Seed)
_Check_return_ int __cdecl rand(void)
Definition: rand.c:10
#define a
Definition: ke_i.h:78
#define b
Definition: ke_i.h:79
#define REG_SZ
Definition: layer.c:22
#define MAX_ROWS
Definition: map.c:19
__u16 time
Definition: mkdosfs.c:8
HDC hdc
Definition: main.c:9
static HDC
Definition: imagelist.c:92
static unsigned int number
Definition: dsound.c:1479
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
Definition: ordinal.c:63
int other
Definition: msacm.c:1376
HMONITOR WINAPI MonitorFromRect(LPCRECT, DWORD)
unsigned int UINT
Definition: ndis.h:50
#define REG_OPTION_NON_VOLATILE
Definition: nt_native.h:1057
#define KEY_QUERY_VALUE
Definition: nt_native.h:1016
#define KEY_WRITE
Definition: nt_native.h:1031
#define LOWORD(l)
Definition: pedump.c:82
#define WS_OVERLAPPEDWINDOW
Definition: pedump.c:637
long LONG
Definition: pedump.c:60
#define REG_DWORD
Definition: sdbapi.c:596
#define WINE_TRACE
Definition: debug.h:354
BOOL WINAPI ShellAboutW(HWND hWnd, LPCWSTR szApp, LPCWSTR szOtherStuff, HICON hIcon)
& rect
Definition: startmenu.cpp:1413
TCHAR * cmdline
Definition: stretchblt.cpp:32
LPCWSTR lpszClassName
Definition: winuser.h:3226
LPCWSTR lpszMenuName
Definition: winuser.h:3225
HBRUSH hbrBackground
Definition: winuser.h:3224
WNDPROC lpfnWndProc
Definition: winuser.h:3218
UINT cbSize
Definition: winuser.h:3216
int cbWndExtra
Definition: winuser.h:3220
HCURSOR hCursor
Definition: winuser.h:3223
HICON hIconSm
Definition: winuser.h:3227
HINSTANCE hInstance
Definition: winuser.h:3221
UINT style
Definition: winuser.h:3217
int cbClsExtra
Definition: winuser.h:3219
HICON hIcon
Definition: winuser.h:3222
Definition: main.h:72
HWND hWnd
Definition: main.h:76
HBITMAP hMinesBMP
Definition: main.h:77
unsigned mb
Definition: main.h:112
DIFFICULTY difficulty
Definition: main.h:100
GAME_STATUS status
Definition: main.h:115
unsigned width
Definition: main.h:85
unsigned boxes_left
Definition: main.h:91
RECT timer_rect
Definition: main.h:82
RECT mines_rect
Definition: main.h:80
unsigned cols
Definition: main.h:96
unsigned height
Definition: main.h:86
DWORD best_time[3]
Definition: main.h:99
unsigned mines
Definition: main.h:97
HBITMAP hLedsBMP
Definition: main.h:79
HBITMAP hFacesBMP
Definition: main.h:78
RECT counter_rect
Definition: main.h:83
unsigned time
Definition: main.h:89
unsigned rows
Definition: main.h:95
unsigned num_flags
Definition: main.h:90
FACE_BMP face_bmp
Definition: main.h:114
RECT face_rect
Definition: main.h:81
WCHAR best_name[3][MAX_PLAYER_NAME_SIZE+1]
Definition: main.h:98
POINT pos
Definition: main.h:87
BOOL IsMarkQ
Definition: main.h:73
POINT press
Definition: main.h:102
HINSTANCE hInst
Definition: main.h:75
DWORD cbSize
Definition: winuser.h:3784
long y
Definition: polytest.cpp:48
long x
Definition: polytest.cpp:48
LONG right
Definition: windef.h:308
LONG bottom
Definition: windef.h:309
LONG top
Definition: windef.h:307
LONG left
Definition: windef.h:306
TW_UINT32 TW_UINT16 TW_UINT16 MSG
Definition: twain.h:1829
unsigned char * LPBYTE
Definition: typedefs.h:53
#define HIWORD(l)
Definition: typedefs.h:247
static MONITORINFO mi
Definition: win.c:7338
LONG_PTR LPARAM
Definition: windef.h:208
LONG_PTR LRESULT
Definition: windef.h:209
UINT_PTR WPARAM
Definition: windef.h:207
#define WINAPI
Definition: msvc.h:6
HGDIOBJ WINAPI SelectObject(_In_ HDC, _In_ HGDIOBJ)
Definition: dc.c:1539
HDC WINAPI CreateCompatibleDC(_In_opt_ HDC hdc)
#define SRCCOPY
Definition: wingdi.h:333
BOOL WINAPI DeleteDC(_In_ HDC)
#define HKEY_CURRENT_USER
Definition: winreg.h:11
#define WM_PAINT
Definition: winuser.h:1620
HWND WINAPI SetCapture(_In_ HWND hWnd)
int WINAPI ReleaseDC(_In_opt_ HWND, _In_ HDC)
#define MK_RBUTTON
Definition: winuser.h:2368
#define MK_SHIFT
Definition: winuser.h:2369
#define WM_CLOSE
Definition: winuser.h:1621
BOOL WINAPI RedrawWindow(_In_opt_ HWND, _In_opt_ LPCRECT, _In_opt_ HRGN, _In_ UINT)
BOOL WINAPI TranslateMessage(_In_ const MSG *)
BOOL WINAPI ShowWindow(_In_ HWND, _In_ int)
BOOL WINAPI ReleaseCapture(void)
Definition: message.c:2890
LRESULT WINAPI DefWindowProcW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
BOOL WINAPI AdjustWindowRect(_Inout_ LPRECT, _In_ DWORD, _In_ BOOL)
BOOL WINAPI GetMessageW(_Out_ LPMSG, _In_opt_ HWND, _In_ UINT, _In_ UINT)
#define IMAGE_ICON
Definition: winuser.h:212
#define WM_CREATE
Definition: winuser.h:1608
int WINAPI LoadStringW(_In_opt_ HINSTANCE hInstance, _In_ UINT uID, _Out_writes_to_(cchBufferMax, return+1) LPWSTR lpBuffer, _In_ int cchBufferMax)
int WINAPIV wsprintfW(_Out_ LPWSTR, _In_ _Printf_format_string_ LPCWSTR,...)
__analysis_noreturn void WINAPI PostQuitMessage(_In_ int)
HBRUSH WINAPI GetSysColorBrush(_In_ int)
#define WM_COMMAND
Definition: winuser.h:1740
HANDLE WINAPI LoadImageW(_In_opt_ HINSTANCE hInst, _In_ LPCWSTR name, _In_ UINT type, _In_ int cx, _In_ int cy, _In_ UINT fuLoad)
Definition: cursoricon.c:2203
#define WM_RBUTTONUP
Definition: winuser.h:1780
#define SM_CYSMICON
Definition: winuser.h:1013
#define MF_CHECKED
Definition: winuser.h:132
#define WM_MOUSEMOVE
Definition: winuser.h:1775
#define RDW_UPDATENOW
Definition: winuser.h:1220
#define RDW_ERASE
Definition: winuser.h:1211
#define WM_LBUTTONDOWN
Definition: winuser.h:1776
HCURSOR WINAPI LoadCursorW(_In_opt_ HINSTANCE, _In_ LPCWSTR)
Definition: cursoricon.c:2105
#define MF_UNCHECKED
Definition: winuser.h:204
UINT_PTR WINAPI SetTimer(_In_opt_ HWND, _In_ UINT_PTR, _In_ UINT, _In_opt_ TIMERPROC)
DWORD WINAPI CheckMenuItem(_In_ HMENU, _In_ UINT, _In_ UINT)
#define IDI_APPLICATION
Definition: winuser.h:704
#define WM_RBUTTONDOWN
Definition: winuser.h:1779
BOOL WINAPI PtInRect(_In_ LPCRECT, _In_ POINT)
#define SM_CXSMICON
Definition: winuser.h:1012
#define MK_MBUTTON
Definition: winuser.h:2371
#define WM_TIMER
Definition: winuser.h:1742
BOOL WINAPI EndPaint(_In_ HWND, _In_ const PAINTSTRUCT *)
BOOL WINAPI IntersectRect(_Out_ LPRECT, _In_ LPCRECT, _In_ LPCRECT)
BOOL WINAPI UpdateWindow(_In_ HWND)
ATOM WINAPI RegisterClassExW(_In_ CONST WNDCLASSEXW *)
HDC WINAPI GetDC(_In_opt_ HWND)
#define LR_SHARED
Definition: winuser.h:1100
#define CreateWindowW(a, b, c, d, e, f, g, h, i, j, k)
Definition: winuser.h:4316
#define WM_LBUTTONUP
Definition: winuser.h:1777
#define CW_USEDEFAULT
Definition: winuser.h:225
HACCEL WINAPI LoadAcceleratorsW(_In_opt_ HINSTANCE, _In_ LPCWSTR)
#define WM_MOVE
Definition: winuser.h:1610
LRESULT WINAPI DispatchMessageW(_In_ const MSG *)
int WINAPI TranslateAcceleratorW(_In_ HWND, _In_ HACCEL, _In_ LPMSG)
#define MK_LBUTTON
Definition: winuser.h:2367
#define WM_DESTROY
Definition: winuser.h:1609
BOOL WINAPI GetMonitorInfoW(_In_ HMONITOR, _Inout_ LPMONITORINFO)
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
HBITMAP WINAPI LoadBitmapW(_In_opt_ HINSTANCE, _In_ LPCWSTR)
Definition: cursoricon.c:2163
HDC WINAPI BeginPaint(_In_ HWND, _Out_ LPPAINTSTRUCT)
#define WM_MBUTTONUP
Definition: winuser.h:1783
struct tagCREATESTRUCTW * LPCREATESTRUCTW
HICON WINAPI LoadIconW(_In_opt_ HINSTANCE hInstance, _In_ LPCWSTR lpIconName)
Definition: cursoricon.c:2075
int WINAPI GetSystemMetrics(_In_ int)
BOOL WINAPI MoveWindow(_In_ HWND, _In_ int, _In_ int, _In_ int, _In_ int, _In_ BOOL)
#define RDW_INVALIDATE
Definition: winuser.h:1214
#define WM_MBUTTONDOWN
Definition: winuser.h:1782
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
HMENU WINAPI GetMenu(_In_ HWND)
#define COLOR_BTNFACE
Definition: winuser.h:928
BOOL WINAPI SetRect(_Out_ LPRECT, _In_ int, _In_ int, _In_ int, _In_ int)
INT_PTR WINAPI DialogBoxParamW(_In_opt_ HINSTANCE, _In_ LPCWSTR, _In_opt_ HWND, _In_opt_ DLGPROC, _In_ LPARAM)
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184
unsigned char BYTE
Definition: xxhash.c:193