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