files
kolibrios/programs/games/mine/draw.h--
leency 5cf6c3baf9 Mine game v0.62 (#172)
- 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>
2025-03-22 09:40:04 +01:00

170 lines
4.9 KiB
Plaintext
Raw Blame History

/*******************************************************************************
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);
}