Subversion Repositories Kolibri OS

Rev

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