Subversion Repositories Kolibri OS

Rev

Rev 5911 | Details | Compare with Previous | Last modification | View Log | RSS feed

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