Subversion Repositories Kolibri OS

Rev

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();