Subversion Repositories Kolibri OS

Rev

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