Subversion Repositories Kolibri OS

Rev

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