Subversion Repositories Kolibri OS

Rev

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