Subversion Repositories Kolibri OS

Rev

Rev 551 | Rev 2060 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. /*******************************************************************************
  2.  
  3.     MenuetOS MineSweeper
  4.     Copyright (C) 2003, 2004  Ivan Poddubny
  5.  
  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
  8.     the Free Software Foundation; either version 2 of the License, or
  9.     (at your option) any later version.
  10.  
  11.     This program 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
  14.     GNU General Public License for more details.
  15.  
  16.     You should have received a copy of the GNU General Public License
  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
  19.  
  20. *******************************************************************************/
  21.  
  22. void draw_window() // Ïðîöåäóðà îòðèñîâêè îêíà
  23. {
  24.   sys_window_redraw(1);
  25.   sys_get_colors(#colors, 40);
  26.  
  27.   // WINDOW
  28.   EBX = xpos << 16 + xsize;
  29.   ECX = ypos << 16 + ysize;
  30.   sys_draw_window(EBX, ECX, 0x14CCCCCC, colors.w_grab | 0x80000000, "MineSweeper");
  31.  
  32.    // <NEW GAME> BUTTON (911)
  33.   EBX = xsize / 2 - 10;
  34.   EBX = EBX << 16 + 20;
  35.   sys_draw_button(EBX, 25<<16+20, 911, clLightGray);
  36.  
  37.   // <CHANGE MODE> BUTTON (1001)
  38.   sys_draw_button(10<<16+7, 23<<16+7, 1001, 0x118811);
  39.  
  40.   // <USER FIELD> BUTTON (1002)
  41.   //sys_draw_button(20<<16+7, ECX, EDX+1, 0xddbb44);
  42.  
  43.   draw_time();     // draw timer
  44.   draw_minesi();   // draw mines
  45.   draw_squares();  // draw field
  46.  
  47.   sys_window_redraw(2);
  48. }
  49.  
  50. dword num_colors[8]=
  51. {
  52.   0x4444d0,  // 1
  53.   0x118811,  // 2
  54.   0xd04444,  // 3
  55.   0x111199,  // 4
  56.   0x991111,  // 5
  57.   0x117089,  // 6
  58.   0x000000,  // 7
  59.   0x808080   // 8
  60. };
  61.  
  62.  
  63. // Îòðèñîâêà îäíîé êëåòêè
  64. void draw_square(int x, y)
  65. {
  66.    int xl, xr, yt, yb;       // ñëåâà, ñïðàâà, ñâåðõó, ñíèçó
  67.    dword tcolor = clBlack;   // öâåò çíà÷åíèÿ êëåòêè ïî óìîë÷àíèþ ÷åðíûé
  68.    byte tchar, tval;
  69.  
  70.    xl = XPX * x + XST;
  71.    xr = xl + XPX - 1;
  72.    yt = YPX * y + YST;
  73.    yb = yt + YPX - 1;
  74.  
  75.    EBX = xl+1 << 16 + xr - xl-1;
  76.    ECX = yt+1 << 16 + yb - yt-1;
  77.    $inc ebx
  78.    $inc ecx
  79.    sys_draw_bar(EBX, ECX, clLightGray);  // ðèñóåò çàêðàøåííûé ïðÿìîóãîëüíèê
  80.  
  81.    if (!get_open(x, y))
  82.    {
  83.       // ðèñóåì ðàìêó
  84.       ECX = yt << 16 + yb - 1;
  85.       sys_draw_line(xl<<16+xl, ECX, clWhite);
  86.       EBX = xl << 16 + xr - 1;
  87.       sys_draw_line(EBX, yt << 16 + yt, EDX);
  88.       sys_draw_line(xr << 16 + xl, yb << 16 + yb, clDarkGray);
  89.       sys_draw_line(xr << 16 + xr, yb << 16 + yt, EDX);
  90.  
  91.       SWITCH (get_mark(x, y))
  92.       {
  93.         CASE 2: tcolor = 0x121288; tchar = '?'; BREAK;
  94.         CASE 1: tcolor = 0xd04444; tchar = 'P';
  95.       }
  96.  
  97.       IF (get_mark(x,y))
  98.       {
  99.         EBX = xl + 5 << 16 + yt + 4;
  100.         sys_write_text(EBX, tcolor, #tchar, 1);
  101.         EBX += 0x00010000;
  102.         /*  Âòîðîé ðàç - ðåãèñòðû ñîõðàíÿþòñÿ  */
  103.         sys_write_text(EBX, ECX, EDX, ESI);
  104.       }
  105.    }
  106.    else          // get_open(x,y)==TRUE
  107.    {
  108.       tval = get_value(x, y);
  109.       IF (tval != 0)
  110.       {
  111.         IF (tval == MINE)
  112.         {
  113.           tcolor = 0xee1111;
  114.           tchar = '*';
  115.         }
  116.         ELSE
  117.         {
  118.           tchar = tval + '0';
  119.           tcolor = num_colors[tval-1];
  120.         }
  121.         EBX = xl + 5 << 16 + yt + 5;
  122.         sys_write_text(EBX, tcolor, #tchar, 1);
  123.         EBX += 0x00010000;
  124.         sys_write_text(EBX, ECX, EDX, ESI);
  125.       }
  126.       sys_draw_line(xl << 16 + xl, yt << 16 + yb, clDarkGray);
  127.       sys_draw_line(xl << 16 + xr, yt << 16 + yt, EDX);
  128.    }
  129. }
  130.  
  131.  
  132. // Òàéìåð
  133. void draw_time()
  134. {
  135.   sys_draw_bar(XST<<16+25, 31<<16+10, 0xCCCCCC);
  136.   sys_write_number(0x00030000, time, XST<<16+32, 0x10ff0000);
  137. }
  138.  
  139.  
  140. // Èíäèêàòîð êîëè÷åñòâà íåðàññòàâëåííûõ ìèí
  141. void draw_minesi()
  142. {
  143.   EBX = xsize - XST - 25;
  144.   $PUSH EBX
  145.   EBX = EBX << 16 + 25;
  146.   sys_draw_bar(EBX, 31<<16+10, 0xCCCCCC);
  147.   $POP EDX
  148.   EDX <<= 16; EDX += 32;
  149.   sys_write_number(0x00030000, cmines, EDX, 0x10ff0000);
  150. }
  151.  
  152.  
  153. // Îòðèñîâêà ìèííîãî ïîëÿ
  154. void draw_squares()
  155. {
  156.   int x,y;
  157.  
  158.   FOR (y=0; y < ncy; y++)
  159.     FOR (x=0; x < ncx; x++)
  160.       draw_square(x, y);
  161. }
  162.