Subversion Repositories Kolibri OS

Rev

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: зарезервировано