Subversion Repositories Kolibri OS

Rev

Rev 109 | Rev 177 | 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. {
  25.  
  26.   sys_window_redraw(1);
  27.   sys_get_colors(#colors, 40);
  28.  
  29.   // WINDOW
  30.   EBX = xpos << 16 + xsize;
  31.   ECX = ypos << 16 + ysize;
  32.   sys_draw_window(EBX, ECX, 0x02CCCCCC, colors.w_grab | 0x80000000, colors.w_frames);
  33.  
  34.   // LABEL
  35.   sys_write_text(8<<16+8, colors.w_grab_text | 0x10000000, "MineSweeper", 11);
  36.  
  37.   // <CLOSE> BUTTON (1)
  38.   EBX = xsize - 19; EBX = EBX<<16 + 12;
  39.   sys_draw_button(EBX, 5<<16+12, 1, colors.w_grab_button);
  40.  
  41.   // <NEW GAME> BUTTON (911)
  42.   EBX = xsize / 2 - 10;
  43.   EBX = EBX << 16 + 20;
  44.   sys_draw_button(EBX, 25<<16+20, 911, clLightGray);
  45.  
  46.   // <MAIN> BUTTON (1000)
  47. //  EBX = ncx * XPX; EBX += XST << 16;
  48. //  ECX = ncy * YPX; ECX += YST << 16;
  49. //  sys_draw_button(EBX, ECX, 1000, 0x60000000);
  50.  
  51.   // <CHANGE MODE> BUTTON (1001)
  52.   sys_draw_button(10<<16+7, 23<<16+7, 1001, 0x118811);
  53.  
  54.   // <USER FIELD> BUTTON (1002)
  55. //  sys_draw_button(20<<16+7, ECX, EDX+1, 0xddbb44);
  56.  
  57.   // <OPTIONS> BUTTON (1003)
  58.   // sys_draw_button();
  59.  
  60.   // <SCORES> BUTTON (1004)
  61.   // sys_draw_button();
  62.  
  63.   // <ABOUT> BUTTON (1005)
  64.   // sys_draw_button();
  65.  
  66.   sys_window_redraw(2);
  67.  
  68.   draw_time();     // draw timer
  69.   draw_minesi();   // draw mines
  70.   draw_squares();  // draw field
  71.  
  72. }
  73.  
  74. dword num_colors[8]=
  75. {
  76.   0x4444d0,  // 1
  77.   0x118811,  // 2
  78.   0xd04444,  // 3
  79.   0x111199,  // 4
  80.   0x991111,  // 5
  81.   0x117089,  // 6
  82.   0x000000,  // 7
  83.   0x808080   // 8
  84. };
  85.  
  86.  
  87. // Îòðèñîâêà îäíîé êëåòêè
  88. void draw_square(int x, y)
  89. {
  90.    int xl, xr, yt, yb;       // ñëåâà, ñïðàâà, ñâåðõó, ñíèçó
  91.    dword tcolor = clBlack;   // öâåò çíà÷åíèÿ êëåòêè ïî óìîë÷àíèþ ÷åðíûé
  92.    byte tchar, tval;
  93.  
  94.    xl = XPX * x + XST;
  95.    xr = xl + XPX - 1;
  96.    yt = YPX * y + YST;
  97.    yb = yt + YPX - 1;
  98.  
  99.    EBX = xl << 16 + xr - xl;
  100.    ECX = yt << 16 + yb - yt;
  101.    $inc ebx
  102.    $inc ecx
  103.    sys_draw_bar(EBX, ECX, clLightGray);  // ðèñóåò çàêðàøåííûé ïðÿìîóãîëüíèê
  104.  
  105.    if (!get_open(x, y))
  106.    {
  107.       // ðèñóåì ðàìêó
  108.       ECX = yt << 16 + yb - 1;
  109.       sys_draw_line(xl<<16+xl, ECX, clWhite);
  110.       EBX = xl << 16 + xr - 1;
  111.       sys_draw_line(EBX, yt << 16 + yt, EDX);
  112.       sys_draw_line(xr << 16 + xl, yb << 16 + yb, clDarkGray);
  113.       sys_draw_line(xr << 16 + xr, yb << 16 + yt, EDX);
  114.  
  115.       SWITCH (get_mark(x, y))
  116.       {
  117.         CASE 2: tcolor = 0x121288; tchar = '?'; BREAK;
  118.         CASE 1: tcolor = 0xd04444; tchar = 'P';
  119.       }
  120.  
  121.       IF (get_mark(x,y))
  122.       {
  123.         EBX = xl + 5; EBX <<= 16; EBX += yt + 4;
  124.         sys_write_text(EBX, tcolor, #tchar, 1);
  125.         EBX += 0x00010000;
  126.         /*  Âòîðîé ðàç - ðåãèñòðû ñîõðàíÿþòñÿ  */
  127.         sys_write_text(EBX, ECX, EDX, ESI);
  128.       }
  129.    }
  130.    else          // get_open(x,y)==TRUE
  131.    {
  132.       tval = get_value(x, y);
  133.       IF (tval != 0)
  134.       {
  135.         IF (tval == MINE)
  136.         {
  137.           tcolor = 0xee1111;
  138.           tchar = '*';
  139.         }
  140.         ELSE
  141.         {
  142.           tchar = tval + '0';
  143.           tcolor = num_colors[tval-1];
  144.         }
  145.         EBX = xl + 5; EBX <<= 16; EBX += yt + 5;
  146.         sys_write_text(EBX, tcolor, #tchar, 1);
  147.         EBX += 0x00010000;
  148.         sys_write_text(EBX, ECX, EDX, ESI);
  149.       }
  150.       sys_draw_line(xl << 16 + xl, yt << 16 + yb, clDarkGray);
  151.       sys_draw_line(xl << 16 + xr, yt << 16 + yt, EDX);
  152.    }
  153. }
  154.  
  155.  
  156. // Òàéìåð
  157. void draw_time()
  158. {
  159.   sys_draw_bar(XST<<16+25, 31<<16+10, 0xCCCCCC);
  160.   EBX = 0x00030000;
  161.   sys_write_number(EBX, time, XST<<16+32, 0x10ff0000);
  162. }
  163.  
  164.  
  165. // Èíäèêàòîð êîëè÷åñòâà íåðàññòàâëåííûõ ìèí
  166. void draw_minesi()
  167. {
  168.   EBX = xsize - XST - 25;
  169.   $PUSH EBX
  170.   EBX = EBX << 16 + 25;
  171.   sys_draw_bar(EBX, 31<<16+10, 0xCCCCCC);
  172.   $POP EDX
  173.   EDX <<= 16; EDX += 32;
  174.   EBX = 0x00030000;
  175.   sys_write_number(EBX, cmines, EDX, 0x10ff0000);
  176. }
  177.  
  178.  
  179. // Îòðèñîâêà ìèííîãî ïîëÿ
  180. void draw_squares()
  181. {
  182.   int x,y;
  183.  
  184.   FOR (x=0; x < ncx; x++)
  185.     FOR (y=0; y < ncy; y++)
  186.       draw_square(x, y);
  187. }