Subversion Repositories Kolibri OS

Rev

Rev 109 | Rev 177 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
31 halyavin 1
/*******************************************************************************
2
 
3
    MenuetOS MineSweeper
126 poddubny 4
    Copyright (C) 2003, 2004  Ivan Poddubny
31 halyavin 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
126 poddubny 35
  sys_write_text(8<<16+8, colors.w_grab_text | 0x10000000, "MineSweeper", 11);
31 halyavin 36
 
37
  //  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
  //  BUTTON (911)
42
  EBX = xsize / 2 - 10;
43
  EBX = EBX << 16 + 20;
44
  sys_draw_button(EBX, 25<<16+20, 911, clLightGray);
45
 
126 poddubny 46
  // 
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
 
31 halyavin 51
  //  BUTTON (1001)
52
  sys_draw_button(10<<16+7, 23<<16+7, 1001, 0x118811);
53
 
54
  //  BUTTON (1002)
126 poddubny 55
//  sys_draw_button(20<<16+7, ECX, EDX+1, 0xddbb44);
31 halyavin 56
 
57
  //  BUTTON (1003)
58
  // sys_draw_button();
59
 
60
  //  BUTTON (1004)
61
  // sys_draw_button();
62
 
63
  //  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
 
126 poddubny 86
 
87
// Отрисовка одной клетки
31 halyavin 88
void draw_square(int x, y)
89
{
126 poddubny 90
   int xl, xr, yt, yb;       // слева, справа, сверху, снизу
91
   dword tcolor = clBlack;   // цвет значения клетки по умолчанию черный
92
   byte tchar, tval;
31 halyavin 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
126 poddubny 103
   sys_draw_bar(EBX, ECX, clLightGray);  // рисует закрашенный прямоугольник
31 halyavin 104
 
105
   if (!get_open(x, y))
106
   {
126 poddubny 107
      // рисуем рамку
31 halyavin 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);
126 poddubny 133
      IF (tval != 0)
31 halyavin 134
      {
126 poddubny 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);
31 halyavin 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
 
126 poddubny 155
 
156
// Таймер
31 halyavin 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
 
126 poddubny 164
 
165
// Индикатор количества нерасставленных мин
31 halyavin 166
void draw_minesi()
167
{
168
  EBX = xsize - XST - 25;
169
  $PUSH EBX
170
  EBX = EBX << 16 + 25;
126 poddubny 171
  sys_draw_bar(EBX, 31<<16+10, 0xCCCCCC);
31 halyavin 172
  $POP EDX
126 poddubny 173
  EDX <<= 16; EDX += 32;
31 halyavin 174
  EBX = 0x00030000;
175
  sys_write_number(EBX, cmines, EDX, 0x10ff0000);
176
}
177
 
126 poddubny 178
 
179
// Отрисовка минного поля
31 halyavin 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
}