/******************************************************************************* 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; // 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); // 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); // 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)) { // рисуем рамку 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); }