Subversion Repositories Kolibri OS

Rev

Rev 1538 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1535 IgorA 1
use32
2
	org 0x0
3
	db 'MENUET01' ;идентиф. исполняемого файла всегда 8 байт
4
	dd 0x1
5
	dd start
6
	dd i_end ;размер приложения
7
	dd mem
8
	dd stacktop
9
	dd 0x0
10
	dd sys_path
11
 
12
include '../../../macros.inc'
13
include '../../../proc32.inc'
14
include '../../../develop/libraries/box_lib/load_lib.mac'
15
include 'mem.inc'
16
include 'dll.inc'
17
 
18
@use_library_mem mem.Alloc,mem.Free,mem.ReAlloc, dll.Load
19
 
20
;флаги, для функции обрезания буфера
21
BUF2D_OPT_CROP_TOP equ 1 ;обрезка сверху
22
BUF2D_OPT_CROP_LEFT equ 2 ;обрезка слева
23
BUF2D_OPT_CROP_BOTTOM equ 4 ;обрезка снизу
24
BUF2D_OPT_CROP_RIGHT equ 8 ;обрезка справа
25
BUF2D_BIT_OPT_CROP_TOP equ 0
26
BUF2D_BIT_OPT_CROP_LEFT equ 1
27
BUF2D_BIT_OPT_CROP_BOTTOM equ 2
28
BUF2D_BIT_OPT_CROP_RIGHT equ 3
29
 
30
BUF_STRUCT_SIZE equ 21
31
buf2d_data equ dword[edi] ;данные буфера изображения
32
buf2d_w equ dword[edi+8] ;ширина буфера
33
buf2d_h equ dword[edi+12] ;высота буфера
34
buf2d_t equ word[edi+6] ;отступ сверху
35
buf2d_l equ word[edi+4] ;отступ слева
36
buf2d_size_lt equ dword[edi+4] ;отступ слева и справа для буфера
37
buf2d_color equ dword[edi+16] ;цвет фона буфера
38
buf2d_bits equ byte[edi+20] ;количество бит в 1-й точке изображения
39
 
40
struct FileInfoBlock
41
	Function dd ?
42
	Position dd ?
43
	Flags	 dd ?
44
	Count	 dd ?
45
	Buffer	 dd ?
46
		db ?
47
	FileName dd ?
48
ends
49
 
50
GAME_POLE_W equ 315 ;ширина поля
51
GAME_POLE_H equ 210 ;высота поля
52
GAME_POLE_BYTES equ GAME_POLE_W*GAME_POLE_H*3 ;размер файла с изображением
53
OFFS_SHADOW_X equ 2 ;сдвиг теней по оси 'x'
54
OFFS_SHADOW_Y equ 2 ;сдвиг теней по оси 'y'
55
IMAGE_FONT_SIZE equ 128*144*3
56
 
57
fn_icon0 db 'curici.png',0 ;имя файла с декорациями
58
fn_icon1 db 'wolf.png',0 ;имя файла с волком и зайцем
59
fn_icon2 db 'eggs.png',0 ;имя файла с яйцами
60
fn_icon3 db 'chi.png',0 ;имя файла с циплятами
61
fn_font db 'font8x9.bmp',0
62
 
63
color_fon dd 0xffffff
64
color_shadows dd 0xd0d0d0 ;цвет теней
65
color_trees dd 0x008000 ;цвет травы
66
color_wolf dd 0x800000 ;цвет волка и зайца
67
color_egg dd 0x404080 ;цвет яйца
68
color_chick dd 0x00d0d0 ;цвет ципленка
69
color_curici dd 0x8080d0 ;цвет курицы
70
color_perilo dd 0x000080 ;цвет перила (гребня)
71
 
72
macro load_image_file path,buf,size { ;макрос для загрузки изображений
73
	stdcall mem.Alloc, dword size ;выделяем память для изображения
74
	mov [buf],eax
75
 
76
	copy_path path,sys_path,file_name,0x0 ;формируем полный путь к файлу изображения, подразумеваем что он в одной папке с программой
77
	mov eax,70 ;70-я функция работа с файлами
78
	mov [run_file_70.Function], 0
79
	mov [run_file_70.Position], 0
80
	mov [run_file_70.Flags], 0
81
	mov [run_file_70.Count], dword size
82
	m2m [run_file_70.Buffer], [buf]
83
	mov byte[run_file_70+20], 0
84
	mov [run_file_70.FileName], file_name
85
	mov ebx,run_file_70
86
	int 0x40 ;загружаем файл изображения
87
	cmp ebx,0xffffffff
88
	je @f
89
		;определяем вид изображения и переводим его во временный буфер image_data
90
		stdcall dword[img_decode], dword[buf],ebx,0
91
		mov dword[image_data],eax
92
		;преобразуем изображение к формату rgb
93
		stdcall dword[img_to_rgb2], dword[image_data],dword[buf]
94
		;удаляем временный буфер image_data
95
		stdcall dword[img_destroy], dword[image_data]
96
	@@:
97
}
98
 
99
;данные игры
100
bit_zaac equ 2 ;бит зайца
101
val_zaac equ 4 ;цифра отвечающая за бит зайца
102
bit_mig equ 3 ;бит мигания
103
val_mig equ 8 ;цифра отвечающая за бит мигания
104
mask_lot_lu    equ 1b ;маска для левого верхнего лотка
105
mask_lot_ld    equ 100000b ;маска для левого нижнего лотка
106
mask_lot_ru    equ 10000000000b ;маска для правого верхнего лотка
107
mask_lot_rd    equ 1000000000000000b ;маска для правого нижнего лотка
108
mask_clear_all equ 11111011111011110111101111011110b ;маска для очистки падающих яиц и прибежавших циплят
109
mask_fail_eggs equ 100001000010000100000b ;маска падающих яиц
110
mask_chi_left  equ 11111000000000000000000000b ;маска левых циплят
111
mask_chi_right equ 11111000000000000000000000000000b ;маска правых циплят
112
mask_chi_cr_l  equ 1000000000000000000000b ;маска для создания левого
113
mask_chi_cr_r  equ 1000000000000000000000000000b ;маска для создания правого
114
bit_chi_left  equ 21 ;1-й бит который отвечает за бегущего слева
115
bit_chi_right equ 27 ;1-й бит который отвечает за бегущего права
116
 
117
pos_wolf db 0 ;позиция волка 0-й бит слева/справа, 1-й бит сверху/вниз
118
;rb 1
119
pos_eggs dd 0 ;позиции расположения яиц и циплят
120
eggs_count dw 0 ;колличество пойманых яиц
121
game_text db 'Игра _',13
122
some_text db '0'
123
	rb 8 ;текст с числом пойманных яиц
124
count_last db 0 ;счетчик пропущенных яиц
125
game_spd dd 0 ;задержка игры
126
 
127
;для генерации случайных чисел
128
rand_x dd 0
129
 
130
align 4
131
rand_next:
132
;x(k+1) = (a*x(k)+c) mod m
133
; a=22695477, c=1, m=2^32
134
push eax
135
	mov eax,dword[rand_x]
136
	imul eax,22695477
137
	inc eax
138
	mov dword[rand_x],eax
139
pop eax
140
	ret
141
 
142
;создаем прозрачные буфера по 8 бит (трафареты), для рисования
143
;где buf - буфер на основе которого будет создан трафарет
144
;фоновый цвет буфера должен быть 0xffffff, иначе не произойдет обрезка
145
;по фоновому цвету и трафарет будет занимат ьмного места в памяти
146
align 4
147
proc CreateTrapharetBuffer, buf:dword, img_data:dword
148
	push edi
149
	mov edi,dword[buf]
150
	stdcall [buf2d_create_f_img], edi,[img_data] ;создаем буфер
151
	stdcall [buf2d_conv_24_to_8], edi,1 ;делаем буфер прозрачности 8бит
152
	stdcall [buf2d_crop_color], edi,buf2d_color,BUF2D_OPT_CROP_TOP+BUF2D_OPT_CROP_BOTTOM+BUF2D_OPT_CROP_RIGHT
153
	pop edi
154
	ret
155
endp
156
 
157
align 4
158
InitBackgroundBuffer: ;создание фонового изображения
159
	pushad
160
	mov edi,buf_fon
161
	mov eax,[color_fon]
162
	mov buf2d_color,eax
163
	stdcall [buf2d_clear], edi,eax
164
	mov esi,edi
165
 
166
	xor eax,eax
167
	xor ebx,ebx
168
 
169
	mov edi,buf_tr_fon0
170
	mov ax,buf2d_t
171
	add eax,OFFS_SHADOW_Y
172
	mov bx,buf2d_l
173
	add ebx,OFFS_SHADOW_X
174
	stdcall [buf2d_bit_blt_alpha], esi, ebx,eax, edi,[color_shadows] ;рисуем тени домиков
175
	mov edi,buf_tr_fon1
176
	mov ax,buf2d_t
177
	add eax,OFFS_SHADOW_Y
178
	mov bx,buf2d_l
179
	add ebx,OFFS_SHADOW_X
180
	stdcall [buf2d_bit_blt_alpha], esi, ebx,eax, edi,[color_shadows] ;рисуем тени куриц
181
	mov edi,buf_tr_fon2
182
	mov ax,buf2d_t
183
	add eax,OFFS_SHADOW_Y
184
	mov bx,buf2d_l
185
	add ebx,OFFS_SHADOW_X
186
	stdcall [buf2d_bit_blt_alpha], esi, ebx,eax, edi,[color_shadows] ;рисуем тени деревьев
187
 
188
	mov edi,buf_tr_fon0
189
	mov ax,buf2d_t
190
	stdcall [buf2d_bit_blt_alpha], esi, 0,eax, edi,[color_perilo] ;рисуем домики
191
	mov edi,buf_tr_fon1
192
	mov ax,buf2d_t
193
	stdcall [buf2d_bit_blt_alpha], esi, 0,eax, edi,[color_curici] ;рисуем курицы
194
	mov edi,buf_tr_fon2
195
	mov ax,buf2d_t
196
	stdcall [buf2d_bit_blt_alpha], esi, 0,eax, edi,[color_trees] ;рисуем деревья
197
	popad
198
	ret
199
 
200
;рисует картинку в буфере buf из массива буферов buf_img с индексом ind
201
;т. е. buf <- buf_img[ind]
202
align 4
203
proc DrawArrayImg, buf:dword, buf_img:dword, ind:dword, color:dword
204
	pushad
205
		mov edi,dword[ind]
206
		imul edi,BUF_STRUCT_SIZE
207
		add edi,dword[buf_img]
208
 
209
		mov esi,dword[buf]
210
		xor eax,eax
211
		mov ax,buf2d_t
212
		xor ebx,ebx
213
		mov bx,buf2d_l
214
		stdcall [buf2d_bit_blt_alpha], esi, ebx,eax, edi,[color]
215
	popad
216
	ret
217
endp
218
 
219
align 4
220
DrawZaac: ;рисование зайца
221
	push eax
222
	bt word[pos_wolf],bit_zaac
223
	jae .end_mig
224
 
225
	stdcall DrawArrayImg, buf_displ,buf_wolf,6,[color_wolf] ;рисуем тело зайца
226
	mov eax,dword[pos_eggs]
227
	and eax,mask_chi_right+mask_chi_left
228
	cmp eax,0
229
	je .end_mig ;если нет бегающих циплят, то заяц рукой не машет
230
	bt word[pos_wolf],bit_mig
231
	jc @f
232
		stdcall DrawArrayImg, buf_displ,buf_wolf,7,[color_wolf] ;рисуем руку зайца вверху
233
		jmp .end_mig
234
	@@:
235
		stdcall DrawArrayImg, buf_displ,buf_wolf,8,[color_wolf] ;рисуем руку зайца внизу
236
	.end_mig:
237
	pop eax
238
	ret
239
 
240
align 4
241
DrawWolf: ;рисует волка с корзинами
242
	bt word[pos_wolf],0
243
	jc @f
244
		stdcall DrawArrayImg, buf_displ,buf_wolf,0,[color_wolf]
245
		bt word[pos_wolf],1
246
		jc .corz_ldn
247
			stdcall DrawArrayImg, buf_displ,buf_wolf,1,[color_wolf]
248
			jmp .corz_lend
249
		.corz_ldn:
250
			stdcall DrawArrayImg, buf_displ,buf_wolf,2,[color_wolf]
251
		.corz_lend:
252
		jmp .wolf_b
253
	@@:
254
		stdcall DrawArrayImg, buf_displ,buf_wolf,3,[color_wolf]
255
		bt word[pos_wolf],1
256
		jc .corz_rdn
257
			stdcall DrawArrayImg, buf_displ,buf_wolf,4,[color_wolf]
258
			jmp .corz_rend
259
		.corz_rdn:
260
			stdcall DrawArrayImg, buf_displ,buf_wolf,5,[color_wolf]
261
		.corz_rend:
262
	.wolf_b:
263
	ret
264
 
265
align 4
266
DrawEggs: ;рисует яйца
267
	pushad
268
	cld
269
 
270
	mov eax,dword[pos_eggs]
271
	xor ebx,ebx
272
	mov ecx,20 ;цикл для рисования котящихся яиц
273
	@@:
274
		bt eax,ebx
275
		jae .draw_egg
276
			stdcall DrawArrayImg, buf_displ,buf_egg,ebx,[color_egg]
277
		.draw_egg:
278
		inc ebx
279
		loop @b
280
 
281
	;mov eax,dword[pos_eggs]
282
	and eax,mask_chi_left
283
	cmp eax,0
284
	je @f
285
		stdcall DrawArrayImg, buf_displ,buf_egg,20,[color_egg] ;разбитое яйцо слева
286
	@@:
287
	mov eax,dword[pos_eggs]
288
	and eax,mask_chi_right
289
	cmp eax,0
290
	je @f
291
		stdcall DrawArrayImg, buf_displ,buf_egg,21,[color_egg] ;разбитое яйцо справа
292
	@@:
293
 
294
	mov eax,dword[pos_eggs]
295
	xor edx,edx
296
	mov ebx,bit_chi_left
297
	mov ecx,5 ;цикл для рисования левых циплят
298
	@@:
299
		bt eax,ebx
300
		jae .draw_chick_l
301
			stdcall DrawArrayImg, buf_displ,buf_chi,edx,[color_chick]
302
		.draw_chick_l:
303
		inc ebx
304
		inc edx
305
		loop @b
306
	mov ebx,bit_chi_right
307
	mov ecx,5 ;цикл для рисования правых циплят
308
	@@:
309
		bt eax,ebx
310
		jae .draw_chick_r
311
			stdcall DrawArrayImg, buf_displ,buf_chi,edx,[color_chick]
312
		.draw_chick_r:
313
		inc ebx
314
		inc edx
315
		loop @b
316
 
317
	xor eax,eax
318
	mov al,byte[count_last]
319
	mov ecx,eax ;цикл для рисования штрафных очков
320
	shr ecx,1
321
	mov edx,10 ;индекс начала штрафных иконок в буфере buf_chi
322
	cmp ecx,0
323
	je .no_unit_last
324
	@@:
325
		stdcall DrawArrayImg, buf_displ,buf_chi,edx,[color_chick]
326
		inc edx
327
		loop @b
328
	.no_unit_last:
329
 
330
	bt ax,0 ;проверяем мигающее не четное очко
331
	jae @f
332
		bt word[pos_wolf],bit_mig
333
		jc @f
334
			stdcall DrawArrayImg, buf_displ,buf_chi,edx,[color_chick] ;мигающее штрафное очко
335
	@@:
336
 
337
	popad
338
	ret
339
 
340
align 4
341
CountEggsInc: ;увеличиваем счетчик яиц на 1
342
	push eax edi
343
		xor eax,eax
344
		inc word[eggs_count] ;увеличиваем счетчик яиц
345
		cmp word[eggs_count],200 ;бонусные очки
346
		je @f
347
		cmp word[eggs_count],500 ;бонусные очки
348
		je @f
349
			jmp .no_bonus
350
		@@:
351
			mov byte[count_last],0
352
		.no_bonus:
353
 
354
		mov ax,word[eggs_count]
355
		mov edi,some_text
356
		call convert_to_str ;обновляем текстовую строку
357
		and ax,0xf ;через каждые 16 яиц уменьшаем время
358
		cmp ax,0
359
		jne @f
360
			cmp dword[game_spd],15 ;минимальная задержка
361
			jle @f
362
				dec dword[game_spd]
363
		@@:
364
	pop edi eax
365
	ret
366
 
367
;input:
368
; eax - маска, указывающая с какой строны упало яйцо
369
align 4
370
CountLastInc: ;начисление штрафных очков
371
	inc byte[count_last] ;половинао штрафного очка
372
	bt word[pos_wolf],bit_zaac
373
	jc @f
374
		inc byte[count_last] ;если нет зайца то еще 1-на половина штрафного очка
375
	@@:
376
	cmp byte[count_last],6
377
	jle @f
378
		mov byte[count_last],6 ;ставим ограничени на число штрафных очков
379
	@@:
380
	or dword[pos_eggs],eax ;создаем бегущего ципленка
381
	ret
382
 
383
align 4
384
MoveEggs:
385
	pushad
386
	xor byte[pos_wolf],val_mig ;бит для мигания
387
 
388
	cmp byte[count_last],6 ;максимальное число штрафных очков
389
	je .end_fun
390
 
391
	rol dword[pos_eggs],1
392
	mov ecx,dword[pos_eggs]
393
	and ecx,mask_fail_eggs
394
	cmp ecx,0
395
	je .no_fail ;нет падающих яиц
396
		;начисление яиц попавших в корзину
397
		;или начисление штрафных очков
398
		xor ebx,ebx
399
		mov bl,byte[pos_wolf] ;берем параметры (позицию) волка
400
		and bl,3 ;на всякий случай
401
 
402
		bt ecx,5 ;проверяем верхнее левое перило
403
		jae .perilo_lu
404
			cmp bx,0 ;проверяем наличие корзины
405
			jne @f
406
				call CountEggsInc
407
				jmp .perilo_lu
408
			@@:
409
				mov eax,mask_chi_cr_l
410
				call CountLastInc
411
			.perilo_lu:
412
		bt ecx,10 ;проверяем нижнее левое перило
413
		jae .perilo_ld
414
			cmp bx,2 ;проверяем наличие корзины
415
			jne @f
416
				call CountEggsInc
417
				jmp .perilo_ld
418
			@@:
419
				mov eax,mask_chi_cr_l
420
				call CountLastInc
421
		.perilo_ld:
422
		bt ecx,15 ;проверяем верхнее правое перило
423
		jae .perilo_ru
424
			cmp bx,1 ;проверяем наличие корзины
425
			jne @f
426
				call CountEggsInc
427
				jmp .perilo_ru
428
			@@:
429
				mov eax,mask_chi_cr_r
430
				call CountLastInc
431
		.perilo_ru:
432
		bt ecx,20 ;проверяем нижнее правое перило
433
		jae .perilo_rd
434
			cmp bx,3 ;проверяем наличие корзины
435
			jne @f
436
				call CountEggsInc
437
				jmp .perilo_rd
438
			@@:
439
				mov eax,mask_chi_cr_r
440
				call CountLastInc
441
		.perilo_rd:
442
	.no_fail:
443
 
444
	and dword[pos_eggs],mask_clear_all ;очистка упавших яиц и добежавших курей
445
 
446
	call rand_next
447
	bt dword[rand_x],6
448
	jc @f
449
	bt dword[rand_x],8
450
	jc @f
451
	bt dword[rand_x],9
452
	jc @f
453
		xor byte[pos_wolf],val_zaac ;высовываем/засовываем зайца
454
	@@:
455
 
456
	;создание новых яиц
457
	bt dword[rand_x],4 ;проверяем будем ли создавать новое яйцо
458
	jc .end_creat
459
	bt dword[rand_x],5 ;проверяем с какой стороны будем создавать новое яйцо
460
	jc .creat_r
461
		bt dword[rand_x],7
462
		jc @f
463
			or dword[pos_eggs],mask_lot_lu
464
			jmp .end_creat
465
		@@:
466
			or dword[pos_eggs],mask_lot_ld
467
			jmp .end_creat
468
	.creat_r:
469
		bt dword[rand_x],7
470
		jc @f
471
			or dword[pos_eggs],mask_lot_ru
472
			jmp .end_creat
473
		@@:
474
			or dword[pos_eggs],mask_lot_rd
475
			;jmp .end_creat
476
	.end_creat:
477
 
478
	.end_fun:
479
	popad
480
	ret
481
 
482
align 4
483
proc InitGame, b:dword ;первоначальные настройки игры
484
	mov word[eggs_count],0 ;колличество пойманых яиц
485
	mov byte[some_text],'0'
486
	mov byte[some_text+1],0 ;текст с числом пойманных яиц
487
	mov byte[count_last],0
488
	mov dword[pos_eggs],0
489
 
490
	cmp dword[b],0
491
	jne @f
492
		mov byte[game_text+5],'А'
493
		mov dword[game_spd],65 ;задержка игры
494
		jmp .end_init
495
	@@:
496
		mov byte[game_text+5],'Б'
497
		mov dword[game_spd],35 ;задержка игры
498
	.end_init:
499
 
500
	push eax ebx
501
		mcall 26,9
502
		mov dword[rand_x],eax ;заполняем 1-е случайное число
503
	pop ebx eax
504
 
505
	ret
506
endp
507
 
508
align 4
509
start:
510
	load_libraries l_libs_start,load_lib_end
511
 
512
	;проверка на сколько удачно загузилась наша либа
513
	mov	ebp,lib0
514
	cmp	dword [ebp+ll_struc_size-4],0
515
	jz	@f
516
		mcall -1 ;exit not correct
517
	@@:
518
	mov	ebp,lib1
519
	cmp	dword [ebp+ll_struc_size-4],0
520
	jz	@f
521
		mcall -1 ;exit not correct
522
	@@:
523
 
524
	mcall 40,0x27
525
	mcall 48,3,sc,sizeof.system_colors ;получаем системные цвета
526
 
527
	load_image_file fn_icon0,image_data_gray,3*GAME_POLE_BYTES
528
		mov eax,[image_data_gray]
529
		stdcall CreateTrapharetBuffer,buf_tr_fon0,eax
530
		add eax,GAME_POLE_BYTES
531
		stdcall CreateTrapharetBuffer,buf_tr_fon1,eax
532
		add eax,GAME_POLE_BYTES
533
		stdcall CreateTrapharetBuffer,buf_tr_fon2,eax
534
	stdcall mem.Free,[image_data_gray] ;освобождаем память
535
 
536
	stdcall [buf2d_create], buf_fon ;создаем буфер с фоновыми декорациями
537
 
538
	load_image_file fn_icon1,image_data_gray, 9*GAME_POLE_BYTES
539
		mov eax,[image_data_gray]
540
		mov edi,buf_wolf
541
		mov ecx,9
542
		cld
543
		@@: ;считываем 9 буферов с волком и зайцем
544
			mov buf2d_size_lt,0
545
			mov buf2d_w,GAME_POLE_W
546
			mov buf2d_h,GAME_POLE_H
547
			mov buf2d_color,0xffffff
548
			mov buf2d_bits,24
549
			stdcall CreateTrapharetBuffer,edi,eax
550
			add eax,GAME_POLE_BYTES
551
			add edi,BUF_STRUCT_SIZE
552
			loop @b
553
	stdcall mem.Free,[image_data_gray] ;освобождаем память
554
 
555
	load_image_file fn_icon2,image_data_gray, 22*GAME_POLE_BYTES
556
		mov eax,[image_data_gray]
557
		mov edi,buf_egg
558
		mov ecx,22
559
		cld
560
		@@: ;считываем 22 буферов с яйцами
561
			mov buf2d_size_lt,0
562
			mov buf2d_w,GAME_POLE_W
563
			mov buf2d_h,GAME_POLE_H
564
			mov buf2d_color,0xffffff
565
			mov buf2d_bits,24
566
			stdcall CreateTrapharetBuffer,edi,eax
567
			add eax,GAME_POLE_BYTES
568
			add edi,BUF_STRUCT_SIZE
569
			loop @b
570
	stdcall mem.Free,[image_data_gray] ;освобождаем память
571
 
572
	load_image_file fn_icon3,image_data_gray, 13*GAME_POLE_BYTES
573
		mov eax,[image_data_gray]
574
		mov edi,buf_chi
575
		mov ecx,13
576
		cld
577
		@@: ;считываем 13 буферов с циплятами
578
			mov buf2d_size_lt,0
579
			mov buf2d_w,GAME_POLE_W
580
			mov buf2d_h,GAME_POLE_H
581
			mov buf2d_color,0xffffff
582
			mov buf2d_bits,24
583
			stdcall CreateTrapharetBuffer,edi,eax
584
			add eax,GAME_POLE_BYTES
585
			add edi,BUF_STRUCT_SIZE
586
			loop @b
587
	stdcall mem.Free,[image_data_gray] ;освобождаем память
588
 
589
	load_image_file fn_font, image_data_gray,IMAGE_FONT_SIZE
590
	stdcall [buf2d_create_f_img], buf_font,[image_data_gray] ;создаем буфер
591
	stdcall mem.Free,[image_data_gray] ;освобождаем память
592
 
593
	stdcall [buf2d_conv_24_to_8], buf_font,1 ;делаем буфер прозрачности 8 бит
594
	stdcall [buf2d_convert_text_matrix], buf_font
595
 
596
;проверка занимаемого буфером места
597
;mov edi,buf_wolf
598
;add edi,BUF_STRUCT_SIZE ;переходим на буфер корзины
599
;stdcall [buf2d_clear],edi,0x808080 ;заливаем его серым цветом
600
 
601
	stdcall [buf2d_create], buf_displ ;создаем буфер для вывода на экран
602
	call InitBackgroundBuffer ;заполняем буфер с фоновыми декорациями
603
	stdcall InitGame,0
604
	mcall 26,9
605
	mov [last_time],ebx
606
 
607
 
608
 
609
align 4
610
red_win:
611
	call draw_window
612
 
613
align 4
614
still: ;главный цикл
615
	mcall 26,9
616
	mov ebx,[last_time]
617
	add ebx,dword[game_spd] ;delay
618
	sub ebx,eax
619
	cmp ebx,dword[game_spd] ;delay
620
	ja it_is_time_now
621
	test ebx,ebx
622
	jz it_is_time_now
623
	mcall 23
624
 
625
	cmp eax,0
626
	je it_is_time_now
627
 
628
	;mcall 10
629
 
630
	cmp al,0x1 ;изменилось положение окна
631
	jz red_win
632
	cmp al,0x2
633
	jz key
634
	cmp al,0x3
635
	jz button
636
 
637
	jmp still
638
 
639
align 4
640
it_is_time_now:
641
	mcall 26,9
642
	mov [last_time],eax
643
 
644
	;...здесь идут действия, вызываемые каждые delay сотых долей секунд...
645
	call MoveEggs
646
	call draw_display
647
	jmp still
648
 
649
align 4
650
key:
651
	push eax ebx
652
	mcall 2
653
 
654
	cmp ah,176 ;Left
655
	jne @f
656
		and byte[pos_wolf],0xfe
657
	@@:
658
	cmp ah,179 ;Right
659
	jne @f
660
		or byte[pos_wolf],1
661
	@@:
662
	cmp ah,178 ;Up
663
	jne @f
664
		and byte[pos_wolf],0xff-2
665
	@@:
666
	cmp ah,177 ;Down
667
	jne @f
668
		or byte[pos_wolf],2
669
	@@:
670
 
671
	cmp ah,97 ;a
672
	jne @f
673
		and byte[pos_wolf],0xff-3 ;00
674
	@@:
675
	cmp ah,122 ;z
676
	jne @f
677
		and byte[pos_wolf],0xff-1
678
		or byte[pos_wolf],2 ;10
679
	@@:
680
	cmp ah,39 ;'
681
	jne @f
682
		and byte[pos_wolf],0xff-2
683
		or byte[pos_wolf],1 ;01
684
	@@:
685
	cmp ah,47 ;/
686
	jne @f
687
		or byte[pos_wolf],3 ;11
688
	@@:
689
 
690
	pop ebx eax
691
	jmp still
692
 
693
 
694
align 4
695
draw_window:
696
	pushad
697
	mcall 12,1
698
 
699
	xor eax,eax
700
	mov ebx,20*65536+370
701
	mov ecx,20*65536+280
702
	mov edx,[sc.work]
703
	;or edx,0x33000000
704
	or edx,0x73000000
705
	mov edi,hed
706
	mcall ;создание окна
707
 
708
	mcall 9,procinfo,-1
709
	mov edi,buf_displ
710
	mov eax,dword[procinfo.client_box.width]
711
	cmp eax,GAME_POLE_W
712
	jle @f
713
		sub eax,GAME_POLE_W
714
		shr eax,1
715
		mov buf2d_l,ax ;выправниваем буфер по центру окна
716
	@@:
717
 
718
	call draw_display
719
 
720
	mov eax,13 ;рисование прямоугольника
721
	mov edx,[sc.work]
722
	xor esi,esi
723
	mov si,buf2d_l
724
	add esi,GAME_POLE_W
725
	mov ebx,dword[procinfo.client_box.width]
726
	inc ebx
727
	cmp esi,ebx
728
	jge @f
729
		sub ebx,esi
730
		rol ebx,16
731
		mov bx,si
732
		rol ebx,16
733
		mov ecx,dword[procinfo.client_box.height]
734
		inc ecx
735
		int 0x40 ;рисование правого бокового поля
736
		jmp .draw_s
737
	@@:
738
		mov esi,dword[procinfo.client_box.width] ;когда по ширине не влазит
739
		inc esi
740
	.draw_s:
741
 
742
	mov ebx,esi
743
	mov ecx,dword[procinfo.client_box.height]
744
	inc ecx
745
	mov esi,GAME_POLE_H
746
	cmp esi,ebx
747
	jge @f
748
		sub ecx,esi
749
		rol ecx,16
750
		mov cx,si
751
		rol ecx,16
752
		int 0x40 ;рисование нижнего поля
753
	@@:
754
 
755
	xor ebx,ebx
756
	mov bx,buf2d_l
757
	mov ecx,GAME_POLE_H
758
	int 0x40 ;рисование левого бокового поля
759
 
760
	mcall 12,2
761
	popad
762
	ret
763
 
764
align 4
765
draw_display:
766
 
767
	stdcall mem_copy, dword[buf_fon],dword[buf_displ],GAME_POLE_BYTES ;копирование изображения из фонового буфера
768
	call DrawZaac
769
	call DrawWolf ;рисуем волка
770
	call DrawEggs
771
 
772
	stdcall [buf2d_draw_text], buf_displ, buf_font,game_text,GAME_POLE_W/2,OFFS_SHADOW_X,[color_curici] ;рисуем строку с текстом
773
 
774
	stdcall [buf2d_draw], buf_displ
775
 
776
;mov eax,4 ;рисование текста
777
;mov ebx,(GAME_POLE_W/2)*65536+OFFS_SHADOW_X
778
;mov ecx,[color_curici]
779
;or  ecx,0x80000000
780
;mov edx,some_text
781
;mcall
782
 
783
	ret
784
 
785
align 4
786
button:
787
	mcall 17 ;получить код нажатой кнопки
788
	cmp ah,1
789
	jne still
790
.exit:
791
	stdcall [buf2d_delete],buf_fon ;удаляем буфер
792
	stdcall [buf2d_delete],buf_displ ;удаляем буфер
793
 
794
	stdcall [buf2d_delete],buf_tr_fon0
795
	stdcall [buf2d_delete],buf_tr_fon1
796
	stdcall [buf2d_delete],buf_tr_fon2
797
 
798
	stdcall [buf2d_delete],buf_font
799
 
800
	cld
801
	mov ecx,9
802
	mov edi,buf_wolf
803
	@@: ;удаляем 9 буферов с волком и зайцем
804
		stdcall [buf2d_delete],edi
805
		add edi,BUF_STRUCT_SIZE
806
		loop @b
807
	mov ecx,13
808
	mov edi,buf_chi
809
	@@: ;удаляем 13 буферов
810
		stdcall [buf2d_delete],edi
811
		add edi,BUF_STRUCT_SIZE
812
		loop @b
813
	mov ecx,22
814
	mov edi,buf_egg
815
	@@: ;удаляем 22 буфера
816
		stdcall [buf2d_delete],edi
817
		add edi,BUF_STRUCT_SIZE
818
		loop @b
819
 
820
	mcall -1 ;выход из программы
821
 
822
head_f_i:
823
head_f_l  db 'Системная ошибка',0
824
 
825
system_dir0 db '/sys/lib/'
826
name_buf2d db 'buf2d.obj',0
827
err_message_found_lib0 db 'Не удалось найти библиотеку buf2d.obj',0
828
err_message_import0 db 'Ошибка при импорте библиотеки buf2d.obj',0
829
 
830
system_dir1 db '/sys/lib/'
831
name_libimg db 'libimg.obj',0
832
err_message_found_lib1 db 'Не удалось найти библиотеку libimg.obj',0
833
err_message_import1 db 'Ошибка при импорте библиотеки libimg.obj',0
834
 
835
;library structures
836
l_libs_start:
837
	lib0 l_libs name_buf2d,  sys_path, file_name, system_dir0, err_message_found_lib0, head_f_l, import_buf2d_lib, err_message_import0, head_f_i
838
	lib1 l_libs name_libimg, sys_path, file_name, system_dir1, err_message_found_lib1, head_f_l, import_libimg, err_message_import1, head_f_i
839
load_lib_end:
840
 
841
align 4
842
proc mem_copy, source:dword, destination:dword, len:dword
843
  push ecx esi edi
844
    cld
845
    mov esi, dword[source]
846
    mov edi, dword[destination]
847
    mov ecx, dword[len]
848
    rep movsb
849
  pop edi esi ecx
850
  ret
851
endp
852
 
853
align 4
854
convert_to_str:
855
	pushad
856
	;mov eax,dword[value]
857
	;mov edi,dword[text]
858
	mov dword[edi+1],0
859
	cld
860
	call .str
861
	popad
862
	ret
863
 
864
 
865
align 4
866
.str:
867
  mov ecx,0x0a ;задается система счисления изменяются регистры ebx,eax,ecx,edx входные параметры eax - число
868
    ;преревод числа в ASCII строку взодные данные ecx=система счисленя edi адрес куда записывать, будем строку, причем конец переменной
869
  cmp eax,ecx  ;сравнить если в eax меньше чем в ecx то перейти на @@-1 т.е. на pop eax
870
  jb @f
871
  xor edx,edx  ;очистить edx
872
  div ecx      ;разделить - остаток в edx
873
  push edx     ;положить в стек
874
  ;dec edi             ;смещение необходимое для записи с конца строки
875
  call .str;перейти на саму себя т.е. вызвать саму себя и так до того момента пока в eax не станет меньше чем в ecx
876
  pop eax
877
  @@: ;cmp al,10 ;проверить не меньше ли значение в al чем 10 (для системы счисленя 10 данная команда - лишная))
878
  ;sbb al,$69  ;- честно данная инструкция меня заставляет задуматься т.е. я не знаю как это работает
879
  ;das        ;после данной команды как бы происходит уменьшение al на 66h  (в книге написано другое)
880
  or al,0x30  ;данная команда короче  чем две выше
881
  stosb       ;записать элемент из регистра al в ячеку памяти es:edi
882
  ret	      ;вернуться чень интересный ход т.к. пока в стеке храниться кол-во вызовов то столько раз мы и будем вызываться
883
 
884
 
885
last_time dd ?
886
image_data dd 0 ;память для преобразования картинки функциями libimg
887
image_data_gray dd 0 ;память с временными серыми изображениями в формате 24-bit, из которых будут создаваться трафареты
888
 
889
run_file_70 FileInfoBlock
890
hed db 'Nu pogodi 29.07.10',0 ;подпись окна
891
sc system_colors  ;системные цвета
892
 
893
align 4
894
buf_fon: ;фоновый буфер
895
	dd 0 ;указатель на буфер изображения
896
	dw 0 ;+4 left
897
	dw 0 ;+6 top
898
	dd GAME_POLE_W ;+8 w
899
	dd GAME_POLE_H ;+12 h
900
	dd 0xffffff ;+16 color
901
	db 24 ;+20 bit in pixel
902
 
903
align 4
904
buf_font: ;буфер со шрифтом
905
	dd 0 ;указатель на буфер изображения
906
	dw 25 ;+4 left
907
	dw 25 ;+6 top
908
	dd 128 ;+8 w
909
	dd 144 ;+12 h
910
	dd 0 ;+16 color
911
	db 24 ;+20 bit in pixel
912
 
913
align 4
914
buf_tr_fon0: ;буфер с домиками и рейками
915
	dd 0 ;указатель на буфер изображения
916
	dw 0 ;+4 left
917
	dw 0 ;+6 top
918
	dd GAME_POLE_W ;+8 w
919
	dd GAME_POLE_H ;+12 h
920
	dd 0xffffff ;+16 color
921
	db 24 ;+20 bit in pixel
922
align 4
923
buf_tr_fon1: ;буфер с курицами
924
	dd 0 ;указатель на буфер изображения
925
	dw 0 ;+4 left
926
	dw 0 ;+6 top
927
	dd GAME_POLE_W ;+8 w
928
	dd GAME_POLE_H ;+12 h
929
	dd 0xffffff ;+16 color
930
	db 24 ;+20 bit in pixel
931
align 4
932
buf_tr_fon2: ;буфер с растениями
933
	dd 0 ;указатель на буфер изображения
934
	dw 0 ;+4 left
935
	dw 0 ;+6 top
936
	dd GAME_POLE_W ;+8 w
937
	dd GAME_POLE_H ;+12 h
938
	dd 0xffffff ;+16 color
939
	db 24 ;+20 bit in pixel
940
 
941
align 4
942
buf_displ:
943
	dd 0 ;указатель на буфер изображения
944
	dw 25,0
945
	dd GAME_POLE_W ;+8 w
946
	dd GAME_POLE_H ;+12 h
947
	dd 0 ;+16 color
948
	db 24 ;+20 bit in pixel
949
 
950
align 4
951
buf_wolf:
952
	rb 9*BUF_STRUCT_SIZE
953
 
954
align 4
955
buf_egg:
956
	rb 22*BUF_STRUCT_SIZE
957
 
958
align 4
959
buf_chi:
960
	rb 13*BUF_STRUCT_SIZE
961
 
962
align 4
963
import_libimg:
964
  dd alib_init1
965
  img_is_img  dd aimg_is_img
966
  img_info    dd aimg_info
967
  img_from_file dd aimg_from_file
968
  img_to_file dd aimg_to_file
969
  img_from_rgb dd aimg_from_rgb
970
  img_to_rgb  dd aimg_to_rgb
971
  img_to_rgb2 dd aimg_to_rgb2
972
  img_decode  dd aimg_decode
973
  img_encode  dd aimg_encode
974
  img_create  dd aimg_create
975
  img_destroy dd aimg_destroy
976
  img_destroy_layer dd aimg_destroy_layer
977
  img_count   dd aimg_count
978
  img_lock_bits dd aimg_lock_bits
979
  img_unlock_bits dd aimg_unlock_bits
980
  img_flip    dd aimg_flip
981
  img_flip_layer dd aimg_flip_layer
982
  img_rotate  dd aimg_rotate
983
  img_rotate_layer dd aimg_rotate_layer
984
  img_draw    dd aimg_draw
985
 
986
  dd 0,0
987
  alib_init1   db 'lib_init',0
988
  aimg_is_img  db 'img_is_img',0 ;определяет по данным, может ли библиотека сделать из них изображение
989
  aimg_info    db 'img_info',0
990
  aimg_from_file db 'img_from_file',0
991
  aimg_to_file db 'img_to_file',0
992
  aimg_from_rgb db 'img_from_rgb',0
993
  aimg_to_rgb  db 'img_to_rgb',0 ;преобразование изображения в данные RGB
994
  aimg_to_rgb2 db 'img_to_rgb2',0
995
  aimg_decode  db 'img_decode',0 ;автоматически определяет формат графических данных
996
  aimg_encode  db 'img_encode',0
997
  aimg_create  db 'img_create',0
998
  aimg_destroy db 'img_destroy',0
999
  aimg_destroy_layer db 'img_destroy_layer',0
1000
  aimg_count   db 'img_count',0
1001
  aimg_lock_bits db 'img_lock_bits',0
1002
  aimg_unlock_bits db 'img_unlock_bits',0
1003
  aimg_flip    db 'img_flip',0
1004
  aimg_flip_layer db 'img_flip_layer',0
1005
  aimg_rotate  db 'img_rotate',0
1006
  aimg_rotate_layer db 'img_rotate_layer',0
1007
  aimg_draw    db 'img_draw',0
1008
 
1009
align 4
1010
import_buf2d_lib:
1011
	dd sz_lib_init
1012
	buf2d_create dd sz_buf2d_create
1013
	buf2d_create_f_img dd sz_buf2d_create_f_img
1014
	buf2d_clear dd sz_buf2d_clear
1015
	buf2d_draw dd sz_buf2d_draw
1016
	buf2d_delete dd sz_buf2d_delete
1017
	buf2d_line dd sz_buf2d_line
1018
	buf2d_circle dd sz_buf2d_circle
1019
	buf2d_img_hdiv2 dd sz_buf2d_img_hdiv2
1020
	buf2d_img_wdiv2 dd sz_buf2d_img_wdiv2
1021
	buf2d_conv_24_to_8 dd sz_buf2d_conv_24_to_8
1022
	buf2d_conv_24_to_32 dd sz_buf2d_conv_24_to_32
1023
	buf2d_bit_blt dd sz_buf2d_bit_blt
1024
	buf2d_bit_blt_transp dd sz_buf2d_bit_blt_transp
1025
	buf2d_bit_blt_alpha dd sz_buf2d_bit_blt_alpha
1026
	buf2d_cruve_bezier dd sz_buf2d_cruve_bezier
1027
	buf2d_convert_text_matrix dd sz_buf2d_convert_text_matrix
1028
	buf2d_draw_text dd sz_buf2d_draw_text
1029
	buf2d_crop_color dd sz_buf2d_crop_color
1030
	buf2d_offset_h dd sz_buf2d_offset_h
1031
	dd 0,0
1032
	sz_lib_init db 'lib_init',0
1033
	sz_buf2d_create db 'buf2d_create',0
1034
	sz_buf2d_create_f_img db 'buf2d_create_f_img',0
1035
	sz_buf2d_clear db 'buf2d_clear',0
1036
	sz_buf2d_draw db 'buf2d_draw',0
1037
	sz_buf2d_delete db 'buf2d_delete',0
1038
	sz_buf2d_line db 'buf2d_line',0
1039
	sz_buf2d_circle db 'buf2d_circle',0 ;рисование окружности
1040
	sz_buf2d_img_hdiv2 db 'buf2d_img_hdiv2',0
1041
	sz_buf2d_img_wdiv2 db 'buf2d_img_wdiv2',0
1042
	sz_buf2d_conv_24_to_8 db 'buf2d_conv_24_to_8',0
1043
	sz_buf2d_conv_24_to_32 db 'buf2d_conv_24_to_32',0
1044
	sz_buf2d_bit_blt db 'buf2d_bit_blt',0
1045
	sz_buf2d_bit_blt_transp db 'buf2d_bit_blt_transp',0
1046
	sz_buf2d_bit_blt_alpha db 'buf2d_bit_blt_alpha',0
1047
	sz_buf2d_cruve_bezier db 'buf2d_cruve_bezier',0
1048
	sz_buf2d_convert_text_matrix db 'buf2d_convert_text_matrix',0
1049
	sz_buf2d_draw_text db 'buf2d_draw_text',0
1050
	sz_buf2d_crop_color db 'buf2d_crop_color',0
1051
	sz_buf2d_offset_h db 'buf2d_offset_h',0
1052
 
1053
i_end:
1054
	rb 1024
1055
	align 16
1056
	procinfo process_information
1057
stacktop:
1058
	sys_path rb 4096
1059
	file_name:
1060
		rb 4096
1061
	plugin_path:
1062
		rb 4096
1063
	openfile_path:
1064
		rb 4096
1065
	filename_area:
1066
		rb 256
1067
mem: