Subversion Repositories Kolibri OS

Rev

Rev 2020 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2079 mario79 1
;*************************************************************
2
;*GAME TANKS CRETED BY ANDREY IGNATYEV AKA ANDREW_PROGRAMMER *
3
;*********************/8/2005*********************************
4
; version:	1.15
5
; last update:  19/08/2011
6
; changed by:   Marat Zakiyanov aka Mario79, aka Mario
7
; changes:      1) Checking for "rolled up" window
8
;               2) Code optimization
9
;               3) Clearing source
10
;---------------------------------------------------------------------
11
;Lipatov Kirill aka Leency /07/2011
2018 leency 12
;dunkaist /07/2011
2079 mario79 13
;v1.1
14
;----------------------------------------------------------
15
	use32
16
	org	0x0
17
	db	'MENUET01'
18
	dd	0x1
19
	dd	START
20
	dd	I_END
21
	dd	0x4000+640*400*3+50*20*20*3+512+640+1+24*20*20*3+1
22
	dd	0x4000
23
	dd	0x0
24
	dd	0x0
25
;----------------------------------------------------------
31 halyavin 26
include 'lang.inc'
1933 yogev_ezra 27
include '../../../macros.inc'
2079 mario79 28
;----------------------------------------------------------
31 halyavin 29
START:
2079 mario79 30
	mcall	40,111b
31 halyavin 31
;----------------------------------------------------------
32
;---------load all sprites from arrays to memory-----------
33
;----------------------------------------------------------
2079 mario79 34
	and	[number_sprite],0
35
	xor	eax,eax
31 halyavin 36
nextfile:
2079 mario79 37
	mov	ebx,[spisok+4*eax]
38
	mov	ecx,50
39
	mov	esi,ebx
40
	add	esi,2
41
	mov	edi,0x4000+(640*400*3)+(50*20*20*3)+10
42
	rep	movsb	;copy palitra to memory
43
	mov	esi,ebx
44
	add	esi,52
45
	xor	ecx,ecx
46
	mov	cl,byte [ebx]
47
	mov	edi,0x4000+(640*400*3)+(50*20*20*3)+512
48
	push	eax
49
	call	unpakin
50
	pop	eax
51
	mov	ecx,20*20
52
	mov	esi,0x4000+(640*400*3)+(50*20*20*3)+512
53
	mov	edi,[number_sprite]
54
	imul	edi,3*20*20
55
	add	edi,0x4000+(640*400*3)
56
unp:
57
	xor	ebx,ebx
58
	mov	bl,byte[esi]
59
	lea	ebx,[ebx+ebx*2]
60
	add	ebx,0x4000+(640*400*3)+(50*20*20*3)+10
61
	mov	edx,[ebx]
62
	mov	[edi],edx
63
	add	esi,1
64
	add	edi,3
65
	dec	ecx
66
	jnz	unp
67
	inc	[number_sprite]
68
	inc	eax
69
	cmp	[number_sprite],26	;total number of pictures equal 26
70
	jne	nextfile
31 halyavin 71
;----------------------------------------------------------
72
;------rotate sprites of tanks to pi/2---------------------
73
;----------------------------------------------------------
2079 mario79 74
	mov	[sp_pos],0x4000+(640*400*3)+18*20*20*3
75
	and	[num_blocks],0
31 halyavin 76
next_block_rotate:
2079 mario79 77
	mov	[number_sprite],0
31 halyavin 78
next_sprite_rotate:
2079 mario79 79
	mov	[x],19
80
	and	[y],0
31 halyavin 81
rotate_90:
2079 mario79 82
	mov	ebx,[number_sprite]
83
	mov	esi,[y]
84
	imul	esi,60
85
	imul	ebx,1200
86
	add	esi,ebx	;esi=number_sprite*1200+y*60
87
	add	esi,dword [sp_pos]
88
	mov	edi,0x4000+(640*400*3)+(50*20*20*3)
89
	mov	ecx,15
90
	rep	movsd
91
	mov	edi,[number_sprite]
92
	imul	edi,1200
93
	add	edi,dword [sp_pos]
94
	add	edi,8*20*20*3
95
	mov	ebx,[x]
96
	lea	ebx,[ebx+2*ebx]
97
	add	edi,ebx
98
	mov	esi,0x4000+(640*400*3)+(50*20*20*3)
99
	mov	ecx,20*3
31 halyavin 100
vertical:
2079 mario79 101
	xor	eax,eax
102
	mov	al,byte[esi+2]
103
	mov	[edi+2],al
104
	xor	eax,eax
105
	mov	ax,word[esi]
106
	mov	[edi],ax
107
	add	edi,60
108
	add	esi,3
109
	sub	ecx,3
110
	jnz	vertical
111
	dec	[x]
112
	inc	[y]
113
	cmp	[x],-1
114
	jne	rotate_90
115
	inc	[number_sprite]
116
	cmp	[number_sprite],9
117
	jne	next_sprite_rotate
118
	add	[sp_pos],8*20*20*3
119
	inc	[num_blocks]
120
	cmp	[num_blocks],3
121
	jne	next_block_rotate
31 halyavin 122
;---------------------------------------------------------
123
restart_level:
2079 mario79 124
	call	drawwin
31 halyavin 125
;Start game(demo scen)
2079 mario79 126
	mov	[y],18
31 halyavin 127
@1:
2079 mario79 128
	mov	[x],30
129
@2:
130
	mov	esi,[x]
131
	mov	edi,[y]
132
	imul	esi,20*3
133
	imul	edi,20*(640*3)
134
	add	edi,esi
135
	add	edi,0x4000
136
	mov	esi,0x4000+(640*400*3)+1200
137
	mov	[counter],20
138
	mov	eax,esi
139
	mov	ebx,edi
140
@3:
141
	mov	esi,eax
142
	mov	edi,ebx
143
	mov	ecx,15
144
	rep	movsd
145
	add	eax,20*3
146
	add	ebx,640*3
147
	dec	[counter]
148
	jnz	@3
149
	dec	[x]
150
	jnz	@2
151
	dec	[y]
152
	jnz	@1
31 halyavin 153
;draw script ******TANKS*******
2079 mario79 154
	mov	eax,54
31 halyavin 155
@11:
2079 mario79 156
	mov	esi,5
157
	mov	edi,80
158
	xor	ebx,ebx
159
	xor	edx,edx
160
	mov	bl,byte[TANKS_script+2*eax]	;dx
161
	mov	dl,byte[TANKS_script+2*eax+1]	;dy
162
	imul	ebx,20
163
	imul	edx,20
164
	add	esi,ebx
165
	add	edi,edx
166
	lea	esi,[esi+2*esi]
167
	lea	edi,[edi+2*edi]
168
	imul	edi,640
169
	add	edi,esi
170
	add	edi,0x4000
171
	mov	esi,0x4000+(640*400*3)
172
	mov	ebx,esi
173
	mov	edx,edi
174
	mov	[counter],20
175
@22:
176
	mov	esi,ebx
177
	mov	edi,edx
178
	mov	ecx,15
179
	rep	movsd
180
	add	ebx,20*3
181
	add	edx,640*3
182
	dec	[counter]
183
	jnz	@22
184
	dec	eax
185
	cmp	eax,-1
186
	jne	@11
187
	mcall	7,0x4000,<640,400>,<0,20>
188
	call	menu
31 halyavin 189
;----------------------------
190
new_level:
2079 mario79 191
	call	paint_area	;drawwin
192
	mov	[SpriteInfo+72+8],dword 100	;Xo
193
	mov	[SpriteInfo+72+36],dword 100	;Yo
194
	mov	edx,[number_level]
195
	call	load_level
31 halyavin 196
;--------------------------
2079 mario79 197
	and	[strike_action],0
198
	and	[bazas],0
199
	and	[y],0
200
	mov	eax,8
31 halyavin 201
next_y:
2079 mario79 202
	and	[x],0
203
next_x:
204
	mov	esi,[y]
205
	shl	esi,5
206
	add	esi,[x]
207
	add	esi,0x4000+(640*400*3)+(50*20*20*3)+512
208
	xor	ebx,ebx
209
	mov	bl,byte[esi]
210
	cmp	bl,7
211
	jne	no_baza
212
	mov	ecx,[x]
213
	mov	edx,[y]
214
	inc	ecx
215
	inc	[bazas]
216
	add	eax,4
217
	imul	ecx,20
218
	imul	edx,20
219
	mov	[SpriteInfo+9*eax+0],dword 3
220
	mov	[SpriteInfo+9*eax+4],dword 1
221
	mov	[SpriteInfo+9*eax+8],dword ecx
222
	mov	[SpriteInfo+9*eax+12],dword edx
223
	mov	[SpriteInfo+9*eax+16],dword 5
224
	mov	[SpriteInfo+9*eax+28],dword -5
225
	mov	edx,eax
226
	shr	edx,2
227
	mov	[LifesTanks+edx],byte 3	;three lifes
228
	mov	[PulyTanks+edx],byte 1	;can draw animation of "puly"
229
no_baza:
230
	inc	[x]
231
	cmp	[x],32
232
	jne	next_x
233
	inc	[y]
234
	cmp	[y],20
235
	jne	next_y
236
	mov	[LifesPlayer],3*4
237
	and	[score],0
31 halyavin 238
;----------------------------------------------------------
239
;--------------------main loop-----------------------------
240
;----------------------------------------------------------
241
maincycle:
2079 mario79 242
;save fon
243
	mov	eax,23*4
244
SaveFonForSprites:
245
	mov	ebx,[SpriteInfo+9*eax+4]
246
	test	ebx,ebx	;if ebx<>0 then can save
247
	jz	NoSaveFon
248
	mov	esi,[SpriteInfo+9*eax+8]	;cordinat x
249
	mov	edi,[SpriteInfo+9*eax+12]	;cordinat y
250
	mov	edx,eax
251
	shr	edx,2
252
	call	SaveFon
253
NoSaveFon:
254
	sub	eax,4
255
	cmp	eax,-4
256
	jne	SaveFonForSprites
257
;put sprites
258
	mov	eax,23*4
259
PutSprites:
260
	mov	ebx,[SpriteInfo+9*eax+4]
261
	test	ebx,ebx
262
	jz	NoPutSprite
263
	and	ebx,10000b
264
	test	ebx,ebx	;move to transparent shablon?
265
	jnz	NoPutSprite
266
	mov	esi,[SpriteInfo+9*eax+8]	;x
267
	mov	edi,[SpriteInfo+9*eax+12]	;y
268
	mov	edx,[SpriteInfo+9*eax+0]	;number sprite in sprites table
269
	shl	edx,2
270
	add	edx,[SpriteInfo+9*eax+24]	;edx=4*NumSprites+phas
271
	call	PutSprite
272
NoPutSprite:
273
	sub	eax,4
274
	cmp	eax,-4
275
	jne	PutSprites
276
;put image
277
	call	clock
278
	mov	ebx,[time]
279
	sub	ebx,[time_frame_old]
280
	cmp	ebx,5
281
	jl	NoPutScreen
282
	mov	ebx,[time]
283
	mov	[time_frame_old],ebx
284
	mcall	7,0x4000,<640,400>,<0,20>
285
NoPutScreen:
286
;put fon
287
	mov	eax,23*4
288
PutFonForSprites:
289
	mov	ebx,[SpriteInfo+9*eax+4]
290
	test	ebx,ebx
291
	jz	NoPutFon
292
	mov	esi,[SpriteInfo+9*eax+8]
293
	mov	edi,[SpriteInfo+9*eax+12]
294
	mov	edx,eax
295
	shr	edx,2
296
	call	PutFon
297
NoPutFon:
298
	sub	eax,4
299
	cmp	eax,-4
300
	jne	PutFonForSprites
301
;change phas(if need)
302
	mov	eax,23*4
303
ChangePhasSprites:
304
	push	eax
305
	call	clock
306
	pop	eax
307
	mov	ebx,[SpriteInfo+9*eax+16]	;time of animation
308
	mov	ecx,[SpriteInfo+9*eax+20]	;time of last frame
309
	mov	edx,[time]
310
	sub	edx,ecx
311
	cmp	edx,ebx
312
	jl	no_change_phas
313
	mov	ebx,[time]
314
	mov	[SpriteInfo+9*eax+20],ebx	;save new time
315
;------------------------------
316
	mov	esi,[SpriteInfo+9*eax+8]
317
	mov	edi,[SpriteInfo+9*eax+12]
318
	mov	ecx,[SpriteInfo+9*eax+28]
319
	mov	edx,[SpriteInfo+9*eax+32]
320
	add	esi,ecx	;x=x+dx
321
	add	edi,edx	;y=y+dy
322
	mov	[SpriteInfo+9*eax+8],dword esi
323
	mov	[SpriteInfo+9*eax+12],dword edi
324
;-------------------------------
325
	mov	edx,[SpriteInfo+9*eax+24]	;phas
326
	add	edx,1
327
	cmp	edx,4
328
	jne	no_limit_phas
329
	xor	edx,edx
330
	mov	[SpriteInfo+9*eax+24],dword edx
331
	mov	[SpriteInfo+9*eax+4],dword edx
332
	jmp	no_change_phas
333
no_limit_phas:
334
	mov	[SpriteInfo+9*eax+24],dword edx
335
no_change_phas:
336
	sub	eax,4
337
	cmp	eax,-4
338
	jne	ChangePhasSprites
339
;-------------------------------------------------
340
;----------------keys-----------------------------
341
;-------------------------------------------------
342
	call	pause_cicle
343
	mcall	23,3
344
	cmp	eax,1
345
	je	.redraw
346
	cmp	eax,2
347
	je	.key
348
	cmp	eax,3
349
	je	.button
350
	jmp	action
2018 leency 351
.button:
2079 mario79 352
	mcall	-1
2018 leency 353
.redraw:
2079 mario79 354
	call	drawwin
355
	jmp	action
2018 leency 356
.key:
2079 mario79 357
keypressed:
358
	cmp	eax,2
359
	jne	action
360
	and	[_dx],0
361
	and	[_dy],0
362
	mcall	2
363
	shr	eax,8
364
;---------
365
	cmp	eax,32
366
	jne	key2
367
	cmp	[strike_action],0
368
	jne	action
369
	mov	[SpriteInfo+36+4],dword 1	;can draw sprite "puly"
370
	mov	[strike_action],1		;sprite	is active
371
	mov	eax,[SpriteInfo+72+8]
372
	mov	ebx,[SpriteInfo+72+12]
373
	mov	ecx,[SpriteInfo+72+28]
374
	mov	edx,[SpriteInfo+72+32]
375
	add	eax,ecx
376
	add	ebx,edx
377
	mov	[SpriteInfo+36+8],dword eax
378
	mov	[SpriteInfo+36+12],dword ebx
379
	jmp	action
380
key2:
381
	cmp	eax,176
382
	jne	key3
383
	mov	[SpriteInfo+8*9+0],dword 8
384
	mov	[SpriteInfo+8*9+4],dword 1
385
	mov	[SpriteInfo+8*9+28],dword -5
386
	mov	[SpriteInfo+8*9+32],dword 0
387
	mov	[_dx],0
388
	mov	[_dy],10
389
	cmp	[strike_action],0
390
	jne	action
391
	mov	[SpriteInfo+36+28],dword -5
392
	mov	[SpriteInfo+36+32],dword 0
393
	jmp	action
394
key3:
395
	cmp	eax,179
396
	jne	key4
397
	mov	[SpriteInfo+8*9+0],dword 4
398
	mov	[SpriteInfo+8*9+4],dword 1
399
	mov	[SpriteInfo+8*9+28],dword 5
400
	mov	[SpriteInfo+8*9+32],dword 0
401
	mov	[_dx],15
402
	mov	[_dy],10
403
	cmp	[strike_action],0
404
	jne	action
405
	mov	[SpriteInfo+36+28],dword 5
406
	mov	[SpriteInfo+36+32],dword 0
407
	jmp	action
408
key4:
409
	cmp	eax,178
410
	jne	key5
411
	mov	[SpriteInfo+8*9+0],dword 2
412
	mov	[SpriteInfo+8*9+4],dword 1
413
	mov	[SpriteInfo+8*9+28],dword 0
414
	mov	[SpriteInfo+8*9+32],dword -5
415
	mov	[_dx],10
416
	mov	[_dy],1
417
	cmp	[strike_action],0
418
	jne	action
419
	mov	[SpriteInfo+36+28],dword 0
420
	mov	[SpriteInfo+36+32],dword -5
421
	jmp	action
422
key5:
423
	cmp	eax,177
424
	jne	key6
425
	mov	[SpriteInfo+8*9+0],dword 6
426
	mov	[SpriteInfo+8*9+4],dword 1
427
	mov	[SpriteInfo+8*9+28],dword 0
428
	mov	[SpriteInfo+8*9+32],dword 5
429
	mov	[_dy],15
430
	mov	[_dx],10
431
	cmp	[strike_action],0
432
	jne	action
433
	mov	[SpriteInfo+36+28],dword 0
434
	mov	[SpriteInfo+36+32],dword 5
435
	jmp	action
436
key6:
437
	cmp	eax,27
438
	jne	action
439
	mcall	-1
31 halyavin 440
action:
2079 mario79 441
	mov	[SpriteInfo+72+4],dword 1
442
	mov	[SpriteInfo+72+16],dword 5	;usal speed of tank
443
	mov	esi,[SpriteInfo+8*9+8]		;cordinat x of sprite
444
	mov	edi,[SpriteInfo+8*9+12]		;cordinat y of sprite
445
	mov	ecx,[SpriteInfo+72+28]
446
	mov	edx,[SpriteInfo+72+32]
447
	add	ecx,[_dx]
448
	add	edx,[_dy]
449
	add	esi,ecx	;x=x+_dx+dx
450
	add	edi,edx	;y=y+_dy+dy
451
	call	map_x_y
452
	cmp	ecx,6
453
	jne	no_woter
454
	mov	[SpriteInfo+72+16],dword 7	;in water tank slow move
455
no_woter:
456
	cmp	ecx,4
457
	jne	no_palma
458
	mov	[SpriteInfo+72+4],dword 10000b	;if bit 4 than transparent sprite
459
no_palma:
460
	cmp	ecx,8
461
	jne	no_derevo
462
	mov	[SpriteInfo+72+4],dword 10000b
463
no_derevo:
464
	test	edx,edx
465
	jnz	ani
466
	mov	[SpriteInfo+8*9+28],dword 0
467
	mov	[SpriteInfo+8*9+32],dword 0
468
;-------------------------------------------------
469
ani:
470
	mov	eax,[strike_action]
471
	test	eax,eax
472
	jz	no_anim_strike
473
	mov	esi,[SpriteInfo+36+8]
474
	mov	edi,[SpriteInfo+36+12]
475
	mov	ecx,[SpriteInfo+36+28]
476
	mov	edx,[SpriteInfo+36+32]
477
	add	esi,ecx
478
	add	edi,edx
479
	call	map_x_y
480
	cmp	cl,0
481
	jne	no_stena
482
	mov	[ebx],byte 2	;trava
483
	jmp	bum
484
no_stena:
485
	cmp	cl,1
486
	jne	no_brony
487
	jmp	bum
488
no_brony:
489
	cmp	cl,7
490
	jne	anim_action_puly
491
	sub	[bazas],1
492
	mov	[ebx],byte 2	;trava
493
bum:
494
	mov	esi,[SpriteInfo+36+8]
495
	mov	edi,[SpriteInfo+36+12]
496
	mov	[SpriteInfo+4],dword 1
497
	mov	[SpriteInfo+8],dword esi
498
	mov	[SpriteInfo+12],dword edi
499
	mov	[SpriteInfo+36+4],dword 0
500
	mov	[end_bum],1
501
	jmp	no_anim_strike
502
anim_action_puly:
503
	mov	[SpriteInfo+36+4],dword 1
504
no_anim_strike:
505
;-------------------------------------------------
506
;проверяем попала ли пуля в противников
507
	mov	esi,[SpriteInfo+4*9+8]
508
	mov	edi,[SpriteInfo+4*9+12]
509
	mov	[x],esi	;координата x пули
510
	mov	[y],edi	;координата y пули
511
	mov	eax,3*4
512
bum_tank:
513
	mov	ebx,eax
514
	shr	ebx,2
515
	xor	ecx,ecx
516
	mov	cl,byte [LifesTanks+ebx]
517
	cmp	ecx,0
518
	jz	no_strike
519
	mov	esi,[SpriteInfo+9*eax+8]	;x
520
	mov	edi,[SpriteInfo+9*eax+12]	;y
521
	sub	esi,[x]
522
	sub	edi,[y]
523
	cmp	esi,5
524
	ja	no_strike
525
	cmp	edi,5
526
	ja	no_strike
527
	add	[score],5
528
	cmp	[score],20
529
	jl	no_bonus
530
	add	[LifesPlayer],4
531
	and	[score],0
532
no_bonus:
533
	dec	ecx;,1
534
	mov	[LifesTanks+ebx],cl	;life=life-1
535
	mov	esi,[x]
536
	mov	edi,[y]
537
	mov	[SpriteInfo+4],dword 1
538
	mov	[SpriteInfo+8],dword esi
539
	mov	[SpriteInfo+12],dword edi
540
	mov	[SpriteInfo+36+4],dword 0
541
	mov	[end_bum],1
542
no_strike:
543
	add	eax,4
544
	cmp	eax,10*4
545
	jne	bum_tank
546
;-------------------------------------------------
547
	xor	eax,eax
548
	mov	al,[end_bum]
549
	test	eax,eax
550
	jz	no_end_strike
551
	mov	eax,[SpriteInfo+24]
552
	cmp	eax,3
553
	jne	no_end_strike
554
	and	[strike_action],0
555
	and	[end_bum],0
556
	mov	edx,[number_level]
557
	mov	ecx,15
558
	call	load_level
559
no_end_strike:
560
;----------------------------
561
;проверяем,попали ли противники	в игрока
562
	mov	eax,3*4
563
	mov	esi,[SpriteInfo+72+8]
564
	mov	edi,[SpriteInfo+72+12]
565
	mov	[x],esi
566
	mov	[y],edi
567
strike_to_player:
568
	mov	ebx,eax
569
	add	ebx,28
570
	mov	esi,[SpriteInfo+9*ebx+8]
571
	mov	edi,[SpriteInfo+9*ebx+12]
572
	sub	esi,[x]
573
	sub	edi,[y]
574
	cmp	esi,5
575
	ja	no_strike_to_player
576
	cmp	edi,5
577
	ja	no_strike_to_player
578
	mov	esi,[x]
579
	mov	edi,[y]
580
	mov	[SpriteInfo+9*ebx+4],dword 0
581
	add	ebx,28
582
	mov	[SpriteInfo+9*ebx+4],dword 1
583
	mov	[SpriteInfo+9*ebx+8],dword esi
584
	mov	[SpriteInfo+9*ebx+12],dword edi
585
	sub	[LifesPlayer],1
586
	cmp	[LifesPlayer],0
587
	jne	no_game_over
588
	call	end_game
589
	jmp	restart_level
590
no_game_over:
591
no_strike_to_player:
592
	add	eax,4
593
	cmp	eax,10*4
594
	jne	strike_to_player
595
;----------------------------
596
	xor	eax,eax
597
	mov	al,[bazas]
598
	test	eax,eax
599
	jnz	no_end_level
600
	call	you_won
601
	inc	[number_level]
602
	cmp	[number_level],25
603
	jne	no_end_game
604
	mov	eax,-1
605
	mcall
606
no_end_game:
607
	jmp	new_level
608
no_end_level:
609
;-------------------------------------------------
610
;------------ logic of tanks----------------------
611
;-------------------------------------------------
612
	mov	eax,12
613
next_bad_tank:
614
	mov	ebx,eax
615
	shr	ebx,2
616
	xor	ecx,ecx
617
	mov	cl,byte[LifesTanks+ebx]
618
	test	ecx,ecx
619
	jz	no_action_bad_tank
620
	mov	ebx,[SpriteInfo+9*eax+4]
621
	test	ebx,ebx
622
	jnz	no_action_bad_tank
623
;---------------------
624
	mov	esi,[SpriteInfo+9*eax+8]
625
	mov	edi,[SpriteInfo+9*eax+12]
626
	mov	[x],esi
627
	mov	[y],edi
628
	mov	ecx,[SpriteInfo+9*eax+28]
629
	mov	edx,[SpriteInfo+9*eax+32]
630
;смотрим что впереди танка-противника
631
	cmp	ecx,0
632
	ja	more_null_x
633
	lea	ecx,[ecx+2*ecx]
634
	jmp	test_y
635
more_null_x:
636
	shl	ecx,2
637
	add	ecx,15
638
test_y:
639
	cmp	edx,0
640
	ja	more_null_y
641
	lea	edx,[edx+2*edx]
642
	jmp	add_numbers
643
more_null_y:
644
	shl	edx,2
645
	add	edx,15
646
add_numbers:
647
;--------------------
648
	add	esi,ecx
649
	add	edi,edx
650
	call	map_x_y
651
	cmp	ecx,4
652
	jne	no_palma_p
653
	mov	[SpriteInfo+9*eax+4],dword 10000b
654
no_palma_p:
655
	cmp	ecx,8
656
	jne	no_derevo_p
657
	mov	[SpriteInfo+9*eax+4],dword 10000b
658
	no_derevo_p:
659
;если	на пути	танка препятствие,то надо изменить
660
;направление движения
661
	test	edx,edx
662
	jnz	lab1
663
;проверяем - не попал ли танк в тупик(3	напрвления заняты)
664
	and	[tupik],0
665
	mov	esi,[x]
666
	mov	edi,[y]
667
	add	esi,(20+15)
668
	add	edi,10
669
	call	map_x_y
670
	test	edx,edx
671
	jnz	direct1
672
	inc	[tupik]
673
direct1:
674
	mov	esi,[x]
675
	mov	edi,[y]
676
	add	esi,10
677
	add	edi,(20+15)
678
	call	map_x_y
679
	test	edx,edx
680
	jnz	direct2
681
	inc	[tupik]
682
direct2:
683
	mov	esi,[x]
684
	mov	edi,[y]
685
	add	esi,-15
686
	add	edi,10
687
	call	map_x_y
688
	test	edx,edx
689
	jnz	direct3
690
	inc	[tupik]
691
direct3:
692
	mov	esi,[x]
693
	mov	edi,[y]
694
	add	esi,10
695
	add	edi,-15
696
	call	map_x_y
697
	test	edx,edx
698
	jnz	direct4
699
	inc	[tupik]
700
direct4:
701
	cmp	[tupik],3
702
	je	no_move0
703
;------------------
704
;strategy1
705
	mov	esi,[x]
706
	mov	edi,[y]
707
	add	esi,(20+15)
708
	add	edi,10
709
	call	map_x_y
710
	test	edx,edx
711
	jnz	no_strategy1
712
	mov	esi,[x]
713
	mov	edi,[y]
714
	add	esi,10
715
	add	edi,-15
716
	call	map_x_y
717
	jnz	no_strategy1
718
	jmp	no_move3	;going to left
719
no_strategy1:
720
;------------------
721
	mov	esi,[x]
722
	mov	edi,[y]
723
	add	esi,-15
724
	add	edi,10
725
	call	map_x_y
726
	test	edx,edx
727
	jnz	no_strategy2
728
	mov	esi,[x]
729
	mov	edi,[y]
730
	add	esi,10
731
	add	edi,-15
732
	call	map_x_y
733
	test	edx,edx
734
	jnz	no_strategy2
735
	jmp	no_move2
736
no_strategy2:
737
;------------------
738
	mov	esi,[x]
739
	mov	edi,[y]
740
	add	edi,(20+15)
741
	add	esi,10
742
	call	map_x_y
743
	test	edx,edx
744
	jnz	no_strategy3
745
	mov	esi,[x]
746
	mov	edi,[y]
747
	add	esi,-15
748
	add	edi,10
749
	call	map_x_y
750
	test	edx,edx
751
	jnz	no_strategy3
752
	jmp	no_move1
753
no_strategy3:
754
;-------------------------------------------------
755
no_move0:
756
	mov	esi,[x]	;	x
757
	mov	edi,[y]	;	y
758
	add	edi,-15	;	(y-20) up
759
	add	esi,10
760
	call	map_x_y
761
	test	edx,edx
762
	jz	no_move1
763
;вверху	свободно - можно двигаться up
764
	mov	[SpriteInfo+9*eax+0],dword 3
765
	mov	[SpriteInfo+9*eax+28],dword 0
766
	mov	[SpriteInfo+9*eax+32],dword -5
767
	jmp	lab1
768
no_move1:
769
	mov	esi,[x]
770
	mov	edi,[y]
771
	add	esi,(20+15)	;x+20
772
	add	edi,10
773
	call	map_x_y
774
	test	edx,edx
775
	jz	no_move2
776
;right
777
	mov	[SpriteInfo+9*eax+0],dword 5
778
	mov	[SpriteInfo+9*eax+28],dword 5
779
	mov	[SpriteInfo+9*eax+32],dword 0
780
	jmp	lab1
781
no_move2:
782
	mov	esi,[x]
783
	mov	edi,[y]
784
	add	esi,10	;x-20
785
	add	edi,(20+15)
786
	call	map_x_y
787
	test	edx,edx
788
	jz	no_move3
789
;down
790
	mov	[SpriteInfo+9*eax+0],dword 7
791
	mov	[SpriteInfo+9*eax+28],dword 0
792
	mov	[SpriteInfo+9*eax+32],dword 5
793
	jmp	lab1
794
no_move3:
795
	mov	esi,[x]
796
	mov	edi,[y]
797
	add	edi,10	;y+20
798
	add	esi,-15
799
	call	map_x_y
800
	test	edx,edx
801
	jz	no_move4
802
;внизу свободно-можно двигаться left
803
	mov	[SpriteInfo+9*eax+0],dword 9
804
	mov	[SpriteInfo+9*eax+28],dword -5
805
	mov	[SpriteInfo+9*eax+32],dword 0
806
	jmp	lab1
807
no_move4:
808
	mov	[SpriteInfo+9*eax+28],dword 0
809
	mov	[SpriteInfo+9*eax+32],dword 0
810
lab1:
811
	mov	edx,dword[SpriteInfo+9*eax+4]
812
	test	edx,edx
813
	jnz	no_action_bad_tank
814
	mov	[SpriteInfo+9*eax+4],dword 1
815
no_action_bad_tank:
816
	add	eax,4
817
	cmp	eax,10*4
818
	jne	next_bad_tank
819
;-------------------------------------------------
820
	mov	eax,12
821
next_puly:
822
	mov	edx,eax
823
	shr	edx,2
824
	xor	ecx,ecx
825
	mov	cl,byte[PulyTanks+edx]
826
	test	ecx,ecx	;can change course of puly?
827
	jz	no_change_course
828
	xor	ecx,ecx
829
	mov	cl,byte[LifesTanks+edx]
830
	test	ecx,ecx	;is tank not destroed?
831
	jz	no_draw_s
832
	mov	ecx,[SpriteInfo+9*eax+24]	;tank's phas of animation
833
	test	ecx,ecx		;phas=0?
834
	jnz	no_change_course
835
	mov	esi,[SpriteInfo+9*eax+8]
836
	mov	edi,[SpriteInfo+9*eax+12]
837
	mov	ecx,[SpriteInfo+9*eax+28]
838
	mov	edx,[SpriteInfo+9*eax+32]
839
	mov	ebx,eax
840
	add	ebx,28
841
	mov	[SpriteInfo+9*ebx+0],dword 1
842
	mov	[SpriteInfo+9*ebx+4],dword 1
843
	mov	[SpriteInfo+9*ebx+28],dword ecx
844
	mov	[SpriteInfo+9*ebx+32],dword edx
845
	mov	[SpriteInfo+9*ebx+16],dword 3
846
	mov	[SpriteInfo+9*ebx+8],dword esi
847
	mov	[SpriteInfo+9*ebx+12],dword edi
848
	mov	ebx,eax
849
	shr	ebx,2
850
	mov	[PulyTanks+ebx],byte 0
851
	jmp	no_draw_s
852
;-------------------
853
no_change_course:
854
	mov	ebx,eax
855
	add	ebx,28
856
	mov	ecx,[SpriteInfo+9*ebx+24]
857
	test	ecx,ecx
858
	jnz	no_draw_s
859
	mov	esi,[SpriteInfo+9*ebx+8]
860
	mov	edi,[SpriteInfo+9*ebx+12]
861
	mov	ecx,[SpriteInfo+9*ebx+28]
862
	mov	edx,[SpriteInfo+9*ebx+32]
863
	call	map_x_y
864
	cmp	ecx,1
865
	je	bumm
866
	cmp	ecx,0
867
	je	strike_to_wall
868
	jmp	no_bumm
869
strike_to_wall:
870
	mov	[ebx],byte 2
871
bumm:
872
;-------------------
873
	mov	ebx,eax
874
	add	ebx,28
875
	mov	[SpriteInfo+9*ebx+28],dword 0
876
	mov	[SpriteInfo+9*ebx+32],dword 0
877
	mov	esi,[SpriteInfo+9*ebx+8]
878
	mov	edi,[SpriteInfo+9*ebx+12]
879
	add	ebx,28
880
	mov	[SpriteInfo+9*ebx+4],dword 1
881
	mov	[SpriteInfo+9*ebx+8],dword esi
882
	mov	[SpriteInfo+9*ebx+12],dword edi
883
	mov	[SpriteInfo+9*ebx+16],dword 3
884
	mov	[SpriteInfo+9*ebx+28],dword 0
885
	mov	[SpriteInfo+9*ebx+32],dword 0
886
	mov	ebx,eax
887
	shr	ebx,2
888
	mov	[PulyTanks+ebx],byte 1
889
	mov	edx,[number_level]
890
	mov	ecx,15
891
	push	eax
892
	call	load_level
893
	pop	eax
894
	jnp	no_draw_s
895
;-------------------
896
no_bumm:
897
	mov	ebx,eax
898
	add	ebx,28
899
	mov	[SpriteInfo+9*ebx+4],dword 1	;can draw sprite of puly
900
no_draw_s:
901
	add	eax,4
902
	cmp	eax,10*4
903
	jne	next_puly
904
;-------------------------------------------------
905
;-------------end of tanks logic------------------
906
;-------------------------------------------------
907
	xor	edx,edx
908
	mcall	13,<190,192>,<5,7>
909
	mcall	4,<190,5>,0x1ded00,Level,5
910
	mcall	,<260,5>,0x3558ff,Lifes,
911
	mcall	,<330,5>,0xf93500,Score,
912
	mov	ecx,[number_level]
913
;	inc	ecx	//leency
914
	mcall	47,3*65536,,<225,5>,0x1ded00
915
	xor	ecx,ecx
916
	mov	cl,[LifesPlayer]
917
	shr	ecx,2
918
	mcall	,,,<295,5>,0x3558ff
919
	xor	ecx,ecx
920
	mov	cl,byte[score]
921
	mcall	,,<365,5>,0xf93500
922
	jmp	maincycle
31 halyavin 923
;----------------------------------------------------------
924
;-----------------end of main cycle------------------------
925
;----------------------------------------------------------
2079 mario79 926
pause_cicle:
927
	pusha
928
.start:
929
	mcall	9,procinfo,-1
930
	mov	eax,[procinfo+70] ;status of window
931
	test	eax,100b
932
	jne	@f
933
	popa
934
	ret
935
@@:
936
	mcall	10
937
	dec	eax
938
	jz	.redraw
939
	dec	eax
940
	jz	.key
941
	dec	eax
942
	jnz	.start
943
.button:
944
	mcall	-1
945
.key:
946
	mcall	2
947
	jmp	.start
948
.redraw:
949
	call	drawwin
950
	jmp	.start
951
;---------------------------------------------------------
31 halyavin 952
;draw sprite in video memory
953
PutSprite:
2079 mario79 954
	push	eax
955
	mov	ebx,esi
956
	mov	eax,edi
957
	lea	ebx,[ebx+2*ebx]
958
	lea	eax,[eax+2*eax]
959
	imul	eax,640
960
	add	eax,0x4000
961
	add	eax,ebx
962
	mov	[counter],20
963
	mov	esi,edx
964
	imul	esi,1200
965
	add	esi,0x4000+(640*400*3)+10*1200
966
	mov	ebx,esi
967
	mov	edi,eax
968
draw:
969
	mov	esi,ebx
970
	mov	edi,eax
971
	mov	ecx,20
972
;--------------------
973
rep_movsb:
974
	xor	edx,edx
975
	mov	edx,[esi]
976
	and	edx,0xffffff
977
	test	edx,edx	;0 is transparent color
978
	jz	transparent_color
979
	mov	[edi],dx
980
	shr	edx,16
981
	mov	[edi+2],dl
982
transparent_color:
983
	add	esi,3
984
	add	edi,3
985
	sub	ecx,1
986
	jnz	rep_movsb
987
;--------------------
988
	add	eax,640*3
989
	add	ebx,20*3
990
	dec	[counter]
991
	jnz	draw
992
	pop	eax
993
	ret
31 halyavin 994
;----------------------------------------------------------
995
SaveFon:
2079 mario79 996
	push	eax
997
	lea	esi,[esi+2*esi]
998
	lea	edi,[edi+2*edi]
999
	imul	edi,640
1000
	add	esi,edi
1001
	add	esi,0x4000
1002
	mov	edi,edx
1003
	imul	edi,1200
1004
	add	edi,0x4000+(640*400*3)+(50*20*20*3)+512+641
1005
	mov	[counter],20
1006
	mov	eax,esi
1007
	mov	ebx,edi
31 halyavin 1008
save_to:
2079 mario79 1009
	mov	esi,eax
1010
	mov	edi,ebx
1011
	mov	ecx,15
1012
	rep	movsd
1013
	add	eax,640*3
1014
	add	ebx,20*3
1015
	dec	[counter]
1016
	jnz	save_to
1017
	pop	eax
31 halyavin 1018
	ret
1019
;----------------------------------------------------------
1020
PutFon:
2079 mario79 1021
	push	eax
1022
	lea	esi,[esi+2*esi]
1023
	lea	edi,[edi+2*edi]
1024
	imul	edi,640
1025
	add	edi,esi
1026
	add	edi,0x4000
1027
	mov	esi,edx
1028
	imul	esi,1200
1029
	add	esi,0x4000+(640*400*3)+(50*20*20*3)+512+641
1030
	mov	[counter],20
1031
	mov	eax,esi
1032
	mov	ebx,edi
1033
put_to:
1034
	mov	esi,eax
1035
	mov	edi,ebx
1036
	mov	ecx,15
1037
	rep	movsd
1038
	add	eax,20*3
1039
	add	ebx,640*3
1040
	dec	[counter]
1041
	jnz	put_to
1042
	pop	eax
1043
	ret
31 halyavin 1044
;----------------------------------------------------------
1045
;get time in 1/100 sec
2079 mario79 1046
clock:
1047
	mcall	26,9
1048
	mov	[time],eax
31 halyavin 1049
	ret
1050
;----------------------------------------------------------
1051
;-----------------load level to memory---------------------
1052
;----------------------------------------------------------
1053
load_level:
2079 mario79 1054
	cmp	ecx,15
1055
	je	no_load_level
1056
	mov	eax,edx
1057
	mov	ebx,[levels+4*eax]
1058
	mov	esi,ebx
1059
	add	esi,2
1060
	xor	ecx,ecx
1061
	xor	eax,eax
1062
	mov	cl,byte[ebx]
1063
	mov	al,byte[ebx+1]
1064
	add	ecx,eax
1065
	mov	edi,0x4000+(640*400*3)+(50*20*20*3)+512
1066
	call	unpakin
1067
no_load_level:
1068
	and	[y],0
1069
c_y:
1070
	and	[x],0
1071
c_x:
1072
	mov	eax,[x]
1073
	mov	ebx,[y]
1074
	shl	ebx,5
1075
	add	eax,ebx
1076
	add	eax,0x4000+(640*400*3)+(50*20*20*3)+512
1077
	mov	ecx,eax
1078
	xor	eax,eax
1079
	mov	al,byte [ecx]
1080
	imul	eax,1200
1081
	add	eax,0x4000+(640*400*3)
1082
	mov	ebx,[x]
1083
	imul	ebx,20*3
1084
	mov	ecx,[y]
1085
	imul	ecx,20*3*640
1086
	add	ebx,ecx
1087
	add	ebx,0x4000
1088
	mov	esi,eax
1089
	mov	edi,ebx
1090
;----------------------------
1091
	mov	edx,20
1092
next_line:
1093
	mov	esi,eax
1094
	mov	edi,ebx
1095
	mov	ecx,15
1096
	rep	movsd
1097
	add	eax,20*3
1098
	add	ebx,(640*3)
1099
	dec	edx
1100
	jnz	next_line
1101
;----------------------------
1102
	inc	[x]
1103
	cmp	[x],32
1104
	jne	c_x
1105
	inc	[y]
1106
	cmp	[y],20
1107
	jne	c_y
1108
	ret
31 halyavin 1109
;----------------------------------------------------------
1110
map_x_y:
2079 mario79 1111
	push	eax
1112
	mov	ecx,20
1113
	mov	eax,esi
1114
	cdq
1115
	idiv	ecx
1116
	mov	esi,eax
1117
	mov	eax,edi
1118
	cdq
1119
	idiv	ecx
1120
	mov	edi,eax
1121
;------------------
1122
	mov	ebx,edi
1123
	shl	ebx,5
1124
	add	ebx,esi
1125
	add	ebx,0x4000+(640*400*3)+(50*20*20*3)+512
1126
	xor	ecx,ecx
1127
	mov	cl,byte[ebx]
1128
	cmp	cl,0
1129
	je	false_draw
1130
	cmp	cl,1
1131
	je	false_draw
1132
	cmp	cl,3
1133
	je	false_draw
1134
	cmp	cl,7
1135
	je	false_draw
1136
	mov	edx,1
1137
	jmp	lab2
1138
false_draw:
1139
	xor	edx,edx
1140
lab2:
1141
	pop	eax
1142
	ret
31 halyavin 1143
;----------------------------------------------------------
1144
you_won:
2079 mario79 1145
	mcall	13,<1,640>,<20,400>,0xc6e9
1146
	mcall	4,<255,190>,0xffffff,won1,29
1147
	mcall	,<255,200>,,won2,
1148
	mcall	,<255,210>,,won3,
1149
	mcall	5,400
1150
	ret
31 halyavin 1151
;----------------------------------------------------------
1152
end_game:
2079 mario79 1153
	xor	edx,edx
1154
	mcall	13,<0,640>,<20,400>
1155
	mcall	4,<280,200>,0xffffff,game_over,9
1156
	mcall	5,350
31 halyavin 1157
	ret
1158
;----------------------------------------------------------
1159
drawwin:
2009 yogev_ezra 1160
	mcall	12,1
2079 mario79 1161
;рисуем окно задавая все необходимые цвета
2009 yogev_ezra 1162
	mcall	0,100*65536+649,50*65536+446,(0x74000000+0xffffff),,name
2079 mario79 1163
	mcall	9,procinfo,-1
1164
	mov	eax,[procinfo+70] ;status of window
1165
	test	eax,100b
1166
	jne	@f
1167
	call	paint_area
1168
@@:
2009 yogev_ezra 1169
	mcall	12,2
31 halyavin 1170
	ret
1171
;----------------------------------------------------------
2079 mario79 1172
paint_area:
1173
	xor	edx,edx
1174
	mcall	13,0*65536+640,0*65536+20
1175
	ret
1176
;----------------------------------------------------------
31 halyavin 1177
menu:
2079 mario79 1178
cycle_menu:
1179
	mcall	13,<238,141>,<229,20>,0xed16
1180
	mcall	4,<255,235>,0xff0200,start_menu,11
1181
	mcall	47,3*65536,[number_level],<345,235>,0xff0200
1182
	mcall	4,<465,5>,0x888888,description,25
1183
still:
1184
	mcall	10
1185
	dec	eax
1186
	jz	.redraw
1187
	dec	eax
1188
	jz	.key
1189
;	jmp	.button
2018 leency 1190
;.button:
2079 mario79 1191
	mcall	-1
2018 leency 1192
.redraw:
2079 mario79 1193
	pop	eax
1194
	jmp	restart_level
2018 leency 1195
.key:
2079 mario79 1196
	mcall	2
1197
	shr	eax,8
1198
	cmp	eax,32
1199
	je	start_game
1200
	cmp	eax,13
1201
	je	start_game
1202
	cmp	eax,176
1203
	jne	no_left
1204
	dec	[number_level]
1205
	and	[number_level],15
1206
	jmp	cycle_menu
1207
no_left:
1208
	cmp	eax,179
1209
	jne	no_right
1210
	inc	[number_level]
1211
	and	[number_level],15
1212
	jmp	cycle_menu
1213
no_right:
1214
	cmp	eax,27
1215
	jne	cycle_menu
1216
	mov	eax,-1
485 heavyiron 1217
	mcall
31 halyavin 1218
	start_game:
1219
	ret
1220
;----------------------------------------------------------
1221
;--------------unpak pix engin-----------------------------
1222
;----------------------------------------------------------
2079 mario79 1223
	unpakin:
1224
NextLitlColor:
1225
	xor	edx,edx
1226
	mov	dl,byte[esi]
1227
	xor	eax,eax
1228
	xor	ebx,ebx
1229
	mov	al,dl
1230
	mov	bl,al
1231
	shr	al,4
1232
	and	al,0xf
1233
	mov	[LitlCounter],al
1234
	and	bl,0xf
1235
	mov	[LitlColor],bl
1236
	xor	eax,eax
1237
;----------------------
1238
	mov	al,[LitlColor]
1239
beg:
1240
	mov	[edi],al
1241
	add	edi,1
1242
	add	[LitlCounter],-1
1243
	cmp	[LitlCounter],-1
1244
	jne	beg
1245
	inc	esi
1246
	dec	ecx
1247
	jnz	NextLitlColor
1248
	ret
31 halyavin 1249
;----------------------------------------------------------
2079 mario79 1250
include	'data.inc'
31 halyavin 1251
;----------------------------------------------------------
2079 mario79 1252
procinfo:
1253
	rb 1024
31 halyavin 1254
;----------------------------------------------------------
2018 leency 1255
I_END: