Subversion Repositories Kolibri OS

Rev

Rev 1577 | Rev 1619 | 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'
1609 IgorA 15
include '../../../develop/libraries/box_lib/trunk/box_lib.mac' ;макросы для задания элементов box_lib
1535 IgorA 16
include 'mem.inc'
17
include 'dll.inc'
18
 
19
@use_library_mem mem.Alloc,mem.Free,mem.ReAlloc, dll.Load
20
 
21
;флаги, для функции обрезания буфера
22
BUF2D_OPT_CROP_TOP equ 1 ;обрезка сверху
23
BUF2D_OPT_CROP_LEFT equ 2 ;обрезка слева
24
BUF2D_OPT_CROP_BOTTOM equ 4 ;обрезка снизу
25
BUF2D_OPT_CROP_RIGHT equ 8 ;обрезка справа
26
BUF2D_BIT_OPT_CROP_TOP equ 0
27
BUF2D_BIT_OPT_CROP_LEFT equ 1
28
BUF2D_BIT_OPT_CROP_BOTTOM equ 2
29
BUF2D_BIT_OPT_CROP_RIGHT equ 3
30
 
31
BUF_STRUCT_SIZE equ 21
32
buf2d_data equ dword[edi] ;данные буфера изображения
33
buf2d_w equ dword[edi+8] ;ширина буфера
34
buf2d_h equ dword[edi+12] ;высота буфера
1538 IgorA 35
buf2d_l equ word[edi+4] ;отступ слева
1535 IgorA 36
buf2d_t equ word[edi+6] ;отступ сверху
37
buf2d_size_lt equ dword[edi+4] ;отступ слева и справа для буфера
38
buf2d_color equ dword[edi+16] ;цвет фона буфера
39
buf2d_bits equ byte[edi+20] ;количество бит в 1-й точке изображения
40
 
41
struct FileInfoBlock
42
	Function dd ?
43
	Position dd ?
44
	Flags	 dd ?
45
	Count	 dd ?
46
	Buffer	 dd ?
47
		db ?
48
	FileName dd ?
49
ends
50
 
1552 IgorA 51
displ_w dd ? ;ширина поля
52
displ_h dd ? ;высота поля
53
displ_bytes dd ? ;размер 1-го файла с изображением
1573 IgorA 54
offs_shadow_x dd ? ;сдвиг теней по оси 'x'
55
offs_shadow_y dd ? ;сдвиг теней по оси 'y'
1552 IgorA 56
 
1535 IgorA 57
IMAGE_FONT_SIZE equ 128*144*3
58
 
1538 IgorA 59
BUT1_T equ 10 ;отступ сверху
60
BUT1_L equ 15 ;отступ слева
61
BUT1_W equ 50 ;ширина
62
BUT1_H equ 20 ;высота
63
BUT1_NEXT_TOP equ (BUT1_T+BUT1_H)*65536
64
 
1609 IgorA 65
game_select_mode db 1 ;режим выбора игры
1573 IgorA 66
 
1555 IgorA 67
FILE_NAME_MAX equ 20 ;максимальная длинна имени файла (без папок, относительно текущей)
68
;значения имен по умолчанию
1573 IgorA 69
ini_def_decorat_file db 'curici.png',0
1555 IgorA 70
ini_def_unit_file db 'wolf.png',0
1577 IgorA 71
ini_def_objects_file db 'eggs.png',0
1609 IgorA 72
ini_def_lost_file db 'chi.png',0
1555 IgorA 73
;имена файлов
1573 IgorA 74
fn_icon0 rb FILE_NAME_MAX ;имя файла с декорациями
1555 IgorA 75
fn_icon1 rb FILE_NAME_MAX ;имя файла с волком и зайцем
1577 IgorA 76
fn_icon2 rb FILE_NAME_MAX ;имя файла с яйцами
1609 IgorA 77
fn_icon3 rb FILE_NAME_MAX ;имя файла с циплятами
1535 IgorA 78
fn_font db 'font8x9.bmp',0
79
 
1609 IgorA 80
fn_icon_tl_sys db 'tl_sys_16.png',0
81
TREE_ICON_SYS16_BMP_SIZE equ 256*3*11+54 ;размер bmp файла с системными иконками
82
 
83
ini_m_name db 'main.ini',0
84
key_count db 'count',0
85
key_game db 'g'
86
	key_game_ind db 0,0,0
87
 
88
ini_name rb FILE_NAME_MAX ;имя ini файла c выбранной игрой
1552 IgorA 89
ini_sec_files db 'Files',0
1573 IgorA 90
key_file_decorat db 'file_decorat',0
1555 IgorA 91
key_file_unit db 'file_unit',0
1577 IgorA 92
key_file_objects db 'file_objects',0
1609 IgorA 93
key_file_lost db 'file_lost',0
1552 IgorA 94
key_displ_w db 'displ_w',0
95
key_displ_h db 'displ_h',0
1573 IgorA 96
key_shadow_x db 'offs_shadow_x',0
97
key_shadow_y db 'offs_shadow_y',0
1555 IgorA 98
 
1577 IgorA 99
ini_sec_game db 'Game',0
100
key_delay_a db 'delay_a',0
101
key_delay_b db 'delay_b',0
102
key_delay_min db 'delay_min',0
103
 
1552 IgorA 104
ini_sec_color db 'Colors',0
1573 IgorA 105
;ключи для считывания цветов из *.ini файла
106
key_color_fon db 'background',0
107
key_color_shadows db 'shadows',0
108
key_color_egg db 'objects',0
109
key_color_chick db 'lost',0
110
key_color_decorat: db 'dec'
111
	.ind: db '?',0
1552 IgorA 112
key_color_unit db 'unit',0
113
 
1538 IgorA 114
;цвета в игре
1573 IgorA 115
color_fon dd ? ;цвет фона
116
color_shadows dd ? ;цвет теней
117
color_wolf dd ? ;цвет волка и зайца
118
color_egg dd ? ;цвет яйца
119
color_chick dd ? ;цвет ципленка
120
color_decorat dd ?,?,? ;цвета декораций (курицы, перила, ...)
121
 
1538 IgorA 122
;цвета интерфейса
123
color_but_sm dd 0x808080 ;цвет маленьких кнопок
1552 IgorA 124
color_but_te dd 0xffffff ;цвет текста на кнопках
1535 IgorA 125
 
126
macro load_image_file path,buf,size { ;макрос для загрузки изображений
1552 IgorA 127
	copy_path path,sys_path,file_name,0x0 ;формируем полный путь к файлу изображения, подразумеваем что он в одной папке с программой
128
 
1535 IgorA 129
	stdcall mem.Alloc, dword size ;выделяем память для изображения
130
	mov [buf],eax
131
 
132
	mov eax,70 ;70-я функция работа с файлами
133
	mov [run_file_70.Function], 0
134
	mov [run_file_70.Position], 0
135
	mov [run_file_70.Flags], 0
136
	mov [run_file_70.Count], dword size
137
	m2m [run_file_70.Buffer], [buf]
138
	mov byte[run_file_70+20], 0
139
	mov [run_file_70.FileName], file_name
140
	mov ebx,run_file_70
141
	int 0x40 ;загружаем файл изображения
142
	cmp ebx,0xffffffff
143
	je @f
144
		;определяем вид изображения и переводим его во временный буфер image_data
145
		stdcall dword[img_decode], dword[buf],ebx,0
146
		mov dword[image_data],eax
147
		;преобразуем изображение к формату rgb
148
		stdcall dword[img_to_rgb2], dword[image_data],dword[buf]
149
		;удаляем временный буфер image_data
150
		stdcall dword[img_destroy], dword[image_data]
151
	@@:
152
}
153
 
154
;данные игры
155
bit_zaac equ 2 ;бит зайца
156
val_zaac equ 4 ;цифра отвечающая за бит зайца
157
bit_mig equ 3 ;бит мигания
158
val_mig equ 8 ;цифра отвечающая за бит мигания
159
mask_lot_lu    equ 1b ;маска для левого верхнего лотка
160
mask_lot_ld    equ 100000b ;маска для левого нижнего лотка
161
mask_lot_ru    equ 10000000000b ;маска для правого верхнего лотка
162
mask_lot_rd    equ 1000000000000000b ;маска для правого нижнего лотка
163
mask_clear_all equ 11111011111011110111101111011110b ;маска для очистки падающих яиц и прибежавших циплят
1573 IgorA 164
mask_move_eggs equ 11111111111111111111b ;маска движущихся яиц
1535 IgorA 165
mask_fail_eggs equ 100001000010000100000b ;маска падающих яиц
166
mask_chi_left  equ 11111000000000000000000000b ;маска левых циплят
167
mask_chi_right equ 11111000000000000000000000000000b ;маска правых циплят
168
mask_chi_cr_l  equ 1000000000000000000000b ;маска для создания левого
169
mask_chi_cr_r  equ 1000000000000000000000000000b ;маска для создания правого
170
bit_chi_left  equ 21 ;1-й бит который отвечает за бегущего слева
171
bit_chi_right equ 27 ;1-й бит который отвечает за бегущего права
1538 IgorA 172
val_zaac_time_y equ 5 ;колличество тактов, которое обязательно должен провисеть заяц
173
val_zaac_time_n equ 7 ;колличество тактов, которое обязательно должен быть спрятанным заяц
1535 IgorA 174
 
1552 IgorA 175
txt_game_a db 'Игра А',0
176
txt_game_b db 'Игра Б',0
177
 
1573 IgorA 178
zaac_status db 0 ;число тактов, которое заяц не должен менять свое положение
1535 IgorA 179
pos_wolf db 0 ;позиция волка 0-й бит слева/справа, 1-й бит сверху/вниз
180
;rb 1
181
pos_eggs dd 0 ;позиции расположения яиц и циплят
182
eggs_count dw 0 ;колличество пойманых яиц
183
game_text db 'Игра _',13
184
some_text db '0'
185
	rb 8 ;текст с числом пойманных яиц
186
count_last db 0 ;счетчик пропущенных яиц
187
game_spd dd 0 ;задержка игры
1577 IgorA 188
game_delay_a dd ? ;первоначальная задержка для игры А
189
game_delay_b dd ? ;первоначальная задержка для игры Б
190
game_delay_min dd ? ;минимальная задержка
1535 IgorA 191
 
192
;для генерации случайных чисел
193
rand_x dd 0
194
 
195
align 4
196
rand_next:
197
;x(k+1) = (a*x(k)+c) mod m
198
; a=22695477, c=1, m=2^32
199
push eax
200
	mov eax,dword[rand_x]
201
	imul eax,22695477
202
	inc eax
203
	mov dword[rand_x],eax
204
pop eax
205
	ret
206
 
207
;создаем прозрачные буфера по 8 бит (трафареты), для рисования
208
;где buf - буфер на основе которого будет создан трафарет
209
;фоновый цвет буфера должен быть 0xffffff, иначе не произойдет обрезка
210
;по фоновому цвету и трафарет будет занимат ьмного места в памяти
211
align 4
212
proc CreateTrapharetBuffer, buf:dword, img_data:dword
1552 IgorA 213
	push eax edi
1535 IgorA 214
	mov edi,dword[buf]
1552 IgorA 215
 
216
	;заполнение данных буфера
217
	mov buf2d_size_lt,0
218
	mov eax,dword[displ_w]
219
	mov buf2d_w,eax
220
	mov eax,dword[displ_h]
221
	mov buf2d_h,eax
222
	mov buf2d_color,0xffffff
223
	mov buf2d_bits,24
224
 
1535 IgorA 225
	stdcall [buf2d_create_f_img], edi,[img_data] ;создаем буфер
226
	stdcall [buf2d_conv_24_to_8], edi,1 ;делаем буфер прозрачности 8бит
1538 IgorA 227
	;обрезаем лишние края буфера, для более быстрого рисования
228
	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 229
	pop edi eax
1535 IgorA 230
	ret
231
endp
232
 
233
align 4
234
InitBackgroundBuffer: ;создание фонового изображения
235
	pushad
236
	mov edi,buf_fon
237
	mov eax,[color_fon]
238
	mov buf2d_color,eax
239
	stdcall [buf2d_clear], edi,eax
240
	mov esi,edi
241
 
242
	xor eax,eax
1573 IgorA 243
	cld
244
	cmp dword[offs_shadow_x],0
245
	jne @f
246
	cmp dword[offs_shadow_y],0
247
	jne @f
248
		jmp .end_shadows
249
	@@:
250
		mov edi,buf_decor
251
		xor ebx,ebx
252
		mov ecx,3
253
		@@:
254
			mov ax,buf2d_t
255
			add eax,[offs_shadow_y]
256
			mov bx,buf2d_l
257
			add ebx,[offs_shadow_x]
258
			stdcall [buf2d_bit_blt_alpha], esi, ebx,eax, edi,[color_shadows] ;рисуем тени декораций
259
			add edi,BUF_STRUCT_SIZE
260
			loop @b
261
	.end_shadows:
1535 IgorA 262
 
1552 IgorA 263
	mov edi,buf_decor
1573 IgorA 264
	mov ebx,color_decorat
265
	mov ecx,3
266
	@@:
267
		mov ax,buf2d_t
268
		stdcall [buf2d_bit_blt_alpha], esi, 0,eax, edi,[ebx] ;рисуем декорации
269
		add edi,BUF_STRUCT_SIZE
270
		add ebx,4
271
		loop @b
1535 IgorA 272
	popad
273
	ret
274
 
275
;рисует картинку в буфере buf из массива буферов buf_img с индексом ind
276
;т. е. buf <- buf_img[ind]
277
align 4
278
proc DrawArrayImg, buf:dword, buf_img:dword, ind:dword, color:dword
279
	pushad
280
		mov edi,dword[ind]
281
		imul edi,BUF_STRUCT_SIZE
282
		add edi,dword[buf_img]
283
 
284
		mov esi,dword[buf]
285
		xor eax,eax
286
		mov ax,buf2d_t
287
		xor ebx,ebx
288
		mov bx,buf2d_l
289
		stdcall [buf2d_bit_blt_alpha], esi, ebx,eax, edi,[color]
290
	popad
291
	ret
292
endp
293
 
294
align 4
295
DrawZaac: ;рисование зайца
296
	push eax
297
	bt word[pos_wolf],bit_zaac
298
	jae .end_mig
299
 
300
	stdcall DrawArrayImg, buf_displ,buf_wolf,6,[color_wolf] ;рисуем тело зайца
301
	mov eax,dword[pos_eggs]
302
	and eax,mask_chi_right+mask_chi_left
303
	cmp eax,0
304
	je .end_mig ;если нет бегающих циплят, то заяц рукой не машет
305
	bt word[pos_wolf],bit_mig
306
	jc @f
307
		stdcall DrawArrayImg, buf_displ,buf_wolf,7,[color_wolf] ;рисуем руку зайца вверху
308
		jmp .end_mig
309
	@@:
310
		stdcall DrawArrayImg, buf_displ,buf_wolf,8,[color_wolf] ;рисуем руку зайца внизу
311
	.end_mig:
312
	pop eax
313
	ret
314
 
315
align 4
316
DrawWolf: ;рисует волка с корзинами
317
	bt word[pos_wolf],0
318
	jc @f
319
		stdcall DrawArrayImg, buf_displ,buf_wolf,0,[color_wolf]
320
		bt word[pos_wolf],1
321
		jc .corz_ldn
322
			stdcall DrawArrayImg, buf_displ,buf_wolf,1,[color_wolf]
323
			jmp .corz_lend
324
		.corz_ldn:
325
			stdcall DrawArrayImg, buf_displ,buf_wolf,2,[color_wolf]
326
		.corz_lend:
327
		jmp .wolf_b
328
	@@:
329
		stdcall DrawArrayImg, buf_displ,buf_wolf,3,[color_wolf]
330
		bt word[pos_wolf],1
331
		jc .corz_rdn
332
			stdcall DrawArrayImg, buf_displ,buf_wolf,4,[color_wolf]
333
			jmp .corz_rend
334
		.corz_rdn:
335
			stdcall DrawArrayImg, buf_displ,buf_wolf,5,[color_wolf]
336
		.corz_rend:
337
	.wolf_b:
338
	ret
339
 
340
align 4
341
DrawEggs: ;рисует яйца
342
	pushad
343
	cld
344
 
345
	mov eax,dword[pos_eggs]
346
	xor ebx,ebx
347
	mov ecx,20 ;цикл для рисования котящихся яиц
348
	@@:
349
		bt eax,ebx
350
		jae .draw_egg
351
			stdcall DrawArrayImg, buf_displ,buf_egg,ebx,[color_egg]
352
		.draw_egg:
353
		inc ebx
354
		loop @b
355
 
356
	;mov eax,dword[pos_eggs]
357
	and eax,mask_chi_left
358
	cmp eax,0
359
	je @f
360
		stdcall DrawArrayImg, buf_displ,buf_egg,20,[color_egg] ;разбитое яйцо слева
361
	@@:
362
	mov eax,dword[pos_eggs]
363
	and eax,mask_chi_right
364
	cmp eax,0
365
	je @f
366
		stdcall DrawArrayImg, buf_displ,buf_egg,21,[color_egg] ;разбитое яйцо справа
367
	@@:
368
 
369
	mov eax,dword[pos_eggs]
370
	xor edx,edx
371
	mov ebx,bit_chi_left
372
	mov ecx,5 ;цикл для рисования левых циплят
373
	@@:
374
		bt eax,ebx
375
		jae .draw_chick_l
376
			stdcall DrawArrayImg, buf_displ,buf_chi,edx,[color_chick]
377
		.draw_chick_l:
378
		inc ebx
379
		inc edx
380
		loop @b
381
	mov ebx,bit_chi_right
382
	mov ecx,5 ;цикл для рисования правых циплят
383
	@@:
384
		bt eax,ebx
385
		jae .draw_chick_r
386
			stdcall DrawArrayImg, buf_displ,buf_chi,edx,[color_chick]
387
		.draw_chick_r:
388
		inc ebx
389
		inc edx
390
		loop @b
391
 
392
	xor eax,eax
393
	mov al,byte[count_last]
394
	mov ecx,eax ;цикл для рисования штрафных очков
395
	shr ecx,1
396
	mov edx,10 ;индекс начала штрафных иконок в буфере buf_chi
397
	cmp ecx,0
398
	je .no_unit_last
399
	@@:
400
		stdcall DrawArrayImg, buf_displ,buf_chi,edx,[color_chick]
401
		inc edx
402
		loop @b
403
	.no_unit_last:
404
 
405
	bt ax,0 ;проверяем мигающее не четное очко
406
	jae @f
407
		bt word[pos_wolf],bit_mig
408
		jc @f
409
			stdcall DrawArrayImg, buf_displ,buf_chi,edx,[color_chick] ;мигающее штрафное очко
410
	@@:
411
 
412
	popad
413
	ret
414
 
415
align 4
416
CountEggsInc: ;увеличиваем счетчик яиц на 1
417
	push eax edi
418
		xor eax,eax
419
		inc word[eggs_count] ;увеличиваем счетчик яиц
420
		cmp word[eggs_count],200 ;бонусные очки
421
		je @f
422
		cmp word[eggs_count],500 ;бонусные очки
423
		je @f
424
			jmp .no_bonus
425
		@@:
426
			mov byte[count_last],0
427
		.no_bonus:
428
 
429
		mov ax,word[eggs_count]
430
		mov edi,some_text
431
		call convert_to_str ;обновляем текстовую строку
432
		and ax,0xf ;через каждые 16 яиц уменьшаем время
433
		cmp ax,0
434
		jne @f
1577 IgorA 435
			mov edi,dword[game_delay_min] ;минимальная задержка
436
			cmp dword[game_spd],edi
1535 IgorA 437
			jle @f
438
				dec dword[game_spd]
439
		@@:
440
	pop edi eax
441
	ret
442
 
443
;input:
444
; eax - маска, указывающая с какой строны упало яйцо
445
align 4
446
CountLastInc: ;начисление штрафных очков
447
	inc byte[count_last] ;половинао штрафного очка
448
	bt word[pos_wolf],bit_zaac
449
	jc @f
450
		inc byte[count_last] ;если нет зайца то еще 1-на половина штрафного очка
451
	@@:
452
	cmp byte[count_last],6
453
	jle @f
454
		mov byte[count_last],6 ;ставим ограничени на число штрафных очков
455
	@@:
456
	or dword[pos_eggs],eax ;создаем бегущего ципленка
457
	ret
458
 
459
align 4
460
MoveEggs:
461
	pushad
462
	xor byte[pos_wolf],val_mig ;бит для мигания
463
 
464
	cmp byte[count_last],6 ;максимальное число штрафных очков
465
	je .end_fun
466
 
467
	rol dword[pos_eggs],1
468
	mov ecx,dword[pos_eggs]
469
	and ecx,mask_fail_eggs
470
	cmp ecx,0
471
	je .no_fail ;нет падающих яиц
472
		;начисление яиц попавших в корзину
473
		;или начисление штрафных очков
474
		xor ebx,ebx
475
		mov bl,byte[pos_wolf] ;берем параметры (позицию) волка
476
		and bl,3 ;на всякий случай
477
 
478
		bt ecx,5 ;проверяем верхнее левое перило
479
		jae .perilo_lu
480
			cmp bx,0 ;проверяем наличие корзины
481
			jne @f
482
				call CountEggsInc
483
				jmp .perilo_lu
484
			@@:
485
				mov eax,mask_chi_cr_l
486
				call CountLastInc
487
			.perilo_lu:
488
		bt ecx,10 ;проверяем нижнее левое перило
489
		jae .perilo_ld
490
			cmp bx,2 ;проверяем наличие корзины
491
			jne @f
492
				call CountEggsInc
493
				jmp .perilo_ld
494
			@@:
495
				mov eax,mask_chi_cr_l
496
				call CountLastInc
497
		.perilo_ld:
498
		bt ecx,15 ;проверяем верхнее правое перило
499
		jae .perilo_ru
500
			cmp bx,1 ;проверяем наличие корзины
501
			jne @f
502
				call CountEggsInc
503
				jmp .perilo_ru
504
			@@:
505
				mov eax,mask_chi_cr_r
506
				call CountLastInc
507
		.perilo_ru:
508
		bt ecx,20 ;проверяем нижнее правое перило
509
		jae .perilo_rd
510
			cmp bx,3 ;проверяем наличие корзины
511
			jne @f
512
				call CountEggsInc
513
				jmp .perilo_rd
514
			@@:
515
				mov eax,mask_chi_cr_r
516
				call CountLastInc
517
		.perilo_rd:
518
	.no_fail:
519
 
520
	and dword[pos_eggs],mask_clear_all ;очистка упавших яиц и добежавших курей
521
 
522
	call rand_next
1538 IgorA 523
	cmp byte[zaac_status],0
524
	jle @f
525
		dec byte[zaac_status]
526
		jmp .no_zaac_move ;заяц пока не двигается
527
	@@:
528
 
529
	bt dword[rand_x],6 ;заяц от фонаря меняет статус
1535 IgorA 530
	jc @f
531
		xor byte[pos_wolf],val_zaac ;высовываем/засовываем зайца
1538 IgorA 532
		bt word[pos_wolf],val_zaac
533
		jc .zaac_n
534
			mov byte[zaac_status],val_zaac_time_y ;ставим минимальное время для смены статуса
535
			jmp @f
536
		.zaac_n:
537
			mov byte[zaac_status],val_zaac_time_n ;ставим минимальное время для смены статуса
1535 IgorA 538
	@@:
1538 IgorA 539
	.no_zaac_move:
1535 IgorA 540
 
541
	;создание новых яиц
1573 IgorA 542
	cmp word[eggs_count],5 ;первые 5 яиц катятся по 1-му
543
	jge @f
544
		mov ecx,dword[pos_eggs]
545
		and ecx,mask_move_eggs
546
		;cmp ecx,0
547
		jnz .end_creat
548
	@@:
549
 
1535 IgorA 550
	bt dword[rand_x],4 ;проверяем будем ли создавать новое яйцо
551
	jc .end_creat
552
	bt dword[rand_x],5 ;проверяем с какой стороны будем создавать новое яйцо
553
	jc .creat_r
554
		bt dword[rand_x],7
555
		jc @f
556
			or dword[pos_eggs],mask_lot_lu
557
			jmp .end_creat
558
		@@:
559
			or dword[pos_eggs],mask_lot_ld
560
			jmp .end_creat
561
	.creat_r:
562
		bt dword[rand_x],7
563
		jc @f
564
			or dword[pos_eggs],mask_lot_ru
565
			jmp .end_creat
566
		@@:
567
			or dword[pos_eggs],mask_lot_rd
568
			;jmp .end_creat
569
	.end_creat:
570
 
571
	.end_fun:
572
	popad
573
	ret
574
 
575
align 4
576
proc InitGame, b:dword ;первоначальные настройки игры
577
	mov word[eggs_count],0 ;колличество пойманых яиц
578
	mov byte[some_text],'0'
579
	mov byte[some_text+1],0 ;текст с числом пойманных яиц
1577 IgorA 580
	mov byte[count_last],0 ;штрафные очки
1535 IgorA 581
	mov dword[pos_eggs],0
1538 IgorA 582
	mov byte[zaac_status],0
1535 IgorA 583
 
1577 IgorA 584
	push eax ebx
1535 IgorA 585
	cmp dword[b],0
586
	jne @f
587
		mov byte[game_text+5],'А'
1577 IgorA 588
		mov eax,dword[game_delay_a]
589
		mov dword[game_spd],eax ;задержка игры
1535 IgorA 590
		jmp .end_init
591
	@@:
592
		mov byte[game_text+5],'Б'
1577 IgorA 593
		mov eax,dword[game_delay_b]
594
		mov dword[game_spd],eax ;задержка игры
1535 IgorA 595
	.end_init:
596
 
1577 IgorA 597
	mcall 26,9
598
	mov dword[rand_x],eax ;заполняем 1-е случайное число
1535 IgorA 599
	pop ebx eax
600
 
601
	ret
602
endp
603
 
604
align 4
1552 IgorA 605
proc LoadArrayBuffer, f_name:dword, buf_start:dword, count:dword
606
	pushad
607
	mov edx,dword[displ_bytes]
608
	mov ecx,edx
609
	imul ecx,dword[count]
610
	mov eax,dword[f_name]
611
	load_image_file eax,image_data_gray,ecx
612
		mov edx,dword[displ_bytes]
613
		mov eax,[image_data_gray]
614
		mov edi,dword[buf_start]
615
		mov ecx,dword[count]
616
		cld
617
		@@: ;считываем 3 буфера с декорациями
618
			stdcall CreateTrapharetBuffer,edi,eax
619
			add eax,edx
620
			add edi,BUF_STRUCT_SIZE
621
			loop @b
622
	stdcall mem.Free,[image_data_gray] ;освобождаем память
623
	popad
624
	ret
625
endp
626
 
1609 IgorA 627
txt_tile_type_0 rb FILE_NAME_MAX
628
 
1552 IgorA 629
align 4
1609 IgorA 630
user_is_select:
631
	push ecx esi edi
632
 
633
	stdcall [tl_node_get_data], tree1
634
	pop esi
635
	cmp esi,0 ;если имя игры пустое
636
	je @f
637
		mov edi,ini_name
638
		mov ecx,FILE_NAME_MAX
639
		cld
640
		rep movsb
1535 IgorA 641
 
1609 IgorA 642
		mov byte[game_select_mode],0
643
		call InitAll
1535 IgorA 644
	@@:
1609 IgorA 645
	pop edi esi ecx
1535 IgorA 646
 
1609 IgorA 647
	call draw_window
648
	ret
1535 IgorA 649
 
1609 IgorA 650
;******************************************************************************
651
; функция, которая 1 раз делает все настройки нужные для игры
652
;******************************************************************************
653
align 4
654
InitAll:
655
	pushad
1552 IgorA 656
	;работа с файлом настроек
657
	copy_path ini_name,sys_path,file_name,0x0
658
	stdcall dword[ini_get_int],file_name,ini_sec_files,key_displ_w,210
659
	mov	dword[displ_w],eax
660
	stdcall dword[ini_get_int],file_name,ini_sec_files,key_displ_h,140
661
	mov	dword[displ_h],eax
1573 IgorA 662
	stdcall dword[ini_get_str],file_name,ini_sec_files,key_file_decorat,fn_icon0,FILE_NAME_MAX,ini_def_decorat_file
663
	stdcall dword[ini_get_str],file_name,ini_sec_files,key_file_unit,fn_icon1,FILE_NAME_MAX,ini_def_unit_file
1577 IgorA 664
	stdcall dword[ini_get_str],file_name,ini_sec_files,key_file_objects,fn_icon2,FILE_NAME_MAX,ini_def_objects_file
1609 IgorA 665
	stdcall dword[ini_get_str],file_name,ini_sec_files,key_file_lost,fn_icon3,FILE_NAME_MAX,ini_def_lost_file
666
 
1573 IgorA 667
	stdcall dword[ini_get_int],file_name,ini_sec_files,key_shadow_x,2
668
	mov	dword[offs_shadow_x],eax
669
	stdcall dword[ini_get_int],file_name,ini_sec_files,key_shadow_y,2
670
	mov	dword[offs_shadow_y],eax
671
 
1577 IgorA 672
	;считывание настроек влияющих на скорсть игры
673
	stdcall dword[ini_get_int],file_name,ini_sec_game,key_delay_a,65
674
	mov	dword[game_delay_a],eax
675
	stdcall dword[ini_get_int],file_name,ini_sec_game,key_delay_b,35
676
	mov	dword[game_delay_b],eax
677
	stdcall dword[ini_get_int],file_name,ini_sec_game,key_delay_min,15
678
	mov	dword[game_delay_min],eax
679
 
1573 IgorA 680
	stdcall dword[ini_get_color],file_name,ini_sec_color,key_color_fon,0xffffff
681
	mov	dword[color_fon],eax
682
	stdcall dword[ini_get_color],file_name,ini_sec_color,key_color_shadows,0xd0d0d0
683
	mov	dword[color_shadows],eax
1552 IgorA 684
	stdcall dword[ini_get_color],file_name,ini_sec_color,key_color_unit,0
685
	mov	dword[color_wolf],eax
1573 IgorA 686
	stdcall dword[ini_get_color],file_name,ini_sec_color,key_color_egg,0x404080
687
	mov	dword[color_egg],eax
688
	stdcall dword[ini_get_color],file_name,ini_sec_color,key_color_chick,0x00d0d0
689
	mov	dword[color_chick],eax
1535 IgorA 690
 
1573 IgorA 691
	mov ebx,color_decorat
692
	mov byte[key_color_decorat.ind],'0'
693
	mov ecx,3
694
	cld
695
	@@:
1577 IgorA 696
		push ecx ;функция ini_get_color имеет право манять регистр ecx
1573 IgorA 697
		stdcall dword[ini_get_color],file_name,ini_sec_color,key_color_decorat,0x000080
1577 IgorA 698
		pop ecx
1573 IgorA 699
		mov dword[ebx],eax
700
		add ebx,4
701
		inc byte[key_color_decorat.ind]
702
		loop @b
1555 IgorA 703
 
1552 IgorA 704
	mov edx,dword[displ_w]
705
	imul edx,dword[displ_h]
706
	lea edx,[edx+edx*2]
707
	mov dword[displ_bytes],edx ;вычисляем размер игрового поля
1535 IgorA 708
 
1552 IgorA 709
	stdcall LoadArrayBuffer, fn_icon0, buf_decor,3 ;считываем 3 буфера с декорациями
710
	stdcall LoadArrayBuffer, fn_icon1, buf_wolf,9 ;считываем 9 буферов с волком и зайцем
711
	stdcall LoadArrayBuffer, fn_icon2, buf_egg,22 ;считываем 22 буферов с яйцами
712
	stdcall LoadArrayBuffer, fn_icon3, buf_chi,13 ;считываем 13 буферов с циплятами
1535 IgorA 713
 
714
	load_image_file fn_font, image_data_gray,IMAGE_FONT_SIZE
715
	stdcall [buf2d_create_f_img], buf_font,[image_data_gray] ;создаем буфер
716
	stdcall mem.Free,[image_data_gray] ;освобождаем память
717
 
718
	stdcall [buf2d_conv_24_to_8], buf_font,1 ;делаем буфер прозрачности 8 бит
719
	stdcall [buf2d_convert_text_matrix], buf_font
720
 
721
;проверка занимаемого буфером места
722
;mov edi,buf_wolf
723
;add edi,BUF_STRUCT_SIZE ;переходим на буфер корзины
724
;stdcall [buf2d_clear],edi,0x808080 ;заливаем его серым цветом
725
 
1552 IgorA 726
	mov ebx,dword[displ_w]
727
	mov edx,dword[displ_h]
728
 
729
	mov edi,buf_displ
730
	mov buf2d_w,ebx
731
	mov buf2d_h,edx
1535 IgorA 732
	stdcall [buf2d_create], buf_displ ;создаем буфер для вывода на экран
1552 IgorA 733
 
734
	mov edi,buf_fon
735
	mov buf2d_w,ebx
736
	mov buf2d_h,edx
737
	stdcall [buf2d_create], buf_fon ;создаем буфер с фоновыми декорациями
738
 
1535 IgorA 739
	call InitBackgroundBuffer ;заполняем буфер с фоновыми декорациями
740
	stdcall InitGame,0
1609 IgorA 741
	popad
742
	ret
743
 
744
align 4
745
start:
746
	load_libraries l_libs_start,load_lib_end
747
 
748
	;проверка на сколько удачно загузилась наша либа
749
	mov	ebp,lib0
750
	cmp	dword [ebp+ll_struc_size-4],0
751
	jz	@f
752
		mcall -1 ;exit not correct
753
	@@:
754
	mov	ebp,lib1
755
	cmp	dword [ebp+ll_struc_size-4],0
756
	jz	@f
757
		mcall -1 ;exit not correct
758
	@@:
759
 
760
	mcall 40,0x27
761
	mcall 48,3,sc,sizeof.system_colors ;получаем системные цвета
762
 
763
;******************************************************************************
764
; подготовка списка игор
765
;******************************************************************************
766
	stdcall dword[tl_data_init], tree1
767
 
768
	load_image_file fn_icon_tl_sys, image_data_gray,TREE_ICON_SYS16_BMP_SIZE
769
	stdcall [buf2d_create_f_img], buf_tree_sys,[image_data_gray] ;создаем буфер
770
	stdcall mem.Free,[image_data_gray] ;освобождаем память
771
 
772
	mov edi,buf_tree_sys
773
	m2m dword[tree1.data_img_sys],buf2d_data
774
 
775
	;работа с главным файлом настроек
776
	copy_path ini_m_name,sys_path,file_name,0x0
777
 
778
	stdcall dword[ini_get_int],file_name,ini_sec_files,key_count,1
779
	mov	ecx,eax
780
	mov dl,'0'
781
	cld
782
	@@:
783
		mov byte[key_game_ind],dl
784
		inc dl
785
		push ecx edx
786
		stdcall dword[ini_get_str],file_name,ini_sec_files,key_game,txt_tile_type_0,FILE_NAME_MAX,ini_def_decorat_file
787
		stdcall dword[tl_node_add], txt_tile_type_0, 0, tree1 ;добавляем название игры
788
		stdcall dword[tl_cur_next], tree1 ;переносим курсор вниз, что-бы не поменялся порядок игр
789
		pop edx ecx
790
	loop @b
791
	stdcall dword[tl_cur_beg], tree1 ;переносим курсор вверх
792
 
1535 IgorA 793
	mcall 26,9
794
	mov [last_time],ebx
795
 
796
 
797
 
798
align 4
799
red_win:
800
	call draw_window
801
 
802
align 4
803
still: ;главный цикл
1609 IgorA 804
 
805
	cmp byte[game_select_mode],0
806
	jne .select_mode
807
 
808
	mcall 26,9 ;берем системное время
1535 IgorA 809
	mov ebx,[last_time]
810
	add ebx,dword[game_spd] ;delay
811
	sub ebx,eax
812
	cmp ebx,dword[game_spd] ;delay
813
	ja it_is_time_now
814
	test ebx,ebx
815
	jz it_is_time_now
816
	mcall 23
817
 
818
	cmp eax,0
819
	je it_is_time_now
820
 
1609 IgorA 821
	jmp @f
822
	.select_mode:
823
		mcall 10
824
	@@:
1535 IgorA 825
 
1609 IgorA 826
	cmp al,1 ;изменилось положение окна
1535 IgorA 827
	jz red_win
1609 IgorA 828
	cmp al,2
1535 IgorA 829
	jz key
1609 IgorA 830
	cmp al,3
1535 IgorA 831
	jz button
1609 IgorA 832
	cmp al,6
833
	jz mouse
1535 IgorA 834
 
835
	jmp still
836
 
837
align 4
1609 IgorA 838
mouse:
839
	cmp byte[game_select_mode],0
840
	je @f
841
		stdcall [tl_mouse], tree1 ;если игра еще не выбрана
842
	@@:
843
	jmp still
844
 
845
align 4
1535 IgorA 846
it_is_time_now:
847
	mcall 26,9
848
	mov [last_time],eax
849
 
1609 IgorA 850
	cmp byte[game_select_mode],0
851
	jne still
852
 
1535 IgorA 853
	;...здесь идут действия, вызываемые каждые delay сотых долей секунд...
854
	call MoveEggs
855
	call draw_display
856
	jmp still
857
 
858
align 4
859
key:
860
	push eax ebx
861
	mcall 2
862
 
1609 IgorA 863
	cmp byte[game_select_mode],0
864
	je @f
865
		stdcall [tl_key], tree1
866
	@@:
867
 
1535 IgorA 868
	cmp ah,176 ;Left
869
	jne @f
870
		and byte[pos_wolf],0xfe
871
	@@:
872
	cmp ah,179 ;Right
873
	jne @f
874
		or byte[pos_wolf],1
875
	@@:
876
	cmp ah,178 ;Up
877
	jne @f
878
		and byte[pos_wolf],0xff-2
879
	@@:
880
	cmp ah,177 ;Down
881
	jne @f
882
		or byte[pos_wolf],2
883
	@@:
884
 
885
	cmp ah,97 ;a
886
	jne @f
887
		and byte[pos_wolf],0xff-3 ;00
888
	@@:
889
	cmp ah,122 ;z
890
	jne @f
891
		and byte[pos_wolf],0xff-1
892
		or byte[pos_wolf],2 ;10
893
	@@:
894
	cmp ah,39 ;'
895
	jne @f
896
		and byte[pos_wolf],0xff-2
897
		or byte[pos_wolf],1 ;01
898
	@@:
899
	cmp ah,47 ;/
900
	jne @f
901
		or byte[pos_wolf],3 ;11
902
	@@:
903
 
904
	pop ebx eax
905
	jmp still
906
 
907
 
908
align 4
909
draw_window:
910
	pushad
911
	mcall 12,1
912
 
913
	xor eax,eax
1538 IgorA 914
	mov ebx,20*65536+480
915
	mov ecx,20*65536+270
1535 IgorA 916
	mov edx,[sc.work]
917
	;or edx,0x33000000
918
	or edx,0x73000000
919
	mov edi,hed
920
	mcall ;создание окна
921
 
1609 IgorA 922
	cmp byte[game_select_mode],0
923
	jne .select_mode
924
 
1535 IgorA 925
	mcall 9,procinfo,-1
926
	mov edi,buf_displ
927
	mov eax,dword[procinfo.client_box.width]
1552 IgorA 928
	cmp eax,dword[displ_w]
1535 IgorA 929
	jle @f
1552 IgorA 930
		sub eax,dword[displ_w]
1535 IgorA 931
		shr eax,1
932
		mov buf2d_l,ax ;выправниваем буфер по центру окна
933
	@@:
934
 
935
	call draw_display
936
 
937
	mov eax,13 ;рисование прямоугольника
938
	mov edx,[sc.work]
939
	xor esi,esi
940
	mov si,buf2d_l
1552 IgorA 941
	add esi,dword[displ_w]
1535 IgorA 942
	mov ebx,dword[procinfo.client_box.width]
943
	inc ebx
944
	cmp esi,ebx
945
	jge @f
946
		sub ebx,esi
947
		rol ebx,16
948
		mov bx,si
949
		rol ebx,16
950
		mov ecx,dword[procinfo.client_box.height]
951
		inc ecx
952
		int 0x40 ;рисование правого бокового поля
953
		jmp .draw_s
954
	@@:
955
		mov esi,dword[procinfo.client_box.width] ;когда по ширине не влазит
956
		inc esi
957
	.draw_s:
958
 
1538 IgorA 959
	; *** рисование кнопок ***
960
push esi
961
	mov eax,8
962
	xor ebx,ebx
963
	mov bx,buf2d_l
964
	add ebx,buf2d_w
965
	add ebx,BUT1_L
966
	shl ebx,16
967
	mov bx,BUT1_W
968
	mov ecx,BUT1_T*65536+BUT1_H
969
	mov edx,5
970
	;or edx,0x40000000
971
	mov esi,dword[color_but_sm]
972
	int 0x40
973
 
974
	inc edx
975
	add ecx,BUT1_NEXT_TOP
976
	int 0x40
977
pop esi
978
 
1552 IgorA 979
	mov eax,4 ;аЁбRў -Ё? в?Єбв 
980
	mov bx,BUT1_H
981
	add ebx,3*65536;+3
982
	mov ecx,dword[color_but_te]
983
	or  ecx,0x80000000
984
	mov edx,txt_game_a
985
	int 0x40
986
 
987
	ror ebx,16
988
	add ebx,BUT1_NEXT_TOP
989
	ror ebx,16
990
	mov edx,txt_game_b
991
	int 0x40
992
 
1538 IgorA 993
	; *** восстановление параметров ***
994
	mov eax,13 ;рисование прямоугольника
995
	mov edx,[sc.work]
996
 
1535 IgorA 997
	mov ebx,esi
998
	mov ecx,dword[procinfo.client_box.height]
999
	inc ecx
1552 IgorA 1000
	mov esi,dword[displ_h]
1535 IgorA 1001
	cmp esi,ebx
1002
	jge @f
1003
		sub ecx,esi
1004
		rol ecx,16
1005
		mov cx,si
1006
		rol ecx,16
1007
		int 0x40 ;рисование нижнего поля
1008
	@@:
1009
 
1010
	xor ebx,ebx
1011
	mov bx,buf2d_l
1552 IgorA 1012
	mov ecx,dword[displ_h]
1535 IgorA 1013
	int 0x40 ;рисование левого бокового поля
1014
 
1609 IgorA 1015
	jmp @f
1016
	.select_mode:
1017
		stdcall dword[tl_draw],dword tree1
1018
	@@:
1019
 
1535 IgorA 1020
	mcall 12,2
1021
	popad
1022
	ret
1023
 
1024
align 4
1025
draw_display:
1026
 
1609 IgorA 1027
	stdcall mem_copy, dword[buf_fon],dword[buf_displ],dword[displ_bytes] ;копирование изображения из фонового буфера
1552 IgorA 1028
	call DrawZaac ;рисуем зайца
1535 IgorA 1029
	call DrawWolf ;рисуем волка
1552 IgorA 1030
	call DrawEggs ;рисуем яйца
1535 IgorA 1031
 
1552 IgorA 1032
push eax
1033
	mov eax,dword[displ_w]
1034
	shr eax,1
1573 IgorA 1035
	stdcall [buf2d_draw_text], buf_displ, buf_font,game_text,eax,[offs_shadow_x],[color_wolf] ;рисуем строку с текстом
1552 IgorA 1036
pop eax
1535 IgorA 1037
	stdcall [buf2d_draw], buf_displ
1038
	ret
1039
 
1040
align 4
1041
button:
1042
	mcall 17 ;получить код нажатой кнопки
1573 IgorA 1043
 
1538 IgorA 1044
	cmp ah,5
1045
	jne @f
1046
		stdcall InitGame,0
1047
	@@:
1048
	cmp ah,6
1049
	jne @f
1050
		stdcall InitGame,1
1573 IgorA 1051
	@@:
1535 IgorA 1052
	cmp ah,1
1053
	jne still
1054
.exit:
1055
	stdcall [buf2d_delete],buf_fon ;удаляем буфер
1056
	stdcall [buf2d_delete],buf_displ ;удаляем буфер
1057
 
1609 IgorA 1058
	stdcall [buf2d_delete],buf_tree_sys
1535 IgorA 1059
	stdcall [buf2d_delete],buf_font
1060
 
1061
	cld
1552 IgorA 1062
	mov ecx,3
1063
	mov edi,buf_decor
1064
	@@: ;удаляем 3 буфера
1065
		stdcall [buf2d_delete],edi
1066
		add edi,BUF_STRUCT_SIZE
1067
		loop @b
1535 IgorA 1068
	mov ecx,9
1069
	mov edi,buf_wolf
1070
	@@: ;удаляем 9 буферов с волком и зайцем
1071
		stdcall [buf2d_delete],edi
1072
		add edi,BUF_STRUCT_SIZE
1073
		loop @b
1074
	mov ecx,13
1075
	mov edi,buf_chi
1076
	@@: ;удаляем 13 буферов
1077
		stdcall [buf2d_delete],edi
1078
		add edi,BUF_STRUCT_SIZE
1079
		loop @b
1080
	mov ecx,22
1081
	mov edi,buf_egg
1082
	@@: ;удаляем 22 буфера
1083
		stdcall [buf2d_delete],edi
1084
		add edi,BUF_STRUCT_SIZE
1085
		loop @b
1086
 
1609 IgorA 1087
	mov dword[tree1.data_img_sys],0 ;чистим указатель на изображение
1088
	stdcall dword[tl_data_clear], tree1
1535 IgorA 1089
	mcall -1 ;выход из программы
1090
 
1091
head_f_i:
1092
head_f_l  db 'Системная ошибка',0
1093
 
1094
system_dir0 db '/sys/lib/'
1609 IgorA 1095
lib0_name db 'buf2d.obj',0
1535 IgorA 1096
err_message_found_lib0 db 'Не удалось найти библиотеку buf2d.obj',0
1097
err_message_import0 db 'Ошибка при импорте библиотеки buf2d.obj',0
1098
 
1099
system_dir1 db '/sys/lib/'
1609 IgorA 1100
lib1_name db 'libimg.obj',0
1535 IgorA 1101
err_message_found_lib1 db 'Не удалось найти библиотеку libimg.obj',0
1102
err_message_import1 db 'Ошибка при импорте библиотеки libimg.obj',0
1103
 
1552 IgorA 1104
system_dir2 db '/sys/lib/'
1609 IgorA 1105
lib2_name db 'libini.obj',0
1552 IgorA 1106
err_message_found_lib2 db 'Не удалось найти библиотеку libini.obj',0
1107
err_message_import2 db 'Ошибка при импорте библиотеки libini.obj',0
1108
 
1609 IgorA 1109
system_dir3 db '/sys/lib/'
1110
lib3_name db 'box_lib.obj',0
1111
err_message_found_lib3 db 'Не удалось найти библиотеку box_lib.obj',0
1112
err_message_import3 db 'Ошибка при импорте библиотеки box_lib.obj',0
1113
 
1535 IgorA 1114
;library structures
1115
l_libs_start:
1609 IgorA 1116
	lib0 l_libs lib0_name,	sys_path, file_name, system_dir0, err_message_found_lib0, head_f_l, import_buf2d_lib, err_message_import0, head_f_i
1117
	lib1 l_libs lib1_name, sys_path, file_name, system_dir1, err_message_found_lib1, head_f_l, import_libimg, err_message_import1, head_f_i
1118
	lib2 l_libs lib2_name, sys_path, file_name, system_dir2, err_message_found_lib2, head_f_l, import_libini, err_message_import2, head_f_i
1119
	lib3 l_libs lib3_name, sys_path, file_name, system_dir3, err_message_found_lib3, head_f_l, import_box_lib, err_message_import3, head_f_i
1535 IgorA 1120
load_lib_end:
1121
 
1122
align 4
1123
proc mem_copy, source:dword, destination:dword, len:dword
1124
  push ecx esi edi
1125
    cld
1126
    mov esi, dword[source]
1127
    mov edi, dword[destination]
1128
    mov ecx, dword[len]
1129
    rep movsb
1130
  pop edi esi ecx
1131
  ret
1132
endp
1133
 
1134
align 4
1135
convert_to_str:
1136
	pushad
1137
	;mov eax,dword[value]
1138
	;mov edi,dword[text]
1139
	mov dword[edi+1],0
1140
	cld
1141
	call .str
1142
	popad
1143
	ret
1144
 
1145
 
1146
align 4
1147
.str:
1148
  mov ecx,0x0a ;задается система счисления изменяются регистры ebx,eax,ecx,edx входные параметры eax - число
1149
    ;преревод числа в ASCII строку взодные данные ecx=система счисленя edi адрес куда записывать, будем строку, причем конец переменной
1150
  cmp eax,ecx  ;сравнить если в eax меньше чем в ecx то перейти на @@-1 т.е. на pop eax
1151
  jb @f
1152
  xor edx,edx  ;очистить edx
1153
  div ecx      ;разделить - остаток в edx
1154
  push edx     ;положить в стек
1155
  ;dec edi             ;смещение необходимое для записи с конца строки
1156
  call .str;перейти на саму себя т.е. вызвать саму себя и так до того момента пока в eax не станет меньше чем в ecx
1157
  pop eax
1158
  @@: ;cmp al,10 ;проверить не меньше ли значение в al чем 10 (для системы счисленя 10 данная команда - лишная))
1159
  ;sbb al,$69  ;- честно данная инструкция меня заставляет задуматься т.е. я не знаю как это работает
1160
  ;das        ;после данной команды как бы происходит уменьшение al на 66h  (в книге написано другое)
1161
  or al,0x30  ;данная команда короче  чем две выше
1162
  stosb       ;записать элемент из регистра al в ячеку памяти es:edi
1163
  ret	      ;вернуться чень интересный ход т.к. пока в стеке храниться кол-во вызовов то столько раз мы и будем вызываться
1164
 
1165
 
1166
last_time dd ?
1167
image_data dd 0 ;память для преобразования картинки функциями libimg
1168
image_data_gray dd 0 ;память с временными серыми изображениями в формате 24-bit, из которых будут создаваться трафареты
1169
 
1170
run_file_70 FileInfoBlock
1609 IgorA 1171
hed db 'Nu pogodi 08.09.10',0 ;подпись окна
1535 IgorA 1172
sc system_colors  ;системные цвета
1173
 
1609 IgorA 1174
count_of_dir_list_files equ 10
1175
el_focus dd tree1
1176
tree1 tree_list FILE_NAME_MAX,count_of_dir_list_files+2, tl_key_no_edit+tl_draw_par_line+tl_list_box_mode,\
1177
	16,16, 0x8080ff,0x0000ff,0xffffff, 10,10,140,100, 0,0,0, el_focus,\
1178
	0,user_is_select
1179
 
1535 IgorA 1180
align 4
1609 IgorA 1181
buf_tree_sys:
1182
	dd 0 ;указатель на буфер изображения
1183
	dw 0 ;+4 left
1184
	dw 0 ;+6 top
1185
	dd 16 ;+8 w
1186
	dd 16*11 ;+12 h
1187
	dd 0 ;+16 color
1188
	db 24 ;+20 bit in pixel
1189
 
1190
align 4
1535 IgorA 1191
buf_font: ;буфер со шрифтом
1192
	dd 0 ;указатель на буфер изображения
1193
	dw 25 ;+4 left
1194
	dw 25 ;+6 top
1195
	dd 128 ;+8 w
1196
	dd 144 ;+12 h
1197
	dd 0 ;+16 color
1198
	db 24 ;+20 bit in pixel
1199
 
1200
align 4
1552 IgorA 1201
buf_displ:
1535 IgorA 1202
	dd 0 ;указатель на буфер изображения
1552 IgorA 1203
	dw 25,0
1204
	dd ? ;+8 w
1205
	dd ? ;+12 h
1206
	dd 0 ;+16 color
1535 IgorA 1207
	db 24 ;+20 bit in pixel
1552 IgorA 1208
 
1535 IgorA 1209
align 4
1552 IgorA 1210
buf_fon: ;фоновый буфер
1535 IgorA 1211
	dd 0 ;указатель на буфер изображения
1212
	dw 0 ;+4 left
1213
	dw 0 ;+6 top
1552 IgorA 1214
	dd ? ;+8 w
1215
	dd ? ;+12 h
1535 IgorA 1216
	dd 0xffffff ;+16 color
1217
	db 24 ;+20 bit in pixel
1218
 
1219
align 4
1552 IgorA 1220
buf_decor: ;буфера с декорациями: домиками и рейками; с курицами; с растениями
1221
	rb 3*BUF_STRUCT_SIZE
1535 IgorA 1222
 
1223
align 4
1224
buf_wolf:
1225
	rb 9*BUF_STRUCT_SIZE
1226
 
1227
align 4
1228
buf_egg:
1229
	rb 22*BUF_STRUCT_SIZE
1230
 
1231
align 4
1232
buf_chi:
1233
	rb 13*BUF_STRUCT_SIZE
1234
 
1552 IgorA 1235
 
1236
 
1535 IgorA 1237
align 4
1609 IgorA 1238
import_libini:
1552 IgorA 1239
	dd alib_init0
1240
	ini_get_str   dd aini_get_str
1241
	ini_get_int   dd aini_get_int
1242
	ini_get_color dd aini_get_color
1243
dd 0,0
1244
	alib_init0     db 'lib_init',0
1245
	aini_get_str   db 'ini_get_str',0
1246
	aini_get_int   db 'ini_get_int',0
1247
	aini_get_color db 'ini_get_color',0
1248
 
1249
align 4
1535 IgorA 1250
import_libimg:
1251
  dd alib_init1
1252
  img_is_img  dd aimg_is_img
1253
  img_info    dd aimg_info
1254
  img_from_file dd aimg_from_file
1255
  img_to_file dd aimg_to_file
1256
  img_from_rgb dd aimg_from_rgb
1257
  img_to_rgb  dd aimg_to_rgb
1258
  img_to_rgb2 dd aimg_to_rgb2
1259
  img_decode  dd aimg_decode
1260
  img_encode  dd aimg_encode
1261
  img_create  dd aimg_create
1262
  img_destroy dd aimg_destroy
1263
  img_destroy_layer dd aimg_destroy_layer
1264
  img_count   dd aimg_count
1265
  img_lock_bits dd aimg_lock_bits
1266
  img_unlock_bits dd aimg_unlock_bits
1267
  img_flip    dd aimg_flip
1268
  img_flip_layer dd aimg_flip_layer
1269
  img_rotate  dd aimg_rotate
1270
  img_rotate_layer dd aimg_rotate_layer
1271
  img_draw    dd aimg_draw
1272
 
1273
  dd 0,0
1274
  alib_init1   db 'lib_init',0
1275
  aimg_is_img  db 'img_is_img',0 ;определяет по данным, может ли библиотека сделать из них изображение
1276
  aimg_info    db 'img_info',0
1277
  aimg_from_file db 'img_from_file',0
1278
  aimg_to_file db 'img_to_file',0
1279
  aimg_from_rgb db 'img_from_rgb',0
1280
  aimg_to_rgb  db 'img_to_rgb',0 ;преобразование изображения в данные RGB
1281
  aimg_to_rgb2 db 'img_to_rgb2',0
1282
  aimg_decode  db 'img_decode',0 ;автоматически определяет формат графических данных
1283
  aimg_encode  db 'img_encode',0
1284
  aimg_create  db 'img_create',0
1285
  aimg_destroy db 'img_destroy',0
1286
  aimg_destroy_layer db 'img_destroy_layer',0
1287
  aimg_count   db 'img_count',0
1288
  aimg_lock_bits db 'img_lock_bits',0
1289
  aimg_unlock_bits db 'img_unlock_bits',0
1290
  aimg_flip    db 'img_flip',0
1291
  aimg_flip_layer db 'img_flip_layer',0
1292
  aimg_rotate  db 'img_rotate',0
1293
  aimg_rotate_layer db 'img_rotate_layer',0
1294
  aimg_draw    db 'img_draw',0
1295
 
1296
align 4
1297
import_buf2d_lib:
1298
	dd sz_lib_init
1299
	buf2d_create dd sz_buf2d_create
1300
	buf2d_create_f_img dd sz_buf2d_create_f_img
1301
	buf2d_clear dd sz_buf2d_clear
1302
	buf2d_draw dd sz_buf2d_draw
1303
	buf2d_delete dd sz_buf2d_delete
1304
	buf2d_line dd sz_buf2d_line
1305
	buf2d_circle dd sz_buf2d_circle
1306
	buf2d_img_hdiv2 dd sz_buf2d_img_hdiv2
1307
	buf2d_img_wdiv2 dd sz_buf2d_img_wdiv2
1308
	buf2d_conv_24_to_8 dd sz_buf2d_conv_24_to_8
1309
	buf2d_conv_24_to_32 dd sz_buf2d_conv_24_to_32
1310
	buf2d_bit_blt dd sz_buf2d_bit_blt
1311
	buf2d_bit_blt_transp dd sz_buf2d_bit_blt_transp
1312
	buf2d_bit_blt_alpha dd sz_buf2d_bit_blt_alpha
1313
	buf2d_cruve_bezier dd sz_buf2d_cruve_bezier
1314
	buf2d_convert_text_matrix dd sz_buf2d_convert_text_matrix
1315
	buf2d_draw_text dd sz_buf2d_draw_text
1316
	buf2d_crop_color dd sz_buf2d_crop_color
1317
	buf2d_offset_h dd sz_buf2d_offset_h
1318
	dd 0,0
1319
	sz_lib_init db 'lib_init',0
1320
	sz_buf2d_create db 'buf2d_create',0
1321
	sz_buf2d_create_f_img db 'buf2d_create_f_img',0
1322
	sz_buf2d_clear db 'buf2d_clear',0
1323
	sz_buf2d_draw db 'buf2d_draw',0
1324
	sz_buf2d_delete db 'buf2d_delete',0
1325
	sz_buf2d_line db 'buf2d_line',0
1326
	sz_buf2d_circle db 'buf2d_circle',0 ;рисование окружности
1327
	sz_buf2d_img_hdiv2 db 'buf2d_img_hdiv2',0
1328
	sz_buf2d_img_wdiv2 db 'buf2d_img_wdiv2',0
1329
	sz_buf2d_conv_24_to_8 db 'buf2d_conv_24_to_8',0
1330
	sz_buf2d_conv_24_to_32 db 'buf2d_conv_24_to_32',0
1331
	sz_buf2d_bit_blt db 'buf2d_bit_blt',0
1332
	sz_buf2d_bit_blt_transp db 'buf2d_bit_blt_transp',0
1333
	sz_buf2d_bit_blt_alpha db 'buf2d_bit_blt_alpha',0
1334
	sz_buf2d_cruve_bezier db 'buf2d_cruve_bezier',0
1335
	sz_buf2d_convert_text_matrix db 'buf2d_convert_text_matrix',0
1336
	sz_buf2d_draw_text db 'buf2d_draw_text',0
1337
	sz_buf2d_crop_color db 'buf2d_crop_color',0
1338
	sz_buf2d_offset_h db 'buf2d_offset_h',0
1339
 
1609 IgorA 1340
align 4
1341
import_box_lib:
1342
	dd alib_init2
1343
 
1344
	;scrollbar_ver_draw  dd aScrollbar_ver_draw
1345
 
1346
	tl_data_init dd sz_tl_data_init
1347
	tl_data_clear dd sz_tl_data_clear
1348
	tl_info_clear dd sz_tl_info_clear
1349
	tl_key dd sz_tl_key
1350
	tl_mouse dd sz_tl_mouse
1351
	tl_draw dd sz_tl_draw
1352
	tl_info_undo dd sz_tl_info_undo
1353
	tl_info_redo dd sz_tl_info_redo
1354
	tl_node_add dd sz_tl_node_add
1355
	tl_node_set_data dd sz_tl_node_set_data
1356
	tl_node_get_data dd sz_tl_node_get_data
1357
	tl_node_delete dd sz_tl_node_delete
1358
	tl_cur_beg dd sz_tl_cur_beg
1359
	tl_cur_next dd sz_tl_cur_next
1360
	tl_cur_perv dd sz_tl_cur_perv
1361
	tl_node_close_open dd sz_tl_node_close_open
1362
	tl_node_lev_inc dd sz_tl_node_lev_inc
1363
	tl_node_lev_dec dd sz_tl_node_lev_dec
1364
 
1365
dd 0,0
1366
	alib_init2 db 'lib_init',0
1367
 
1368
	;aScrollbar_ver_draw  db 'scrollbar_v_draw',0
1369
 
1370
	sz_tl_data_init db 'tl_data_init',0
1371
	sz_tl_data_clear db 'tl_data_clear',0
1372
	sz_tl_info_clear db 'tl_info_clear',0
1373
	sz_tl_key db 'tl_key',0
1374
	sz_tl_mouse db 'tl_mouse',0
1375
	sz_tl_draw db 'tl_draw',0
1376
	sz_tl_info_undo db 'tl_info_undo',0
1377
	sz_tl_info_redo db 'tl_info_redo',0
1378
	sz_tl_node_add db 'tl_node_add',0
1379
	sz_tl_node_set_data db 'tl_node_set_data',0
1380
	sz_tl_node_get_data db 'tl_node_get_data',0
1381
	sz_tl_node_delete db 'tl_node_delete',0
1382
	sz_tl_cur_beg db 'tl_cur_beg',0
1383
	sz_tl_cur_next db 'tl_cur_next',0
1384
	sz_tl_cur_perv db 'tl_cur_perv',0
1385
	sz_tl_node_close_open db 'tl_node_close_open',0
1386
	sz_tl_node_lev_inc db 'tl_node_lev_inc',0
1387
	sz_tl_node_lev_dec db 'tl_node_lev_dec',0
1388
 
1389
 
1390
 
1535 IgorA 1391
i_end:
1392
	rb 1024
1393
	align 16
1394
	procinfo process_information
1395
stacktop:
1396
	sys_path rb 4096
1397
	file_name:
1398
		rb 4096
1399
	openfile_path:
1400
		rb 4096
1401
	filename_area:
1402
		rb 256
1403
mem: