Rev 109 | 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 | // USER FIELD WINDOW |
||
23 | |||
24 | byte px,py,pm; |
||
25 | |||
26 | byte uf_open = FALSE; |
||
27 | byte uf_stack[2048]; |
||
28 | |||
126 | poddubny | 29 | dword active_textbox = #str1; |
31 | halyavin | 30 | |
126 | poddubny | 31 | byte str1[4] = {'1','1','1',0}; |
32 | byte str2[4] = {'2','2','2',0}; |
||
33 | byte str3[4] = {'3','2','1',0}; |
||
31 | halyavin | 34 | |
126 | poddubny | 35 | dword uf_x=0, |
36 | uf_y=0; |
||
37 | |||
38 | :fastcall dword str2dword(dword EAX) |
||
39 | // str2byte переводит строку из 3ёх цифр в байт |
||
40 | // IN: EAX = адрес сторки |
||
41 | // OUT: EAX = байт |
||
42 | { |
||
43 | EDX = 0; |
||
44 | ECX = 0; |
||
45 | WHILE(ECX<3) |
||
46 | { |
||
47 | EDX *= 10; |
||
48 | EBX = DSBYTE[EAX+ECX]; |
||
49 | EBX -= '0'; |
||
50 | EDX += EBX; |
||
51 | ECX++; |
||
52 | } |
||
53 | EAX = EDX; |
||
54 | } |
||
55 | |||
56 | :fastcall void dword2str(dword EAX,ESI) |
||
57 | { |
||
58 | $PUSHA |
||
59 | DSDWORD[ESI]=0; |
||
60 | // EAX &= 255; |
||
61 | EDI = 10; |
||
62 | ECX = 2; |
||
63 | WHILE(ECX>=0) |
||
64 | { |
||
65 | IF(!EAX) BREAK; |
||
66 | $XOR EDX,EDX |
||
67 | $DIV EDI // al = div; dl = mod |
||
68 | DL += '0'; |
||
69 | DSBYTE[ESI+ECX] = DL; |
||
70 | ECX--; |
||
71 | } |
||
72 | $POPA |
||
73 | } |
||
74 | |||
31 | halyavin | 75 | void draw_uf_window() |
76 | { |
||
126 | poddubny | 77 | #ifdef DEBUG |
78 | sys_debug_write_string("MINE: отрисовка UF\n"w); |
||
79 | #endif |
||
80 | |||
31 | halyavin | 81 | sys_get_colors(#colors, 40); |
82 | sys_window_redraw(1); |
||
83 | |||
84 | EDX = colors.w_work; |
||
85 | $bts edx,25 |
||
126 | poddubny | 86 | EBX = uf_x; |
87 | ECX = uf_y; |
||
88 | sys_draw_window(EBX, ECX, EDX, colors.w_grab | 0x80000000, colors.w_frames); |
||
31 | halyavin | 89 | ECX = colors.w_grab_text | 0x10000000; |
126 | poddubny | 90 | sys_write_text(7<<16+8, colors.w_grab_text | 0x10000000, "USER FIELD"n, 10); |
91 | sys_draw_button(83<<16+12, 5<<16+12, 1, colors.w_grab_button); |
||
31 | halyavin | 92 | |
93 | // three buttons: |
||
94 | // 1) WIDTH 10 |
||
95 | // 2) HEIGHT 11 |
||
96 | // 3) MINES 12 |
||
97 | // and also: |
||
98 | // OK, Cancel - 20,21 |
||
99 | |||
100 | sys_draw_button(54<<16+38, 30<<16+10, 10, 0xe0e0e0); // WIDTH |
||
101 | EDX++; sys_draw_button(EBX, 48<<16+10, EDX, ESI); // HEIGHT |
||
102 | EDX++; sys_draw_button(EBX, 66<<16+10, EDX, ESI); // MINES |
||
103 | |||
104 | ESI = colors.w_work_button; |
||
105 | ECX = 84<<16+10; |
||
106 | sys_draw_button( 8<<16+38, ECX, 20, ESI); EDX++; |
||
107 | sys_draw_button(54<<16+38, ECX, EDX, ESI); |
||
108 | |||
126 | poddubny | 109 | ECX = colors.w_work_text | 0x10000000; |
110 | sys_write_text(8<<16+32, ECX, "WIDTH"n, 5); |
||
111 | sys_write_text(8<<16+50, ECX, "HEIGHT"n, 6); |
||
112 | sys_write_text(8<<16+68, ECX, "MINES"n, 5); |
||
31 | halyavin | 113 | |
126 | poddubny | 114 | sys_write_text(72<<16+32, 0, #str1, 3); |
115 | sys_write_text(72<<16+50, 0, #str2, 3); |
||
116 | sys_write_text(72<<16+68, 0, #str3, 3); |
||
117 | |||
118 | sys_write_text(21<<16+86, colors.w_work_button_text, "OK Cancel", 12); |
||
119 | |||
31 | halyavin | 120 | sys_window_redraw(2); |
121 | } |
||
122 | |||
126 | poddubny | 123 | |
31 | halyavin | 124 | void uf_main() |
125 | { |
||
126 | poddubny | 126 | #ifdef DEBUG |
127 | sys_debug_write_string("MINE: поток создан\n"w); |
||
128 | #endif |
||
129 | |||
130 | // dword2str(13, #str1); |
||
131 | // EAX = str2dword(#str3); |
||
132 | // dword2str(EAX, #str2); |
||
133 | |||
31 | halyavin | 134 | uf_x <<= 16; uf_x += 100; |
135 | uf_y <<= 16; uf_y += 104; |
||
136 | draw_uf_window(); |
||
137 | |||
126 | poddubny | 138 | #ifdef DEBUG |
139 | sys_debug_write_string("MINE: жду событий\n"w); |
||
140 | #endif |
||
141 | |||
31 | halyavin | 142 | WHILE() |
143 | { |
||
144 | SWITCH (sys_wait_event()) |
||
145 | { |
||
146 | case 1: draw_uf_window(); |
||
147 | break; |
||
148 | |||
126 | poddubny | 149 | case 2: //IF (sys_get_key() == 27) |
150 | //{ |
||
151 | // uf_open = FALSE; |
||
152 | // sys_exit_process(); |
||
153 | //} |
||
154 | //EAX = key now! |
||
155 | EAX = sys_get_key(); |
||
156 | if (active_textbox != 0) |
||
31 | halyavin | 157 | { |
126 | poddubny | 158 | EBX = #str1; //active_textbox; |
159 | DSBYTE[EBX] = 'A'; |
||
160 | DSBYTE[EBX] = DSBYTE[EBX+1]; |
||
161 | DSBYTE[EBX+1] = DSBYTE[EBX+2]; |
||
162 | DSBYTE[EBX+2] = AL; |
||
163 | draw_uf_window(); |
||
31 | halyavin | 164 | } |
165 | break; |
||
166 | |||
167 | case 3: uf_button(); |
||
168 | } |
||
169 | } |
||
170 | } |
||
171 | |||
172 | uf_button() |
||
173 | { |
||
174 | switch (sys_get_button_id()) |
||
175 | { |
||
126 | poddubny | 176 | case 10: |
177 | // set [width] INPUT active |
||
178 | active_textbox = #str1; break; |
||
179 | case 11: |
||
180 | // set [height] INPUT active |
||
181 | active_textbox = #str2; break; |
||
182 | case 12: |
||
183 | // set [mines] INPUT active |
||
184 | active_textbox = #str3; break; |
||
31 | halyavin | 185 | |
186 | case 20: |
||
126 | poddubny | 187 | // [string -> byte] three times and save them |
188 | px = str2dword(#str1); |
||
189 | py = str2dword(#str2); |
||
190 | pm = str2dword(#str3); |
||
191 | mode = 4; |
||
31 | halyavin | 192 | case 21: |
126 | poddubny | 193 | // close UF window, forget all changes |
31 | halyavin | 194 | |
195 | case 1: |
||
126 | poddubny | 196 | uf_open = FALSE; |
197 | sys_exit_process(); |
||
31 | halyavin | 198 | } |
199 | } |
||
200 | |||
201 | void start_uf() |
||
202 | { |
||
126 | poddubny | 203 | #ifdef DEBUG |
204 | sys_debug_write_string("MINE: вызвана start_uf\n"w); |
||
205 | #endif |
||
206 | |||
31 | halyavin | 207 | sys_process_info(#procinfo, -1); |
208 | uf_x = procinfo.xstart + XST; |
||
209 | uf_y = procinfo.ystart + YST; |
||
210 | |||
126 | poddubny | 211 | #ifdef DEBUG |
212 | sys_debug_write_string("MINE: создаю поток...\n"w); |
||
213 | #endif |
||
214 | |||
31 | halyavin | 215 | sys_create_thread(#uf_main, #uf_stack + 2048); |
126 | poddubny | 216 | |
217 | IF(EAX > 0x80000000) |
||
218 | return; |
||
219 | |||
31 | halyavin | 220 | uf_open = TRUE; |
221 | mouse_disable(); |
||
222 | WHILE (uf_open == TRUE) |
||
223 | { |
||
224 | SWITCH (sys_wait_event_timeout(5)) |
||
225 | { |
||
226 | CASE 1: draw_window(); CONTINUE; |
||
227 | CASE 2: sys_get_key(); CONTINUE; |
||
228 | CASE 3: sys_get_button_id(); CONTINUE; |
||
229 | } |
||
230 | } |
||
231 | mouse_enable(); |
||
232 | }=><=>=><=>16+86,><16+86,>16+68,><16+68,>16+50,><16+50,>16+32,><16+32,>16+68,><16+68,>16+50,><16+50,>16+32,><16+32,>16+38,><16+38,>16+38,><16+38,>16+10; |