From 0c189bcb2fce317808244dab889575206e180162 Mon Sep 17 00:00:00 2001 From: IgorA Date: Fri, 30 Jul 2010 17:42:39 +0000 Subject: [PATCH] update 'buf2d.obj' and 'nu pogodi' git-svn-id: svn://kolibrios.org@1538 a494cfbc-eb01-0410-851d-a64ba20cac60 --- .../develop/libraries/buf2d/trunk/about.htm | 4 +- .../develop/libraries/buf2d/trunk/buf2d.asm | 241 +++++++++++++++--- programs/games/nu_pogodi/trunk/nu_pogod.asm | 83 +++++- 3 files changed, 288 insertions(+), 40 deletions(-) diff --git a/programs/develop/libraries/buf2d/trunk/about.htm b/programs/develop/libraries/buf2d/trunk/about.htm index b8dd4d3d99..c2a1fcf723 100644 --- a/programs/develop/libraries/buf2d/trunk/about.htm +++ b/programs/develop/libraries/buf2d/trunk/about.htm @@ -62,7 +62,7 @@ table { font-size: 15px; } ╤ хх яюью∙№№■ ьюцэю ёючфртрЄ№ сєЇхЁр ё шчюсЁрцхэш ьш т ярь Єш, ш яЁш эхюсїюфшьюёЄш т√тюфшЄ№ шї эр ¤ъЁрэ. ╚чюсЁрцхэш  ьюцэю эръырф√трЄ№ юфэю эр фЁєуюх, яюффхЁцштрхЄё  ЁрсюЄр ё яЁючЁрўэ√ьш шчюсЁрцхэш ьш, хёЄ№ ЇєэъЎш  Ёшёютрэш  ышэш яюър эр ¤Єюь тёх.

-

╧юёыхфэхх юсэютыхэшх сшсышюЄхъш 29.07.10.

+

╧юёыхфэхх юсэютыхэшх сшсышюЄхъш 30.07.10.

╘юЁьрЄ√ сєЇхЁют

╧юффхЁцштрхЄё  3 ЇюЁьрЄр сєЇхЁют. @@ -178,6 +178,8 @@ stdcall [buf2d_convert_text_matrix], buf_1

╩юэёЄрэЄ√

BUF2D_OPT_CROP_TOP equ 1

╩юэёЄрэЄр фы  ЇєэъЎшш buf2d_crop_color, юсючэрўрхЄ юсЁхчъє сєЇхЁр ётхЁїє

+

BUF2D_OPT_CROP_LEFT equ 2

+

╩юэёЄрэЄр фы  ЇєэъЎшш buf2d_crop_color, юсючэрўрхЄ юсЁхчъє сєЇхЁр ёыхтр

BUF2D_OPT_CROP_BOTTOM equ 4

╩юэёЄрэЄр фы  ЇєэъЎшш buf2d_crop_color, юсючэрўрхЄ юсЁхчъє сєЇхЁр ёэшчє

BUF2D_OPT_CROP_RIGHT equ 8

diff --git a/programs/develop/libraries/buf2d/trunk/buf2d.asm b/programs/develop/libraries/buf2d/trunk/buf2d.asm index e54d86dce2..933a9f005c 100644 --- a/programs/develop/libraries/buf2d/trunk/buf2d.asm +++ b/programs/develop/libraries/buf2d/trunk/buf2d.asm @@ -15,6 +15,7 @@ BUF_STRUCT_SIZE equ 21 buf2d_data equ dword[edi] ;данные буфера изображения buf2d_w equ dword[edi+8] ;ширина буфера buf2d_h equ dword[edi+12] ;высота буфера +buf2d_l equ word[edi+4] buf2d_t equ word[edi+6] ;отступ сверху buf2d_size_lt equ dword[edi+4] ;отступ слева и справа для буфера buf2d_color equ dword[edi+16] ;цвет фона буфера @@ -196,8 +197,14 @@ proc buf_clear, buf_struc:dword, color:dword ; ret endp +;функция для обрезания буферов 8 и 24 битных, по заданому цвету. +;параметр opt задается комбинацией констант: +; BUF2D_OPT_CROP_TOP - обрезка сверху +; BUF2D_OPT_CROP_LEFT - обрезка слева +; BUF2D_OPT_CROP_BOTTOM - обрезка снизу +; BUF2D_OPT_CROP_RIGHT - обрезка справа align 4 -proc buf_crop_color, buf_struc:dword, color:dword, opt:dword ;обрезка буфера по заданому цветом цвету +proc buf_crop_color, buf_struc:dword, color:dword, opt:dword locals crop_r dd ? endl @@ -305,14 +312,14 @@ endl add esi,buf2d_data ;esi - указатель на конец буфера изображения mov dword[crop_r],0 cld - .found_beg: + .24found_beg_right: sub esi,3 ;двигаемся на 1-ну колонку влево mov ecx,buf2d_h ;восстановление ecx для нового цикла @@: cmp word[esi],ax - jne .found + jne .24found_right cmp byte[esi+2],dl - jne .found + jne .24found_right sub esi,ebx ;прыгаем на верхнюю строку loop @b inc dword[crop_r] @@ -320,30 +327,30 @@ endl mov ecx,buf2d_w dec ecx ;1 колонка на запас cmp dword[crop_r],ecx - jge .found + jge .24found_right sub esi,3 ;двигаемся на 1-ну колонку влево mov ecx,buf2d_h ;восстановление ecx для нового цикла @@: add esi,ebx ;прыгаем на нижнюю строку cmp word[esi],ax - jne .found + jne .24found_right cmp byte[esi+2],dl - jne .found + jne .24found_right loop @b inc dword[crop_r] mov ecx,buf2d_w dec ecx ;1 колонка на запас cmp dword[crop_r],ecx - jl .found_beg + jl .24found_beg_right - .found: + .24found_right: cmp dword[crop_r],0 je .24no_crop_right mov ecx,buf2d_w sub ecx,dword[crop_r] - stdcall img_rgb_wcrop, buf2d_data, buf2d_w, ecx, buf2d_h ;обрезаем буфер, по новому размеру + stdcall img_rgb_crop_r, buf2d_data, buf2d_w, ecx, buf2d_h ;обрезаем буфер, по новому размеру mov buf2d_w,ecx ;ставим новую ширину для буфера mov ebx,buf2d_h imul ecx,ebx @@ -352,6 +359,66 @@ endl mov buf2d_data,eax ;на случай если изменился указатель на данные .24no_crop_right: + bt dword[opt],BUF2D_BIT_OPT_CROP_LEFT + jae .24no_crop_left + mov eax,dword[color] + mov edx,eax ;ax = colors - r,g + shr edx,16 ;dl = color - b + mov ebx,buf2d_w + lea ebx,[ebx+ebx*2] + mov esi,buf2d_data ;esi - указатель на начоло буфера изображения + mov dword[crop_r],0 + cld + .24found_beg_left: + + mov ecx,buf2d_h ;восстановление ecx для нового цикла + @@: + cmp word[esi],ax + jne .24found_left + cmp byte[esi+2],dl + jne .24found_left + add esi,ebx ;прыгаем на нижнюю строку + loop @b + inc dword[crop_r] + add esi,3 ;двигаемся на 1-ну колонку вправо + + mov ecx,buf2d_w + dec ecx ;1 колонка на запас + cmp dword[crop_r],ecx + jge .24found_left + + mov ecx,buf2d_h ;восстановление ecx для нового цикла + @@: + sub esi,ebx ;прыгаем на верхнюю строку + cmp word[esi],ax + jne .24found_left + cmp byte[esi+2],dl + jne .24found_left + loop @b + inc dword[crop_r] + add esi,3 ;двигаемся на 1-ну колонку вправо + + mov ecx,buf2d_w + dec ecx ;1 колонка на запас + cmp dword[crop_r],ecx + jl .24found_beg_left + + .24found_left: + cmp dword[crop_r],0 + je .24no_crop_left + mov ecx,buf2d_w + sub ecx,dword[crop_r] + stdcall img_rgb_crop_l, buf2d_data, buf2d_w, ecx, buf2d_h ;обрезаем буфер, по новому размеру + mov buf2d_w,ecx ;ставим новую ширину для буфера + mov ebx,buf2d_h + imul ecx,ebx + lea ecx,[ecx+ecx*2] + invoke mem.realloc,buf2d_data,ecx + mov buf2d_data,eax ;на случай если изменился указатель на данные + mov eax,dword[crop_r] + add buf2d_l,ax + .24no_crop_left: + .24end_f: @@ -479,7 +546,7 @@ endl je .8no_crop_right mov ecx,buf2d_w sub ecx,edx - stdcall img_gray_wcrop, buf2d_data, buf2d_w, ecx, buf2d_h ;обрезаем буфер, по новому размеру + stdcall img_gray_crop_r, buf2d_data, buf2d_w, ecx, buf2d_h ;обрезаем буфер, по новому размеру mov buf2d_w,ecx ;ставим новую ширину для буфера mov ebx,buf2d_h imul ecx,ebx @@ -487,19 +554,72 @@ endl mov buf2d_data,eax ;на случай если изменился указатель на данные .8no_crop_right: + bt dword[opt],BUF2D_BIT_OPT_CROP_LEFT + jae .8no_crop_left + mov eax,dword[color] + mov ebx,buf2d_w + mov esi,buf2d_data ;esi - указатель на начоло буфера изображения + mov edx,0 + cld + .8found_beg_left: + + mov ecx,buf2d_h ;восстановление ecx для нового цикла + @@: + cmp word[esi],ax + jne .8found_left + add esi,ebx ;прыгаем на нижнюю строку + loop @b + inc edx + inc esi ;двигаемся на 1-ну колонку вправо + + mov ecx,buf2d_w + dec ecx ;1 колонка на запас + cmp edx,ecx + jge .8found_left + + mov ecx,buf2d_h ;восстановление ecx для нового цикла + @@: + sub esi,ebx ;прыгаем на верхнюю строку + cmp word[esi],ax + jne .8found_left + loop @b + inc edx + inc esi ;двигаемся на 1-ну колонку вправо + + mov ecx,buf2d_w + dec ecx ;1 колонка на запас + cmp edx,ecx + jl .8found_beg_left + + .8found_left: + cmp edx,0 + je .8no_crop_left + mov ecx,buf2d_w + sub ecx,edx + stdcall img_gray_crop_l, buf2d_data, buf2d_w, ecx, buf2d_h ;обрезаем буфер, по новому размеру + mov buf2d_w,ecx ;ставим новую ширину для буфера + mov ebx,buf2d_h + imul ecx,ebx + invoke mem.realloc,buf2d_data,ecx + mov buf2d_data,eax ;на случай если изменился указатель на данные + mov eax,edx + add buf2d_l,ax + .8no_crop_left: + .8end_f: popad ret endp +;обрезаем цветное изображение с правой стороны ;input: ;data_rgb - pointer to rgb data ;size_w_old - width img in pixels ;size_w_new - new width img in pixels ;size_h - height img in pixels align 4 -proc img_rgb_wcrop, data_rgb:dword, size_w_old:dword, size_w_new:dword, size_h:dword +proc img_rgb_crop_r, data_rgb:dword, size_w_old:dword, size_w_new:dword, size_h:dword pushad mov eax, dword[size_w_old] lea eax, dword[eax+eax*2] ;eax = width(old) * 3(rgb) @@ -525,13 +645,14 @@ proc img_rgb_wcrop, data_rgb:dword, size_w_old:dword, size_w_new:dword, size_h:d ret endp +;обрезаем серое изображение с правой стороны ;input: ;data_gray - pointer to gray data ;size_w_old - width img in pixels ;size_w_new - new width img in pixels ;size_h - height img in pixels align 4 -proc img_gray_wcrop, data_gray:dword, size_w_old:dword, size_w_new:dword, size_h:dword +proc img_gray_crop_r, data_gray:dword, size_w_old:dword, size_w_new:dword, size_h:dword pushad mov eax, dword[size_w_old] mov ebx, dword[size_w_new] @@ -555,6 +676,68 @@ proc img_gray_wcrop, data_gray:dword, size_w_old:dword, size_w_new:dword, size_h ret endp +;обрезаем цветное изображение с левой стороны +;input: +;data_rgb - pointer to rgb data +;size_w_old - width img in pixels +;size_w_new - new width img in pixels +;size_h - height img in pixels +align 4 +proc img_rgb_crop_l, data_rgb:dword, size_w_old:dword, size_w_new:dword, size_h:dword + pushad + mov edi,dword[data_rgb] + mov esi,edi + mov eax,dword[size_w_old] + mov ebx,dword[size_w_new] + cmp eax,ebx + jle .end_f ;старый размер изображения не может быть меньше нового (при условии обрезания картинки) + lea eax,[eax+eax*2] + lea ebx,[ebx+ebx*2] + sub eax,ebx + mov edx,dword[size_h] ;высота изображения + cld + @@: + add esi,eax + mov ecx,ebx + rep movsb + dec edx + cmp edx,0 + jg @b + .end_f: + popad + ret +endp + +;обрезаем серое изображение с левой стороны +;input: +;data_gray - pointer to gray data +;size_w_old - width img in pixels +;size_w_new - new width img in pixels +;size_h - height img in pixels +align 4 +proc img_gray_crop_l, data_gray:dword, size_w_old:dword, size_w_new:dword, size_h:dword + pushad + mov edi,dword[data_gray] + mov esi,edi + mov eax,dword[size_w_old] + mov ebx,dword[size_w_new] + cmp eax,ebx + jle .end_f ;старый размер изображения не может быть меньше нового (при условии обрезания картинки) + sub eax,ebx + mov edx,dword[size_h] ;высота изображения + cld + @@: + add esi,eax + mov ecx,ebx + rep movsb + dec edx + cmp edx,0 + jg @b + .end_f: + popad + ret +endp + ;hoffs - колличество пикселей на котрые поднимается/опускается изображение ;img_t - высота, с которой начинается двигающаяся часть изображения align 4 @@ -888,20 +1071,20 @@ proc img_rgb24_wdiv2 data_rgb:dword, size:dword lea ecx,[ecx+ecx*2] cld @@: ;затемнение цвета пикселей - shr byte[eax],1 - inc eax - loop @b + shr byte[eax],1 + inc eax + loop @b mov eax,dword[data_rgb] mov ecx,dword[size] ;ecx = size shr ecx,1 @@: ;сложение цветов пикселей - mov bx,word[eax+3] ;копируем цвет соседнего пикселя - add word[eax],bx - mov bl,byte[eax+5] ;копируем цвет соседнего пикселя - add byte[eax+2],bl - add eax,6 ;=2*3 - loop @b + mov bx,word[eax+3] ;копируем цвет соседнего пикселя + add word[eax],bx + mov bl,byte[eax+5] ;копируем цвет соседнего пикселя + add byte[eax+2],bl + add eax,6 ;=2*3 + loop @b mov eax,dword[data_rgb] add eax,3 @@ -911,14 +1094,14 @@ proc img_rgb24_wdiv2 data_rgb:dword, size:dword shr ecx,1 dec ecx ;лишний пиксель @@: ;поджатие пикселей - mov edx,dword[ebx] - mov word[eax],dx - shr edx,16 - mov byte[eax+2],dl + mov edx,dword[ebx] + mov word[eax],dx + shr edx,16 + mov byte[eax+2],dl - add eax,3 - add ebx,6 - loop @b + add eax,3 + add ebx,6 + loop @b ;pop edx ecx ebx eax ret endp diff --git a/programs/games/nu_pogodi/trunk/nu_pogod.asm b/programs/games/nu_pogodi/trunk/nu_pogod.asm index 85f8011935..04ba6061f7 100644 --- a/programs/games/nu_pogodi/trunk/nu_pogod.asm +++ b/programs/games/nu_pogodi/trunk/nu_pogod.asm @@ -31,8 +31,8 @@ BUF_STRUCT_SIZE equ 21 buf2d_data equ dword[edi] ;данные буфера изображения buf2d_w equ dword[edi+8] ;ширина буфера buf2d_h equ dword[edi+12] ;высота буфера -buf2d_t equ word[edi+6] ;отступ сверху buf2d_l equ word[edi+4] ;отступ слева +buf2d_t equ word[edi+6] ;отступ сверху buf2d_size_lt equ dword[edi+4] ;отступ слева и справа для буфера buf2d_color equ dword[edi+16] ;цвет фона буфера buf2d_bits equ byte[edi+20] ;количество бит в 1-й точке изображения @@ -54,12 +54,23 @@ OFFS_SHADOW_X equ 2 ;сдв OFFS_SHADOW_Y equ 2 ;сдвиг теней по оси 'y' IMAGE_FONT_SIZE equ 128*144*3 +use_but equ 1 + +if use_but eq 1 +BUT1_T equ 10 ;отступ сверху +BUT1_L equ 15 ;отступ слева +BUT1_W equ 50 ;ширина +BUT1_H equ 20 ;высота +BUT1_NEXT_TOP equ (BUT1_T+BUT1_H)*65536 +end if + fn_icon0 db 'curici.png',0 ;имя файла с декорациями fn_icon1 db 'wolf.png',0 ;имя файла с волком и зайцем fn_icon2 db 'eggs.png',0 ;имя файла с яйцами fn_icon3 db 'chi.png',0 ;имя файла с циплятами fn_font db 'font8x9.bmp',0 +;цвета в игре color_fon dd 0xffffff color_shadows dd 0xd0d0d0 ;цвет теней color_trees dd 0x008000 ;цвет травы @@ -68,6 +79,9 @@ color_egg dd 0x404080 ;цве color_chick dd 0x00d0d0 ;цвет ципленка color_curici dd 0x8080d0 ;цвет курицы color_perilo dd 0x000080 ;цвет перила (гребня) +;цвета интерфейса +color_but_sm dd 0x808080 ;цвет маленьких кнопок +color_but_bi dd 0x8080ff ;цвет больших кнопок macro load_image_file path,buf,size { ;макрос для загрузки изображений stdcall mem.Alloc, dword size ;выделяем память для изображения @@ -113,7 +127,10 @@ mask_chi_cr_l equ 1000000000000000000000b ; mask_chi_cr_r equ 1000000000000000000000000000b ;маска для создания правого bit_chi_left equ 21 ;1-й бит который отвечает за бегущего слева bit_chi_right equ 27 ;1-й бит который отвечает за бегущего права +val_zaac_time_y equ 5 ;колличество тактов, которое обязательно должен провисеть заяц +val_zaac_time_n equ 7 ;колличество тактов, которое обязательно должен быть спрятанным заяц +zaac_status db 0 pos_wolf db 0 ;позиция волка 0-й бит слева/справа, 1-й бит сверху/вниз ;rb 1 pos_eggs dd 0 ;позиции расположения яиц и циплят @@ -149,7 +166,8 @@ proc CreateTrapharetBuffer, buf:dword, img_data:dword mov edi,dword[buf] stdcall [buf2d_create_f_img], edi,[img_data] ;создаем буфер stdcall [buf2d_conv_24_to_8], edi,1 ;делаем буфер прозрачности 8бит - stdcall [buf2d_crop_color], edi,buf2d_color,BUF2D_OPT_CROP_TOP+BUF2D_OPT_CROP_BOTTOM+BUF2D_OPT_CROP_RIGHT + ;обрезаем лишние края буфера, для более быстрого рисования + stdcall [buf2d_crop_color], edi,buf2d_color,BUF2D_OPT_CROP_TOP+BUF2D_OPT_CROP_BOTTOM+BUF2D_OPT_CROP_RIGHT+BUF2D_OPT_CROP_LEFT pop edi ret endp @@ -444,14 +462,23 @@ MoveEggs: and dword[pos_eggs],mask_clear_all ;очистка упавших яиц и добежавших курей call rand_next - bt dword[rand_x],6 - jc @f - bt dword[rand_x],8 - jc @f - bt dword[rand_x],9 + cmp byte[zaac_status],0 + jle @f + dec byte[zaac_status] + jmp .no_zaac_move ;заяц пока не двигается + @@: + + bt dword[rand_x],6 ;заяц от фонаря меняет статус jc @f xor byte[pos_wolf],val_zaac ;высовываем/засовываем зайца + bt word[pos_wolf],val_zaac + jc .zaac_n + mov byte[zaac_status],val_zaac_time_y ;ставим минимальное время для смены статуса + jmp @f + .zaac_n: + mov byte[zaac_status],val_zaac_time_n ;ставим минимальное время для смены статуса @@: + .no_zaac_move: ;создание новых яиц bt dword[rand_x],4 ;проверяем будем ли создавать новое яйцо @@ -486,6 +513,7 @@ proc InitGame, b:dword ; mov byte[some_text+1],0 ;текст с числом пойманных яиц mov byte[count_last],0 mov dword[pos_eggs],0 + mov byte[zaac_status],0 cmp dword[b],0 jne @f @@ -697,8 +725,8 @@ draw_window: mcall 12,1 xor eax,eax - mov ebx,20*65536+370 - mov ecx,20*65536+280 + mov ebx,20*65536+480 + mov ecx,20*65536+270 mov edx,[sc.work] ;or edx,0x33000000 or edx,0x73000000 @@ -739,6 +767,32 @@ draw_window: inc esi .draw_s: +if use_but eq 1 + ; *** рисование кнопок *** +push esi + mov eax,8 + xor ebx,ebx + mov bx,buf2d_l + add ebx,buf2d_w + add ebx,BUT1_L + shl ebx,16 + mov bx,BUT1_W + mov ecx,BUT1_T*65536+BUT1_H + mov edx,5 + ;or edx,0x40000000 + mov esi,dword[color_but_sm] + int 0x40 + + inc edx + add ecx,BUT1_NEXT_TOP + int 0x40 +pop esi + + ; *** восстановление параметров *** + mov eax,13 ;рисование прямоугольника + mov edx,[sc.work] +end if + mov ebx,esi mov ecx,dword[procinfo.client_box.height] inc ecx @@ -785,6 +839,15 @@ draw_display: align 4 button: mcall 17 ;получить код нажатой кнопки + if use_but eq 1 + cmp ah,5 + jne @f + stdcall InitGame,0 + @@: + cmp ah,6 + jne @f + stdcall InitGame,1 + @@: end if cmp ah,1 jne still .exit: @@ -887,7 +950,7 @@ image_data dd 0 ; image_data_gray dd 0 ;память с временными серыми изображениями в формате 24-bit, из которых будут создаваться трафареты run_file_70 FileInfoBlock -hed db 'Nu pogodi 29.07.10',0 ;подпись окна +hed db 'Nu pogodi 30.07.10',0 ;подпись окна sc system_colors ;системные цвета align 4