Subversion Repositories Kolibri OS

Rev

Rev 1619 | Rev 2051 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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