Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
1803 | yogev_ezra | 1 | ;v. 0.4: 20.10.2009 staper@inbox.ru |
2 | |||
3 | use32 |
||
4 | org 0x0 |
||
5 | db 'MENUET01' |
||
6 | dd 0x1 |
||
7 | dd START |
||
8 | dd I_END |
||
9 | dd (I_END+600) and not 3 |
||
10 | dd (I_END+600) and not 3 |
||
11 | dd 0x0,0x0 |
||
12 | |||
13 | DEBUG equ 0 |
||
14 | |||
15 | use_new_logic equ 1 ;фюсрты хЄ яЁютхЁъє ъыхЄъш эр "юъЁєц╕ээюёЄ№", яЁюуЁрььр т√сшЁрхЄ эршсюыхх ётюсюфэє■ |
||
16 | use_ext_logic equ 1 ;ъ use_new_logic, фюяюыэшЄхы№эр яЁютхЁър ўххъ тюъЁєу чрфрээющ ъыхЄъш |
||
17 | |||
18 | include '../../../macros.inc' |
||
19 | include 'lang.inc' |
||
20 | |||
21 | ;include 'debug.inc' |
||
22 | |||
23 | macro dbg_dec num |
||
24 | {pushad |
||
25 | newline |
||
26 | debug_print_dec num |
||
27 | popad} |
||
28 | |||
29 | |||
30 | START: |
||
31 | |||
32 | mcall 40,100111b |
||
33 | mcall 3 |
||
34 | mov [rsx1],ax |
||
35 | shr eax,16 |
||
36 | mov [rsx2],ax |
||
37 | jmp new_game |
||
38 | |||
39 | redraw_all: |
||
40 | mcall 12,1 |
||
41 | mcall 0,100*65536+432,100*65536+260,0x34FFFFFF,,title |
||
42 | mcall 38,1*65536+421,27*65536+27,0x00b0b0b0 |
||
43 | mov edi,10 |
||
44 | @@: add ecx,20*65536+20 |
||
45 | mcall |
||
46 | dec edi |
||
47 | jnz @b |
||
48 | mcall ,1*65536+1,27*65536+226,;000000 |
||
49 | mov edi,21 |
||
50 | @@: add ebx,20*65536+20 |
||
51 | mcall |
||
52 | dec edi |
||
53 | jnz @b |
||
54 | mcall 13,202*65536+19,27*65536+202,0xFFFFFF |
||
55 | mcall 4,40*65536+12,0x80000000,text_user |
||
56 | mcall ,350*65536+12,,text_cpu |
||
57 | mcall 8,120*65536+70,7*65536+15,2,0xFFFFFF |
||
58 | mcall ,230*65536+70,,3, |
||
59 | mcall 4,135*65536+12,0x80000000,but_new |
||
60 | mcall ,240*65536+12,,but_auto |
||
61 | mcall 12,2 |
||
62 | ret |
||
63 | |||
64 | draw_pole: |
||
65 | ; mcall 0,100*65536+432,100*65536+260,0x74FFFFFF,,title |
||
66 | if DEBUG |
||
67 | call SysMsgBoardNum ;show esp |
||
68 | mcall 8,200*65536+10,7*65536+15,4,0xFFFFFF |
||
69 | endf |
||
70 | |||
71 | |||
72 | |||
73 | mov esi,table1 |
||
74 | mov edi,90 |
||
75 | mov ebp,10 |
||
76 | mov ebx,1*65536+21 |
||
77 | mov ecx,27*65536+47 |
||
78 | call draw_bots |
||
79 | |||
80 | mov esi,table5 |
||
81 | mov edi,90 |
||
82 | mov ebp,10 |
||
83 | mov ebx,221*65536+241 |
||
84 | mov ecx,27*65536+47 |
||
85 | call draw_bots |
||
86 | cmp [u_kill],10 |
||
87 | jne @f |
||
88 | mcall 4,69*65536+12,0x80ff0000,text_win |
||
89 | bts [flags],5 |
||
90 | @@: cmp [c_kill],10 |
||
91 | jne @f |
||
92 | mcall 4,372*65536+12,0x80ff0000,text_win |
||
93 | bts [flags],5 |
||
94 | @@: mcall 12,2 |
||
95 | cmp [number_bots],10 |
||
96 | jne still |
||
97 | bts [flags],0 |
||
98 | still: |
||
99 | mcall 10 |
||
100 | |||
101 | cmp eax,6 |
||
102 | je mouse |
||
103 | dec eax |
||
104 | jnz @f |
||
105 | call redraw_all |
||
106 | jmp draw_pole |
||
107 | @@: dec eax |
||
108 | jz key |
||
109 | dec eax |
||
110 | jz button |
||
111 | jmp still |
||
112 | |||
113 | key: |
||
114 | mcall 2 |
||
115 | jmp still |
||
116 | |||
117 | button: |
||
118 | mcall 17 |
||
119 | dec ah |
||
120 | jnz @f |
||
121 | mcall -1 |
||
122 | |||
123 | @@: mov ecx,(344)/4 |
||
124 | mov esi,table1 |
||
125 | .3: mov dword [esi],0 |
||
126 | add esi,4 |
||
127 | loop .3 |
||
128 | |||
129 | dec ah |
||
130 | jz @f |
||
131 | |||
132 | mov [flags],1001b ;auto fill |
||
133 | mov [number_bots],0 |
||
134 | |||
135 | call set_bots |
||
136 | mov [number_bots],0 |
||
137 | bts [flags],2 |
||
138 | call set_bots |
||
139 | call redraw_all |
||
140 | btc [flags2],0 |
||
141 | jc second_pole.comp |
||
142 | jmp draw_pole |
||
143 | |||
144 | @@: ;new game |
||
145 | mov [number_bots],0 |
||
146 | new_game: |
||
147 | mov [flags],1100b |
||
148 | call set_bots |
||
149 | btr [flags],0 |
||
150 | btr [flags],3 |
||
151 | btr [flags],2 |
||
152 | mov [number_bots],0 |
||
153 | call redraw_all |
||
154 | jmp draw_pole |
||
155 | |||
156 | draw_bots: |
||
157 | cmp byte [esi],1 |
||
158 | je .one |
||
159 | cmp byte [esi],2 |
||
160 | je .two |
||
161 | cmp byte [esi],3 |
||
162 | je .three |
||
163 | cmp byte [esi],4 |
||
164 | jne .null |
||
165 | bts [flags],4 |
||
166 | jmp .three |
||
167 | |||
168 | .end: |
||
169 | inc esi |
||
170 | dec ebp |
||
171 | jnz draw_bots |
||
172 | test edi,edi |
||
173 | jz @f |
||
174 | sub edi,10 |
||
175 | mov ebp,10 |
||
176 | add ebx,-200*65536-200 |
||
177 | add ecx,20*65536+20 |
||
178 | jmp draw_bots |
||
179 | @@: |
||
180 | ret |
||
181 | |||
182 | .one: |
||
183 | push ebx ecx |
||
184 | call .0 |
||
185 | mov edx,0x00aa66 |
||
186 | mcall 13 |
||
187 | pop ecx ebx |
||
188 | .null: |
||
189 | add ebx,20*65536+20 |
||
190 | jmp .end |
||
191 | .two: |
||
192 | push ebx ecx |
||
193 | add ebx,8*65536-6 |
||
194 | add ecx,12*65536-12 |
||
195 | mcall 38,,,0x508cec |
||
196 | add ecx,-6*65536+6 |
||
197 | mcall |
||
198 | pop ecx ebx |
||
199 | jmp .null |
||
200 | .three: |
||
201 | push ebx ecx |
||
202 | call .0 |
||
203 | mov edx,0x00FF0000 |
||
204 | bt [flags],4 |
||
205 | jnc @f |
||
206 | mov edx,0x00555555 |
||
207 | btr [flags],4 |
||
208 | @@: mcall 13 |
||
209 | pop ecx ebx |
||
210 | xor edx,edx |
||
211 | mcall 38 |
||
212 | add ecx,20*65536-20 |
||
213 | mcall |
||
214 | add ecx,-20*65536+20 |
||
215 | jmp .null |
||
216 | |||
217 | .0: |
||
218 | shr ebx,16 |
||
219 | inc bx |
||
220 | shl ebx,16 |
||
221 | add ebx,19 |
||
222 | shr ecx,16 |
||
223 | inc cx |
||
224 | shl ecx,16 |
||
225 | add ecx,19 |
||
226 | ret |
||
227 | |||
228 | mouse: |
||
229 | bt [flags],5 |
||
230 | jc still |
||
231 | mcall 37,2 |
||
232 | test eax,eax |
||
233 | jz still |
||
234 | cmp al,2 |
||
235 | jg still |
||
236 | ;1 - левая кнопка, 2 - правая |
||
237 | dec al |
||
238 | jnz .mouse_1 |
||
239 | btr [flags],1 |
||
240 | jmp @f |
||
241 | .mouse_1: |
||
242 | bts [flags],1 |
||
243 | @@: |
||
244 | mcall 37,1 |
||
245 | mov dx,ax |
||
246 | shr eax,16 |
||
247 | cmp dx,27 |
||
248 | jbe still |
||
249 | cmp dx,227 |
||
250 | jge still |
||
251 | cmp ax,1 |
||
252 | jbe still |
||
253 | cmp ax,201 |
||
254 | jge second_pole |
||
255 | ;первое поле |
||
256 | bt [flags],0 |
||
257 | jc still |
||
258 | sub ax,1 |
||
259 | push dx |
||
260 | xor edx,edx |
||
261 | mov cx,20 |
||
262 | div cx |
||
263 | pop dx |
||
264 | mov [oX],al |
||
265 | push ax |
||
266 | sub dx,27 |
||
267 | mov ax,dx |
||
268 | xor dx,dx |
||
269 | div cx |
||
270 | mov [oY],al |
||
271 | xor dx,dx |
||
272 | mov cx,10 |
||
273 | mul cx |
||
274 | pop dx |
||
275 | add ax,dx |
||
276 | cmp ax,100 |
||
277 | jg still |
||
278 | |||
279 | set_bot: |
||
280 | mov esi,table1 |
||
281 | bt [flags],2 |
||
282 | jnc @f |
||
283 | mov esi,table2 |
||
284 | @@: mov edi,esi |
||
285 | add edi,100 |
||
286 | cmp [number_bots],6 |
||
287 | jnb .1paluba |
||
288 | cmp [number_bots],3 |
||
289 | jnb .2paluba |
||
290 | cmp [number_bots],0 |
||
291 | je .4paluba |
||
292 | jmp .3paluba |
||
293 | |||
294 | .4paluba: |
||
295 | bt [flags],1 ;четырёхпалубный |
||
296 | jnc @f |
||
297 | cmp [oX],6 |
||
298 | jg _still |
||
299 | jmp .41 |
||
300 | @@: cmp [oY],6 |
||
301 | jg _still |
||
302 | .41: inc [number_bots] |
||
303 | mov [edi],al |
||
304 | bt [flags],1 |
||
305 | jc @f |
||
306 | add al,10 |
||
307 | mov [edi+1],al |
||
308 | add al,10 |
||
309 | mov [edi+2],al |
||
310 | add al,10 |
||
311 | mov [edi+3],al |
||
312 | jmp init_table |
||
313 | @@: inc al |
||
314 | mov [edi+1],al |
||
315 | inc al |
||
316 | mov [edi+2],al |
||
317 | inc al |
||
318 | mov [edi+3],al |
||
319 | jmp init_table |
||
320 | |||
321 | |||
322 | .3paluba: ;трёхпалубный |
||
323 | bt [flags],1 |
||
324 | jnc @f |
||
325 | cmp [oX],7 |
||
326 | jg _still |
||
327 | jmp .31 |
||
328 | @@: cmp [oY],7 |
||
329 | jg _still |
||
330 | .31: |
||
331 | call find_near |
||
332 | |||
333 | bt [flags],1 |
||
334 | jc @f |
||
335 | add al,10 |
||
336 | call find_near |
||
337 | add al,10 |
||
338 | call find_near |
||
339 | sub al,20 |
||
340 | jmp .32 |
||
341 | @@: inc al |
||
342 | call find_near |
||
343 | inc al |
||
344 | call find_near |
||
345 | sub al,2 |
||
346 | .32: |
||
347 | inc [number_bots] |
||
348 | mov ecx,4 |
||
349 | mov dl,[number_bots] |
||
350 | sub dl,2 |
||
351 | jz @f |
||
352 | add ecx,3 |
||
353 | @@: |
||
354 | mov [edi+ecx],al |
||
355 | bt [flags],1 |
||
356 | jc @f |
||
357 | add al,10 |
||
358 | mov [edi+ecx+1],al |
||
359 | add al,10 |
||
360 | mov [edi+ecx+2],al |
||
361 | jmp init_table |
||
362 | @@: inc al |
||
363 | mov [edi+ecx+1],al |
||
364 | inc al |
||
365 | mov [edi+ecx+2],al |
||
366 | jmp init_table |
||
367 | |||
368 | |||
369 | |||
370 | .2paluba: ;двухпалубный |
||
371 | bt [flags],1 |
||
372 | jnc @f |
||
373 | cmp [oX],8 |
||
374 | jg _still |
||
375 | jmp .21 |
||
376 | @@: cmp [oY],8 |
||
377 | jg _still |
||
378 | .21: |
||
379 | call find_near |
||
380 | bt [flags],1 |
||
381 | jc @f |
||
382 | add al,10 |
||
383 | call find_near |
||
384 | sub al,10 |
||
385 | jmp .22 |
||
386 | @@: inc al |
||
387 | call find_near |
||
388 | dec al |
||
389 | .22: |
||
390 | inc [number_bots] |
||
391 | mov ecx,8 |
||
392 | mov dl,[number_bots] |
||
393 | sub dl,4 |
||
394 | jz @f |
||
395 | add ecx,2 |
||
396 | dec dl |
||
397 | jz @f |
||
398 | add ecx,2 |
||
399 | @@: add ecx,2 |
||
400 | mov [edi+ecx],al |
||
401 | bt [flags],1 |
||
402 | jc @f |
||
403 | add al,10 |
||
404 | mov [edi+ecx+1],al |
||
405 | jmp init_table |
||
406 | @@: inc al |
||
407 | mov [edi+ecx+1],al |
||
408 | jmp init_table |
||
409 | |||
410 | |||
411 | .1paluba: ;однопалубный |
||
412 | call find_near |
||
413 | inc [number_bots] |
||
414 | xor edx,edx |
||
415 | movzx ecx,[number_bots] |
||
416 | add ecx,9 |
||
417 | mov [edi+ecx],al |
||
418 | jmp init_table |
||
419 | |||
420 | find_near: |
||
421 | push ax |
||
422 | call f_near ;0 |
||
423 | |||
424 | cmp al,10 |
||
425 | jb @f |
||
426 | sub al,10 ;-10 |
||
427 | call f_near |
||
428 | |||
429 | @@: cmp al,11 |
||
430 | jb @f |
||
431 | |||
432 | xor edx,edx |
||
433 | mov ecx,10 |
||
434 | div cx |
||
435 | mov ax,[esp] |
||
436 | cmp dx,0 |
||
437 | je @f |
||
438 | |||
439 | sub al,11 ;-11 |
||
440 | call f_near |
||
441 | |||
442 | @@: cmp al,9 |
||
443 | jb @f |
||
444 | |||
445 | xor edx,edx |
||
446 | mov ecx,10 |
||
447 | div cx |
||
448 | mov ax,[esp] |
||
449 | cmp dx,9 |
||
450 | je @f |
||
451 | |||
452 | sub al,9 ;-9 |
||
453 | call f_near |
||
454 | |||
455 | @@: cmp al,1 |
||
456 | jb @f |
||
457 | |||
458 | xor edx,edx |
||
459 | mov ecx,10 |
||
460 | div cx |
||
461 | mov ax,[esp] |
||
462 | cmp dx,0 |
||
463 | je @f |
||
464 | |||
465 | dec al ;-1 |
||
466 | call f_near |
||
467 | |||
468 | @@: cmp al,99 |
||
469 | jg @f |
||
470 | |||
471 | xor edx,edx |
||
472 | mov ecx,10 |
||
473 | div cx |
||
474 | mov ax,[esp] |
||
475 | cmp dx,9 |
||
476 | je @f |
||
477 | |||
478 | inc al ;+1 |
||
479 | call f_near |
||
480 | |||
481 | @@: cmp al,90 |
||
482 | jge @f |
||
483 | add al,10 ;+10 |
||
484 | call f_near |
||
485 | |||
486 | @@: cmp al,91 |
||
487 | jge @f |
||
488 | |||
489 | xor edx,edx |
||
490 | mov ecx,10 |
||
491 | div cx |
||
492 | mov ax,[esp] |
||
493 | cmp dx,0 |
||
494 | je @f |
||
495 | |||
496 | add al,9 ;+9 |
||
497 | call f_near |
||
498 | |||
499 | @@: cmp al,89 |
||
500 | jge @f |
||
501 | |||
502 | xor edx,edx |
||
503 | mov ecx,10 |
||
504 | div cx |
||
505 | mov ax,[esp] |
||
506 | cmp dx,9 |
||
507 | je @f |
||
508 | add al,11 ;+11 |
||
509 | call f_near |
||
510 | |||
511 | @@: pop ax |
||
512 | ; xor bl,bl |
||
513 | ; bt [flags],6 |
||
514 | ; jnc @f |
||
515 | ; bt [flags],9 |
||
516 | ; jnc @f |
||
517 | ; inc [p_pov] |
||
518 | ; cmp [p_pov],20 |
||
519 | ; jb @f |
||
520 | ; bts [flags],9 |
||
521 | ; @@: |
||
522 | btr [flags],6 |
||
523 | clc |
||
524 | ret |
||
525 | |||
526 | f_near: |
||
527 | bt [flags],6 |
||
528 | jnc .2 |
||
529 | ; bt [flags],9 |
||
530 | ; jc @f |
||
531 | ; cmp byte [esi+eax],2 |
||
532 | ; jge @f |
||
533 | ; @@: |
||
534 | cmp byte [esi+eax],4 |
||
535 | je @f |
||
536 | mov ax,[esp+4] |
||
537 | ret |
||
538 | @@:; add esp,4 |
||
539 | ; jmp second_pole.cpu |
||
540 | mov ax,[esp+4] |
||
541 | mov cx,ax |
||
542 | add esp,6 |
||
543 | btr [flags],6 |
||
544 | stc |
||
545 | ; mov bl,1 |
||
546 | ret |
||
547 | |||
548 | .2: movzx edx, byte [smeshenie] |
||
549 | @@: cmp al,[edi+edx] |
||
550 | je .end |
||
551 | dec dl |
||
552 | jnz @b |
||
553 | cmp al,[edi] |
||
554 | je .end |
||
555 | mov ax,[esp+4] |
||
556 | ret |
||
557 | .end: add esp,10 |
||
558 | jmp _still |
||
559 | |||
560 | |||
561 | |||
562 | init_table: |
||
563 | ; xor eax,eax |
||
564 | movzx ecx, byte [number_bots] |
||
565 | mov edx,3 |
||
566 | dec cl |
||
567 | jz .i_t |
||
568 | |||
569 | mov al,2 |
||
570 | .2: add dl,3 |
||
571 | dec cl |
||
572 | jz .i_t |
||
573 | dec al |
||
574 | jnz .2 |
||
575 | |||
576 | mov al,3 |
||
577 | .3: add dl,2 |
||
578 | dec cl |
||
579 | jz .i_t |
||
580 | dec al |
||
581 | jnz .3 |
||
582 | |||
583 | mov al,4 |
||
584 | .4: inc dl |
||
585 | dec cl |
||
586 | jz .i_t |
||
587 | dec al |
||
588 | jnz .4 |
||
589 | |||
590 | .i_t: mov [smeshenie],dl |
||
591 | @@: movzx eax, byte [edi+edx] |
||
592 | mov byte [esi+eax],1 |
||
593 | dec dl |
||
594 | jnz @b |
||
595 | movzx eax, byte [edi] |
||
596 | mov byte [esi+eax],1 |
||
597 | bt [flags],3 |
||
598 | jc set_bots |
||
599 | ; mcall 12,1 |
||
600 | jmp draw_pole |
||
601 | |||
602 | |||
603 | second_pole: |
||
604 | cmp ax,221 |
||
605 | jbe still |
||
606 | cmp ax,421 |
||
607 | jge still |
||
608 | ;второе поле |
||
609 | bt [flags],0 |
||
610 | jnc still |
||
611 | sub ax,221 |
||
612 | push dx |
||
613 | xor edx,edx |
||
614 | mov cx,20 |
||
615 | div cx |
||
616 | pop dx |
||
617 | push ax |
||
618 | sub dx,27 |
||
619 | mov ax,dx |
||
620 | xor dx,dx |
||
621 | div cx |
||
622 | xor dx,dx |
||
623 | mov cx,10 |
||
624 | mul cx |
||
625 | pop dx |
||
626 | add ax,dx |
||
627 | cmp ax,100 |
||
628 | jg still |
||
629 | |||
630 | mov edi,table2 |
||
631 | mov esi,table5 |
||
632 | cmp byte [esi+eax],2 |
||
633 | jge still |
||
634 | mov bl, byte [edi+eax] |
||
635 | add bl,2 |
||
636 | mov ecx,table5 |
||
637 | call if_bot_killed |
||
638 | mov [esi+eax],bl |
||
639 | cmp bl,3 |
||
640 | jge .m_end |
||
641 | .comp: mov esi,table1 |
||
642 | |||
643 | |||
644 | |||
645 | .cpu: |
||
646 | ; jmp .rndm |
||
647 | xor eax,eax |
||
648 | ; mov edi,4 |
||
649 | btr [flags],8 |
||
650 | xor ecx,ecx |
||
651 | mov edx,tbl_ranen |
||
652 | mov dword [edx],0 |
||
653 | @@: mov al,[esi+ecx] ;поиск "подраненного корабля" |
||
654 | cmp al,3 |
||
655 | je .0 |
||
656 | cmp cl,99 |
||
657 | jge .1 |
||
658 | inc cl |
||
659 | jmp @b |
||
660 | .0: mov [edx],cl |
||
661 | if DEBUG |
||
662 | dbg_dec ecx |
||
663 | endf |
||
664 | inc edx |
||
665 | inc cl |
||
666 | jmp @b |
||
667 | |||
668 | .1: |
||
669 | dec edx |
||
670 | mov cl,[edx] |
||
671 | cmp edx,tbl_ranen |
||
672 | jb .rndm |
||
673 | je @f |
||
674 | sub cl,[edx-1] |
||
675 | cmp cl,1 |
||
676 | jne .2 |
||
677 | add cl,[edx-1] |
||
678 | jmp .12 |
||
679 | .2: |
||
680 | add cl,[edx-1] |
||
681 | jmp .13 |
||
682 | |||
683 | @@: bts [flags],8 |
||
684 | mov eax,4 |
||
685 | call random |
||
686 | dec al |
||
687 | jz .11 |
||
688 | dec al |
||
689 | jz .12 |
||
690 | dec al |
||
691 | jz .13 |
||
692 | jmp .14 |
||
693 | .11: |
||
694 | if DEBUG |
||
695 | dbg_dec 100 |
||
696 | endf |
||
697 | cmp cl,10 |
||
698 | jge @f |
||
699 | bts [flags],8 |
||
700 | jmp .12 |
||
701 | @@: sub cl,10 |
||
702 | cmp byte [esi+ecx],2 |
||
703 | jge @f |
||
704 | mov eax,ecx |
||
705 | bts [flags],6 |
||
706 | call find_near |
||
707 | ; test bl,bl |
||
708 | ; jz .20 |
||
709 | jnc .20 |
||
710 | @@: bts [flags],8 |
||
711 | add cl,10 |
||
712 | bts [flags],8 |
||
713 | .12: |
||
714 | if DEBUG |
||
715 | dbg_dec 200 |
||
716 | endf |
||
717 | movzx eax,cl |
||
718 | push cx |
||
719 | mov ch,10 |
||
720 | div ch |
||
721 | pop cx |
||
722 | cmp ah,9 |
||
723 | jb @f |
||
724 | .121: |
||
725 | bt [flags],8 |
||
726 | jc .13 |
||
727 | bts [flags],8 |
||
728 | mov edx,tbl_ranen |
||
729 | mov cl,[edx] |
||
730 | jmp .14 |
||
731 | @@: inc cl |
||
732 | cmp byte [esi+ecx],2 |
||
733 | jge @f |
||
734 | mov eax,ecx |
||
735 | bts [flags],6 |
||
736 | call find_near |
||
737 | ; test bl,bl |
||
738 | ; jz .20 |
||
739 | jnc .20 |
||
740 | @@: dec cl |
||
741 | jmp .121 |
||
742 | |||
743 | .13: |
||
744 | if DEBUG |
||
745 | dbg_dec 300 |
||
746 | endf |
||
747 | cmp cl,90 |
||
748 | jb @f |
||
749 | .131: |
||
750 | bt [flags],8 |
||
751 | jc .14 |
||
752 | bts [flags],8 |
||
753 | mov edx,tbl_ranen |
||
754 | mov cl,[edx] |
||
755 | jmp .11 |
||
756 | @@: add cl,10 |
||
757 | cmp byte [esi+ecx],2 |
||
758 | jge @f |
||
759 | mov eax,ecx |
||
760 | bts [flags],6 |
||
761 | call find_near |
||
762 | ; test bl,bl |
||
763 | ; jz .20 |
||
764 | jnc .20 |
||
765 | @@: sub cl,10 |
||
766 | jmp .131 |
||
767 | |||
768 | .14: |
||
769 | if DEBUG |
||
770 | dbg_dec 400 |
||
771 | endf |
||
772 | movzx eax,cl |
||
773 | push cx |
||
774 | mov ch,10 |
||
775 | div ch |
||
776 | pop cx |
||
777 | cmp ah,0 |
||
778 | jne @f |
||
779 | .141: |
||
780 | bts [flags],8 |
||
781 | jmp .11;cpu;rndm |
||
782 | @@: dec cl |
||
783 | cmp byte [esi+ecx],2 |
||
784 | jge @f |
||
785 | mov eax,ecx |
||
786 | bts [flags],6 |
||
787 | call find_near |
||
788 | ; test bl,bl |
||
789 | ; jz .20 |
||
790 | jnc .20 |
||
791 | @@: inc cl |
||
792 | jmp .141 |
||
793 | |||
794 | .rndm: |
||
795 | |||
796 | mov eax,100 |
||
797 | call random |
||
798 | cmp eax,100 |
||
799 | jb @f |
||
800 | shr eax,1 |
||
801 | @@: |
||
802 | |||
803 | if use_new_logic |
||
804 | btc [flags],10 |
||
805 | jnc @f |
||
806 | btc [flags],9 |
||
807 | jnc @f |
||
808 | call check_freedom |
||
809 | endf |
||
810 | |||
811 | @@: cmp byte [esi+eax],2 |
||
812 | jb @f; .rndm |
||
813 | ;поиск свободной клеточки перед/после выбранной, |
||
814 | ;иначе random иногда входит в бесконечный цикл |
||
815 | bt ax,0 |
||
816 | jnc .r_1 |
||
817 | .r_0: |
||
818 | cmp al,0 |
||
819 | je .r_1 |
||
820 | dec al |
||
821 | |||
822 | cmp byte [esi+eax],2 |
||
823 | jb @f |
||
824 | jmp .r_0 |
||
825 | .r_1: |
||
826 | cmp al,99 |
||
827 | je .r_0 |
||
828 | inc al |
||
829 | |||
830 | cmp byte [esi+eax],2 |
||
831 | jb @f |
||
832 | jmp .r_1 |
||
833 | @@: |
||
834 | bts [flags],6 |
||
835 | call find_near |
||
836 | ; test bl,bl |
||
837 | ; jnz .cpu |
||
838 | jc .cpu;20 |
||
839 | |||
840 | .20: |
||
841 | mov bl,[esi+eax] |
||
842 | add bl,2 |
||
843 | mov ecx,esi |
||
844 | mov edi,esi |
||
845 | call if_bot_killed |
||
846 | mov [esi+eax],bl |
||
847 | ; cmp [u_kill],10 |
||
848 | ; je .m_end |
||
849 | cmp [c_kill],10 |
||
850 | je .m_end |
||
851 | cmp bl,3 |
||
852 | jge .cpu |
||
853 | |||
854 | .m_end:; mcall 12,1 |
||
855 | jmp draw_pole |
||
856 | |||
857 | if_bot_killed: |
||
858 | push ebx |
||
859 | add edi,100 |
||
860 | mov ebx,19 |
||
861 | @@: cmp al,[edi+ebx] |
||
862 | je @f |
||
863 | dec ebx |
||
864 | jnz @b |
||
865 | cmp al,[edi+ebx] |
||
866 | jne .end |
||
867 | @@: |
||
868 | cmp ebx,16 |
||
869 | jnb .end_i |
||
870 | |||
871 | @@: cmp bl,10 |
||
872 | jb .2 |
||
873 | btc bx,0 |
||
874 | mov bl, [edi+ebx] |
||
875 | cmp byte [ecx+ebx],3 |
||
876 | jne .end |
||
877 | inc byte [ecx+ebx] |
||
878 | jmp .end_i |
||
879 | |||
880 | .2: cmp bl,4 |
||
881 | jb .3 |
||
882 | add edi,4 |
||
883 | cmp bl,7 |
||
884 | jb .3 |
||
885 | add edi,3 |
||
886 | .3: movzx edx, byte [edi] |
||
887 | cmp dl,al |
||
888 | je @f |
||
889 | cmp byte [ecx+edx],3 |
||
890 | jne .end |
||
891 | @@: mov dl,[edi+1] |
||
892 | cmp dl,al |
||
893 | je @f |
||
894 | cmp byte [ecx+edx],3 |
||
895 | jne .end |
||
896 | @@: mov dl,[edi+2] |
||
897 | cmp dl,al |
||
898 | je @f |
||
899 | cmp byte [ecx+edx],3 |
||
900 | jne .end |
||
901 | |||
902 | @@: cmp bl,4 |
||
903 | jnb @f |
||
904 | mov dl,[edi+3] |
||
905 | cmp dl,al |
||
906 | je @f |
||
907 | cmp byte [ecx+edx],3 |
||
908 | jne .end |
||
909 | |||
910 | |||
911 | @@: mov dl,[edi] |
||
912 | cmp dl,al |
||
913 | je @f |
||
914 | inc byte [ecx+edx] |
||
915 | @@: mov dl,[edi+1] |
||
916 | cmp dl,al |
||
917 | je @f |
||
918 | inc byte [ecx+edx] |
||
919 | @@: mov dl,[edi+2] |
||
920 | |||
921 | cmp bl,4 |
||
922 | jnb .9;@f |
||
923 | |||
924 | ; cmp dl,al |
||
925 | ; je .end_i |
||
926 | ; inc byte [ecx+edx] |
||
927 | ; jmp .end_i |
||
928 | |||
929 | |||
930 | @@: cmp dl,al |
||
931 | je @f |
||
932 | inc byte [ecx+edx] |
||
933 | @@: mov dl,[edi+3] |
||
934 | .9: cmp dl,al |
||
935 | je .end_i |
||
936 | inc byte [ecx+edx] |
||
937 | .end_i: |
||
938 | pop ebx |
||
939 | inc ebx |
||
940 | cmp ecx,table5 |
||
941 | jne @f |
||
942 | inc [u_kill] |
||
943 | ret |
||
944 | @@: inc [c_kill] |
||
945 | ret |
||
946 | .end: pop ebx |
||
947 | ret |
||
948 | |||
949 | |||
950 | |||
951 | |||
952 | _still: |
||
953 | bt [flags],3 |
||
954 | jnc still |
||
955 | |||
956 | set_bots: |
||
957 | cmp [number_bots],10 |
||
958 | jne @f |
||
959 | ret |
||
960 | @@: xor edx,edx |
||
961 | mov ecx,10 |
||
962 | cmp [number_bots],6 |
||
963 | jb @f |
||
964 | push dword 10 |
||
965 | jmp .1 |
||
966 | @@: cmp [number_bots],3 |
||
967 | jb @f |
||
968 | push dword 9 |
||
969 | jmp .1 |
||
970 | @@: cmp [number_bots],2 |
||
971 | jb @f |
||
972 | push dword 8 |
||
973 | jmp .1 |
||
974 | @@: push dword 7 |
||
975 | .1: |
||
976 | mov eax,[esp] |
||
977 | call random |
||
978 | mov [oX],al |
||
979 | mul cl |
||
980 | mov cl,al |
||
981 | mov eax,[esp] |
||
982 | call random |
||
983 | mov [oY],al |
||
984 | add cl,al |
||
985 | |||
986 | cmp cl,100 |
||
987 | jge .1 |
||
988 | |||
989 | add esp,4 |
||
990 | mov eax,2 |
||
991 | call random |
||
992 | cmp al,1 |
||
993 | jne @f |
||
994 | bts [flags],1 |
||
995 | mov al,cl |
||
996 | jmp set_bot |
||
997 | @@: btr [flags],1 |
||
998 | mov al,cl |
||
999 | jmp set_bot |
||
1000 | |||
1001 | |||
1002 | |||
1003 | |||
1004 | |||
1005 | |||
1006 | ;процедура отлавливает "наиболее свободную" из клеток для атаки |
||
1007 | |||
1008 | if use_new_logic |
||
1009 | check_freedom: |
||
1010 | ; mov esi,table1 |
||
1011 | push ax |
||
1012 | push word 100 |
||
1013 | xor eax,eax |
||
1014 | mov ebx,0x900 |
||
1015 | |||
1016 | .1: bts [flags],6 |
||
1017 | call find_near |
||
1018 | jc .11 |
||
1019 | cmp byte [esi+eax],2 ;0 |
||
1020 | jb @f |
||
1021 | .11: inc bl |
||
1022 | |||
1023 | @@: cmp al,10 ;-10 |
||
1024 | jb @f |
||
1025 | push ax |
||
1026 | |||
1027 | sub al,10 |
||
1028 | if use_ext_logic |
||
1029 | bts [flags],6 |
||
1030 | call find_near |
||
1031 | jc .21 |
||
1032 | endf |
||
1033 | cmp byte [esi+eax],2 |
||
1034 | jb .22 |
||
1035 | .21: inc bl |
||
1036 | .22: pop ax |
||
1037 | |||
1038 | @@: cmp al,11 |
||
1039 | jb @f |
||
1040 | push ax |
||
1041 | |||
1042 | xor edx,edx |
||
1043 | mov ecx,10 |
||
1044 | push ax |
||
1045 | div cx |
||
1046 | pop ax |
||
1047 | |||
1048 | cmp dx,0 |
||
1049 | je .32 |
||
1050 | |||
1051 | sub al,11 |
||
1052 | if use_ext_logic |
||
1053 | bts [flags],6 |
||
1054 | call find_near |
||
1055 | jc .31 |
||
1056 | endf |
||
1057 | cmp byte [esi+eax],2 ;-11 |
||
1058 | jb .32 |
||
1059 | .31: inc bl |
||
1060 | .32: pop ax |
||
1061 | |||
1062 | @@: cmp al,9 |
||
1063 | jb @f |
||
1064 | push ax |
||
1065 | |||
1066 | xor edx,edx |
||
1067 | mov ecx,10 |
||
1068 | push ax |
||
1069 | div cx |
||
1070 | pop ax |
||
1071 | cmp dx,9 |
||
1072 | je .42 |
||
1073 | |||
1074 | sub eax,9 |
||
1075 | if use_ext_logic |
||
1076 | bts [flags],6 |
||
1077 | call find_near |
||
1078 | jc .41 |
||
1079 | endf |
||
1080 | cmp byte [esi+eax],2 ;-9 |
||
1081 | jb .42 |
||
1082 | .41: inc bl |
||
1083 | .42: pop ax |
||
1084 | |||
1085 | @@: cmp al,1 |
||
1086 | jb @f |
||
1087 | push ax |
||
1088 | |||
1089 | xor edx,edx |
||
1090 | mov ecx,10 |
||
1091 | push ax |
||
1092 | div cx |
||
1093 | pop ax |
||
1094 | cmp dx,0 |
||
1095 | je .52 |
||
1096 | |||
1097 | dec al |
||
1098 | if use_ext_logic |
||
1099 | bts [flags],6 |
||
1100 | call find_near |
||
1101 | jc .51 |
||
1102 | endf |
||
1103 | cmp byte [esi+eax],2 ;-1 |
||
1104 | jb .52 |
||
1105 | .51: inc bl |
||
1106 | .52: pop ax |
||
1107 | |||
1108 | @@: cmp al,99 |
||
1109 | jg @f |
||
1110 | push ax |
||
1111 | |||
1112 | xor edx,edx |
||
1113 | mov ecx,10 |
||
1114 | push ax |
||
1115 | div cx |
||
1116 | pop ax |
||
1117 | cmp dx,9 |
||
1118 | je .62 |
||
1119 | |||
1120 | inc al |
||
1121 | if use_ext_logic |
||
1122 | bts [flags],6 |
||
1123 | call find_near |
||
1124 | jc .61 |
||
1125 | endf |
||
1126 | cmp byte [esi+eax],2 ;+1 |
||
1127 | jb .62 |
||
1128 | .61: inc bl |
||
1129 | .62: pop ax |
||
1130 | |||
1131 | @@: cmp al,90 |
||
1132 | jge @f |
||
1133 | push ax |
||
1134 | add al,10 |
||
1135 | if use_ext_logic |
||
1136 | bts [flags],6 |
||
1137 | call find_near |
||
1138 | jc .71 |
||
1139 | endf |
||
1140 | cmp byte [esi+eax],2 ;+10 |
||
1141 | jb .72 |
||
1142 | .71: inc bl |
||
1143 | .72: pop ax |
||
1144 | |||
1145 | @@: cmp al,91 |
||
1146 | jge @f |
||
1147 | push ax |
||
1148 | xor edx,edx |
||
1149 | mov ecx,10 |
||
1150 | push ax |
||
1151 | div cx |
||
1152 | pop ax |
||
1153 | cmp dx,0 |
||
1154 | je .82 |
||
1155 | |||
1156 | add al,9 |
||
1157 | if use_ext_logic |
||
1158 | bts [flags],6 |
||
1159 | call find_near |
||
1160 | jc .81 |
||
1161 | endf |
||
1162 | cmp byte [esi+eax],2 ;+9 |
||
1163 | jb .82 |
||
1164 | .81: inc bl |
||
1165 | .82: pop ax |
||
1166 | |||
1167 | @@: cmp al,89 |
||
1168 | jge @f |
||
1169 | push ax |
||
1170 | |||
1171 | xor edx,edx |
||
1172 | mov ecx,10 |
||
1173 | push ax |
||
1174 | div cx |
||
1175 | pop ax |
||
1176 | |||
1177 | cmp dx,9 |
||
1178 | je .92 |
||
1179 | |||
1180 | add al,11 |
||
1181 | if use_ext_logic |
||
1182 | bts [flags],6 |
||
1183 | call find_near |
||
1184 | jc .91 |
||
1185 | endf |
||
1186 | cmp byte [esi+eax],2 ;+11 |
||
1187 | jb .92 |
||
1188 | .91: inc bl |
||
1189 | .92: pop ax |
||
1190 | |||
1191 | @@: bt [flags],7 |
||
1192 | jc .ret |
||
1193 | cmp byte [esi+eax],1 |
||
1194 | jg @f |
||
1195 | cmp bl,bh |
||
1196 | jg @f |
||
1197 | |||
1198 | ; shl ebx,8 |
||
1199 | bts [flags],6 |
||
1200 | call find_near |
||
1201 | ; xchg cl,bl |
||
1202 | ; shr ebx,8 |
||
1203 | ; test cl,cl |
||
1204 | ; jnz @f |
||
1205 | jc @f |
||
1206 | |||
1207 | shl bx,8 |
||
1208 | pop dx ;dh - ближайшая слева свободнейшая клетка, dl - справа |
||
1209 | pop cx ;cl - рандомно выбранная клетка |
||
1210 | ; cmp al,dl |
||
1211 | ; jg .5 |
||
1212 | ; cmp al,cl |
||
1213 | ; jb .4 |
||
1214 | ; mov dl,al |
||
1215 | ; jmp .5 |
||
1216 | ;.4: cmp al,dh |
||
1217 | ; jb .5 |
||
1218 | ; mov dh,al |
||
1219 | cmp al,dh |
||
1220 | jb .5 |
||
1221 | cmp al,cl |
||
1222 | jg .4 |
||
1223 | mov dh,al |
||
1224 | jmp .5 |
||
1225 | .4: cmp al,dl |
||
1226 | jg .5 |
||
1227 | mov dl,al |
||
1228 | .5: push cx dx |
||
1229 | @@: xor bl,bl |
||
1230 | inc al |
||
1231 | cmp al,100 |
||
1232 | jb .1 |
||
1233 | pop dx ax |
||
1234 | |||
1235 | if DEBUG |
||
1236 | dbg_dec eax |
||
1237 | dbg_dec edx |
||
1238 | endf |
||
1239 | cmp dl,100 |
||
1240 | jb @f |
||
1241 | mov al,dh |
||
1242 | ret |
||
1243 | @@: mov al,dh |
||
1244 | push dx |
||
1245 | bts [flags],7 |
||
1246 | call .1 |
||
1247 | shl bx,8 |
||
1248 | mov al,[esp] |
||
1249 | call .1 |
||
1250 | pop dx |
||
1251 | btr [flags],7 |
||
1252 | mov al,dl |
||
1253 | test bl,bh |
||
1254 | jbe .ret |
||
1255 | mov al,dh |
||
1256 | .ret: |
||
1257 | ret |
||
1258 | |||
1259 | endf |
||
1260 | |||
1261 | |||
1262 | |||
1263 | |||
1264 | |||
1265 | |||
1266 | |||
1267 | align 4 |
||
1268 | rsx1 dw ?;0x4321 |
||
1269 | rsx2 dw ?;0x1234 |
||
1270 | random: ; из ASCL |
||
1271 | push ecx edx esi |
||
1272 | mov cx,ax |
||
1273 | mov ax,[rsx1] |
||
1274 | mov bx,[rsx2] |
||
1275 | mov si,ax |
||
1276 | mov di,bx |
||
1277 | mov dl,ah |
||
1278 | mov ah,al |
||
1279 | mov al,bh |
||
1280 | mov bh,bl |
||
1281 | xor bl,bl |
||
1282 | rcr dl,1 |
||
1283 | rcr ax,1 |
||
1284 | rcr bx,1 |
||
1285 | add bx,di |
||
1286 | adc ax,si |
||
1287 | add bx,0x62e9 |
||
1288 | adc ax,0x3619 |
||
1289 | mov [rsx1],bx |
||
1290 | mov [rsx2],ax |
||
1291 | xor dx,dx |
||
1292 | cmp ax,0 |
||
1293 | je nodiv |
||
1294 | cmp cx,0 |
||
1295 | je nodiv |
||
1296 | div cx |
||
1297 | nodiv: |
||
1298 | mov ax,dx |
||
1299 | pop esi edx ecx |
||
1300 | and eax,0000ffffh |
||
1301 | ret |
||
1302 | |||
1303 | |||
1304 | if DEBUG |
||
1305 | SysMsgBoardNum: ;warning: destroys eax,ebx,ecx,esi |
||
1306 | mov ebx,esp |
||
1307 | mov ecx,8 |
||
1308 | mov esi,(number_to_out+1) |
||
1309 | .1: |
||
1310 | mov eax,ebx |
||
1311 | and eax,0xF |
||
1312 | cmp al,10 |
||
1313 | sbb al,69h |
||
1314 | das |
||
1315 | mov [esi+ecx],al |
||
1316 | shr ebx,4 |
||
1317 | loop .1 |
||
1318 | dec esi |
||
1319 | mcall 71,1,number_to_out |
||
1320 | ret |
||
1321 | |||
1322 | number_to_out db '0x00000000',13,10,0 |
||
1323 | endf |
||
1324 | |||
1325 | |||
1326 | |||
1327 | |||
1328 | text_cpu db 'CPU',0 |
||
1329 | text_user db 'USER',0 |
||
1330 | if lang eq ru |
||
1331 | title db 'Морской бой 0.4',0 |
||
1332 | but_auto db 'Расставить',0 |
||
1333 | but_new db 'Новая',0 |
||
1334 | text_win db 'Выиграл!',0 |
||
1335 | else |
||
1336 | title db 'Sea war 0.4',0 |
||
1337 | but_auto db 'Auto fill',0 |
||
1338 | but_new db 'New',0 |
||
1339 | text_win db 'Won!',0 |
||
1340 | endf |
||
1341 | |||
1342 | I_END: |
||
1343 | ; t1,t3,t5: 0-непомеченная клеточка, 1-занятая, 2-"промах", 3-"горит", 4-"потоплен" |
||
1344 | ; t2,t4: таблицы расположения элементов, 1 элемент по 4 клетки, 2x3, 3x2, 4x1 |
||
1345 | align 16 |
||
1346 | table1 rb 100 ;левое поле |
||
1347 | table3 rb 20 |
||
1348 | table2 rb 100 ;правое |
||
1349 | table4 rb 20 |
||
1350 | table5 rb 100 |
||
1351 | u_kill rb 1 |
||
1352 | c_kill rb 1 |
||
1353 | p_pov rb 1 |
||
1354 | smeshenie rb 1 |
||
1355 | number_bots rb 1 |
||
1356 | oX rb 1 |
||
1357 | oY rb 1 |
||
1358 | tbl_ranen rb 4 |
||
1359 | |||
1360 | flags rw 1 |
||
1361 | flags2 rw 1 |
||
1362 | ;бит 0: 0/1 - заполнение таблиц /игра |
||
1363 | ;1: нажата левая кнопка мыши (вертикаль) /правая (горизонталь) |
||
1364 | ;2: заполняется левое поле /правое |
||
1365 | ;3: ручное заполнение /автозаполнение |
||
1366 | ;4: в .three - потопленный корабль |
||
1367 | ;5: игра окончена |
||
1368 | ;6: в second_pole - вызов find_near |
||
1369 | ;7: в check_freedom |
||
1370 | ;8: зарезервировано |
||
1371 | ;9: зарезервировано |
||
1372 | ;10: зарезервировано |