Subversion Repositories Kolibri OS

Rev

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