v0.4 (16/10/2004)

- small fixes
 - resizing by kernel

v0.3c (16/09/2003)
 - mines indicator fixed
 - better timer

v0.3b (13/08/2003)
 - mines indicator fixed

git-svn-id: svn://kolibrios.org@126 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Ivan Poddubny 2006-08-14 14:06:52 +00:00
parent 615d8e83ab
commit c0ef030710
8 changed files with 681 additions and 241 deletions

View File

@ -1,15 +0,0 @@
v0.3a (11/08/2003)
- fixed a bug on old kernels
v0.3 (09/08/2003)
- fixed some bugs
- new timer
- better random number generator
- user can't blow up after first mouse click
- uses system colors
v0.2 (29/06/2003)
- fixed a lot of bugs
v0.1 (22/06/2003)
- first public version

View File

@ -1,7 +1,7 @@
/******************************************************************************* /*******************************************************************************
MenuetOS MineSweeper MenuetOS MineSweeper
Copyright (C) 2003 Ivan Poddubny Copyright (C) 2003, 2004 Ivan Poddubny
This program is free software; you can redistribute it and/or modify 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 it under the terms of the GNU General Public License as published by
@ -22,7 +22,6 @@
void draw_window() void draw_window()
// Ïðîöåäóðà îòðèñîâêè îêíà // Ïðîöåäóðà îòðèñîâêè îêíà
{ {
mouse_disable();
sys_window_redraw(1); sys_window_redraw(1);
sys_get_colors(#colors, 40); sys_get_colors(#colors, 40);
@ -33,7 +32,7 @@ void draw_window()
sys_draw_window(EBX, ECX, 0x02CCCCCC, colors.w_grab | 0x80000000, colors.w_frames); sys_draw_window(EBX, ECX, 0x02CCCCCC, colors.w_grab | 0x80000000, colors.w_frames);
// LABEL // LABEL
sys_write_text(8<<16+8, colors.w_grab_text | 0x10000000, "MeOS MineSweeper", 16); sys_write_text(8<<16+8, colors.w_grab_text | 0x10000000, "MineSweeper", 11);
// <CLOSE> BUTTON (1) // <CLOSE> BUTTON (1)
EBX = xsize - 19; EBX = EBX<<16 + 12; EBX = xsize - 19; EBX = EBX<<16 + 12;
@ -44,11 +43,16 @@ void draw_window()
EBX = EBX << 16 + 20; EBX = EBX << 16 + 20;
sys_draw_button(EBX, 25<<16+20, 911, clLightGray); sys_draw_button(EBX, 25<<16+20, 911, clLightGray);
// <MAIN> BUTTON (1000)
// EBX = ncx * XPX; EBX += XST << 16;
// ECX = ncy * YPX; ECX += YST << 16;
// sys_draw_button(EBX, ECX, 1000, 0x60000000);
// <CHANGE MODE> BUTTON (1001) // <CHANGE MODE> BUTTON (1001)
sys_draw_button(10<<16+7, 23<<16+7, 1001, 0x118811); sys_draw_button(10<<16+7, 23<<16+7, 1001, 0x118811);
// <USER FIELD> BUTTON (1002) // <USER FIELD> BUTTON (1002)
//sys_draw_button(20<<16+7, ECX, EDX+1, 0xddbb44); // sys_draw_button(20<<16+7, ECX, EDX+1, 0xddbb44);
// <OPTIONS> BUTTON (1003) // <OPTIONS> BUTTON (1003)
// sys_draw_button(); // sys_draw_button();
@ -65,7 +69,6 @@ void draw_window()
draw_minesi(); // draw mines draw_minesi(); // draw mines
draw_squares(); // draw field draw_squares(); // draw field
mouse_enable();
} }
dword num_colors[8]= dword num_colors[8]=
@ -80,12 +83,13 @@ dword num_colors[8]=
0x808080 // 8 0x808080 // 8
}; };
void draw_square(int x, y)
// Îòðèñîâêà îäíîé êëåòêè // Îòðèñîâêà îäíîé êëåòêè
void draw_square(int x, y)
{ {
int xl, xr, yt, yb; int xl, xr, yt, yb; // ñëåâà, ñïðàâà, ñâåðõó, ñíèçó
dword tcolor = clBlack; dword tcolor = clBlack; // öâåò çíà÷åíèÿ êëåòêè ïî óìîë÷àíèþ ÷åðíûé
byte tchar,tval; byte tchar, tval;
xl = XPX * x + XST; xl = XPX * x + XST;
xr = xl + XPX - 1; xr = xl + XPX - 1;
@ -96,10 +100,11 @@ void draw_square(int x, y)
ECX = yt << 16 + yb - yt; ECX = yt << 16 + yb - yt;
$inc ebx $inc ebx
$inc ecx $inc ecx
sys_draw_bar(EBX, ECX, clLightGray); sys_draw_bar(EBX, ECX, clLightGray); // ðèñóåò çàêðàøåííûé ïðÿìîóãîëüíèê
if (!get_open(x, y)) if (!get_open(x, y))
{ {
// ðèñóåì ðàìêó
ECX = yt << 16 + yb - 1; ECX = yt << 16 + yb - 1;
sys_draw_line(xl<<16+xl, ECX, clWhite); sys_draw_line(xl<<16+xl, ECX, clWhite);
EBX = xl << 16 + xr - 1; EBX = xl << 16 + xr - 1;
@ -125,56 +130,54 @@ void draw_square(int x, y)
else // get_open(x,y)==TRUE else // get_open(x,y)==TRUE
{ {
tval = get_value(x, y); tval = get_value(x, y);
IF (tval == 0) IF (tval != 0)
{ {
//tcolor=clLightGray; IF (tval == MINE)
//tchar=' '; {
GOTO NOCHAR; tcolor = 0xee1111;
tchar = '*';
}
ELSE
{
tchar = tval + '0';
tcolor = num_colors[tval-1];
}
EBX = xl + 5; EBX <<= 16; EBX += yt + 5;
sys_write_text(EBX, tcolor, #tchar, 1);
EBX += 0x00010000;
sys_write_text(EBX, ECX, EDX, ESI);
} }
ELSE IF (tval == MINE)
{
tcolor = 0xee1111;
tchar = '*';
}
ELSE
{
tchar = tval + '0';
tcolor = num_colors[tval-1];
}
EBX = xl + 5; EBX <<= 16; EBX += yt + 5;
sys_write_text(EBX, tcolor, #tchar, 1);
EBX += 0x00010000;
sys_write_text(EBX, ECX, EDX, ESI);
NOCHAR:
sys_draw_line(xl << 16 + xl, yt << 16 + yb, clDarkGray); sys_draw_line(xl << 16 + xl, yt << 16 + yb, clDarkGray);
sys_draw_line(xl << 16 + xr, yt << 16 + yt, EDX); sys_draw_line(xl << 16 + xr, yt << 16 + yt, EDX);
} }
} }
void draw_time()
// Òàéìåð // Òàéìåð
void draw_time()
{ {
sys_draw_bar(XST<<16+25, 31<<16+10, 0xCCCCCC); sys_draw_bar(XST<<16+25, 31<<16+10, 0xCCCCCC);
EBX = 0x00030000; EBX = 0x00030000;
sys_write_number(EBX, time, XST<<16+32, 0x10ff0000); sys_write_number(EBX, time, XST<<16+32, 0x10ff0000);
} }
void draw_minesi()
// Èíäèêàòîð êîëè÷åñòâà íåðàññòàâëåííûõ ìèí // Èíäèêàòîð êîëè÷åñòâà íåðàññòàâëåííûõ ìèí
void draw_minesi()
{ {
EBX = xsize - XST - 25; EBX = xsize - XST - 25;
$PUSH EBX $PUSH EBX
EBX = EBX << 16 + 25; EBX = EBX << 16 + 25;
sys_draw_bar(EBX, 31<<16+12, 0xCCCCCC); sys_draw_bar(EBX, 31<<16+10, 0xCCCCCC);
$POP EDX $POP EDX
EDX <<= 16; EDX += 30; EDX <<= 16; EDX += 32;
EBX = 0x00030000; EBX = 0x00030000;
sys_write_number(EBX, cmines, EDX, 0x10ff0000); sys_write_number(EBX, cmines, EDX, 0x10ff0000);
} }
void draw_squares()
// Îòðèñîâêà ìèííîãî ïîëÿ // Îòðèñîâêà ìèííîãî ïîëÿ
void draw_squares()
{ {
int x,y; int x,y;

View File

@ -0,0 +1,2 @@
@E:\C--\bin\c-- mine.c-- /meos
@pause > nul

View File

@ -1,7 +1,7 @@
/******************************************************************************* /*******************************************************************************
MenuetOS MineSweeper MenuetOS MineSweeper
Copyright (C) 2003 Ivan Poddubny Copyright (C) 2003, 2004 Ivan Poddubny
This program is free software; you can redistribute it and/or modify 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 it under the terms of the GNU General Public License as published by
@ -19,22 +19,22 @@
*******************************************************************************/ *******************************************************************************/
//? pragma option LST // generate ASM listing file - ñîçäàòü àññåìáëåðíûé ëèñòèíã ? pragma option LST // generate ASM listing file - ñîçäàòü àññåìáëåðíûé ëèñòèíã
//? warning TRUE // âêëþ÷èòü ðåæèì âûâîäà ïðåäóïðåæäåíèé ? warning TRUE // âêëþ÷èòü ðåæèì âûâîäà ïðåäóïðåæäåíèé
? pragma option meos
? jumptomain NONE ? jumptomain NONE
? include "msys.h--" // MenuetOS system functions - ñèñòåìíûå ôóíêöèè MenuetOS ? include "msys.h--" // MenuetOS system functions - ñèñòåìíûå ôóíêöèè MenuetOS
//? define DEBUG 1
? print "\nÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿" ? print "\nÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿"
? print "\n³ MeOS MineSweeper v0.3 ³" ? print "\n³ MenuetOS MineSweeper v0.4 ³"
? print "\n³ (C) Ivan Poddubny (ivan-yar@bk.ru) 2003 ³" ? print "\n³ (C) Ivan Poddubny (ivan-yar@bk.ru) 2003,2004 ³"
? print "\nÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\n\n" ? print "\nÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\n\n"
/************************************** DATA **************************************/ /************************************** DATA **************************************/
? define XPX 16 // X pixels by square - ðàçìåð êëåòêè â ïèêñåëÿõ ? define XPX 16 // X pixels by square - ðàçìåð êëåòêè â ïèêñåëÿõ
? define YPX 16 // Y pixels by square ? define YPX 16 // Y pixels by square
? define MINE 255 // çíà÷åíèå äëÿ ìèíû â ïîëå value ? define MINE 255 // â êëåòêå ìèíà, åñëè value = MINE
struct struct
{ {
@ -59,7 +59,7 @@ struct
int XST, // offset of first pixel X - ñìåùåíèå ïîëÿ îò ãðàíèöû îêíà int XST, // offset of first pixel X - ñìåùåíèå ïîëÿ îò ãðàíèöû îêíà
YST, YST,
ncx, // number of squares in X - ðàçìåð ïîë ncx, // number of squares in X - ðàçìåð ïîëÿ
ncy, ncy,
cmines, // mines discovered - êîëè÷åñòâî íåîòêðûòûõ ìèí cmines, // mines discovered - êîëè÷åñòâî íåîòêðûòûõ ìèí
initmines, // number of initial mines - èçíà÷àëüíîå êîëè÷åñòâî ìèí initmines, // number of initial mines - èçíà÷àëüíîå êîëè÷åñòâî ìèí
@ -88,6 +88,7 @@ inline void fastcall mouse_enable()
$int 0x40 $int 0x40
} }
inline void fastcall mouse_disable() inline void fastcall mouse_disable()
{ {
$mov eax,40 $mov eax,40
@ -95,14 +96,16 @@ inline void fastcall mouse_disable()
$int 0x40 $int 0x40
} }
? include "timer.h--" // timer functions ? include "timer.h--" // timer functions
? include "draw.h--" // drawing functions ? include "draw.h--" // drawing functions
? include "access.h--" // get & set functions ? include "access.h--" // get & set functions
? include "random.h--" // random number generator ? include "random.h--" // random number generator
//? include "uf.h--" // user field window //? include "uf.h--" // user field window
void init() void init()
// Èíèöèàëèçàöè // Èíèöèàëèçàöèÿ
{ {
XST = 10; YST = 52; // FIELD POSITION IN WINDOW XST = 10; YST = 52; // FIELD POSITION IN WINDOW
@ -126,6 +129,7 @@ void init()
ysize = ncy * YPX + YST + XST; ysize = ncy * YPX + YST + XST;
} // init } // init
void clear_all() void clear_all()
// Î÷èñòèòü ïîëå // Î÷èñòèòü ïîëå
{ {
@ -135,10 +139,11 @@ void clear_all()
$REP $STOSD $REP $STOSD
} // clear_all } // clear_all
void new_game() void new_game()
// Íîâàÿ èãðà // Íîâàÿ èãðà
{ {
init(); // èíèöèàëèçàöè init(); // èíèöèàëèçàöèÿ
randomize(); // ãåíåðàòîð ñëó÷àéíûõ ÷èñåë randomize(); // ãåíåðàòîð ñëó÷àéíûõ ÷èñåë
clear_all(); // î÷èñòèòü ïîëå clear_all(); // î÷èñòèòü ïîëå
@ -149,16 +154,22 @@ void new_game()
time = 0; // âðåìÿ = 0 time = 0; // âðåìÿ = 0
} // new_game } // new_game
void set_mines(int nminas, no_x, no_y) void set_mines(int nminas, no_x, no_y)
// Ðàññòàâèòü ìèíû // Ðàññòàâèòü ìèíû
{ {
int i, x, y, a, b; int i, x, y, a, b;
#ifdef DEBUG
sys_debug_write_string("MINE: set_mines called\n");
#endif
sqclosed = ncx * ncy - nminas; // êîëè÷åñòâî ÍÅîòêðûòûõ êëåòîê = ïëîùàäü ïîëÿ - êîë-âî ìèí sqclosed = ncx * ncy - nminas; // êîëè÷åñòâî ÍÅîòêðûòûõ êëåòîê = ïëîùàäü ïîëÿ - êîë-âî ìèí
FOR (i = nminas; i > 0; i--) // ðàññòàâèòü ìèíû FOR (i = nminas; i > 0; i--) // ðàññòàâèòü ìèíû
{ {
x = random(ncx); y = random(ncy); x = random(ncx);
y = random(ncy);
WHILE ((get_value(x, y) == MINE) || ((x == no_x) && (y == no_y))) WHILE ((get_value(x, y) == MINE) || ((x == no_x) && (y == no_y)))
{ {
x = random(ncx); x = random(ncx);
@ -190,13 +201,18 @@ void set_mines(int nminas, no_x, no_y)
} }
} // set_mines } // set_mines
inline void do_mouse(void) inline void do_mouse(void)
// Îáðàáîò÷èê ìûøè // Îáðàáîò÷èê ìûøè
{ {
int x,y; int x,y;
EAX = sys_read_mouse(2); // ìûøü íå íàæàòà -> âûõîä EAX = sys_read_mouse(2); // ìûøü íå íàæàòà -> âûõîä
IF (EAX == 0) return; IF (EAX == 0)
{
// sys_debug_write_string("Strange\n");
return;
}
mouse_status = AL; mouse_status = AL;
@ -216,8 +232,10 @@ inline void do_mouse(void)
IF (firstmine == TRUE) IF (firstmine == TRUE)
{ {
firstmine = FALSE; firstmine = FALSE;
set_mines(cmines, x, y); set_mines(initmines, x, y);
start_timer(); start_timer();
time = 1;
draw_time();
} }
IF (get_value(x, y) == MINE) IF (get_value(x, y) == MINE)
{ {
@ -252,10 +270,10 @@ inline void do_mouse(void)
end_game(); end_game();
} }
if (sqclosed == 0) IF (sqclosed == 0)
// îòêðûòû âñå êëåòêè
// all squares are opened
{ {
// îòêðûòû âñå êëåòêè
// all squares are opened
mouse_en = FALSE; // çàïðåòèòü ìûøü mouse_en = FALSE; // çàïðåòèòü ìûøü
stop_timer(); stop_timer();
stop_game = TRUE; // èãðà çàâåðøåíà stop_game = TRUE; // èãðà çàâåðøåíà
@ -273,11 +291,16 @@ inline void do_mouse(void)
} }
} // do_mouse } // do_mouse
void open_square(int x, y) void open_square(int x, y)
// Îòêðûòü êëåòêó // Îòêðûòü êëåòêó
{ {
int a, b, i; int a, b, i;
#ifdef DEBUG
sys_debug_write_string("MINE: open_square called\n");
#endif
set_open(x, y, TRUE); set_open(x, y, TRUE);
sqclosed--; sqclosed--;
@ -305,12 +328,17 @@ void open_square(int x, y)
} }
} // open_square } // open_square
int open_near_squares(int x, y) int open_near_squares(int x, y)
// Îòêðûòü áëèçëåæàùèå êëåòêè (îáå êíîïêè ìûøè âìåñòå) // Îòêðûòü áëèçëåæàùèå êëåòêè (îáå êíîïêè ìûøè âìåñòå)
{ {
int a, b, i; int a, b, i;
dword suma = 0; dword suma = 0;
#ifdef DEBUG
sys_debug_write_string("MINE: open_near_squares called\n");
#endif
a = x; a = x;
b = y; b = y;
FOR (i = 0; i < 8; i++) FOR (i = 0; i < 8; i++)
@ -349,16 +377,21 @@ int open_near_squares(int x, y)
open_square(a, b); open_square(a, b);
} }
} }
RETURN suma; return suma;
} }
ELSE ELSE
RETURN 0; return 0;
} // open_near_squares } // open_near_squares
void end_game() void end_game()
{ {
int x,y; int x,y;
#ifdef DEBUG
sys_debug_write_string("MINE: end_game called\n");
#endif
stop_game = TRUE; stop_game = TRUE;
stop_timer(); stop_timer();
for (x=0; x<ncx; x++) for (x=0; x<ncx; x++)
@ -397,7 +430,7 @@ void end_game()
void main() void main()
{ {
sys_delay(5); // for old kernel only! //sys_delay(5); // for old kernel only!
new_game(); new_game();
draw_window(); draw_window();
@ -406,16 +439,16 @@ void main()
{ {
switch (sys_wait_event_timeout(100)) // wait for 1 second switch (sys_wait_event_timeout(100)) // wait for 1 second
{ {
CASE evReDraw: case evReDraw:
draw_window(); draw_window();
continue; continue;
CASE evKey: case evKey:
IF (sys_get_key() == 27) IF (sys_get_key() == 27)
sys_exit_process(); sys_exit_process();
continue; continue;
CASE evButton: case evButton:
EAX = sys_get_button_id(); EAX = sys_get_button_id();
IF (EAX == 911) // new game IF (EAX == 911) // new game
{ {
@ -429,32 +462,31 @@ void main()
// mode++; mode%=3; mode++; // mode++; mode%=3; mode++;
EAX = mode; EAX++; EAX = EAX%3; EAX++; mode = AL; EAX = mode; EAX++; EAX = EAX%3; EAX++; mode = AL;
// get window position - ïîëó÷èòü êîîðäèíàòû îêíà new_game();
sys_process_info(#procinfo, -1); EBX = ECX = -1;
xpos = procinfo.xstart; EDX = xsize;
ypos = procinfo.ystart; ESI = ysize;
EAX = 67;
// start a new process and terminate this one $int 0x40
sys_create_thread(#main, ESP); continue;
sys_exit_process();
} }
//ELSE IF (EAX == 1002) // ELSE IF (EAX == 1002)
//{ // {
// start_uf(); // start_uf();
//} // }
ELSE IF (EAX == 1) // close window ELSE IF (EAX == 1) // close window
sys_exit_process(); sys_exit_process();
CONTINUE; continue;
case evMouse: case evMouse:
IF (!mouse_en) // is mouse enabled ? IF (!mouse_en) // is mouse enabled ?
CONTINUE; continue;
do_mouse(); do_mouse();
// wait for mouse release - æäàòü îòïóñêàíèÿ êíîïêè // wait for mouse release - æäàòü îòïóñêàíèÿ êíîïêè
WHILE (sys_read_mouse(2) == mouse_status) WHILE (sys_read_mouse(2) == mouse_status)
{ {
check_timer(); check_timer();
sys_delay(6); sys_delay(3);
CONTINUE; CONTINUE;
} }
check_timer(); check_timer();
@ -465,4 +497,4 @@ void main()
check_timer(); check_timer();
sys_delay(2); sys_delay(2);
} }
} // main } // main

File diff suppressed because it is too large Load Diff

View File

@ -1,7 +1,7 @@
/******************************************************************************* /*******************************************************************************
MenuetOS MineSweeper MenuetOS MineSweeper
Copyright (C) 2003 Ivan Poddubny Copyright (C) 2003, 2004 Ivan Poddubny
This program is free software; you can redistribute it and/or modify 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 it under the terms of the GNU General Public License as published by

View File

@ -1,7 +1,7 @@
/******************************************************************************* /*******************************************************************************
MenuetOS MineSweeper MenuetOS MineSweeper
Copyright (C) 2003 Ivan Poddubny Copyright (C) 2003, 2004 Ivan Poddubny
This program is free software; you can redistribute it and/or modify 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 it under the terms of the GNU General Public License as published by
@ -26,12 +26,20 @@ byte timer_life;
start_timer() start_timer()
{ {
#ifdef DEBUG
sys_debug_write_string("MINE: timer started\n");
#endif
timer_life = TRUE; timer_life = TRUE;
ttime = sys_get_clock(); ttime = sys_get_setup_devices(9); //sys_get_clock();
} }
stop_timer() stop_timer()
{ {
#ifdef DEBUG
sys_debug_write_string("MINE: timer stopped\n");
#endif
timer_life = FALSE; timer_life = FALSE;
} }
@ -39,12 +47,11 @@ check_timer()
{ {
IF (!timer_life) return; IF (!timer_life) return;
EAX = sys_get_clock(); ECX = sys_get_setup_devices(9); //sys_get_clock();
IF (EAX == 0xffffff) return;
IF (ttime != EAX) IF (ttime+100 < ECX)
{ {
ttime = EAX; ttime += 100;
IF (time < 999) IF (time < 999)
time++; time++;
draw_time(); draw_time();

View File

@ -1,7 +1,7 @@
/******************************************************************************* /*******************************************************************************
MenuetOS MineSweeper MenuetOS MineSweeper
Copyright (C) 2003 Ivan Poddubny Copyright (C) 2003, 2004 Ivan Poddubny
This program is free software; you can redistribute it and/or modify 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 it under the terms of the GNU General Public License as published by
@ -26,29 +26,69 @@ byte px,py,pm;
byte uf_open = FALSE; byte uf_open = FALSE;
byte uf_stack[2048]; byte uf_stack[2048];
byte str1[5]; dword active_textbox = #str1;
byte str2[5];
byte str3[5];
dword uf_x, byte str1[4] = {'1','1','1',0};
uf_y; byte str2[4] = {'2','2','2',0};
byte str3[4] = {'3','2','1',0};
dword uf_x=0,
uf_y=0;
:fastcall dword str2dword(dword EAX)
// str2byte ïåðåâîäèò ñòðîêó èç 3¸õ öèôð â áàéò
// IN: EAX = àäðåñ ñòîðêè
// OUT: EAX = áàéò
{
EDX = 0;
ECX = 0;
WHILE(ECX<3)
{
EDX *= 10;
EBX = DSBYTE[EAX+ECX];
EBX -= '0';
EDX += EBX;
ECX++;
}
EAX = EDX;
}
:fastcall void dword2str(dword EAX,ESI)
{
$PUSHA
DSDWORD[ESI]=0;
// EAX &= 255;
EDI = 10;
ECX = 2;
WHILE(ECX>=0)
{
IF(!EAX) BREAK;
$XOR EDX,EDX
$DIV EDI // al = div; dl = mod
DL += '0';
DSBYTE[ESI+ECX] = DL;
ECX--;
}
$POPA
}
void draw_uf_window() void draw_uf_window()
{ {
#ifdef DEBUG
sys_debug_write_string("MINE: îòðèñîâêà UF\n"w);
#endif
sys_get_colors(#colors, 40); sys_get_colors(#colors, 40);
sys_window_redraw(1); sys_window_redraw(1);
EDX = colors.w_work; EDX = colors.w_work;
$bts edx,25 $bts edx,25
sys_draw_window(uf_x, uf_y, EDX, colors.w_grab | 0x80000000, colors.w_frames); EBX = uf_x;
ECX = uf_y;
sys_draw_window(EBX, ECX, EDX, colors.w_grab | 0x80000000, colors.w_frames);
ECX = colors.w_grab_text | 0x10000000; ECX = colors.w_grab_text | 0x10000000;
sys_write_text(8<<16+8, colors.w_grab_text | 0x10000000, "USER FIELD", 10); sys_write_text(7<<16+8, colors.w_grab_text | 0x10000000, "USER FIELD"n, 10);
sys_draw_button(81<<16+12, 5<<16+12, 1, colors.w_grab_button); sys_draw_button(83<<16+12, 5<<16+12, 1, colors.w_grab_button);
ECX = colors.w_work_text | 0x10000000;
sys_write_text(8<<16+31, ECX, "WIDTH", 5);
sys_write_text(8<<16+49, ECX, "HEIGHT", 6);
sys_write_text(8<<16+67, ECX, "MINES", 5);
// three buttons: // three buttons:
// 1) WIDTH 10 // 1) WIDTH 10
@ -66,17 +106,39 @@ void draw_uf_window()
sys_draw_button( 8<<16+38, ECX, 20, ESI); EDX++; sys_draw_button( 8<<16+38, ECX, 20, ESI); EDX++;
sys_draw_button(54<<16+38, ECX, EDX, ESI); sys_draw_button(54<<16+38, ECX, EDX, ESI);
sys_write_text(21<<16+85, colors.w_work_button_text, "OK Cancel", 12); ECX = colors.w_work_text | 0x10000000;
sys_write_text(8<<16+32, ECX, "WIDTH"n, 5);
sys_write_text(8<<16+50, ECX, "HEIGHT"n, 6);
sys_write_text(8<<16+68, ECX, "MINES"n, 5);
sys_write_text(72<<16+32, 0, #str1, 3);
sys_write_text(72<<16+50, 0, #str2, 3);
sys_write_text(72<<16+68, 0, #str3, 3);
sys_write_text(21<<16+86, colors.w_work_button_text, "OK Cancel", 12);
sys_window_redraw(2); sys_window_redraw(2);
} }
void uf_main() void uf_main()
{ {
#ifdef DEBUG
sys_debug_write_string("MINE: ïîòîê ñîçäàí\n"w);
#endif
// dword2str(13, #str1);
// EAX = str2dword(#str3);
// dword2str(EAX, #str2);
uf_x <<= 16; uf_x += 100; uf_x <<= 16; uf_x += 100;
uf_y <<= 16; uf_y += 104; uf_y <<= 16; uf_y += 104;
draw_uf_window(); draw_uf_window();
#ifdef DEBUG
sys_debug_write_string("MINE: æäó ñîáûòèé\n"w);
#endif
WHILE() WHILE()
{ {
SWITCH (sys_wait_event()) SWITCH (sys_wait_event())
@ -84,10 +146,21 @@ void uf_main()
case 1: draw_uf_window(); case 1: draw_uf_window();
break; break;
case 2: IF (sys_get_key() == 27) case 2: //IF (sys_get_key() == 27)
//{
// uf_open = FALSE;
// sys_exit_process();
//}
//EAX = key now!
EAX = sys_get_key();
if (active_textbox != 0)
{ {
uf_open = FALSE; EBX = #str1; //active_textbox;
sys_exit_process(); DSBYTE[EBX] = 'A';
DSBYTE[EBX] = DSBYTE[EBX+1];
DSBYTE[EBX+1] = DSBYTE[EBX+2];
DSBYTE[EBX+2] = AL;
draw_uf_window();
} }
break; break;
@ -100,26 +173,50 @@ uf_button()
{ {
switch (sys_get_button_id()) switch (sys_get_button_id())
{ {
//case 10: case 10:
//case 11: // set [width] INPUT active
//case 12: active_textbox = #str1; break;
case 11:
// set [height] INPUT active
active_textbox = #str2; break;
case 12:
// set [mines] INPUT active
active_textbox = #str3; break;
case 20: case 20:
// [string -> byte] three times and save them
px = str2dword(#str1);
py = str2dword(#str2);
pm = str2dword(#str3);
mode = 4;
case 21: case 21:
// close UF window, forget all changes
case 1: case 1:
uf_open = FALSE; uf_open = FALSE;
sys_exit_process(); sys_exit_process();
} }
} }
void start_uf() void start_uf()
{ {
#ifdef DEBUG
sys_debug_write_string("MINE: âûçâàíà start_uf\n"w);
#endif
sys_process_info(#procinfo, -1); sys_process_info(#procinfo, -1);
uf_x = procinfo.xstart + XST; uf_x = procinfo.xstart + XST;
uf_y = procinfo.ystart + YST; uf_y = procinfo.ystart + YST;
#ifdef DEBUG
sys_debug_write_string("MINE: ñîçäàþ ïîòîê...\n"w);
#endif
sys_create_thread(#uf_main, #uf_stack + 2048); sys_create_thread(#uf_main, #uf_stack + 2048);
IF(EAX > 0x80000000)
return;
uf_open = TRUE; uf_open = TRUE;
mouse_disable(); mouse_disable();
WHILE (uf_open == TRUE) WHILE (uf_open == TRUE)