- proper window rolling up fix; - bigger cells and fonts; - add icon to a new game button; - better alignment of ui elements in header. Reviewed-on: #172 Reviewed-by: Max Logaev <maxlogaev@proton.me> Co-authored-by: leency <lipatov.kiril@gmail.com> Co-committed-by: leency <lipatov.kiril@gmail.com>
170 lines
4.9 KiB
Plaintext
170 lines
4.9 KiB
Plaintext
/*******************************************************************************
|
||
|
||
MenuetOS MineSweeper
|
||
Copyright (C) 2003, 2004 Ivan Poddubny
|
||
|
||
This program is free software; you can redistribute it and/or modify
|
||
it under the terms of the GNU General Public License as published by
|
||
the Free Software Foundation; either version 2 of the License, or
|
||
(at your option) any later version.
|
||
|
||
This program is distributed in the hope that it will be useful,
|
||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
GNU General Public License for more details.
|
||
|
||
You should have received a copy of the GNU General Public License
|
||
along with this program; if not, write to the Free Software
|
||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||
|
||
*******************************************************************************/
|
||
char game_mode[] = "1/3";
|
||
|
||
void draw_window()
|
||
{
|
||
dword iconimg = sys_memopen("ICONS18", 0, SHM_READ);
|
||
//sys_get_colors(#colors, 40);
|
||
|
||
sys_window_redraw(1);
|
||
EBX = xpos << 16 + xsize + 9;
|
||
ECX = ypos << 16 + ysize;
|
||
sys_draw_window(EBX, ECX, 0x34CCCCCC, clGray | 0x80000000, "MineSweeper");
|
||
|
||
sys_process_info(#procinfo, -1);
|
||
#define ROLLED_UP 0x04
|
||
IF (procinfo.status_window&ROLLED_UP) return;
|
||
|
||
// <NEW GAME> BUTTON (911)
|
||
sys_draw_button(CENTER_POS << 16 + BTNSIZE, HEADER_Y<<16+BTNSIZE, 911+BT_HIDE, clLightGray);
|
||
draw_rectangle(CENTER_POS,HEADER_Y,BTNSIZE,BTNSIZE,clWhite,clDarkGray);
|
||
draw_rectangle(CENTER_POS+1,HEADER_Y+1,BTNSIZE-2,BTNSIZE-2,clWhite,clWhite);
|
||
sys_put_palette_image(18*18*4*58 + iconimg, 18<<16+18, CENTER_POS+2<<16+HEADER_Y+2, 32, 0);
|
||
|
||
// <CHANGE MODE> BUTTON (1001)
|
||
sys_draw_button(5<<16+32, HEADER_Y<<16+BTNSIZE, 1001+BT_HIDE, clLightGray);
|
||
draw_rectangle(5,HEADER_Y,32,BTNSIZE,clWhite,clDarkGray);
|
||
game_mode[0] = mode + '0';
|
||
sys_write_text(9<<16+HEADER_Y+4, 0x90656565, #game_mode, 3);
|
||
|
||
// <USER FIELD> BUTTON (1002)
|
||
//sys_draw_button(BTNSIZE<<16+7, ECX, EDX+1, 0xddbb44);
|
||
|
||
draw_time();
|
||
draw_mines_left();
|
||
draw_squares();
|
||
|
||
sys_window_redraw(2);
|
||
}
|
||
|
||
dword num_colors[8]=
|
||
{
|
||
0x4444d0, // 1
|
||
0x118811, // 2
|
||
0xd04444, // 3
|
||
0x111199, // 4
|
||
0x991111, // 5
|
||
0x117089, // 6
|
||
0x000000, // 7
|
||
0x808080 // 8
|
||
};
|
||
|
||
|
||
// Draw a single square
|
||
void draw_square(int x, y)
|
||
{
|
||
int xl, xr, yt, yb; // lefx, right, top, bottom
|
||
dword tcolor = clBlack; // set default color as black
|
||
byte tchar, tval;
|
||
|
||
xl = XPX * x + XST;
|
||
xr = xl + XPX - 1;
|
||
yt = YPX * y + YST;
|
||
yb = yt + YPX - 1;
|
||
|
||
EBX = xl+1 << 16 + xr - xl-1;
|
||
ECX = yt+1 << 16 + yb - yt-1;
|
||
$inc ebx
|
||
$inc ecx
|
||
sys_draw_bar(EBX, ECX, clLightGray); // fill bg
|
||
|
||
if (!get_open(x, y))
|
||
{
|
||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
||
ECX = yt << 16 + yb - 1;
|
||
sys_draw_line(xl<<16+xl, ECX, clWhite);
|
||
EBX = xl << 16 + xr - 1;
|
||
sys_draw_line(EBX, yt << 16 + yt, EDX);
|
||
sys_draw_line(xr << 16 + xl, yb << 16 + yb, clDarkGray);
|
||
sys_draw_line(xr << 16 + xr, yb << 16 + yt, EDX);
|
||
|
||
SWITCH (get_mark(x, y))
|
||
{
|
||
CASE 2: tcolor = 0x10121288; tchar = '?'; BREAK;
|
||
CASE 1: tcolor = 0x10d04444; tchar = 'P';
|
||
}
|
||
|
||
IF (get_mark(x,y))
|
||
{
|
||
EBX = xl + 6 << 16 + yt + 4;
|
||
sys_write_text(EBX, tcolor, #tchar, 1);
|
||
EBX += 0x00010000;
|
||
/* Second run - registers are saved */
|
||
sys_write_text(EBX, ECX, EDX, ESI);
|
||
}
|
||
}
|
||
else // get_open(x,y)==TRUE
|
||
{
|
||
tval = get_value(x, y);
|
||
IF (tval != 0)
|
||
{
|
||
IF (tval == MINE)
|
||
{
|
||
tcolor = 0x10ee1111;
|
||
tchar = '*';
|
||
}
|
||
ELSE
|
||
{
|
||
tchar = tval + '0';
|
||
tcolor = num_colors[tval-1]+0x10000000;
|
||
}
|
||
EBX = xl + 7 << 16 + yt + 4;
|
||
sys_write_text(EBX, tcolor, #tchar, 1);
|
||
EBX += 0x00010000;
|
||
sys_write_text(EBX, ECX, EDX, ESI);
|
||
}
|
||
sys_draw_line(xl << 16 + xl, yt << 16 + yb, clDarkGray);
|
||
sys_draw_line(xl << 16 + xr, yt << 16 + yt, EDX);
|
||
}
|
||
}
|
||
|
||
void draw_time()
|
||
{
|
||
sys_draw_bar(xsize-XST-63<<16+34, HEADER_Y<<16+22, clWhiteGray);
|
||
sys_write_number(0x00030000, time, xsize-XST-58<<16+HEADER_Y+4, 0x101166C3);
|
||
}
|
||
|
||
|
||
void draw_mines_left()
|
||
{
|
||
sys_draw_bar(xsize-XST-32<<16+32, HEADER_Y<<16+22, clWhiteGray);
|
||
sys_write_number(0x00030000, cmines, xsize-XST-29<<16+HEADER_Y+4, 0x10ff0000);
|
||
}
|
||
|
||
|
||
// Draw mine field
|
||
void draw_squares()
|
||
{
|
||
int x,y;
|
||
|
||
FOR (y=0; y < ncy; y++)
|
||
FOR (x=0; x < ncx; x++)
|
||
draw_square(x, y);
|
||
}
|
||
|
||
void draw_rectangle(dword x,y,w,h,color1,color2)
|
||
{
|
||
sys_draw_bar(x<<16+w+1,y<<16+1,color1);
|
||
sys_draw_bar(x<<16+1,y+1<<16+h-1,color1);
|
||
sys_draw_bar(x+w<<16+1,y+1<<16+h,color2);
|
||
sys_draw_bar(x<<16+w,y+h<<16+1,color2);
|
||
} |