Rev 109 | Rev 963 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 109 | Rev 126 | ||
---|---|---|---|
Line 1... | Line 1... | ||
1 | /******************************************************************************* |
1 | /******************************************************************************* |
Line 2... | Line 2... | ||
2 | 2 | ||
3 | MenuetOS MineSweeper |
3 | MenuetOS MineSweeper |
Line 4... | Line 4... | ||
4 | Copyright (C) 2003 Ivan Poddubny |
4 | Copyright (C) 2003, 2004 Ivan Poddubny |
5 | 5 | ||
6 | This program is free software; you can redistribute it and/or modify |
6 | This program is free software; you can redistribute it and/or modify |
7 | it under the terms of the GNU General Public License as published by |
7 | it under the terms of the GNU General Public License as published by |
Line 17... | Line 17... | ||
17 | along with this program; if not, write to the Free Software |
17 | along with this program; if not, write to the Free Software |
18 | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
18 | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
Line 19... | Line 19... | ||
19 | 19 | ||
Line 20... | Line 20... | ||
20 | *******************************************************************************/ |
20 | *******************************************************************************/ |
21 | 21 | ||
22 | //? pragma option LST // generate ASM listing file - ñîçäàòü àññåìáëåðíûé ëèñòèíã |
- | |
23 | //? warning TRUE // âêëþ÷èòü ðåæèì âûâîäà ïðåäóïðåæäåíèé |
22 | ? pragma option LST // generate ASM listing file - ñîçäàòü àññåìáëåðíûé ëèñòèíã |
24 | ? pragma option meos |
23 | ? warning TRUE // âêëþ÷èòü ðåæèì âûâîäà ïðåäóïðåæäåíèé |
- | 24 | ? jumptomain NONE |
|
Line 25... | Line 25... | ||
25 | ? jumptomain NONE |
25 | ? include "msys.h--" // MenuetOS system functions - ñèñòåìíûå ôóíêöèè MenuetOS |
26 | ? include "msys.h--" // MenuetOS system functions - ñèñòåìíûå ôóíêöèè MenuetOS |
26 | //? define DEBUG 1 |
27 | 27 | ||
28 | ? print "\nÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿" |
28 | ? print "\nÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿" |
Line 29... | Line 29... | ||
29 | ? print "\n³ MeOS MineSweeper v0.3 ³" |
29 | ? print "\n³ MenuetOS MineSweeper v0.4 ³" |
Line 30... | Line 30... | ||
30 | ? print "\n³ (C) Ivan Poddubny (ivan-yar@bk.ru) 2003 ³" |
30 | ? print "\n³ (C) Ivan Poddubny (ivan-yar@bk.ru) 2003,2004 ³" |
31 | ? print "\nÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\n\n" |
31 | ? print "\nÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\n\n" |
32 | 32 | ||
Line 33... | Line 33... | ||
33 | /************************************** DATA **************************************/ |
33 | /************************************** DATA **************************************/ |
34 | 34 | ||
35 | ? define XPX 16 // X pixels by square - ðàçìåð êëåòêè â ïèêñåëÿõ |
35 | ? define XPX 16 // X pixels by square - ðàçìåð êëåòêè â ïèêñåëÿõ |
36 | ? define YPX 16 // Y pixels by square |
36 | ? define YPX 16 // Y pixels by square |
Line 57... | Line 57... | ||
57 | byte nmines; |
57 | byte nmines; |
58 | } stdmodes[3] = {9,9,10, 16,16,40, 30,16,99}; // {x,y,m} |
58 | } stdmodes[3] = {9,9,10, 16,16,40, 30,16,99}; // {x,y,m} |
Line 59... | Line 59... | ||
59 | 59 | ||
60 | int XST, // offset of first pixel X - ñìåùåíèå ïîëÿ îò ãðàíèöû îêíà |
60 | int XST, // offset of first pixel X - ñìåùåíèå ïîëÿ îò ãðàíèöû îêíà |
61 | YST, |
61 | YST, |
62 | ncx, // number of squares in X - ðàçìåð ïîë |
62 | ncx, // number of squares in X - ðàçìåð ïîëÿ |
63 | ncy, |
63 | ncy, |
64 | cmines, // mines discovered - êîëè÷åñòâî íåîòêðûòûõ ìèí |
64 | cmines, // mines discovered - êîëè÷åñòâî íåîòêðûòûõ ìèí |
65 | initmines, // number of initial mines - èçíà÷àëüíîå êîëè÷åñòâî ìèí |
65 | initmines, // number of initial mines - èçíà÷àëüíîå êîëè÷åñòâî ìèí |
Line 86... | Line 86... | ||
86 | $mov eax,40 |
86 | $mov eax,40 |
87 | $mov ebx,100111b |
87 | $mov ebx,100111b |
88 | $int 0x40 |
88 | $int 0x40 |
89 | } |
89 | } |
Line -... | Line 90... | ||
- | 90 | ||
90 | 91 | ||
91 | inline void fastcall mouse_disable() |
92 | inline void fastcall mouse_disable() |
92 | { |
93 | { |
93 | $mov eax,40 |
94 | $mov eax,40 |
94 | $mov ebx,000111b |
95 | $mov ebx,000111b |
95 | $int 0x40 |
96 | $int 0x40 |
Line -... | Line 97... | ||
- | 97 | } |
|
96 | } |
98 | |
97 | 99 | ||
98 | ? include "timer.h--" // timer functions |
100 | ? include "timer.h--" // timer functions |
99 | ? include "draw.h--" // drawing functions |
101 | ? include "draw.h--" // drawing functions |
100 | ? include "access.h--" // get & set functions |
102 | ? include "access.h--" // get & set functions |
Line -... | Line 103... | ||
- | 103 | ? include "random.h--" // random number generator |
|
101 | ? include "random.h--" // random number generator |
104 | //? include "uf.h--" // user field window |
102 | //? include "uf.h--" // user field window |
105 | |
103 | 106 | ||
104 | void init() |
107 | void init() |
Line 105... | Line 108... | ||
105 | // Èíèöèàëèçàöè |
108 | // Èíèöèàëèçàöèÿ |
106 | { |
109 | { |
Line 124... | Line 127... | ||
124 | 127 | ||
125 | xsize = ncx * XPX + XST + XST; |
128 | xsize = ncx * XPX + XST + XST; |
126 | ysize = ncy * YPX + YST + XST; |
129 | ysize = ncy * YPX + YST + XST; |
Line -... | Line 130... | ||
- | 130 | } // init |
|
127 | } // init |
131 | |
128 | 132 | ||
129 | void clear_all() |
133 | void clear_all() |
130 | // Î÷èñòèòü ïîëå |
134 | // Î÷èñòèòü ïîëå |
131 | { |
135 | { |
132 | EAX = 0; |
136 | EAX = 0; |
133 | EDI = #massiv; |
137 | EDI = #massiv; |
134 | ECX = ncx * ncy; |
138 | ECX = ncx * ncy; |
Line -... | Line 139... | ||
- | 139 | $REP $STOSD |
|
135 | $REP $STOSD |
140 | } // clear_all |
136 | } // clear_all |
141 | |
137 | 142 | ||
138 | void new_game() |
143 | void new_game() |
139 | // Íîâàÿ èãðà |
144 | // Íîâàÿ èãðà |
140 | { |
145 | { |
Line 141... | Line 146... | ||
141 | init(); // èíèöèàëèçàöè |
146 | init(); // èíèöèàëèçàöèÿ |
142 | randomize(); // ãåíåðàòîð ñëó÷àéíûõ ÷èñåë |
147 | randomize(); // ãåíåðàòîð ñëó÷àéíûõ ÷èñåë |
143 | clear_all(); // î÷èñòèòü ïîëå |
148 | clear_all(); // î÷èñòèòü ïîëå |
144 | 149 | ||
145 | firstmine = TRUE; // èãðà íå íà÷àòà |
150 | firstmine = TRUE; // èãðà íå íà÷àòà |
146 | mouse_en = TRUE; // ìûøü ðàçðåøåíà |
151 | mouse_en = TRUE; // ìûøü ðàçðåøåíà |
Line -... | Line 152... | ||
- | 152 | stop_game = FALSE; // èãðà íå çàêîí÷åíà |
|
147 | stop_game = FALSE; // èãðà íå çàêîí÷åíà |
153 | stop_timer(); |
148 | stop_timer(); |
154 | time = 0; // âðåìÿ = 0 |
149 | time = 0; // âðåìÿ = 0 |
155 | } // new_game |
150 | } // new_game |
156 | |
Line -... | Line 157... | ||
- | 157 | ||
- | 158 | void set_mines(int nminas, no_x, no_y) |
|
- | 159 | // Ðàññòàâèòü ìèíû |
|
- | 160 | { |
|
151 | 161 | int i, x, y, a, b; |
|
Line 152... | Line 162... | ||
152 | void set_mines(int nminas, no_x, no_y) |
162 | |
153 | // Ðàññòàâèòü ìèíû |
163 | #ifdef DEBUG |
- | 164 | sys_debug_write_string("MINE: set_mines called\n"); |
|
154 | { |
165 | #endif |
155 | int i, x, y, a, b; |
166 | |
156 | 167 | sqclosed = ncx * ncy - nminas; // êîëè÷åñòâî ÍÅîòêðûòûõ êëåòîê = ïëîùàäü ïîëÿ - êîë-âî ìèí |
|
157 | sqclosed = ncx * ncy - nminas; // êîëè÷åñòâî ÍÅîòêðûòûõ êëåòîê = ïëîùàäü ïîëÿ - êîë-âî ìèí |
168 | |
158 | 169 | FOR (i = nminas; i > 0; i--) // ðàññòàâèòü ìèíû |
|
159 | FOR (i = nminas; i > 0; i--) // ðàññòàâèòü ìèíû |
170 | { |
Line 188... | Line 199... | ||
188 | } |
199 | } |
189 | } |
200 | } |
190 | } |
201 | } |
191 | } // set_mines |
202 | } // set_mines |
Line -... | Line 203... | ||
- | 203 | ||
192 | 204 | ||
193 | inline void do_mouse(void) |
205 | inline void do_mouse(void) |
194 | // Îáðàáîò÷èê ìûøè |
206 | // Îáðàáîò÷èê ìûøè |
195 | { |
207 | { |
Line 196... | Line 208... | ||
196 | int x,y; |
208 | int x,y; |
197 | 209 | ||
- | 210 | EAX = sys_read_mouse(2); // ìûøü íå íàæàòà -> âûõîä |
|
- | 211 | IF (EAX == 0) |
|
- | 212 | { |
|
- | 213 | // sys_debug_write_string("Strange\n"); |
|
Line 198... | Line 214... | ||
198 | EAX = sys_read_mouse(2); // ìûøü íå íàæàòà -> âûõîä |
214 | return; |
Line 199... | Line 215... | ||
199 | IF (EAX == 0) return; |
215 | } |
200 | 216 | ||
Line 214... | Line 230... | ||
214 | // íà íåîòêðûòîé êëåòêå áåç ôëàæêà íàæàòà ëåâàÿ êíîïêà ìûøè |
230 | // íà íåîòêðûòîé êëåòêå áåç ôëàæêà íàæàòà ëåâàÿ êíîïêà ìûøè |
215 | // left mouse button is pressed |
231 | // left mouse button is pressed |
216 | IF (firstmine == TRUE) |
232 | IF (firstmine == TRUE) |
217 | { |
233 | { |
218 | firstmine = FALSE; |
234 | firstmine = FALSE; |
219 | set_mines(cmines, x, y); |
235 | set_mines(initmines, x, y); |
220 | start_timer(); |
236 | start_timer(); |
- | 237 | time = 1; |
|
- | 238 | draw_time(); |
|
221 | } |
239 | } |
222 | IF (get_value(x, y) == MINE) |
240 | IF (get_value(x, y) == MINE) |
223 | { |
241 | { |
224 | end_game(); |
242 | end_game(); |
225 | return; |
243 | return; |
Line 250... | Line 268... | ||
250 | // both mouse buttons are pressed |
268 | // both mouse buttons are pressed |
251 | IF (open_near_squares(x, y) == TRUE) |
269 | IF (open_near_squares(x, y) == TRUE) |
252 | end_game(); |
270 | end_game(); |
253 | } |
271 | } |
Line 254... | Line 272... | ||
254 | 272 | ||
- | 273 | IF (sqclosed == 0) |
|
255 | if (sqclosed == 0) |
274 | { |
256 | // îòêðûòû âñå êëåòêè |
275 | // îòêðûòû âñå êëåòêè |
257 | // all squares are opened |
- | |
258 | { |
276 | // all squares are opened |
259 | mouse_en = FALSE; // çàïðåòèòü ìûøü |
277 | mouse_en = FALSE; // çàïðåòèòü ìûøü |
260 | stop_timer(); |
278 | stop_timer(); |
Line 261... | Line 279... | ||
261 | stop_game = TRUE; // èãðà çàâåðøåíà |
279 | stop_game = TRUE; // èãðà çàâåðøåíà |
Line 271... | Line 289... | ||
271 | } |
289 | } |
272 | draw_minesi(); |
290 | draw_minesi(); |
273 | } |
291 | } |
274 | } // do_mouse |
292 | } // do_mouse |
Line -... | Line 293... | ||
- | 293 | ||
275 | 294 | ||
276 | void open_square(int x, y) |
295 | void open_square(int x, y) |
277 | // Îòêðûòü êëåòêó |
296 | // Îòêðûòü êëåòêó |
278 | { |
297 | { |
Line -... | Line 298... | ||
- | 298 | int a, b, i; |
|
- | 299 | ||
- | 300 | #ifdef DEBUG |
|
- | 301 | sys_debug_write_string("MINE: open_square called\n"); |
|
279 | int a, b, i; |
302 | #endif |
280 | 303 | ||
Line 281... | Line 304... | ||
281 | set_open(x, y, TRUE); |
304 | set_open(x, y, TRUE); |
282 | sqclosed--; |
305 | sqclosed--; |
Line 303... | Line 326... | ||
303 | open_square(a, b); |
326 | open_square(a, b); |
304 | } |
327 | } |
305 | } |
328 | } |
306 | } // open_square |
329 | } // open_square |
Line -... | Line 330... | ||
- | 330 | ||
307 | 331 | ||
308 | int open_near_squares(int x, y) |
332 | int open_near_squares(int x, y) |
309 | // Îòêðûòü áëèçëåæàùèå êëåòêè (îáå êíîïêè ìûøè âìåñòå) |
333 | // Îòêðûòü áëèçëåæàùèå êëåòêè (îáå êíîïêè ìûøè âìåñòå) |
310 | { |
334 | { |
311 | int a, b, i; |
335 | int a, b, i; |
Line -... | Line 336... | ||
- | 336 | dword suma = 0; |
|
- | 337 | ||
- | 338 | #ifdef DEBUG |
|
- | 339 | sys_debug_write_string("MINE: open_near_squares called\n"); |
|
312 | dword suma = 0; |
340 | #endif |
313 | 341 | ||
314 | a = x; |
342 | a = x; |
315 | b = y; |
343 | b = y; |
316 | FOR (i = 0; i < 8; i++) |
344 | FOR (i = 0; i < 8; i++) |
Line 347... | Line 375... | ||
347 | IF (get_value(a, b) == MINE) |
375 | IF (get_value(a, b) == MINE) |
348 | suma = 1; |
376 | suma = 1; |
349 | open_square(a, b); |
377 | open_square(a, b); |
350 | } |
378 | } |
351 | } |
379 | } |
352 | RETURN suma; |
380 | return suma; |
353 | } |
381 | } |
354 | ELSE |
382 | ELSE |
355 | RETURN 0; |
383 | return 0; |
356 | } // open_near_squares |
384 | } // open_near_squares |
Line -... | Line 385... | ||
- | 385 | ||
357 | 386 | ||
358 | void end_game() |
387 | void end_game() |
359 | { |
388 | { |
Line -... | Line 389... | ||
- | 389 | int x,y; |
|
- | 390 | ||
- | 391 | #ifdef DEBUG |
|
- | 392 | sys_debug_write_string("MINE: end_game called\n"); |
|
360 | int x,y; |
393 | #endif |
361 | 394 | ||
362 | stop_game = TRUE; |
395 | stop_game = TRUE; |
363 | stop_timer(); |
396 | stop_timer(); |
364 | for (x=0; x |
397 | for (x=0; x |
Line 395... | Line 428... | ||
395 | } // end_game |
428 | } // end_game |
Line 396... | Line 429... | ||
396 | 429 | ||
397 | 430 | ||
398 | void main() |
431 | void main() |
399 | { |
432 | { |
400 | sys_delay(5); // for old kernel only! |
433 | //sys_delay(5); // for old kernel only! |
Line 401... | Line 434... | ||
401 | new_game(); |
434 | new_game(); |
402 | draw_window(); |
435 | draw_window(); |
403 | 436 | ||
404 | mouse_enable(); |
437 | mouse_enable(); |
405 | while() |
438 | while() |
406 | { |
439 | { |
407 | switch (sys_wait_event_timeout(100)) // wait for 1 second |
440 | switch (sys_wait_event_timeout(100)) // wait for 1 second |
408 | { |
441 | { |
Line 409... | Line 442... | ||
409 | CASE evReDraw: |
442 | case evReDraw: |
410 | draw_window(); |
443 | draw_window(); |
411 | continue; |
444 | continue; |
412 | 445 | ||
Line 413... | Line 446... | ||
413 | CASE evKey: |
446 | case evKey: |
414 | IF (sys_get_key() == 27) |
447 | IF (sys_get_key() == 27) |
415 | sys_exit_process(); |
448 | sys_exit_process(); |
416 | continue; |
449 | continue; |
417 | 450 | ||
418 | CASE evButton: |
451 | case evButton: |
Line 427... | Line 460... | ||
427 | ELSE IF (EAX == 1001) // change mode |
460 | ELSE IF (EAX == 1001) // change mode |
428 | { |
461 | { |
429 | // mode++; mode%=3; mode++; |
462 | // mode++; mode%=3; mode++; |
430 | EAX = mode; EAX++; EAX = EAX%3; EAX++; mode = AL; |
463 | EAX = mode; EAX++; EAX = EAX%3; EAX++; mode = AL; |
Line 431... | Line 464... | ||
431 | 464 | ||
432 | // get window position - ïîëó÷èòü êîîðäèíàòû îêíà |
465 | new_game(); |
433 | sys_process_info(#procinfo, -1); |
466 | EBX = ECX = -1; |
434 | xpos = procinfo.xstart; |
467 | EDX = xsize; |
435 | ypos = procinfo.ystart; |
- | |
436 | 468 | ESI = ysize; |
|
437 | // start a new process and terminate this one |
469 | EAX = 67; |
438 | sys_create_thread(#main, ESP); |
470 | $int 0x40 |
439 | sys_exit_process(); |
471 | continue; |
440 | } |
472 | } |
441 | //ELSE IF (EAX == 1002) |
473 | // ELSE IF (EAX == 1002) |
442 | //{ |
474 | // { |
443 | // start_uf(); |
475 | // start_uf(); |
444 | //} |
476 | // } |
445 | ELSE IF (EAX == 1) // close window |
477 | ELSE IF (EAX == 1) // close window |
446 | sys_exit_process(); |
478 | sys_exit_process(); |
Line 447... | Line 479... | ||
447 | CONTINUE; |
479 | continue; |
448 | 480 | ||
449 | case evMouse: |
481 | case evMouse: |
450 | IF (!mouse_en) // is mouse enabled ? |
482 | IF (!mouse_en) // is mouse enabled ? |
451 | CONTINUE; |
483 | continue; |
452 | do_mouse(); |
484 | do_mouse(); |
453 | // wait for mouse release - æäàòü îòïóñêàíèÿ êíîïêè |
485 | // wait for mouse release - æäàòü îòïóñêàíèÿ êíîïêè |
454 | WHILE (sys_read_mouse(2) == mouse_status) |
486 | WHILE (sys_read_mouse(2) == mouse_status) |
455 | { |
487 | { |
456 | check_timer(); |
488 | check_timer(); |
457 | sys_delay(6); |
489 | sys_delay(3); |
458 | CONTINUE; |
490 | CONTINUE; |
459 | } |
491 | } |
460 | check_timer(); |
492 | check_timer(); |