From 9aaa131d1c64e8e84c1ddd5e86e0564287725b4a Mon Sep 17 00:00:00 2001 From: IgorA Date: Thu, 29 Jul 2010 21:20:45 +0000 Subject: [PATCH] 1) library 'buf2d.obj' 2) new game 'Nu pogodi' git-svn-id: svn://kolibrios.org@1535 a494cfbc-eb01-0410-851d-a64ba20cac60 --- .../develop/libraries/buf2d/trunk/about.htm | 242 +++ .../develop/libraries/buf2d/trunk/buf2d.asm | 1871 +++++++++++++++++ .../develop/libraries/buf2d/trunk/build.bat | 4 + programs/games/nu_pogodi/trunk/build.bat | 11 + programs/games/nu_pogodi/trunk/chi.png | Bin 0 -> 12944 bytes programs/games/nu_pogodi/trunk/curici.png | Bin 0 -> 11611 bytes programs/games/nu_pogodi/trunk/dll.inc | 99 + programs/games/nu_pogodi/trunk/eggs.png | Bin 0 -> 17147 bytes programs/games/nu_pogodi/trunk/help.txt | 7 + programs/games/nu_pogodi/trunk/mem.inc | 48 + programs/games/nu_pogodi/trunk/nu_p_chi.svg | 248 +++ .../games/nu_pogodi/trunk/nu_p_curici.svg | 458 ++++ programs/games/nu_pogodi/trunk/nu_p_egs.svg | 337 +++ programs/games/nu_pogodi/trunk/nu_p_wolf.svg | 692 ++++++ programs/games/nu_pogodi/trunk/nu_pogod.asm | 1067 ++++++++++ programs/games/nu_pogodi/trunk/nu_pogod.svg | 1296 ++++++++++++ programs/games/nu_pogodi/trunk/wolf.png | Bin 0 -> 18548 bytes 17 files changed, 6380 insertions(+) create mode 100644 programs/develop/libraries/buf2d/trunk/about.htm create mode 100644 programs/develop/libraries/buf2d/trunk/buf2d.asm create mode 100644 programs/develop/libraries/buf2d/trunk/build.bat create mode 100644 programs/games/nu_pogodi/trunk/build.bat create mode 100644 programs/games/nu_pogodi/trunk/chi.png create mode 100644 programs/games/nu_pogodi/trunk/curici.png create mode 100644 programs/games/nu_pogodi/trunk/dll.inc create mode 100644 programs/games/nu_pogodi/trunk/eggs.png create mode 100644 programs/games/nu_pogodi/trunk/help.txt create mode 100644 programs/games/nu_pogodi/trunk/mem.inc create mode 100644 programs/games/nu_pogodi/trunk/nu_p_chi.svg create mode 100644 programs/games/nu_pogodi/trunk/nu_p_curici.svg create mode 100644 programs/games/nu_pogodi/trunk/nu_p_egs.svg create mode 100644 programs/games/nu_pogodi/trunk/nu_p_wolf.svg create mode 100644 programs/games/nu_pogodi/trunk/nu_pogod.asm create mode 100644 programs/games/nu_pogodi/trunk/nu_pogod.svg create mode 100644 programs/games/nu_pogodi/trunk/wolf.png diff --git a/programs/develop/libraries/buf2d/trunk/about.htm b/programs/develop/libraries/buf2d/trunk/about.htm new file mode 100644 index 0000000000..b8dd4d3d99 --- /dev/null +++ b/programs/develop/libraries/buf2d/trunk/about.htm @@ -0,0 +1,242 @@ + + +сшсышюЄхър фы  ЁрсюЄ√ ё 2d сєЇхЁрьш + + + + + + +

╬уыртыхэшх

+ + +

┬ёЄєяыхэшх

+

─юъєьхэЄрЎш  ъ ётюсюфэющ сшсышюЄхъх buf2d.asm, фы  ╬╤ ╩юышсЁш. + ▌Єр сшсышюЄхър ёючфрэр фы  ЁрсюЄ√ ё 2d шчюсЁрцхэш ьш. + ╤ хх яюью∙№№■ ьюцэю ёючфртрЄ№ сєЇхЁр ё шчюсЁрцхэш ьш т ярь Єш, ш яЁш эхюсїюфшьюёЄш т√тюфшЄ№ шї эр ¤ъЁрэ. + ╚чюсЁрцхэш  ьюцэю эръырф√трЄ№ юфэю эр фЁєуюх, яюффхЁцштрхЄё  ЁрсюЄр ё яЁючЁрўэ√ьш шчюсЁрцхэш ьш, хёЄ№ ЇєэъЎш  Ёшёютрэш  ышэш яюър эр ¤Єюь тёх.

+ +

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

+ +

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

+

╧юффхЁцштрхЄё  3 ЇюЁьрЄр сєЇхЁют. + ╩рцфр  ЇєэъЎш  яЁш ЁрсюЄх ё сєЇхЁрьш ьюцхЄ с√Є№ ЁрёўшЄрэр эр ЁрсюЄє ё юяЁхфхыхээ√ьш ЇюЁьрЄрьш шчюсЁрцхэшщ.

+ +

8 сшЄ

+

╤юцхЁцшЄ ры№Їр ърэры a (яЁючЁрўэюёЄ№) шчюсЁрцхэш . ═р ¤ъЁрэ эх т√тюфшЄё . ╚ёяюы№чєхЄё  фы  ёючфрэ  32-сшЄэ√ї сєЇхЁют.

+

24 сшЄ

+

─рээ√щ сєЇхЁ ёюфхЁцшЄ шчюсЁрцхэшх т ЇюЁьрЄх rgb. ╠юцхЄ т√тюфшЄё  эр ¤ъЁрэ.

+

32 сшЄ

+

╤юфхЁцшЄ яЁючЁрўэюх шчюсЁрцхэшх т ЇюЁьрЄх rgba. ═р ¤ъЁрэ эх т√тюфшЄё . ╚ёяюы№чєхЄё  фы  эрыюцхэш  шчюсЁрцхэшщ.

+ +

╘єэъЎшш

+ +

╧юўЄш тёх ЇєэъЎшш 1-ь ярЁрьхЄЁюь яЁшэшьр■Є єърчрЄхы№ эр ёЄЁєъЄєЁє сєЇхЁр, + шч ъюЄюЁющ ьюуєЄ шёяюы№чютрЄ№ё  ярЁрьхЄЁ√, эєцэ√х фы  ЁрсюЄ√ ъюэъЁхЄэющ ЇєэъЎшш. + ╧ЁшьхЁ ёЄЁєъЄєЁ√ сєЇхЁр шчюсЁрцхэш :

+
align 4
+buf_0:
+	dd    0 ;+ 0 єърчрЄхы№ эр сєЇхЁ шчюсЁрцхэш 
+	dw  100 ;+ 4 юЄёЄєя ёыхтр
+	dw   10 ;+ 6 юЄёЄєя ёяЁртр
+	dd  150 ;+ 8 °шЁшэр
+	dd  100 ;+12 т√ёюЄр
+	dd 0x80 ;+16 Їюэют√щ ЎтхЄ
+	db   24 ;+20 сшЄ эр яшъёхы№
+ +

lib_init

+

▌Єр ЇєэъЎш  яюыєўрхЄ єърчрЄхыш эр ЇєэъЎшш ЁрсюЄ√ ё ярь Є№■, т√ч√трЄё  фюыцэр яЁш чруЁєчъх сшсышюЄхъш. ╠юцхЄх шёяюы№чютрЄ№ ьръЁюё @use_library_mem, фы  хх ртЄюьрЄшўхёъющ эрёЄЁющъш.

+ +

buf2d_create

+

╤ючфрхЄ сєЇхЁ ш ўшёЄшЄ хую Їюэют√ь ЎтхЄюь.

+ +

buf2d_create_f_img

+

╤ючфрхЄ сєЇхЁ эр юёэютх шчюсЁрцхэш  т ЇюЁьрЄх rgb.

+ +

buf2d_clear

+

╫шёЄшЄ сєЇхЁ Їюэют√ь ЎтхЄюь.

+ +

buf2d_draw

+

╨шёєхЄ сєЇхЁ эр ¤ъЁрэх (ЁрсюЄрхЄ ўхЁхч ёшёЄхьэє■ Ї. 7). ╨шёє■Єё  Єюы№ъю сєЇхЁр ё уыєсшэющ ЎтхЄр 24 сшЄр.

+ +

buf2d_delete

+

╬ётюсюцфрхЄ ярь Є№ чрэ Єє■ шчюсЁрцхэшхь сєЇхЁр.

+ +

buf2d_line

+

╨шёєхЄ т сєЇхЁх ышэш■ ё чрфрээ√ь ЎтхЄюь ш ъююЁфшэрЄрьш. ╧ЁшьхЁ шёяюы№чютрэш :

+
stdcall [buf2d_line], buf_0, 30,10, 110,70, 0xffff00 ;Ёшёєхь ышэш■
+

уфх buf_0 - ёЄЁєъЄєЁр сєЇхЁр т ъюЄюЁюь сєфхЄ ЁшёютрЄ№ё  ышэш ; 30, 10, 110, 70 - ъююЁфшэрЄ√ ышэшш; 0xffff00 - ЎтхЄ ышэшш.

+ +

buf2d_circle

+

╨шёєхЄ т сєЇхЁх юъЁєцэюёЄ№ ё чрфрээ√ь ЎтхЄюь ш Ёрфшєёюь. ╧ЁшьхЁ шёяюы№чютрэш :

+
stdcall [buf2d_circle], buf_0, 25, 70, 15, 0xff0000
+

уфх buf_0 - ёЄЁєъЄєЁр сєЇхЁр т ъюЄюЁюь сєфхЄ ЁшёютрЄ№ё  юъЁєцэюёЄ№; 25, 70 - ъююЁфшэрЄ√ ЎхэЄЁр; 15 - Ёрфшєё; 0xff0000 - ЎтхЄ.

+ +

buf2d_img_hdiv2

+

╤цшьрхЄ шчюсЁрцхэшх т сєЇхЁх яю т√ёюЄх т 2 Ёрчр, яЁш ¤Єюь ЁрчьхЁ ёрьюую сєЇхЁр эх єьхэ№°рхЄё .

+ +

buf2d_img_wdiv2

+

╤цшьрхЄ шчюсЁрцхэшх т сєЇхЁх яю °шЁшэх т 2 Ёрчр, яЁш ¤Єюь ЁрчьхЁ ёрьюую сєЇхЁр эх єьхэ№°рхЄё .

+ +

buf2d_conv_24_to_8

+

╧ЁхюсЁрчютрэшх сєЇхЁр шч 24-сшЄэюую т 8-сшЄэ√щ. + ╧Ёш яЁхюсЁрчютрэшш єърч√трхЄё  ъръющ ЎтхЄ схЁрЄ№: 0-ёшэшщ, 1-чхыхэ√щ, 2-ъЁрёэ√щ. + ╬ёЄры№э√х ЎтхЄр яЁш яЁхюсЁрчютрэшш ЄхЁ ■Єё .

+ +

buf2d_conv_24_to_32

+

╧ЁхюсЁрчютрэшх сєЇхЁр шч 24-сшЄэюую т 32-сшЄэ√щ. + ╧Ёш яЁхюсЁрчютрэшш єърч√трхЄё  Єръцх 8-сшЄэ√щ сєЇхЁ, ъюЄюЁ√щ сєфхЄ шёяюы№чютрэ фы  ёючфрэш  ры№Їр ърэрыр. ╧ЁшьхЁ:

+
stdcall [buf2d_conv_24_to_32],buf_a,buf_b ;фхырхь сєЇхЁ rgba 32сшЄ
+

─ю т√яюыэхэш  ЇєэъЎшш сєЇхЁ buf_a фюыцхэ с√Є№ 24 сшЄэ√ь, р сєЇхЁ buf_b - 8 сшЄэ√ь. + ╧юёых т√яюыэхэш  ЇєэъЎшш сєЇхЁ buf_a ёЄрэхЄ 32 сшЄэ√ь, сєЇхЁ buf_b эх шчьхэшЄё .

+ +

buf2d_bit_blt

+

╨шёєхЄ т сєЇхЁх шчюсЁрцхэшх шч фЁєуюую сєЇхЁр т єърчрээ√ї ъююЁфшэрЄрї. ┴єЇхЁ т ъюЄюЁюь ЁшёєЄ (яЁшхьэшъ) фюыцхэ с√Є№ 24 сшЄэ√ь, р ЄюЄ ъюЄюЁ√щ ЁшёєхЄё  (шёЄюўэшъ) 24 шыш 32 сшЄэ√ь. ┼ёыш сєЇхЁ шёЄюўэшъ 32 сшЄэ√щ, Єю хую яЁючЁрўэюёЄ№ яЁш Ёшёютрэшш эх єўшЄ√трхЄё , фы  єўхЄр яЁючЁрўэюёЄш шёяюы№чєхЄё  ЇєэъЎш  buf2d_bit_blt_transp.

+ +

buf2d_bit_blt_transp

+

╨шёєхЄ т сєЇхЁх шчюсЁрцхэшх шч фЁєуюую сєЇхЁр т єърчрээ√ї ъююЁфшэрЄрї, яЁш ¤Єюь єўшЄ√трхЄё  яЁючЁрўэюёЄ№. + ┴єЇхЁ ъюЄюЁ√щ сєфхЄ эрЁшёютрэ фюыцхэ с√Є№ 32 сшЄэ√ь, р ЄюЄ т ъюЄюЁюь Ёшёє■Є 24 сшЄэ√ь.

+ +

buf2d_bit_blt_alpha

+

╨шёєхЄ т сєЇхЁх шчюсЁрцхэшх шч фЁєуюую сєЇхЁр т єърчрээ√ї ъююЁфшэрЄрї, яЁш ¤Єюь єўшЄ√трхЄё  яЁючЁрўэюёЄ№. + ┴єЇхЁ ъюЄюЁ√щ сєфхЄ эрЁшёютрэ фюыцхэ с√Є№ 8 сшЄэ√ь, р ЄюЄ т ъюЄюЁюь Ёшёє■Є 24 сшЄэ√ь.

+ +

buf2d_cruve_bezier

+

╨шёєхЄ яю ЄЁхь Єюўърь юЄЁхчюъ ъЁштющ схч№х.

+ +

buf2d_convert_text_matrix

+

╧ЁхюсЁрчєхЄ ьрЄЁшЎє ё ЄхъёЄюь ЁрчьхЁюь 16*16 т ЁрчьхЁ 1*256. ═хюсїюфшью фы  ёючфрэш  ьрЄЁшЎ√ фы  Ёшёютрэш  ЄхъёЄр. ╧хЁхф шёяюы№чютрэшхь фрээющ ЇєэъЎшш яЁхфяюырурхЄё  ўЄю хёЄ№ шчюсЁрцхэшх ё яюыэ√ь эрсюЁюь ёшьтюыют ЁрчьхЁюь 16 ёЄюысЎют эр 16 ёЄЁюъ, шч ъюЄюЁюую яЁхфтрЁшЄхы№эю с√ы ёючфрэ 8 сшЄэ√щ сєЇхЁ.

+
stdcall [buf2d_create_f_img], buf_1,[image_data] ;ёючфрхь сєЇхЁ 24 сшЄ эр юёэютх фрээ√ї шчюсЁрцхэш 
+stdcall [buf2d_conv_24_to_8], buf_1,1 ;фхырхь сєЇхЁ яЁючЁрўэюёЄш 8 сшЄ
+stdcall [buf2d_convert_text_matrix], buf_1
+

уфх buf_1 - ёЄЁєъЄєЁр сєЇхЁр фы  ЇюЁьшЁютрэш  ЄхъёЄютющ ьрЄЁшЎ√; + image_data - фрээ√х шчюсЁрцхэш  ЄхъёЄютющ ьрЄЁшЎ√ т ЇюЁьрЄх rgb, ЁрчьхЁюь 16*16 ёшьтюыют.

+ +

buf2d_draw_text

+

╨шёєхЄ ЄхъёЄ т сєЇхЁх, шёяюы№чє  ьрЄЁшЎє ё ЄхъёЄюь ЁрчьхЁюь 1*256 ёшьтюыют. ╧ЁшьхЁ:

+
stdcall [buf2d_draw_text], buf_0, buf_1,some_text,20,10,0x4040ff ;Ёшёєхь ёЄЁюъє ё ЄхъёЄюь
+

уфх buf_0 - ёЄЁєъЄєЁр сєЇхЁр т ъюЄюЁюь сєфхЄ ЁшёютрЄ№ё  ЄхъёЄ; + buf_1 - ёЄЁєъЄєЁр сєЇхЁр ё ЄхъёЄютющ ьрЄЁшЎхщ т ЇюЁьрЄх 8 сшЄ, ЁрчьхЁюь 1*256 ёшьтюыют; + some_text - ЄхъёЄ, ъюЄюЁ√щ сєфхЄ т√тхфхэ т сєЇхЁ buf_0.

+ +

buf2d_crop_color

+

╬сЁхчрэшх сєЇхЁр, яю єърчрээюьє ЎтхЄє. ╘єэъЎш  шёяюы№чєхЄё  фы  єьхэ№°хэш  ярь Єш, чрэшьрхьющ сєЇхЁюь. ╬ЄЁхчр■Єё  ъЁрщэшх ўрёЄш сєЇхЁр шьх■∙шх юфшэръют√щ ЎтхЄ. ╧ЁшьхЁ:

+
stdcall [buf2d_crop_color], buf_0,0xffffff,BUF2D_OPT_CROP_TOP+BUF2D_OPT_CROP_BOTTOM
+

уфх buf_0 - ёЄЁєъЄєЁр сєЇхЁр ъюЄюЁ√щ сєфхЄ юсЁхчрэ; + 0xffffff - ЎтхЄ яю ъюЄюЁюьє сєфхЄ юсЁхчрЄ№ё  сєЇхЁ; + BUF2D_OPT_CROP_TOP ш BUF2D_OPT_CROP_BOTTOM - ъюэёЄрэЄ√, єърч√тр■∙шх ё ъръшї ёЄюЁюэ юсЁхчрЄ№ сєЇхЁ.

+ +

buf2d_offset_h

+

╤фтшу шчюсЁрцхэш  т сєЇхЁх яю т√ёюЄх ттхЁї шыш тэшч.

+ +

╩юэёЄрэЄ√

+

BUF2D_OPT_CROP_TOP equ 1

+

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

+

BUF2D_OPT_CROP_BOTTOM equ 4

+

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

+

BUF2D_OPT_CROP_RIGHT equ 8

+

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

+ +

╥рсышЎр ¤ъёяюЁЄр

+

╧ЁшьхЁ ЄрсышЎ√ ¤ъёяюЁЄр, ЁрёўшЄрээющ эр шёяюы№чютрэшх ьръЁюёр @use_library_mem:

+
align 4
+import_buf2d_lib:
+	dd sz_lib_init
+	buf2d_create dd sz_buf2d_create
+	buf2d_create_f_img dd sz_buf2d_create_f_img
+	buf2d_clear dd sz_buf2d_clear
+	buf2d_draw dd sz_buf2d_draw
+	buf2d_delete dd sz_buf2d_delete
+	buf2d_line dd sz_buf2d_line
+	buf2d_circle dd sz_buf2d_circle
+	buf2d_img_hdiv2 dd sz_buf2d_img_hdiv2
+	buf2d_img_wdiv2 dd sz_buf2d_img_wdiv2
+	buf2d_conv_24_to_8 dd sz_buf2d_conv_24_to_8
+	buf2d_conv_24_to_32 dd sz_buf2d_conv_24_to_32
+	buf2d_bit_blt dd sz_buf2d_bit_blt
+	buf2d_bit_blt_transp dd sz_buf2d_bit_blt_transp
+	buf2d_bit_blt_alpha dd sz_buf2d_bit_blt_alpha
+	buf2d_cruve_bezier dd sz_buf2d_cruve_bezier
+	buf2d_convert_text_matrix dd sz_buf2d_convert_text_matrix
+	buf2d_draw_text dd sz_buf2d_draw_text
+	buf2d_crop_color dd sz_buf2d_crop_color
+	buf2d_offset_h dd sz_buf2d_offset_h
+
+	dd 0,0
+	sz_lib_init db 'lib_init',0
+	sz_buf2d_create db 'buf2d_create',0
+	sz_buf2d_create_f_img db 'buf2d_create_f_img',0
+	sz_buf2d_clear db 'buf2d_clear',0
+	sz_buf2d_draw db 'buf2d_draw',0
+	sz_buf2d_delete db 'buf2d_delete',0
+	sz_buf2d_line db 'buf2d_line',0
+	sz_buf2d_circle db 'buf2d_circle',0
+	sz_buf2d_img_hdiv2 db 'buf2d_img_hdiv2',0
+	sz_buf2d_img_wdiv2 db 'buf2d_img_wdiv2',0
+	sz_buf2d_conv_24_to_8 db 'buf2d_conv_24_to_8',0
+	sz_buf2d_conv_24_to_32 db 'buf2d_conv_24_to_32',0
+	sz_buf2d_bit_blt db 'buf2d_bit_blt',0
+	sz_buf2d_bit_blt_transp db 'buf2d_bit_blt_transp',0
+	sz_buf2d_bit_blt_alpha db 'buf2d_bit_blt_alpha',0
+	sz_buf2d_cruve_bezier db 'buf2d_cruve_bezier',0
+	sz_buf2d_convert_text_matrix db 'buf2d_convert_text_matrix',0
+	sz_buf2d_draw_text db 'buf2d_draw_text',0
+	sz_buf2d_crop_color db 'buf2d_crop_color',0
+	sz_buf2d_offset_h db 'buf2d_offset_h',0
+ +

╚ёЄюЁш 

+

02.07.10 - ёрьр  яхЁтр  тхЁёш  сшсышюЄхъш, 2 яЁшьхЁр шёяюы№чютрэш .

+

06.07.10 - Ёрё°шЁхэ√ тючьюцэюёЄш ЇєэъЎшш buf2d_bit_blt, ЄхяхЁ№ юэр ьюцхЄ ЁшёютрЄ№ 32 сшЄэ√х сєЇхЁ√. ─юсртыхэ√ 2 эют√х ЇєэъЎшш: buf2d_bit_blt_alpha ш buf2d_cruve_bezier. ═хсюы№°шх шчьхэхэш  т ЇєэъЎшш buf2d_line.

+

16.07.10 - шёяЁртыхэю яю 2 ю°шсъш т ЇєэъЎш ї buf2d_img_hdiv2 ш buf2d_img_wdiv2, ъюЄюЁ√х ьюуыш яЁю ты Є№ё  яЁш юяЁхфхыхээ√ї єёыютш ї (хёыш ЁрчьхЁ шчюсЁрцхэш  с√ы ъЁрЄхэ 4╩с ш фЁ.). ─юсртыхэ√ 2 ЇєэъЎшш фы  т√тюфр ЄхъёЄр т сєЇхЁ buf2d_convert_text_matrix ш buf2d_draw_text.

+

19.07.10 - фюсртыхэр ЇєэъЎш  Ёшёютрэш  юъЁєцэюёЄш buf2d_circle; + шчьхэхэ ЇюЁьрЄ сєЇхЁр - фы  °шЁшэ√ ш т√ёюЄ√ шёяюы№чє■Єё  4-ї срщЄэ√х ўшёыр тьхёЄю 2-ї срщЄэ√ї.

+

29.07.10 - фюсртыхэ√ ЇєэъЎшш buf2d_crop_color ш buf2d_offset_h; + шёяЁртыхэш  т ЇєэъЎшш buf2d_delete.

+ + \ No newline at end of file diff --git a/programs/develop/libraries/buf2d/trunk/buf2d.asm b/programs/develop/libraries/buf2d/trunk/buf2d.asm new file mode 100644 index 0000000000..e54d86dce2 --- /dev/null +++ b/programs/develop/libraries/buf2d/trunk/buf2d.asm @@ -0,0 +1,1871 @@ +format MS COFF +public EXPORTS +section '.flat' code readable align 16 + +include '../../../../macros.inc' +include '../../../../proc32.inc' + +;----------------------------------------------------------------------------- +mem.alloc dd ? ;функция для выделения памяти +mem.free dd ? ;функция для освобождения памяти +mem.realloc dd ? ;функция для перераспределения памяти +dll.load dd ? + +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_size_lt equ dword[edi+4] ;отступ слева и справа для буфера +buf2d_color equ dword[edi+16] ;цвет фона буфера +buf2d_bits equ byte[edi+20] ;количество бит в 1-й точке изображения + +struct buf_2d_header + img_data dd ? + left dw ? ;+4 left + top dw ? ;+6 top + size_x dd ? ;+8 w + size_y dd ? ;+12 h + color dd ? ;+16 color + bit_pp db ? ;+21 bit in pixel +ends + +macro swap v1, v2 { + push v1 + push v2 + pop v1 + pop v2 +} + +;флаги, для функции обрезания буфера +BUF2D_OPT_CROP_TOP equ 1 ;обрезка сверху +BUF2D_OPT_CROP_LEFT equ 2 ;обрезка слева +BUF2D_OPT_CROP_BOTTOM equ 4 ;обрезка снизу +BUF2D_OPT_CROP_RIGHT equ 8 ;обрезка справа +BUF2D_BIT_OPT_CROP_TOP equ 0 +BUF2D_BIT_OPT_CROP_LEFT equ 1 +BUF2D_BIT_OPT_CROP_BOTTOM equ 2 +BUF2D_BIT_OPT_CROP_RIGHT equ 3 + +;input: +; eax = указатель на функцию выделения памяти +; ebx = ... освобождения памяти +; ecx = ... перераспределения памяти +; edx = ... загрузки библиотеки (пока не используется) +align 16 +lib_init: + mov dword[mem.alloc], eax + mov dword[mem.free], ebx + mov dword[mem.realloc], ecx + mov dword[dll.load], edx + ret + +;input: +; ebx = coord x +; ecx = coord y +; edx = pixel color +; edi = pointer to buffer struct +align 4 +draw_pixel: + ;cmp buf2d_bits,24 + ;jne @f + bt ebx,31 + jc @f + bt ecx,31 + jc @f + cmp ebx,buf2d_w + jge @f + cmp ecx,buf2d_h + jge @f + push esi + mov esi,buf2d_w ;size x + imul esi,ecx ;size_x*y + add esi,ebx ;size_x*y+x + lea esi,[esi+esi*2] ;(size_x*y+x)*3 + add esi,buf2d_data ;ptr+(size_x*y+x)*3 + + mov word[esi],dx ;copy pixel color + ror edx,16 + mov byte[esi+2],dl + ror edx,16 + pop esi + @@: + ret +;endp + +;создание буфера +align 4 +proc buf_create, buf_struc:dword + pushad + mov edi,dword[buf_struc] + mov ecx,buf2d_w + mov ebx,buf2d_h + imul ecx,ebx + cmp buf2d_bits,24 + jne @f + lea ecx,[ecx+ecx*2] ; 24 bit = 3 + ;;;inc ecx ;запасной байт в конце буфера, что-бы не глючили некоторые функции на изображениях кратных 4К + @@: + cmp buf2d_bits,32 + jne @f + shl ecx,2 ; 32 bit = 4 + @@: + invoke mem.alloc,ecx + mov buf2d_data,eax + + stdcall buf_clear,edi,buf2d_color ;очистка буфера фоновым цветом + popad + ret +endp + +;создание буфера на основе изображения rgb +align 4 +proc buf_create_f_img, buf_struc:dword, rgb_data:dword + pushad + mov edi,dword[buf_struc] + mov ecx,buf2d_w + mov ebx,buf2d_h + imul ecx,ebx + cmp buf2d_bits,24 + jne @f + lea ecx,[ecx+ecx*2] ; 24 bit = 3 + ;;;inc ecx ;запасной байт в конце буфера, что-бы не глючили некоторые функции на изображениях кратных 4К + @@: + cmp buf2d_bits,32 + jne @f + shl ecx,2 ; 32 bit = 4 + @@: + invoke mem.alloc,ecx + mov buf2d_data,eax + + cmp buf2d_bits,24 + jne @f + cld + mov esi,[rgb_data] + mov edi,eax ;eax=buf2d_data + rep movsb ;копируем биты изображения в буфер + jmp .end_create + @@: + stdcall buf_clear,edi,buf2d_color ;очистка буфера фоновым цветом + .end_create: + popad + ret +endp + +align 4 +proc buf_clear, buf_struc:dword, color:dword ;очистка буфера заданым цветом + pushad + mov edi,dword[buf_struc] + + mov ecx,buf2d_w + mov ebx,buf2d_h + imul ecx,ebx + + cld + + cmp buf2d_bits,8 + jne .end_clear_8 + mov edi,buf2d_data + mov al,byte[color] + rep stosb + jmp .end_clear_32 + .end_clear_8: + + cmp buf2d_bits,24 + jne .end_clear_24 + mov edi,buf2d_data + mov eax,dword[color] + mov ebx,eax + shr ebx,16 + @@: + stosw + mov byte[edi],bl + inc edi + loop @b + jmp .end_clear_32 + .end_clear_24: + + cmp buf2d_bits,32 + jne .end_clear_32 + mov edi,buf2d_data + mov eax,dword[color] + rep stosd + ;jmp .end_clear_32 + .end_clear_32: + popad + ret +endp + +align 4 +proc buf_crop_color, buf_struc:dword, color:dword, opt:dword ;обрезка буфера по заданому цветом цвету +locals + crop_r dd ? +endl + pushad + mov edi,dword[buf_struc] + cmp buf2d_bits,24 + jne .24end_f + + bt dword[opt],BUF2D_BIT_OPT_CROP_BOTTOM + jae .24no_crop_bottom + mov eax,dword[color] + mov edx,eax ;ax = colors - r,g + shr edx,16 ;dl = color - b + mov ecx,buf2d_h + mov ebx,buf2d_w + imul ecx,ebx + lea esi,[ecx+ecx*2] ;esi=3*ecx + add esi,buf2d_data + cld + @@: + sub esi,3 + cmp word[esi],ax + jne @f + cmp byte[esi+2],dl + jne @f + loop @b + @@: + lea ebx,[ebx+ebx*2] + xor edx,edx + mov eax,buf2d_h + imul eax,ebx + add eax,buf2d_data ;eax - указатель на конец буфера изображения + @@: + add esi,ebx + cmp esi,eax + jge @f + inc edx ;вычисляем число полных строк для обрезания + loop @b + @@: + cmp edx,0 + je .24no_crop_bottom + cmp edx,buf2d_h + jge .24no_crop_bottom ;что-бы не получить пустой буфер + sub buf2d_h,edx ;уменьшаем высоту буфера + mov ecx,buf2d_h + imul ecx,ebx ;ecx = новый размер изображения + invoke mem.realloc,buf2d_data,ecx + mov buf2d_data,eax ;на случай если изменился указатель на данные + .24no_crop_bottom: + + bt dword[opt],BUF2D_BIT_OPT_CROP_TOP + jae .24no_crop_top + mov eax,dword[color] + mov edx,eax ;ax = colors - r,g + shr edx,16 ;dl = color - b + mov esi,buf2d_data + mov ecx,buf2d_h + dec ecx ;при обрезании должна остаться минимум 1-на строка пикселей + mov ebx,buf2d_w + imul ecx,ebx + cld + @@: + cmp word[esi],ax + jne @f + cmp byte[esi+2],dl + jne @f + add esi,3 + loop @b + @@: + lea ebx,[ebx+ebx*2] + xor edx,edx + @@: + sub esi,ebx + cmp esi,buf2d_data + jl @f + inc edx ;вычисляем число полных строк для обрезания + loop @b + @@: + cmp edx,0 + je .24no_crop_top + xor eax,eax + sub eax,edx + mov ebx,buf2d_h + sub ebx,edx + stdcall buf_offset_h, edi, eax, edx, ebx ;сдвигаем изображение в буфере вверх (eax<0) + sub buf2d_h,edx ;уменьшаем высоту буфера + mov ecx,buf2d_h + add buf2d_t,dx ;сдвигаем отступ вниз, на число обрезанных строк + mov ebx,buf2d_w + imul ecx,ebx + lea ecx,[ecx+ecx*2] + invoke mem.realloc,buf2d_data,ecx + mov buf2d_data,eax ;на случай если изменился указатель на данные + .24no_crop_top: + + bt dword[opt],BUF2D_BIT_OPT_CROP_RIGHT + jae .24no_crop_right + 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,ebx + imul esi,buf2d_h + add esi,buf2d_data ;esi - указатель на конец буфера изображения + mov dword[crop_r],0 + cld + .found_beg: + sub esi,3 ;двигаемся на 1-ну колонку влево + mov ecx,buf2d_h ;восстановление ecx для нового цикла + @@: + cmp word[esi],ax + jne .found + cmp byte[esi+2],dl + jne .found + sub esi,ebx ;прыгаем на верхнюю строку + loop @b + inc dword[crop_r] + + mov ecx,buf2d_w + dec ecx ;1 колонка на запас + cmp dword[crop_r],ecx + jge .found + + sub esi,3 ;двигаемся на 1-ну колонку влево + mov ecx,buf2d_h ;восстановление ecx для нового цикла + @@: + add esi,ebx ;прыгаем на нижнюю строку + cmp word[esi],ax + jne .found + cmp byte[esi+2],dl + jne .found + loop @b + inc dword[crop_r] + + mov ecx,buf2d_w + dec ecx ;1 колонка на запас + cmp dword[crop_r],ecx + jl .found_beg + + .found: + 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 ;обрезаем буфер, по новому размеру + 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 ;на случай если изменился указатель на данные + .24no_crop_right: + + .24end_f: + + + cmp buf2d_bits,8 + jne .8end_f + + bt dword[opt],BUF2D_BIT_OPT_CROP_BOTTOM + jae .8no_crop_bottom + mov eax,dword[color] + mov esi,buf2d_data + mov ecx,buf2d_h + mov ebx,buf2d_w + imul ecx,ebx + mov esi,ecx + add esi,buf2d_data + cld + @@: + dec esi + cmp byte[esi],al + jne @f + loop @b + @@: + xor edx,edx + mov eax,buf2d_h + imul eax,ebx + add eax,buf2d_data ;eax - указатель на конец буфера изображения + @@: + add esi,ebx + cmp esi,eax + jge @f + inc edx + loop @b + @@: + cmp edx,0 + je .8no_crop_bottom + cmp edx,buf2d_h + jge .8no_crop_bottom ;что-бы не получить пустой буфер + sub buf2d_h,edx ;уменьшаем высоту буфера + mov ecx,buf2d_h + imul ecx,ebx ;ecx = новый размер изображения + invoke mem.realloc,buf2d_data,ecx + mov buf2d_data,eax ;на случай если изменился указатель на данные + .8no_crop_bottom: + + bt dword[opt],BUF2D_BIT_OPT_CROP_TOP + jae .8no_crop_top + mov eax,dword[color] + mov esi,buf2d_data + mov ecx,buf2d_h + dec ecx ;при обрезании должна остаться минимум 1-на строка пикселей + mov ebx,buf2d_w + imul ecx,ebx + cld + @@: + cmp byte[esi],al + jne @f + inc esi + loop @b + @@: + xor edx,edx + @@: + sub esi,ebx + cmp esi,buf2d_data + jl @f + inc edx + loop @b + @@: + cmp edx,0 + je .8no_crop_top + xor eax,eax + sub eax,edx + mov ebx,buf2d_h + sub ebx,edx + stdcall buf_offset_h, edi, eax, edx, ebx + mov ecx,buf2d_h + sub ecx,edx + mov buf2d_h,ecx ;уменьшаем высоту буфера + add buf2d_t,dx ;сдвигаем отступ вниз, на число обрезанных строк + mov ebx,buf2d_w + imul ecx,ebx + invoke mem.realloc,buf2d_data,ecx + mov buf2d_data,eax ;на случай если изменился указатель на данные + .8no_crop_top: + + bt dword[opt],BUF2D_BIT_OPT_CROP_RIGHT + jae .8no_crop_right + mov eax,dword[color] + mov ebx,buf2d_w + mov esi,ebx + imul esi,buf2d_h + add esi,buf2d_data ;esi - указатель на конец буфера изображения + xor edx,edx + cld + + .8found_beg: + dec esi ;двигаемся на 1-ну колонку влево + mov ecx,buf2d_h ;восстановление ecx для нового цикла + @@: + cmp byte[esi],al + jne .8found + sub esi,ebx ;прыгаем на верхнюю строку + loop @b + inc edx + mov ecx,buf2d_w + dec ecx ;1 колонка на запас + cmp edx,ecx + jge .8found + + dec esi ;двигаемся на 1-ну колонку влево + mov ecx,buf2d_h ;восстановление ecx для нового цикла + @@: + add esi,ebx ;прыгаем на нижнюю строку + cmp byte[esi],al + jne .8found + loop @b + inc edx + + mov ecx,buf2d_w + dec ecx ;1 колонка на запас + cmp edx,ecx + jl .8found_beg + + .8found: + cmp edx,0 + je .8no_crop_right + mov ecx,buf2d_w + sub ecx,edx + stdcall img_gray_wcrop, 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 ;на случай если изменился указатель на данные + .8no_crop_right: + + .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 + pushad + mov eax, dword[size_w_old] + lea eax, dword[eax+eax*2] ;eax = width(old) * 3(rgb) + mov ebx, dword[size_w_new] + lea ebx, dword[ebx+ebx*2] ;ebx = width(new) * 3(rgb) + mov edx, dword[size_h] + mov edi, dword[data_rgb] ;edi - получает данные + mov esi, edi + add edi, ebx + add esi, eax + cld + @@: + dec edx ;уменьшаем счетчик оставшихся строк на 1 + cmp edx,0 + jle @f + mov ecx, ebx + rep movsb ;перенос (копирование) строки пикселей + add esi,eax ;переход на новую строчку изображения + sub esi,ebx + jmp @b + @@: + 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_wcrop, 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] + mov edx, dword[size_h] + mov edi, dword[data_gray] ;edi - получает данные + mov esi, edi + add edi, ebx + add esi, eax + cld + @@: + dec edx ;уменьшаем счетчик оставшихся строк на 1 + cmp edx,0 + jle @f + mov ecx, ebx + rep movsb ;перенос (копирование) строки пикселей + add esi,eax ;переход на новую строчку изображения + sub esi,ebx + jmp @b + @@: + popad + ret +endp + +;hoffs - колличество пикселей на котрые поднимается/опускается изображение +;img_t - высота, с которой начинается двигающаяся часть изображения +align 4 +proc buf_offset_h, buf_struc:dword, hoffs:dword, img_t:dword, img_h:dword ;сдвигает изображение по высоте + pushad + mov edi,dword[buf_struc] + cmp buf2d_bits,24 + jne .end_move_24 + + mov eax,[hoffs] + cmp eax,0 + je .end_move_24 + mov ebx,buf2d_w + mov edx,dword[img_t] + mov ecx,dword[img_h] ;ecx - высота сдвигаемых данных + cmp ecx,buf2d_h + jge .end_f ;ошибочное условие, высота изображения меньше чем высота сдвигаемого изображения + imul ecx,ebx ;ecx - колличество пикселей в сдвигаемых данных + lea ecx,[ecx+ecx*2] + imul ebx,edx + lea ebx,[ebx+ebx*2] + mov esi,buf2d_data + add esi,ebx + + add edx,eax ;edx = img_t+hoffs (hoffs<0) + mov ebx,buf2d_w + imul ebx,edx + lea ebx,[ebx+ebx*2] + mov edi,buf2d_data ;позиция, куда будет двигаться изображение + add edi,ebx + + cmp eax,0 + jg .move_down_24 + ;двигаем изображение вверх + cld + rep movsb + jmp .end_f + .move_down_24: + ;двигаем изображение вниз + add esi,ecx + dec esi + add edi,ecx + dec edi + std + rep movsb + jmp .end_f + .end_move_24: + +;stdcall print_err,sz_buf2d_offset_h,txt_err_n24b + + cmp buf2d_bits,8 + jne .end_move_8 + + mov eax,[hoffs] + cmp eax,0 + je .end_move_8 + ;двигаем изображение вверх + mov ebx,buf2d_w + mov edx,dword[img_t] + mov ecx,dword[img_h] ;ecx - высота сдвигаемых данных + cmp ecx,buf2d_h + jge .end_f ;ошибочное условие, высота изображения меньше чем высота сдвигаемого изображения + imul ecx,ebx ;ecx - колличество пикселей в сдвигаемых данных + imul ebx,edx + mov esi,buf2d_data + add esi,ebx + + add edx,eax ;edx = img_t+hoffs (hoffs<0) + mov ebx,buf2d_w + imul ebx,edx + mov edi,buf2d_data ;позиция, куда будет двигаться изображение + add edi,ebx + + cmp eax,0 + jg .move_down_8 + cld + rep movsb + jmp .end_f + .move_down_8: + ;двигаем изображение вниз + add esi,ecx + dec esi + add edi,ecx + dec edi + std + rep movsb + jmp .end_f + .end_move_8: + + .end_f: + popad + ret +endp + + +align 4 +proc buf_draw_buf, buf_struc:dword + pushad + mov edi,dword[buf_struc] + cmp buf2d_bits,24 + jne .error + mov eax,7 + mov ebx,buf2d_data + + mov ecx,buf2d_w + ror ecx,16 + mov edx,buf2d_h + mov cx,dx + + mov edx,buf2d_size_lt + ror edx,16 + int 0x40 + jmp .end_draw_24 + .error: + stdcall print_err,sz_buf2d_draw,txt_err_n24b + .end_draw_24: + popad + ret +endp + +align 4 +proc buf_delete, buf_struc:dword + push edi + mov edi,dword[buf_struc] + invoke mem.free,buf2d_data + pop edi + ret +endp + +align 4 +proc buf_line_brs, buf_struc:dword, coord_x0:dword, coord_y0:dword, coord_x1:dword, coord_y1:dword, color:dword +locals + loc_1 dd ? + loc_2 dd ? + napravl db ? +endl + pushad + mov edx,dword[color] + + mov eax,dword[coord_x1] + sub eax,dword[coord_x0] + bt eax,31 + jae @f + neg eax + inc eax + @@: + mov ebx,dword[coord_y1] + sub ebx,dword[coord_y0] + bt ebx,31 + jae @f + neg ebx + inc ebx + @@: + + mov [napravl],byte 0 ;bool steep=false + cmp eax,ebx + jle @f + mov [napravl],byte 1 ;bool steep=true + swap dword[coord_x0],dword[coord_y0] ;swap(x0, y0); + swap dword[coord_x1],dword[coord_y1] ;swap(x1, y1); + @@: + mov eax,dword[coord_y0] ;x0 + cmp eax,dword[coord_y1] ;if(x0>x1) + jle @f + swap dword[coord_y0],dword[coord_y1] ;swap(x0, x1); + swap dword[coord_x0],dword[coord_x1] ;swap(y0, y1); + @@: + +; int deltax esi +; int deltay edi +; int error ebp-6 +; int ystep ebp-8 + + mov eax,dword[coord_y0] + mov esi,dword[coord_y1] + sub esi,eax ;deltax = y1-y0 + mov ebx,esi + shr ebx,1 + mov [loc_1],ebx ;error = deltax/2 + + mov eax,dword[coord_x0] + mov edi,dword[coord_x1] + mov [loc_2],dword -1 ;ystep = -1 + cmp eax,edi ;if (x0UO=S_7>X3>MF?bo z2uMe&5J*S>k)F^Y^c+0jI_JAP>$`Yw&b!E3S+i#E|6I(h`OUMRXaB<==xVT@;5q?; zKv*^JsXc-~=oBE36M4sv9*n4}Xv`iQ=sX{3+=di&UHEfCZ>OrG3W1bHGw)h39GqXW zy7x#20`a>BfjoZ+fovZPJ)eO}oi4!N7nVDHwSXfzEPo6x<#>RH))Tz^_PqVYL zb8v8+IdkUh*|X=)or6N5oSdBJ&!6Yw;^OA!zHs5f#fuktczAeuc`seMbouh-D_5>u zy?T|8kB^_9|Jt={0s;cpuU{7w6ufcchLDhuu&}U*hzJY@6BQK|6B82`7nhKbkd&0X zdGn@}l$5lzw2X|5tgNh@oSeM8yn=#)l9H0Lva*Vb%B@?sR8>`P-@bk4&K)&1HFb6M zyLazuXlUHKcTZDO^Zxz&T3TA#+S)ogI=Z^LdU|>f9z1yX@ZqCJkM#BRA3uIP3V`F1$Yinm` zXK!!s;NbA=*)vB+M<*vIXJ=;@7Z+DoS2s5|cXxLW4-ZdIPcJVoZ*Ok^0FX$ekB^V9 zudkn*CP;hYY^XJb)LPA1ALtngj@$%)%SFc{Ze*HQuEbPsjH{s#o zZ{NO+h=};>ufHNABcr0CqNAhVy?gim{re9eKE%Yt#Ky+P#l^+P$0sBtBqk;%B_)0Q z_%S&-IVB|}H8u6qr%xypDlIK7Jv}`mBO^02^YiD=Sy@@x+1WWcIk~yHU%q_F%gf8p z&o3w_C@d^2Dk>^2E-oo4DJ?B6D=RB6FaP@WYehvxWo0EAjjpPys;;iaU@#yE*4Eb6 z)zx9K*l*vy)z{ZIG&D3eHh%y9y{W0Gxw*NerKPpCwXLnKy}iAoqocF4^T&@LU0q$> z-Q7JsJ-xlXeSLlX{rx|G{u~$>7#tkL;c!DkL&L+vcs!m!AdHNR5Q#(*i8MMoIyN>o zK0f~I*RP3*iQm6}PfkuwO-)TtPtVNE%+Aiv&CSiv&y&ey3Wc(;u&}texU{siyu7@! zva-6my0*5qzP`S(u|cI$H#ax8wzjsnw|91Sc6WF8_V)Jo_h~fR!JB{Z)6a~C9~_w6 z?iqU?kY@hpPX~+0tv?v#^intS(s#A>LRxs(Kpt2)xOl;I)gNC1Bw>9&ZO=06Nw4GeleVSA99{^LFV%D zV*ZZ_B2qZ#{sKTqMhK}TEFr1GP+0TayiMm=Sj5SOPQ_xJ@^s317)3(4+b+swS`M|^ zf_J2DrFaIpV(mU9&938_Zu36Al$H+9y~rB^;N9sE7zIidM3k5cm_1Ke&{cqa(?aH4 zgpOr_{ZY(IeME;A2A|o5uMKzMEGV8 z6LdsbLe_n7_AF}_1e#jv1|)a9fblZ7W9aqozbtwVjLSr`ltmAEe$^6Q8k|XihZXa~ zB5qzEu>&R=l;yyyJi?FOes={Q0Ibn*$o5`_o#+~0gJ0-}v8o~DN;nQQ_yqIws&QIa z&2lRic}I*2%VF&%6J8>Fd=2s=JT%)#ULoWRD4g1;$=fz6+)UaWiLzeIkS&I#z=y;{ zRBDde{ydwb-iL(W0ux~NyPZK(Et;e1?ue(izB_LDdq^h&&%&XHEwu0$AP%wV}-7V>Z&%AuhjZ?w+?&P zrh5hR-=Z{J>~Ht*31g)_IdSb})N@J$;iOW*j)6fOTzTh=-}o7|pGEuC9o;qiTOXHd ztIsZGJ*T@Eg8zXfe<#e97jJGi4*N6uQ7of#iTK$&35)VOR(eqIs4wj&Y-A&~nTE-! zlV_P<@QtkTc`q~MGF^>^;W=MdJQb}UJ@It}X69+?%;_@n;P=%du2={#E|j$y5?R1( z!MGonb)`3o=J@ka_zpGx?^^vRUjRkeNPDe|h`cG$_%ez5g-<-e0WF!BwH=do`c3y= zgaHEzw_0?%>k?GU`26TX;bmitc|beF#4TkLsF*ayJkd8?E_DQw1M-*14^> zuN_~C;VWUL$*(6~k`3s4>oz4bwD)Rw$xBAVVwa_Tf{;`JU(AEB}1|EKyO!}zeyuG>`e!pa- z8l1~JshX^{Agp>M;CCvpDo@`#p_RWR8HYGf4j)~bFx+joTPqrZs_I>cN9}iu z1q3n#RrZ}oRxW3iWb4Fx`(GeAWeU4ow7w+FCWRN zmKXrRz`5k%^5UWZC6@U`go%CqV?yD1r6~bc3m;q?@)ax6V9-86Z7e%_4PjJXp_n_e z|HIRcpUDcIJV$&Le4cB!@g=BxQW?E8qNmK>akWi-wvrj!ciEm$>)o^Pdu(N0)5sE@ z>;axlIJTuRKU*rx4v+N!-4Hu9MDbCr@9guxz7lE`#aw0hsKomgybfrP+F1kNBE0hM zP&RF+@YJR)&%;}iDi~U{(8Tga?%B{W4(9n2kqOVhkIT+TJOgpx7^FYqt&-Fu6-|A= z;#idDb3>JDy6^EKj0GJSOs+EqB~ipDQF~OxnK?AN{}| zxD>JJ6m#wI#j-Cn9{!I#p=}kCY`Jg2EIwRT5OVzKK6{WKHul1s13eZXQ{Ey&)W|$Rbb$ZrbV? z?put%+Y{Y#2(;;1Xk}jo*3%dh+>?8lwXCtIq1mFL-cd874AgMy2`ri8FC)g~`y(zppO<57g$H1j-*|(+&iDPsE(=fY zI1#V1IWapLHpP>6US&~}3Zs=Xg5hg+l*C(mjZ(rRiAQ}pBJ;#sEI2CyABsH?(ve0%pU_!7YK{Iu9^ zwt*g_*h<+abh_yH&ZqS!_A(xGE?)JYu=X0~2=t_e&xpH#pw?@gTcZFM1!j^3mjK=7 ze^>g}@N|6DvZj(yuH1d{t}@nzKsdQB=wZ%_sJX-}p=7fh_!aPDc#@pTrbl$E%Mhxj z`&tHbBld~nd1*z7+<~}JqW{d|!wt)F53RM}+-Jd_l2dr87v)yJf;ey>_>y;ccXE*^ zZ#TDxzYJ2tcRM`{4khgG%EkZrYXLq%bX}zlx`PN00H5md5`)(Q*ABu$0ophlZ7Gb(@hnyoeH!QG00rLT{e#Fu^HbSAbV;Ux{LwHz^91TJ4)o zT$26O)!ajDI%B4?^)AJ1r+(G(Yee{<*YNAS7iGW;)cOwi(xZ1Wzr_Yiio<5YJwW_Q z)KvjpS?`C=`g1t2>J8yss>H7!+v^kl+WoL1<9_ds7G62Y?QSG#B_7bEG<+o3k%u>v zbj+*nfb=Fm5OWJvpa0(rRdz6vb^ghqJ8G)^CqX1x%-XFfgTng~fv3brJ9F;^Tc}J< zv03^Zc;h1Yf~de6e4CC%lmf)81{Y5xY8>=GyxRkrdNX%c!#k*KeRbgQj?HX)cEBl_ zh&B9x$X=i~CrnOhhf(2m-R8c~{UG&cl)UM+dFkyCBouXekE!Xs-cJ=NnnrTW{LQDI z2Vk_EaQSF%PNJO(&6*NQvT4yFJ}|HOivPha6|mWKaYg2>=eZxUu)|aId(kQfGp3qd-y;1rxnsG9j6T zTgd4A61Wl^To%}^FPYT&EtF>e-UR$em!zHWN#m|p7*$>{qhrnF(ad<(pvxUv>-@{Q zI~pv!J#tzJvlT{Q;*p9Mx~6KMQwP; z?B~V1X&w-pXqb(Iv2b(IU;t;`>I~bH7J5xL>gcQ(mjpe*qsl9@DnvMzi58L$hf-=F0{aO)3Z^{+Sr5P|b>bRFfX>v*? zbCfSVXAhqUFtGvS+FOVKdXzuQnUL>bgm=HoJ(c0ZcAL!L$zzk;AxY{s} zhXxEOUlk}(*3+(S15K{zmFlH7PcDi{;2gPLN@V=r&vRH}>%Jj^kiC4=e=sRYFIvlM zKilIa0s(c1#m(C5bQ&+ z|IfzOvP}S2;$m}A#r1MWM!BiHMQhqyQ#7>ixw2vDum~?f`gmxJ>$ZO)qI4LJgB@%i zD{IXfoftZsO#FQT?$&vg;bxkiffF#X`Uh`Dn7N@7P)_aWi__WiuQEOp4JY>5e$s&bXz7VN(CfnI!1Wlm@MAdN-ET9> zgvB;ILv2S?GA8}ju{DRcO$UTqG{XLe@X~(~t_M#nG9pVKG@*;4i2Tt=BV#Xc#t*So z*1*|gCwLAV*{b}jji4Sa9T#1k>yVZM(>8nztaBjosep#X0djVNJYZb+E4@$s_P9BH zrDLwo+De)G&PD%$-0a_w3$<>UuJAQk$;f&>Lq*Af8%laVtRO&72Mf4si0^@TzXzA3oRE^*g4FAEM wn5qG<IzX`{&|}7|EcFXim=D_dhisIyBqVT@g1V6uB%pb+dTBY00#cWeEGcNm-yEVz5n!JQf0U4!dDa33rXU~t!gAi*-YGr0Sv zwrbyZ-~N5N)m`VxOZV;5eWKM=NJ|`)G#o&!)AI*HA`5@nJwg2?|3&x&P-1+CxF{0L`1~I#3Upnq@<)|WMuE(zb7Xrr=Xzt z@Zkd`B_$OV6*VaBy;Ra&d8Sb93|X@bL2T^6~NU^YaS`2nY%a3JD1b3k!>ghyVZpQBhGb zF)?v*aR~_tNl8g5DJf}bX&D)r&!0cb%F2HE@Fd|8%F4gwtm8XB6Knp#>~+S=MWIy$<#x_Wwg`uh3?1_p+PhDJt4#>U1bCMKq) zrr*AOGcz+YH#fJiu&}hWw6e0YwzdWWfi^Zawzjr*c6Rpm_6`mXj*gB_PEO9w&Mq!4 zuCA_bZf@@G?j9ZK_O$HylmBqSy#e*gYGDJdyAIXNXI zB{elQEiElQJv}2MBQrBID=RBIJ3A*QCpR}20)gb^<>lw+|M>BvprD|zu&}78sJOVe zq@<*@w6v_Oth~IuqN1X*va+hGs=B(mrltl8h1S;A*45S3*Vi{RG&D9g{`~o~si~>C zx%tCd4x3{maufM;4U|?WyaByg7 zXn1&dWMpJ?baZTNYD=Vw3t7~g(>+9gwwH`ugVP=JxjX?(XjX{{G?N z;qmeD>FMeD`T6DLWuwm6|6dGXyU6RiqoCmYixHe}s2s87J^!5VJ!JJfG@Y$Iz-De% zC~9W5P97X8vRbqtUJhP)R+n0604mt3lvAi1kq~85Y93w+u4j*uZ*)V z3&Mn%GCP2ss*Om9J9zikOBV0ZIK~%jC6uobs{yec(O-_fBH@>c9Meqbmi6&SXo$zyuarfWCR<&PmYQ+;pa9(RdilBs{uta^E31iSus6ML_8)?yn91gjob#X| z6z0Q^9HO-@@eP0$4)|nX46X%FESqeR%)FxWBU{+bH|ddUCm&Cp2OkqPCkNZb`sEL) z@6+UNL28r7uLTD*HR^HtEwOIJOzc2kLV1%OU)P9F)535GLyY&_L;(WoSe&w@&zgH2>vN9`t9@^_tx3v~9gLbyKAa zG=e<$aarg09ojeknN?s3LYi@i`fpG+r!h;P-XAht{4)B#&)h6+Fzb`#X-ROnmi?{6Qy?KYaQt=Ov> zg7r5gsYs*b=YC*u*gF6a+|Ej7a>}|?$dDoM%CAjy!;7O|7?93-&3)ZjD&>`UvEmrF zsh)<540zjHML+S$o{dV`iL!ahHOu(h&=;)r0o%A7t-pr(C(LH|(oS zL{_9;g6b8vK`H`q9UuO*&XMI2fKlkomc{lQZy9MNw}m8hspz2h0Aarcv~xvK)%Ou~ z8zvtghalcnT_*W0VSchllgltQJ<%BuQ8;5H9bt46hjiNDour`e zzoFi(P&uFfDCUmV6>n1oPEdxg|8^~$7z7_pvl&s)Lu&TyDi`dj?%wEgMDq3%wu3Zz ztNIgNi4^AjXz$*rBs^ek*JYm5{lV^RR*Wr5vjLxzQzFvQ15}b`S$mGT)(b)VBpmT+eYHJ|8~VO-!%I{t z##w(AginR)<_&7@<3cMFr}$664SeouzM2Otc_nv2G)+t$_No=)g@rPALfN=2PtvJw ze2J=CqDSmHe#Hs&qDnT+l#@k|e0AX)ympKy)9IJz?z66+>yR8^b|I@sNo;qufkR(y zE&o9;yt}yGz$)=xLAwIJpAzKy^$#%UoxTNBi3lJcN%Kl;Dq&J66BR&8UG*_Qr8PDC>KCKouc|TKeB?hM%gqW?#<2sM1m0=SODp_%V27?q z_Sn#!KGhw)gMPQ|<#>`nn`V8^yTPY?qiU|FQC|Y^ph5W)EO^U{VQzKf!vd@Luft#j zfKUOFV%&RrW%A5lN*;)BrsWqdS^3#;a*duGMkMK$jE9BnDHOJ50YUV>ouT|&eV81tWSKj z`u;Hs&AIAkA#YgKC&ND?6g5UE|N3Ua@|+N5gd;#X5*ZWmMUF8?V00yO4zb6((~>`V zYf9626$P^%ih-Im>0R8>HRc`gCWBgT$5N9Vy58sx5>m&@E_>V{9Y)zPd6mTJ{i^+< zVhlf~B$h+CB*#UbN|3ig^v7Mt8@%|%tdq*8iP^pu_ogFIa|^4GAGTdY$3NPtG}Bze z{2~I^b0wwNtCH+~k!RCFQ-e^$ikIGhwDVXLuw|gdWe?h=r@eg8s0UDQ zqRt7Xk0;dUyR~IpU30K3+J#w8z~7dg{P-HR@a|_7jNq;>q4x%0F|_c^L!D&QKIcX|b;p#nVZW=^_}+?yCr>6v|E)*1hdI ztbBYs*a6S)#}-N`L?hZQ?+}?(gq9Fw{bp4idE{?Jkdn;Iv&=*H`0CYx0K_js9bWuHk2cXeD!-hpinhhB-}!LgqIUKCF!Vr$Y?ECDF!s-@~E zzBY)YR`iH4MRxI@@H#y|plJsO43JAuY zW_kS2nfnK>wlEVW6E^qhn!+LkeOU;{Ob~gq8$E+KQSL>{%=IjD4}OEIDc4yL5s$qo zvkGyy;%y+WfC-kS=pg$^wIvvoO0oVf_0&wCWWqSWx$j(P+lcsty0ITWioO1ED(H~= zA8~**FIfnRTQ^Z|J!iGiYpj0B5#NktYudI;X3s;o2WTz(_&M)spT$kKO*5$5BjRst zxz$$qw7H6MGK}V*%uQ!haLOytri{ULiW8o!e0{9{lCoHPKRnYCBemu@1sQQTDsJoJ{`gz^@r|+Ye-ay zQok|Y|6x}r?WnlN%4gaaf_1#A&8e(pMFyl&aXfH!R!;ZXrfeE`nUZ7rRM)<%DzvAg ziuQE0+l|7tMi$+rR8F1jn|7L=&%o%>Mg2SoHH>X# zc{zGAULJXQ^yS$}Up_}XCJ7>VE6e&Ii)*Swz<6;WG8gY3Vf$H4HQsxbx)&Q8lypX; zH}>iuiyCMtB+Vx#*~FQ_B`LH#yZD~2NU1-Ep5xmRxuy5}@IZc6@ZRdT5X4|Ga};_i zk>L=7?e{KEcZH_k=+Pu#?zUG*(RZJmnZ-tvbK8Z-KWDwG1)DwAoKo8#{U;?y?gk{B zP=Nt-t%!8-zrI7yW5D?&{+$VO=zjN`RIzH8%-)qa*f5AKvm!6Huz!+T9?FSk8-DD! ziJXiSGF_%VIhwOg7Gmuu_I-ml?f4(os6daZHVxfYPf~r8@!iMLaj185sHUfp8K#sF3ukTD*6lBDVC(3eT~!9Ki$#?o=woAlX8w0G@*}rHpF76UcC^ zAn)@3-5_MOrO*5O{ROn)VV!OWmjJ$q2&j%HhkY-3qE3~wz5mlUJ3PXJcP3xTlW-dE z11J86WUa7)FLF1xN0zCBMH5`zX}0~?SM#nX-Pn|vYA4nF!o+9)+cB=YP-JfX2(7bN zy;jsbtd2tMxH7L6Eim}A`JVjYqq;CzNwfAi07#bWAVM_C@i}9mepMi|aZ~erQzY8D zwz`p(x@NFlZt_=*cVMMmzY#DI-6b9phWHP<`)zgSo@Y`e-kacq6VZh@;~Yc40?26H zXVa3LNV}c6z*>JEG7fdx(4j}SaER#%C#SDIzAZy!(zGsno(B%)h8Rm;#(o-TU#-d4 zMmk!YaXe84r)~fc31<$#RxEjLb?63+DvODR%FGaG+&W-9tFP8gf5 zcZ_`Nq?*%z!@n4@@Im!rr%B8YXp+OBn}^* zASW`&(=K?nRvxwc?@r<;0NF`7#GxPm#gGVK9?2N=>m%ZSC)7{-2@C7kYwQZ(etcCF zXN5L;kQbVl()9l+)1s*IP*##XrGnG2vzc>>&>@J#S>xD!P3~Qc5E1Oe-tE(9BFm4D zSS@fTU)eQ+96AsKqGjAEgQN({sX}mj&!N#Spfzk zy5q000Ao=QSsCYF@Bn+ap9SBWT{j~>2fcr06Exq=h3F>;m1Jam%F~fVDvrPbTvM3T z-}8dMB8|*+xrFsq=05uhVv5Lr>4%em0Lq&@=DRi@*UAHL9?^y8=n=w{pIc`IOGWH6 zXzKeCC#V{iUp8<>`Ab9&6(M4j&An_nJ*uu`TdYQ>Bo+l#-cV*ogA1)ZkKM0eUlaX~ z8>zkPp>$awd!yn7*nJIEJk zsx+txtRioDJn1}SJA|9guKs!KneB&%Ka*xor4^HO^ljYcqkbQm*Vp6437*UK>;mNmGYE>2f6 z-Eg>oCMD$tOSO&rURrxzZLsMQl1M0BFzukr`8=o8_sYYaNPlvf=)Im&&92lWs&Ax+ z;iJqf^mQ-#W1q%y_ZbD9^~24;dY!ZkGex(71J&geU-_)^-f-o3FcNb4@q*WZWJfOJ zXwE870`x#QsbnjSvTy{dpQ2|v(QRAj>}JhPzw@8lFH$drQ%D@iyC=az>E?YmbzK|3 zvD?Xb86L*3duT_+f_(hDoe}njJ=WB@c{k-m>6dvypPOG;LPe%Zy*};XXF{pZL$XQ( z8*W&d*bOzJoZO+3FbGMJLuNxeFOhblPh{Co+k=GW6~SNbFN_r?6jPoVOpf z(QCCSW)MQ}RHgvnx66aT?U(6wrfsKs++-&j#hw9|ZL36oV->_Cq%@isKwAY?xC{AH3e^!NiC}i*Mrg;~1+OiK%(xFxF=L3^GI81Ul2m zbhTMKUky1K=ttie>5%bSX{5|M#->{SMj6d`raQL_MlfK+1Rj&akSmeh-oNyo-|8(E ziOl9%a7S#v{?IeiEc2B8<=THGn;T@F-9LGf_2GJty{+4667RcTxb_T#o9TStP_xd- zE&s0wq~sr~rz1m0l-KM#AF2;)esOk0pv=|$0oFqG>E}loXuW||THnNBx_|CcFQ0%Y zaeQ_5Gq*_RQb%6T3bLU2V%E3f&xVaTl&^&tpLlU2T6jMItv=vw7E`1TJ^W|9w&Ke?5z8WW&Y@z|Xb544i5#k`!7>}*3t+ak;2N^KcIZ}yQ1YXbN$lYK+q ziX9UqARE3j39~+rWjK9TuZdMXCsiuthIq`?*2(&g;!L+IYZgU@)bDOkh|!OvZfC(C~C zIPLCt@&(S-809g_g)Fa^^VzcAmtm^Xjpt_vKZ{9Q%dY7V@40(liINn6qVq!vh5azI zk_}F_Uq9G~B+l-sH_*D&uu87cn>KEMhkjiJxrsf0GEd}$(=0&S<>XJW$8f!Oz^sy1 z;uT*`|h0e_79%}^&oQUMt$s^V}&c~Xu$mL?Og+RA0JQgMLYZhB~$qZ z{nw1C3}{271l;(SH47wNj}rfFv!DW9#h@#4v3F5a&$^7D|NEaYEY!=e#t^OlrP}i~ zN2D7PxHmc#HTXwH(TA-(8 zOsBlzk{CYzW&W$HI5Twk$Amn%YdXEy>(3A1G+0^pIeQqR?*v)})lJdT=LQbK{;CoGjR zYk+VJ`)?Gw-T0ZD(Y%w97Fun3iuMR1I;21eJv^W6`p{-Yr ze*(M8F;+u|9#}VQh@Za_tng=(zp9@9_TUh zzJ7EOMV+1+Ins?RSL|Yb)>k^ejgA$(H!#)Y{ZrUcgEhQ}Ep`tjqdGLd|5R+?C{F^g z1P6{#zk0)a^?h)){cUmBWnIadQp$+6baYUKPQ&7All}dIzEV%O_~EAsLG}<7VcL_` z(;%Hs*1!H*^e@H;?4RG8eJ_rvH)X@LFQKfm5i*mq19Wq%<9#@e&LnJi&`=7m&vTk1&tyWlp>hk;|Os zH`eK)&*$OCquoc|jTaKwG>k4C%zUYZWUDpc9OU%k>(ZVWj2cX;Q678ZmG zP4Kq+#mx5UYBbrFUM?n$@|YEx|7ajg(PV=WC@l*;DkTYFwj3z>+sAHQG=9xNoi#?l zaN(6CDNL&-szi{Mo=s&Aw7hY}s%^V>$d+Q30vO(^4?&a}r9Lbky~3gfiu}o(1tv-c zq`OHcdi>S`l4VlWC~r{`-nOLJ8f0GEZF)*0|39nDlaK!gJ{X>jIF<^ z;OC{H0>{exvUAR7H(MS_P4P5kV-B2fGQrrqh>Pd+aGM?*`8P|{{AdmwfKRCc$KXAH z+k@l0^jL$oxC9R%UGQdNI4n*@4ygsg{KHP2Poln}?Xgne9}O9GGQSvIfrf;3XA&;Q zL_tQ6-6Aq#_dI%-X9BmZ`{4^KNAaG~#;whZ&L&pKM3PrgkP%%rJ0zt^cxKWv9`YJU zaD{zM3t|AthWaZ;46z>0cvs&}rBo0o3L_dbB3S3nT9OyeM%x})05@){9KnhLf6H1b z=6Zeb*R`W25N6-X${7A|#RLAPqCxe3HB9)|z~?okDsWXGSwjoIU0o};ig8;ATy?8D z#Nv7{4s*r4wZ3RU&eKActZQ2a-@x2_ZuLi}jhSi3_$vzH$_#qLo(AGbc5Cj2F2+FQ z3v(p;M~-dq;Yk4FU-cK<#>OI{>dEy)m!E z%$9qJ000wbRho*7G6IF19L}X*5c)FH=6^j;eHm^)@#01sWc!k3O{cm!IAlS8qg8-j zxXtA1$7mW1|LN~qG5r@L8!BR{)pKlcuC}XTukM1Ht==6ztd4K~{|jyZADJBfpBp1} zYScZ+uHA=rVv0#ls>;c=Y>31WG!{D zTZr?xcQ^rIVP0ie7#ajs3g2&%LS0*ZnTcPdL)k9l0&SKE4?$Kn=!M^?MjEJVzATza zal`n2;=GhOH-1w+b3#5ETO4S|QQlI6`%~W=E-#^q1f}cKC$ktD;n}gM`S2aWE?Md= zkRGa$$d(fqj~dXRO32W{`_*@A!tGmxSKK`ot3q}sieC<%-qu@~Ho55WDivpp%h6G& zJfuS`9ah)4pHgaknK-mI(@)&px?WUsZvTz-4Cq0ZHyWHy<{!vx^sUd3XL}80DVviv zZ&nEMP0StStd)Oz9_Hl?DVaW+Uug7&2K_i!+xB*>U;YgZRIf1*6M0{LTDU@T zLUo|-Gbh#0T{EXw(QX>ST-{caKK5etbwARQ0@4jA^4JyWELGg?{(k!r)g-!l7E|I)16jM%IYy*%qhhg8v&}pj=Yl_GYpPv zd(X_q2RgRjJymj$3q-y3&9{--`*^-(3_9ggR<~`abf-TLWF~7V->NGhHBf6KMhH&c zKCl0&XCGVbDpmJD0y`TP9I|_wZ|@SHE@&-e8`-YUb8mOMQ#1R=lXCdR#?WRDxhG1O zq=4fV9Rvs0Ssx7MvK(8xa!ucfECqte6bqjIDUSO8FQTjA%|7(oH+VrZ&OKg!WP91Z zNj)#p*ZcE}l#JV#cwgj*{)MSYv(HS~a_5roY392~ZLVEx-wP8M_3EH4lajJ?#O-H^ zeV6pzh2g!Lo77y$d$qG|`17KDOnB@=bM1dSr=HX%;?LW!STVJ0^#zN)b51$Vgq@#k zzRBIsAvqksTI~vUoZnqme|pE!7vhAfp7TEERt(UuJ@fc+zz@Un*HTr}bQ|~{~ z@+UOgi1P~beduOrl>kSry+~9_yKr>m%$~V~KjXR}h=*Bmh2@ASE192`msx?0ybB`y zSZ(QX`8!M!<-|2Y-9qVU?zmUdN>IqWlC4=?`M*QyUCzZ^9m=)2CbD9|SYY^mf!hJ; z;EF=kfpFn$e#VA_ZQ~gwIixLm5YS-iRJm}7`;SN&-~IN9Q2<|`fft`XP-<5FA13pEH;FKI*4y7 zgOA3AMkSu%#Pt-uUTU>H^YJCaN@F_%9sN00RmBa<)f@G9F+Cl<+bm{^on|Mg$2aUg zm1%OYAx<*nI8JkmdQ;~Iaq9PmbIU`VKU^Q9Oz)Iy3F@A?oThF)SKb=buq;dMlQb23 zm@17tom8?ju6VI=B|TgonIW2=xf{#KX7#%RR+yXU$r}7b0{Rk4uHOfkJYJOkjfpO9 zfDx|>bOaXaCC$#+eEO$d^YLKa6nCDaKxl3lxU1_Nq^x9}*j6w!k7qEDbaCk{&AMKM zdtC5oKekD9UhZvG@IIf7>g<<2i*+deFctQ!&^s}#_)^t!SrPX%J>MeH--*@%!+R;^ zGaX3<%Q4MTBxB!~%b9*<-A(##pzSA_f0MjSup{T4OZ65-oZR{HDgwuLm6SR+i^BOY z<2U4LNBcxKJmJu&z~@gDfJW7E*0%cturq*%S7c!lW_@$1UKPNXi+CE8VQ$@B?2Ozr zWZYiwEMe7QGz|b9wB$-XJ(QMRQ)L3S?>ryi3SBQ*$!q(pvWbf)qllwzZp-~2?I=5% zvQ8OK6see9YO1HlJhX!9SR;+ux9g%7(;}{cd4)PARh?%mS*kJ6k$7dr3vcVq{`#r} zl8SsUIUWE^ZWijB2Y+MpPLI7sIne|=dSryzc0Y@}BD$kcr0Ix~DnIF=mI!?2ze2nW z@|Xi$9r>o#Wb{aT&CIUISTH70>_R1xnl~q->JFxI2pOnbsFv}uLQ_*_+xmh}4CGVSu-dUz~0Z-+If5L`&Xs$Oe;bfxrtzrGx zt{8t32(N<^@JHukmwCs?>G0Gk1-nMZ>dt1)QJ*Fc@63{t$=7+ar27wus_=RuXr%l8^pccuM?uy%L6Ng$NAA_TjLW<3zSmaG zPyJ9*mHoG@((W*4o*BJHsJ3?z}qfd31`S^OaKrO{wLV(yjL9hXIe3Ci#wT zsBw#-bMShg#G<3^w_h2DeGh6<7doQcCrYtsh@EU?`QP?8ijhsPS!50PO9PD@A7r?%5XJGU)Do<%NZ<5hBG^^mYinTfbu;g=AmOwp#7%#_ zj(2JCBdOOP+r_5&4w6-W^BZNY5tet5smv<|jETw}J_)d}{~Yy8N79PF`A|9_Hu?9B zKz=MN7nutI-|zeOeSJ!O7)a_1l_RrNTmS|eK957{?pG6^O?7xN;wrn2JTr9;L zaXbQpm85DZ(aSW~Tf9%4afHDlcEMmV@i5q|rYU9^1`9KW!A8AcutS+Jm`-pG?OQ7t zYzgf2sk3%lwrttDb?c5DJ9h8h{nb}r?b)+u@7}%p_U$t?G&C|YGB!5ezkmOM0|!h@ zOiWEp&CJZq&CL-AgoTC0!Gi}69Xe!bX=!C;Wo>P3V`F1$YkT~PEJnF&d#S#pZ@mSZ_k`LY`|{<> zK0ZFazP=a?=E{{Tetv%6efOQezkfhLKww}X7K;rE3JMMmzIyfQwQJWxLPA1AL&L(t z006+@aCkgEJUl!iB7#65L`FtNMMXtNM-z#}n3$N@*x0zZxa-%i$H&Ki|NZv~2?>db zi8pTCxOwyDty{N}l9F!UzMY($oRX4~nwom&&Yin=@7}w2FD)(Y{{8z89y~}-PtVB6 z$jr>l%F259@L^6)PHt{4i9~wz=+WcHkDokwl9!kF!w)|^efsp-vuFAF`9J>nV?jZ| z^XJcBym(PmR8&$@Qd(MCR#sMCUS3gAL7`BnRBB~qWmQ!bjYb1Ou)4aMPN&z@)G!!~ z+S=MzuU^&F)z#P6zkdC?p`oF%vGL8DH*ep*efRENQ&SU@$!uw9VX;{6-@k8dZT;}! z!^e*w+uPeaIy%^Fc4ucNhr{XW>f&;_-QC>~1oiav@OZr5-rl~xzE7V%_4oG=3=9ko z4h{_s@%jAW;o*^yk3PmE3SS*%EBvPqVCXFMd2nVH$yS%pHOR4P>}m0GQyo14?@$@%l~voXlfjAmu<3AYd!Y?aq9-$jN=Kfcs7 zZV0uz5b6@-8;V0;^MRd4`(Z;3o$StT0Za@{%#6ilWEjlW^yIN4XYoi8dnPY849&la ziN6!Sl1S!8*#jj=+$-~L~nHn*FfMkXF=&+2GhlakigdYJo zRWTVNLrWcLDdfXnjHG}zkq zsa8UXwP^4I0Pj-AvBj1A4;jv23^`~wh+>THv`m;`qt!iaNJAf7-)pUFb;aneWy(m0 z&L~y5Vi;@D#v^n!?Gzd^uw-aI(OR@Px@M;k3GkmldIr<(&QVqI&>pN?x#d)ui&5`# zk5}RXdsdTm@Vh{DOB>2?5;sNJ=jsvGgO-q@W7g*czm+ub=#x|0R+KmdDK>Ou&b7I= z&lO)U+-y8gr*WRF=E5+3;}zQ+g5yOu2koyIyZ}htiNa?l`dJs3Sa(_gl7pkM=*rn+ z^w%E&?@sGdYzlUR(`=DTQp|GQI&l=A*|vs_il=6F1*`@OdaAvsg5jU+YOg1wUEQB3a-3Dv1y zDKVyVEPy-#vbz7(I#MQbsTJn};2iD6Wisk@PhB-nhyFz-?zC@enJoRYF=Am?{l>2P zGlBcRUKI6fp}tyeq(ruzcPa-BSUuN-Ln3XPLxC&sq?fKe--sbTz*V z5sY%mvI+Fj+tzJQz4Ei(h+W3PY+`Onli1v|{TM*#fEZVBb7)mIVw2-#1Wlogsn2XF?ffNzOd*k3%i>KwfK}wyhKOA#H{5S<7MV`?>ENXH_i{lVl%oocG;dSU~!D#f|@pFNLcQPMbd3PE~y*qhF*Kcu_Hmlhp1A z&MdX)+~R2QxnhE3W1UiPUw39}$Cb)efVc_5xET9jx*|l@HCtHO``KJ z#pUigqJ-^gbn>=d@1i&;Bee^IV+y32o|IKU-Z;y%o*Pxa$*#5$xdx;c9lYA-4HC9% z`ZCYgVNGWzIJ&GF^=ukO=>BfBGx>O`4Sr@24uQv)$EVUS0(ga4t`DD4BV2&N1yS<{ zDrIcDNT0~1co)soFhr;BFYkd;%{|HmP!X@(d)JETJIg7c@*!GWp@^5R{RhDdJjx## zlBP`S&zxU3ei7j-65M=;8kHn@JL*x9)ogX8G6IoBF^d{RIT zMi=VA{`J2Y4bfEoz5c>%DyZ`Lw|Q)CJ*qmge2P)sQMKPF zlGPuP^phx^s;iP!VdyG?i&k-*Ml@67aAdKm<($fQ-g(02?efllC*q$qb;RAEk!OT3 z-2_l}2O-W4?f?nG*9IPQ;=U9IL`|6F?8agAt`bYpEp%UnqS^({RyevKVj*wcFGhxt z{2Kpr|<~l@s-%Nb56bpPYi0ruQcT40+KHv`TrII zaOi>7!L9g00&xIAin}N3nZ3uwGD5jBc&FvE75JqT?rg2Gyz6R168xoQk?OW6g=-ds zSnaAuo%&q5GyvDMJ_)FMtKIj49oYcbT3;eVDOq~@+~mSa0NyiXX1m2IhN~*tuA{!V zT8=?fsR$_-r$eqzDGZ$R^Q2JnaX4OFP#85X%V!A@)ekz8^@)<~LZvV?;Dl4jHp{BM zf0=P+j7%2T>mSHo|MuW7#$n~d%Zn@~KM)m5h$$5p3R}cBp`BHTZdHetHe;6W-+GuF zeokmpGN?xPg|&CUN3TDBi9IJoMmKJQjJxs5O{VYdk?X-p=hiiKv&0SqHv;r?r)O}# z3!b{UY-+{yP1o0A2LWLC$&)_FRqpUN@>mbHHfmQ5xAYaV^`c*{j=E%@*IuG)eQj>U z9i^U{qfb%F?inC=f)A`-Jq#=xM|m!|9)H&(-ivdM=OjZ?FeI`?cJP z6FA8%o#W^$*D>NEz>oy>`BTRcv;84oi1aNcWWrtLiiW#MKzx;=g^sYN`{!nIpAtz>J$Zn)lrx_rx4-L(%*W95U;6<` zZZ;A9&vKn_%MwK5jVGLQBKulQ44bg4V=*4r`j^!i=O}x}{6H>mIA4HcaUiPft&gmf zOCBaA@rM)o2H{Ouw^)^t1)s7EM5xrIKA^_-W+qi=EVS4U`YfAb^xnrAc0$+0znUH* z3_Cp|aX`~5A@LT^~gHhghRg69Il<$Nwc_dh^m{I@BbI>|KH)EA_gd9L{nC8K-VdWc0%g2AZ&I z1Gw}$<7$OjA`h_<34|c+#iTOb1jv9Mwyjz?RM|otkAsW@R2@6;9Hw8C=*K7kk&_1P zSUk?gG6LZ}=_lU-h@#1=bzg{ppf}im#(wY5s=>b$-xC<@=0b5Dq;U%GfUsuZ4jF^E zSzF`J2pvs#M5wMkDTW;DC(Dz{7Gmi0DeLGj3+;oaB;ss1T~S9Q>#a}@e%qKsm%K0*+0zCjb6SVBjG*GH;|{jT*UFT7 zKC#W}6U|EADiSy7m7BV`@T`%gPV?VhC@ehSADJwOjf}Nd4?HI7&y8O9JQxBhoD*}x zheF^N*H^ohDcbm=O$h`CjzyY+jb4*_V22vHJXi z?EdrfNB^=&{-38#BRm^<#E%VYvQaZncN)IM`hjr0tKt^)2CTLE2l8g=6Ja{VQZ{?A zYKC2*%OE}~D0TlJZgo^>sQbgF((GZ$t5mXF7u0hv%YK6mt%np+fZm&0n%yi85%4Nv zZ=2nwRQ?~LnZ#K?v@-sA!+Uts0` zQ^I(y$vb%DKoNPfK-2|ApCYtyfT^UE={^fQN0c8bdtGPTU2FzkT}p~(QmIT0PuWf0 zxIGZ(Y)>1R)B@Nj60~8lGh<*qZf~ck+vYe&OiBqI_0$4D{k@~FUNy>*Fg{&uvW{T~W^Y&2)Aj_Z5C(y& z#Fdk!y2(@6YD^{pDpgyi_4yzWVB640LSKVRY4#~E)7g)Ez7Qn@@-n{+#O1XjQhP8s zQ5DB=hcQmJn<}icRFZd{KsPM=aOdU%Nn_Gfez*2<+X)CP4M7*9*j$>NXOMl#_>dwo5@7Z7QCH}t@{haDmz=_f(=L?5inPXxb z+T@RAh8AHENIFL6R1gLxTr^UY4&(xEz`9jA!OZGzr68W=lqm)yeQ|Of11md3wJce) zv!zfVqXZmUv+e<-3h#?U(8kL1r71H;9LFz%+nym>1kly)$zP=?sGD3P?_#=B1MxD0 zyVz$89y7~&>c%VPG_HSr@xC9*lvzyd)5Sg1g^=KaHu=v4`?nx4dAC#$6d5AP%rGQ! z0z~4pL@cp2#At48Y_GTHes_Syz-$0eA>9p(O-;U4Nxn_kwqhyGUzML8vXRd(^TADY zi-%B_Z0iGSTMn?B)1m8_eO+sGAQBY6m|!mKLR5>^r7x#NQUC-^eos@nunj!9Odkqu zTikPwf$$5D`9-4U!2@U$nyMh#`$UaO?bV^eX){unIqaA;>-BRH7TN1sAY0}mj`D5A znwcZ!^f^_R7b1iUOldw=2|te=n+uYF-S5v-d{b7qsYO zyMWdr(msr*h#w3lQulRw;(15({o0n)1;7I%<9f^N(J@fC5LYi|!qITuw6kF5|mQ{fa zH+lM`t=s;dfG&v85jYR7E{55r3oegpA*KEm$ zK#9IOq0J^->Ozcal7R_&EL4gwhwPjU86hC6?#MTUwGrawh8q)b`cpGLf$5-Em#~l= zvQZq#Ig+a4vpALF=?87e&zRy&9FrrmQun6KO!f@!GV5UFGsUV#(dGo#ZmSNCYeZ`~ zCt2TP?t?B#p7o&gcDr*fbVbr=Xg$tw8URHA literal 0 HcmV?d00001 diff --git a/programs/games/nu_pogodi/trunk/help.txt b/programs/games/nu_pogodi/trunk/help.txt new file mode 100644 index 0000000000..935048b9bd --- /dev/null +++ b/programs/games/nu_pogodi/trunk/help.txt @@ -0,0 +1,7 @@ +╚уЁр ═є яюуюфш. + +╙яЁрты   ё яюью∙№■ ъыртш° a,z,',/ яхЁхьх∙хэшхь тюыър, эхюсїюфшью яющьрЄ№ фтшцє∙шхё   щЎр. ┼ёыш шуЁюъ эх ёьюцхЄ яющьрЄ№  щЎр, Єю юэ яюыєўрхЄ °ЄЁрЇэ√х юўъш (шчюсЁрцр■Єё  т тхЁїэхь яЁртюь єуыє ¤ъЁрэр). ┼ёыш  щЎр Ёрчсштр■Єё  яЁш яю тыхэшш чрщЎр т ыхтюь тхЁїэхь єуыє ¤ъЁрэр, Єю шуЁюъє эрчэрўрхЄё  яюы °ЄЁрЇэюую юўър (яюыютшэр °ЄЁрЇэюую юўър ьшурхЄ). +┬ ёыєўрх ёыхфє■∙шї эхєфрў юўъш ёєььшЁє■Єё . ╧Ёш яюыєўхэшш ЄЁхї °ЄЁрЇэ√ї юўъют шуЁр чрърэўштрхЄё . +┼ёыш ёўхЄ шуЁ√ фюёЄшурхЄ 200 шыш 500, яюыєўхээ√х фю ¤Єюую °ЄЁрЇэ√х юўъш рээєышЁє■Єё , ю ўхь юяютх∙рхЄ чтєъютющ ёшуэры. +╧ю ьхЁх єтхышўхэш  ўшёыр эрсЁрээ√ї юўъют шуЁр єёыюцэ хЄё . +╬Єышўшх "╚уЁ√ └" юЄ "╚уЁ√ ┴" т Єюь, ўЄю яЁш трЁшрэЄх "╚уЁр └" фтшцє∙шхё  яЁхфьхЄ√ юфэютЁхьхээю ьюуєЄ фтшурЄ№ё  Єюы№ъю ё ЄЁхї Єюўхъ, яЁш трЁшрэЄх "╚уЁр ┴" - ё ўхЄ√Ёхї. \ No newline at end of file diff --git a/programs/games/nu_pogodi/trunk/mem.inc b/programs/games/nu_pogodi/trunk/mem.inc new file mode 100644 index 0000000000..ec78fbf7f6 --- /dev/null +++ b/programs/games/nu_pogodi/trunk/mem.inc @@ -0,0 +1,48 @@ +;----------------------------------------------------------------------------- +proc mem.Alloc,size ;///////////////////////////////////////////////////////// +;----------------------------------------------------------------------------- + push ebx ecx + mov ecx,[size] + ;*** add ecx,4 + mcall 68,12 + ;*** add ecx,-4 + ;*** mov [eax],ecx + ;*** add eax,4 + pop ecx ebx + ret +endp + +;----------------------------------------------------------------------------- +proc mem.ReAlloc,mptr,size ;////////////////////////////////////////////////// +;----------------------------------------------------------------------------- + push ebx ecx edx + mov ecx,[size] + or ecx,ecx + jz @f + ;*** add ecx,4 + @@: mov edx,[mptr] + or edx,edx + jz @f + ;*** add edx,-4 + @@: mcall 68,20 + or eax,eax + jz @f + ;*** add ecx,-4 + ;*** mov [eax],ecx + ;*** add eax,4 + @@: pop edx ecx ebx + ret +endp + +;----------------------------------------------------------------------------- +proc mem.Free,mptr ;////////////////////////////////////////////////////////// +;----------------------------------------------------------------------------- + push ebx ecx + mov ecx,[mptr] + or ecx,ecx + jz @f + ;*** add ecx,-4 + @@: mcall 68,13 + pop ecx ebx + ret +endp diff --git a/programs/games/nu_pogodi/trunk/nu_p_chi.svg b/programs/games/nu_pogodi/trunk/nu_p_chi.svg new file mode 100644 index 0000000000..5589084be0 --- /dev/null +++ b/programs/games/nu_pogodi/trunk/nu_p_chi.svg @@ -0,0 +1,248 @@ + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/programs/games/nu_pogodi/trunk/nu_p_curici.svg b/programs/games/nu_pogodi/trunk/nu_p_curici.svg new file mode 100644 index 0000000000..24ee41163e --- /dev/null +++ b/programs/games/nu_pogodi/trunk/nu_p_curici.svg @@ -0,0 +1,458 @@ + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/programs/games/nu_pogodi/trunk/nu_p_egs.svg b/programs/games/nu_pogodi/trunk/nu_p_egs.svg new file mode 100644 index 0000000000..1decd6cd8a --- /dev/null +++ b/programs/games/nu_pogodi/trunk/nu_p_egs.svg @@ -0,0 +1,337 @@ + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/programs/games/nu_pogodi/trunk/nu_p_wolf.svg b/programs/games/nu_pogodi/trunk/nu_p_wolf.svg new file mode 100644 index 0000000000..29c1b59795 --- /dev/null +++ b/programs/games/nu_pogodi/trunk/nu_p_wolf.svg @@ -0,0 +1,692 @@ + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/programs/games/nu_pogodi/trunk/nu_pogod.asm b/programs/games/nu_pogodi/trunk/nu_pogod.asm new file mode 100644 index 0000000000..85f8011935 --- /dev/null +++ b/programs/games/nu_pogodi/trunk/nu_pogod.asm @@ -0,0 +1,1067 @@ +use32 + org 0x0 + db 'MENUET01' ;идентиф. исполняемого файла всегда 8 байт + dd 0x1 + dd start + dd i_end ;размер приложения + dd mem + dd stacktop + dd 0x0 + dd sys_path + +include '../../../macros.inc' +include '../../../proc32.inc' +include '../../../develop/libraries/box_lib/load_lib.mac' +include 'mem.inc' +include 'dll.inc' + +@use_library_mem mem.Alloc,mem.Free,mem.ReAlloc, dll.Load + +;флаги, для функции обрезания буфера +BUF2D_OPT_CROP_TOP equ 1 ;обрезка сверху +BUF2D_OPT_CROP_LEFT equ 2 ;обрезка слева +BUF2D_OPT_CROP_BOTTOM equ 4 ;обрезка снизу +BUF2D_OPT_CROP_RIGHT equ 8 ;обрезка справа +BUF2D_BIT_OPT_CROP_TOP equ 0 +BUF2D_BIT_OPT_CROP_LEFT equ 1 +BUF2D_BIT_OPT_CROP_BOTTOM equ 2 +BUF2D_BIT_OPT_CROP_RIGHT equ 3 + +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_size_lt equ dword[edi+4] ;отступ слева и справа для буфера +buf2d_color equ dword[edi+16] ;цвет фона буфера +buf2d_bits equ byte[edi+20] ;количество бит в 1-й точке изображения + +struct FileInfoBlock + Function dd ? + Position dd ? + Flags dd ? + Count dd ? + Buffer dd ? + db ? + FileName dd ? +ends + +GAME_POLE_W equ 315 ;ширина поля +GAME_POLE_H equ 210 ;высота поля +GAME_POLE_BYTES equ GAME_POLE_W*GAME_POLE_H*3 ;размер файла с изображением +OFFS_SHADOW_X equ 2 ;сдвиг теней по оси 'x' +OFFS_SHADOW_Y equ 2 ;сдвиг теней по оси 'y' +IMAGE_FONT_SIZE equ 128*144*3 + +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 ;цвет травы +color_wolf dd 0x800000 ;цвет волка и зайца +color_egg dd 0x404080 ;цвет яйца +color_chick dd 0x00d0d0 ;цвет ципленка +color_curici dd 0x8080d0 ;цвет курицы +color_perilo dd 0x000080 ;цвет перила (гребня) + +macro load_image_file path,buf,size { ;макрос для загрузки изображений + stdcall mem.Alloc, dword size ;выделяем память для изображения + mov [buf],eax + + copy_path path,sys_path,file_name,0x0 ;формируем полный путь к файлу изображения, подразумеваем что он в одной папке с программой + mov eax,70 ;70-я функция работа с файлами + mov [run_file_70.Function], 0 + mov [run_file_70.Position], 0 + mov [run_file_70.Flags], 0 + mov [run_file_70.Count], dword size + m2m [run_file_70.Buffer], [buf] + mov byte[run_file_70+20], 0 + mov [run_file_70.FileName], file_name + mov ebx,run_file_70 + int 0x40 ;загружаем файл изображения + cmp ebx,0xffffffff + je @f + ;определяем вид изображения и переводим его во временный буфер image_data + stdcall dword[img_decode], dword[buf],ebx,0 + mov dword[image_data],eax + ;преобразуем изображение к формату rgb + stdcall dword[img_to_rgb2], dword[image_data],dword[buf] + ;удаляем временный буфер image_data + stdcall dword[img_destroy], dword[image_data] + @@: +} + +;данные игры +bit_zaac equ 2 ;бит зайца +val_zaac equ 4 ;цифра отвечающая за бит зайца +bit_mig equ 3 ;бит мигания +val_mig equ 8 ;цифра отвечающая за бит мигания +mask_lot_lu equ 1b ;маска для левого верхнего лотка +mask_lot_ld equ 100000b ;маска для левого нижнего лотка +mask_lot_ru equ 10000000000b ;маска для правого верхнего лотка +mask_lot_rd equ 1000000000000000b ;маска для правого нижнего лотка +mask_clear_all equ 11111011111011110111101111011110b ;маска для очистки падающих яиц и прибежавших циплят +mask_fail_eggs equ 100001000010000100000b ;маска падающих яиц +mask_chi_left equ 11111000000000000000000000b ;маска левых циплят +mask_chi_right equ 11111000000000000000000000000000b ;маска правых циплят +mask_chi_cr_l equ 1000000000000000000000b ;маска для создания левого +mask_chi_cr_r equ 1000000000000000000000000000b ;маска для создания правого +bit_chi_left equ 21 ;1-й бит который отвечает за бегущего слева +bit_chi_right equ 27 ;1-й бит который отвечает за бегущего права + +pos_wolf db 0 ;позиция волка 0-й бит слева/справа, 1-й бит сверху/вниз +;rb 1 +pos_eggs dd 0 ;позиции расположения яиц и циплят +eggs_count dw 0 ;колличество пойманых яиц +game_text db 'Игра _',13 +some_text db '0' + rb 8 ;текст с числом пойманных яиц +count_last db 0 ;счетчик пропущенных яиц +game_spd dd 0 ;задержка игры + +;для генерации случайных чисел +rand_x dd 0 + +align 4 +rand_next: +;x(k+1) = (a*x(k)+c) mod m +; a=22695477, c=1, m=2^32 +push eax + mov eax,dword[rand_x] + imul eax,22695477 + inc eax + mov dword[rand_x],eax +pop eax + ret + +;создаем прозрачные буфера по 8 бит (трафареты), для рисования +;где buf - буфер на основе которого будет создан трафарет +;фоновый цвет буфера должен быть 0xffffff, иначе не произойдет обрезка +;по фоновому цвету и трафарет будет занимат ьмного места в памяти +align 4 +proc CreateTrapharetBuffer, buf:dword, img_data:dword + push edi + 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 + pop edi + ret +endp + +align 4 +InitBackgroundBuffer: ;создание фонового изображения + pushad + mov edi,buf_fon + mov eax,[color_fon] + mov buf2d_color,eax + stdcall [buf2d_clear], edi,eax + mov esi,edi + + xor eax,eax + xor ebx,ebx + + mov edi,buf_tr_fon0 + mov ax,buf2d_t + add eax,OFFS_SHADOW_Y + mov bx,buf2d_l + add ebx,OFFS_SHADOW_X + stdcall [buf2d_bit_blt_alpha], esi, ebx,eax, edi,[color_shadows] ;рисуем тени домиков + mov edi,buf_tr_fon1 + mov ax,buf2d_t + add eax,OFFS_SHADOW_Y + mov bx,buf2d_l + add ebx,OFFS_SHADOW_X + stdcall [buf2d_bit_blt_alpha], esi, ebx,eax, edi,[color_shadows] ;рисуем тени куриц + mov edi,buf_tr_fon2 + mov ax,buf2d_t + add eax,OFFS_SHADOW_Y + mov bx,buf2d_l + add ebx,OFFS_SHADOW_X + stdcall [buf2d_bit_blt_alpha], esi, ebx,eax, edi,[color_shadows] ;рисуем тени деревьев + + mov edi,buf_tr_fon0 + mov ax,buf2d_t + stdcall [buf2d_bit_blt_alpha], esi, 0,eax, edi,[color_perilo] ;рисуем домики + mov edi,buf_tr_fon1 + mov ax,buf2d_t + stdcall [buf2d_bit_blt_alpha], esi, 0,eax, edi,[color_curici] ;рисуем курицы + mov edi,buf_tr_fon2 + mov ax,buf2d_t + stdcall [buf2d_bit_blt_alpha], esi, 0,eax, edi,[color_trees] ;рисуем деревья + popad + ret + +;рисует картинку в буфере buf из массива буферов buf_img с индексом ind +;т. е. buf <- buf_img[ind] +align 4 +proc DrawArrayImg, buf:dword, buf_img:dword, ind:dword, color:dword + pushad + mov edi,dword[ind] + imul edi,BUF_STRUCT_SIZE + add edi,dword[buf_img] + + mov esi,dword[buf] + xor eax,eax + mov ax,buf2d_t + xor ebx,ebx + mov bx,buf2d_l + stdcall [buf2d_bit_blt_alpha], esi, ebx,eax, edi,[color] + popad + ret +endp + +align 4 +DrawZaac: ;рисование зайца + push eax + bt word[pos_wolf],bit_zaac + jae .end_mig + + stdcall DrawArrayImg, buf_displ,buf_wolf,6,[color_wolf] ;рисуем тело зайца + mov eax,dword[pos_eggs] + and eax,mask_chi_right+mask_chi_left + cmp eax,0 + je .end_mig ;если нет бегающих циплят, то заяц рукой не машет + bt word[pos_wolf],bit_mig + jc @f + stdcall DrawArrayImg, buf_displ,buf_wolf,7,[color_wolf] ;рисуем руку зайца вверху + jmp .end_mig + @@: + stdcall DrawArrayImg, buf_displ,buf_wolf,8,[color_wolf] ;рисуем руку зайца внизу + .end_mig: + pop eax + ret + +align 4 +DrawWolf: ;рисует волка с корзинами + bt word[pos_wolf],0 + jc @f + stdcall DrawArrayImg, buf_displ,buf_wolf,0,[color_wolf] + bt word[pos_wolf],1 + jc .corz_ldn + stdcall DrawArrayImg, buf_displ,buf_wolf,1,[color_wolf] + jmp .corz_lend + .corz_ldn: + stdcall DrawArrayImg, buf_displ,buf_wolf,2,[color_wolf] + .corz_lend: + jmp .wolf_b + @@: + stdcall DrawArrayImg, buf_displ,buf_wolf,3,[color_wolf] + bt word[pos_wolf],1 + jc .corz_rdn + stdcall DrawArrayImg, buf_displ,buf_wolf,4,[color_wolf] + jmp .corz_rend + .corz_rdn: + stdcall DrawArrayImg, buf_displ,buf_wolf,5,[color_wolf] + .corz_rend: + .wolf_b: + ret + +align 4 +DrawEggs: ;рисует яйца + pushad + cld + + mov eax,dword[pos_eggs] + xor ebx,ebx + mov ecx,20 ;цикл для рисования котящихся яиц + @@: + bt eax,ebx + jae .draw_egg + stdcall DrawArrayImg, buf_displ,buf_egg,ebx,[color_egg] + .draw_egg: + inc ebx + loop @b + + ;mov eax,dword[pos_eggs] + and eax,mask_chi_left + cmp eax,0 + je @f + stdcall DrawArrayImg, buf_displ,buf_egg,20,[color_egg] ;разбитое яйцо слева + @@: + mov eax,dword[pos_eggs] + and eax,mask_chi_right + cmp eax,0 + je @f + stdcall DrawArrayImg, buf_displ,buf_egg,21,[color_egg] ;разбитое яйцо справа + @@: + + mov eax,dword[pos_eggs] + xor edx,edx + mov ebx,bit_chi_left + mov ecx,5 ;цикл для рисования левых циплят + @@: + bt eax,ebx + jae .draw_chick_l + stdcall DrawArrayImg, buf_displ,buf_chi,edx,[color_chick] + .draw_chick_l: + inc ebx + inc edx + loop @b + mov ebx,bit_chi_right + mov ecx,5 ;цикл для рисования правых циплят + @@: + bt eax,ebx + jae .draw_chick_r + stdcall DrawArrayImg, buf_displ,buf_chi,edx,[color_chick] + .draw_chick_r: + inc ebx + inc edx + loop @b + + xor eax,eax + mov al,byte[count_last] + mov ecx,eax ;цикл для рисования штрафных очков + shr ecx,1 + mov edx,10 ;индекс начала штрафных иконок в буфере buf_chi + cmp ecx,0 + je .no_unit_last + @@: + stdcall DrawArrayImg, buf_displ,buf_chi,edx,[color_chick] + inc edx + loop @b + .no_unit_last: + + bt ax,0 ;проверяем мигающее не четное очко + jae @f + bt word[pos_wolf],bit_mig + jc @f + stdcall DrawArrayImg, buf_displ,buf_chi,edx,[color_chick] ;мигающее штрафное очко + @@: + + popad + ret + +align 4 +CountEggsInc: ;увеличиваем счетчик яиц на 1 + push eax edi + xor eax,eax + inc word[eggs_count] ;увеличиваем счетчик яиц + cmp word[eggs_count],200 ;бонусные очки + je @f + cmp word[eggs_count],500 ;бонусные очки + je @f + jmp .no_bonus + @@: + mov byte[count_last],0 + .no_bonus: + + mov ax,word[eggs_count] + mov edi,some_text + call convert_to_str ;обновляем текстовую строку + and ax,0xf ;через каждые 16 яиц уменьшаем время + cmp ax,0 + jne @f + cmp dword[game_spd],15 ;минимальная задержка + jle @f + dec dword[game_spd] + @@: + pop edi eax + ret + +;input: +; eax - маска, указывающая с какой строны упало яйцо +align 4 +CountLastInc: ;начисление штрафных очков + inc byte[count_last] ;половинао штрафного очка + bt word[pos_wolf],bit_zaac + jc @f + inc byte[count_last] ;если нет зайца то еще 1-на половина штрафного очка + @@: + cmp byte[count_last],6 + jle @f + mov byte[count_last],6 ;ставим ограничени на число штрафных очков + @@: + or dword[pos_eggs],eax ;создаем бегущего ципленка + ret + +align 4 +MoveEggs: + pushad + xor byte[pos_wolf],val_mig ;бит для мигания + + cmp byte[count_last],6 ;максимальное число штрафных очков + je .end_fun + + rol dword[pos_eggs],1 + mov ecx,dword[pos_eggs] + and ecx,mask_fail_eggs + cmp ecx,0 + je .no_fail ;нет падающих яиц + ;начисление яиц попавших в корзину + ;или начисление штрафных очков + xor ebx,ebx + mov bl,byte[pos_wolf] ;берем параметры (позицию) волка + and bl,3 ;на всякий случай + + bt ecx,5 ;проверяем верхнее левое перило + jae .perilo_lu + cmp bx,0 ;проверяем наличие корзины + jne @f + call CountEggsInc + jmp .perilo_lu + @@: + mov eax,mask_chi_cr_l + call CountLastInc + .perilo_lu: + bt ecx,10 ;проверяем нижнее левое перило + jae .perilo_ld + cmp bx,2 ;проверяем наличие корзины + jne @f + call CountEggsInc + jmp .perilo_ld + @@: + mov eax,mask_chi_cr_l + call CountLastInc + .perilo_ld: + bt ecx,15 ;проверяем верхнее правое перило + jae .perilo_ru + cmp bx,1 ;проверяем наличие корзины + jne @f + call CountEggsInc + jmp .perilo_ru + @@: + mov eax,mask_chi_cr_r + call CountLastInc + .perilo_ru: + bt ecx,20 ;проверяем нижнее правое перило + jae .perilo_rd + cmp bx,3 ;проверяем наличие корзины + jne @f + call CountEggsInc + jmp .perilo_rd + @@: + mov eax,mask_chi_cr_r + call CountLastInc + .perilo_rd: + .no_fail: + + 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 + jc @f + xor byte[pos_wolf],val_zaac ;высовываем/засовываем зайца + @@: + + ;создание новых яиц + bt dword[rand_x],4 ;проверяем будем ли создавать новое яйцо + jc .end_creat + bt dword[rand_x],5 ;проверяем с какой стороны будем создавать новое яйцо + jc .creat_r + bt dword[rand_x],7 + jc @f + or dword[pos_eggs],mask_lot_lu + jmp .end_creat + @@: + or dword[pos_eggs],mask_lot_ld + jmp .end_creat + .creat_r: + bt dword[rand_x],7 + jc @f + or dword[pos_eggs],mask_lot_ru + jmp .end_creat + @@: + or dword[pos_eggs],mask_lot_rd + ;jmp .end_creat + .end_creat: + + .end_fun: + popad + ret + +align 4 +proc InitGame, b:dword ;первоначальные настройки игры + mov word[eggs_count],0 ;колличество пойманых яиц + mov byte[some_text],'0' + mov byte[some_text+1],0 ;текст с числом пойманных яиц + mov byte[count_last],0 + mov dword[pos_eggs],0 + + cmp dword[b],0 + jne @f + mov byte[game_text+5],'А' + mov dword[game_spd],65 ;задержка игры + jmp .end_init + @@: + mov byte[game_text+5],'Б' + mov dword[game_spd],35 ;задержка игры + .end_init: + + push eax ebx + mcall 26,9 + mov dword[rand_x],eax ;заполняем 1-е случайное число + pop ebx eax + + ret +endp + +align 4 +start: + load_libraries l_libs_start,load_lib_end + + ;проверка на сколько удачно загузилась наша либа + mov ebp,lib0 + cmp dword [ebp+ll_struc_size-4],0 + jz @f + mcall -1 ;exit not correct + @@: + mov ebp,lib1 + cmp dword [ebp+ll_struc_size-4],0 + jz @f + mcall -1 ;exit not correct + @@: + + mcall 40,0x27 + mcall 48,3,sc,sizeof.system_colors ;получаем системные цвета + + load_image_file fn_icon0,image_data_gray,3*GAME_POLE_BYTES + mov eax,[image_data_gray] + stdcall CreateTrapharetBuffer,buf_tr_fon0,eax + add eax,GAME_POLE_BYTES + stdcall CreateTrapharetBuffer,buf_tr_fon1,eax + add eax,GAME_POLE_BYTES + stdcall CreateTrapharetBuffer,buf_tr_fon2,eax + stdcall mem.Free,[image_data_gray] ;освобождаем память + + stdcall [buf2d_create], buf_fon ;создаем буфер с фоновыми декорациями + + load_image_file fn_icon1,image_data_gray, 9*GAME_POLE_BYTES + mov eax,[image_data_gray] + mov edi,buf_wolf + mov ecx,9 + cld + @@: ;считываем 9 буферов с волком и зайцем + mov buf2d_size_lt,0 + mov buf2d_w,GAME_POLE_W + mov buf2d_h,GAME_POLE_H + mov buf2d_color,0xffffff + mov buf2d_bits,24 + stdcall CreateTrapharetBuffer,edi,eax + add eax,GAME_POLE_BYTES + add edi,BUF_STRUCT_SIZE + loop @b + stdcall mem.Free,[image_data_gray] ;освобождаем память + + load_image_file fn_icon2,image_data_gray, 22*GAME_POLE_BYTES + mov eax,[image_data_gray] + mov edi,buf_egg + mov ecx,22 + cld + @@: ;считываем 22 буферов с яйцами + mov buf2d_size_lt,0 + mov buf2d_w,GAME_POLE_W + mov buf2d_h,GAME_POLE_H + mov buf2d_color,0xffffff + mov buf2d_bits,24 + stdcall CreateTrapharetBuffer,edi,eax + add eax,GAME_POLE_BYTES + add edi,BUF_STRUCT_SIZE + loop @b + stdcall mem.Free,[image_data_gray] ;освобождаем память + + load_image_file fn_icon3,image_data_gray, 13*GAME_POLE_BYTES + mov eax,[image_data_gray] + mov edi,buf_chi + mov ecx,13 + cld + @@: ;считываем 13 буферов с циплятами + mov buf2d_size_lt,0 + mov buf2d_w,GAME_POLE_W + mov buf2d_h,GAME_POLE_H + mov buf2d_color,0xffffff + mov buf2d_bits,24 + stdcall CreateTrapharetBuffer,edi,eax + add eax,GAME_POLE_BYTES + add edi,BUF_STRUCT_SIZE + loop @b + stdcall mem.Free,[image_data_gray] ;освобождаем память + + load_image_file fn_font, image_data_gray,IMAGE_FONT_SIZE + stdcall [buf2d_create_f_img], buf_font,[image_data_gray] ;создаем буфер + stdcall mem.Free,[image_data_gray] ;освобождаем память + + stdcall [buf2d_conv_24_to_8], buf_font,1 ;делаем буфер прозрачности 8 бит + stdcall [buf2d_convert_text_matrix], buf_font + +;проверка занимаемого буфером места +;mov edi,buf_wolf +;add edi,BUF_STRUCT_SIZE ;переходим на буфер корзины +;stdcall [buf2d_clear],edi,0x808080 ;заливаем его серым цветом + + stdcall [buf2d_create], buf_displ ;создаем буфер для вывода на экран + call InitBackgroundBuffer ;заполняем буфер с фоновыми декорациями + stdcall InitGame,0 + mcall 26,9 + mov [last_time],ebx + + + +align 4 +red_win: + call draw_window + +align 4 +still: ;главный цикл + mcall 26,9 + mov ebx,[last_time] + add ebx,dword[game_spd] ;delay + sub ebx,eax + cmp ebx,dword[game_spd] ;delay + ja it_is_time_now + test ebx,ebx + jz it_is_time_now + mcall 23 + + cmp eax,0 + je it_is_time_now + + ;mcall 10 + + cmp al,0x1 ;изменилось положение окна + jz red_win + cmp al,0x2 + jz key + cmp al,0x3 + jz button + + jmp still + +align 4 +it_is_time_now: + mcall 26,9 + mov [last_time],eax + + ;...здесь идут действия, вызываемые каждые delay сотых долей секунд... + call MoveEggs + call draw_display + jmp still + +align 4 +key: + push eax ebx + mcall 2 + + cmp ah,176 ;Left + jne @f + and byte[pos_wolf],0xfe + @@: + cmp ah,179 ;Right + jne @f + or byte[pos_wolf],1 + @@: + cmp ah,178 ;Up + jne @f + and byte[pos_wolf],0xff-2 + @@: + cmp ah,177 ;Down + jne @f + or byte[pos_wolf],2 + @@: + + cmp ah,97 ;a + jne @f + and byte[pos_wolf],0xff-3 ;00 + @@: + cmp ah,122 ;z + jne @f + and byte[pos_wolf],0xff-1 + or byte[pos_wolf],2 ;10 + @@: + cmp ah,39 ;' + jne @f + and byte[pos_wolf],0xff-2 + or byte[pos_wolf],1 ;01 + @@: + cmp ah,47 ;/ + jne @f + or byte[pos_wolf],3 ;11 + @@: + + pop ebx eax + jmp still + + +align 4 +draw_window: + pushad + mcall 12,1 + + xor eax,eax + mov ebx,20*65536+370 + mov ecx,20*65536+280 + mov edx,[sc.work] + ;or edx,0x33000000 + or edx,0x73000000 + mov edi,hed + mcall ;создание окна + + mcall 9,procinfo,-1 + mov edi,buf_displ + mov eax,dword[procinfo.client_box.width] + cmp eax,GAME_POLE_W + jle @f + sub eax,GAME_POLE_W + shr eax,1 + mov buf2d_l,ax ;выправниваем буфер по центру окна + @@: + + call draw_display + + mov eax,13 ;рисование прямоугольника + mov edx,[sc.work] + xor esi,esi + mov si,buf2d_l + add esi,GAME_POLE_W + mov ebx,dword[procinfo.client_box.width] + inc ebx + cmp esi,ebx + jge @f + sub ebx,esi + rol ebx,16 + mov bx,si + rol ebx,16 + mov ecx,dword[procinfo.client_box.height] + inc ecx + int 0x40 ;рисование правого бокового поля + jmp .draw_s + @@: + mov esi,dword[procinfo.client_box.width] ;когда по ширине не влазит + inc esi + .draw_s: + + mov ebx,esi + mov ecx,dword[procinfo.client_box.height] + inc ecx + mov esi,GAME_POLE_H + cmp esi,ebx + jge @f + sub ecx,esi + rol ecx,16 + mov cx,si + rol ecx,16 + int 0x40 ;рисование нижнего поля + @@: + + xor ebx,ebx + mov bx,buf2d_l + mov ecx,GAME_POLE_H + int 0x40 ;рисование левого бокового поля + + mcall 12,2 + popad + ret + +align 4 +draw_display: + + stdcall mem_copy, dword[buf_fon],dword[buf_displ],GAME_POLE_BYTES ;копирование изображения из фонового буфера + call DrawZaac + call DrawWolf ;рисуем волка + call DrawEggs + + stdcall [buf2d_draw_text], buf_displ, buf_font,game_text,GAME_POLE_W/2,OFFS_SHADOW_X,[color_curici] ;рисуем строку с текстом + + stdcall [buf2d_draw], buf_displ + +;mov eax,4 ;рисование текста +;mov ebx,(GAME_POLE_W/2)*65536+OFFS_SHADOW_X +;mov ecx,[color_curici] +;or ecx,0x80000000 +;mov edx,some_text +;mcall + + ret + +align 4 +button: + mcall 17 ;получить код нажатой кнопки + cmp ah,1 + jne still +.exit: + stdcall [buf2d_delete],buf_fon ;удаляем буфер + stdcall [buf2d_delete],buf_displ ;удаляем буфер + + stdcall [buf2d_delete],buf_tr_fon0 + stdcall [buf2d_delete],buf_tr_fon1 + stdcall [buf2d_delete],buf_tr_fon2 + + stdcall [buf2d_delete],buf_font + + cld + mov ecx,9 + mov edi,buf_wolf + @@: ;удаляем 9 буферов с волком и зайцем + stdcall [buf2d_delete],edi + add edi,BUF_STRUCT_SIZE + loop @b + mov ecx,13 + mov edi,buf_chi + @@: ;удаляем 13 буферов + stdcall [buf2d_delete],edi + add edi,BUF_STRUCT_SIZE + loop @b + mov ecx,22 + mov edi,buf_egg + @@: ;удаляем 22 буфера + stdcall [buf2d_delete],edi + add edi,BUF_STRUCT_SIZE + loop @b + + mcall -1 ;выход из программы + +head_f_i: +head_f_l db 'Системная ошибка',0 + +system_dir0 db '/sys/lib/' +name_buf2d db 'buf2d.obj',0 +err_message_found_lib0 db 'Не удалось найти библиотеку buf2d.obj',0 +err_message_import0 db 'Ошибка при импорте библиотеки buf2d.obj',0 + +system_dir1 db '/sys/lib/' +name_libimg db 'libimg.obj',0 +err_message_found_lib1 db 'Не удалось найти библиотеку libimg.obj',0 +err_message_import1 db 'Ошибка при импорте библиотеки libimg.obj',0 + +;library structures +l_libs_start: + lib0 l_libs name_buf2d, sys_path, file_name, system_dir0, err_message_found_lib0, head_f_l, import_buf2d_lib, err_message_import0, head_f_i + lib1 l_libs name_libimg, sys_path, file_name, system_dir1, err_message_found_lib1, head_f_l, import_libimg, err_message_import1, head_f_i +load_lib_end: + +align 4 +proc mem_copy, source:dword, destination:dword, len:dword + push ecx esi edi + cld + mov esi, dword[source] + mov edi, dword[destination] + mov ecx, dword[len] + rep movsb + pop edi esi ecx + ret +endp + +align 4 +convert_to_str: + pushad + ;mov eax,dword[value] + ;mov edi,dword[text] + mov dword[edi+1],0 + cld + call .str + popad + ret + + +align 4 +.str: + mov ecx,0x0a ;задается система счисления изменяются регистры ebx,eax,ecx,edx входные параметры eax - число + ;преревод числа в ASCII строку взодные данные ecx=система счисленя edi адрес куда записывать, будем строку, причем конец переменной + cmp eax,ecx ;сравнить если в eax меньше чем в ecx то перейти на @@-1 т.е. на pop eax + jb @f + xor edx,edx ;очистить edx + div ecx ;разделить - остаток в edx + push edx ;положить в стек + ;dec edi ;смещение необходимое для записи с конца строки + call .str;перейти на саму себя т.е. вызвать саму себя и так до того момента пока в eax не станет меньше чем в ecx + pop eax + @@: ;cmp al,10 ;проверить не меньше ли значение в al чем 10 (для системы счисленя 10 данная команда - лишная)) + ;sbb al,$69 ;- честно данная инструкция меня заставляет задуматься т.е. я не знаю как это работает + ;das ;после данной команды как бы происходит уменьшение al на 66h (в книге написано другое) + or al,0x30 ;данная команда короче чем две выше + stosb ;записать элемент из регистра al в ячеку памяти es:edi + ret ;вернуться чень интересный ход т.к. пока в стеке храниться кол-во вызовов то столько раз мы и будем вызываться + + +last_time dd ? +image_data dd 0 ;память для преобразования картинки функциями libimg +image_data_gray dd 0 ;память с временными серыми изображениями в формате 24-bit, из которых будут создаваться трафареты + +run_file_70 FileInfoBlock +hed db 'Nu pogodi 29.07.10',0 ;подпись окна +sc system_colors ;системные цвета + +align 4 +buf_fon: ;фоновый буфер + dd 0 ;указатель на буфер изображения + dw 0 ;+4 left + dw 0 ;+6 top + dd GAME_POLE_W ;+8 w + dd GAME_POLE_H ;+12 h + dd 0xffffff ;+16 color + db 24 ;+20 bit in pixel + +align 4 +buf_font: ;буфер со шрифтом + dd 0 ;указатель на буфер изображения + dw 25 ;+4 left + dw 25 ;+6 top + dd 128 ;+8 w + dd 144 ;+12 h + dd 0 ;+16 color + db 24 ;+20 bit in pixel + +align 4 +buf_tr_fon0: ;буфер с домиками и рейками + dd 0 ;указатель на буфер изображения + dw 0 ;+4 left + dw 0 ;+6 top + dd GAME_POLE_W ;+8 w + dd GAME_POLE_H ;+12 h + dd 0xffffff ;+16 color + db 24 ;+20 bit in pixel +align 4 +buf_tr_fon1: ;буфер с курицами + dd 0 ;указатель на буфер изображения + dw 0 ;+4 left + dw 0 ;+6 top + dd GAME_POLE_W ;+8 w + dd GAME_POLE_H ;+12 h + dd 0xffffff ;+16 color + db 24 ;+20 bit in pixel +align 4 +buf_tr_fon2: ;буфер с растениями + dd 0 ;указатель на буфер изображения + dw 0 ;+4 left + dw 0 ;+6 top + dd GAME_POLE_W ;+8 w + dd GAME_POLE_H ;+12 h + dd 0xffffff ;+16 color + db 24 ;+20 bit in pixel + +align 4 +buf_displ: + dd 0 ;указатель на буфер изображения + dw 25,0 + dd GAME_POLE_W ;+8 w + dd GAME_POLE_H ;+12 h + dd 0 ;+16 color + db 24 ;+20 bit in pixel + +align 4 +buf_wolf: + rb 9*BUF_STRUCT_SIZE + +align 4 +buf_egg: + rb 22*BUF_STRUCT_SIZE + +align 4 +buf_chi: + rb 13*BUF_STRUCT_SIZE + +align 4 +import_libimg: + dd alib_init1 + img_is_img dd aimg_is_img + img_info dd aimg_info + img_from_file dd aimg_from_file + img_to_file dd aimg_to_file + img_from_rgb dd aimg_from_rgb + img_to_rgb dd aimg_to_rgb + img_to_rgb2 dd aimg_to_rgb2 + img_decode dd aimg_decode + img_encode dd aimg_encode + img_create dd aimg_create + img_destroy dd aimg_destroy + img_destroy_layer dd aimg_destroy_layer + img_count dd aimg_count + img_lock_bits dd aimg_lock_bits + img_unlock_bits dd aimg_unlock_bits + img_flip dd aimg_flip + img_flip_layer dd aimg_flip_layer + img_rotate dd aimg_rotate + img_rotate_layer dd aimg_rotate_layer + img_draw dd aimg_draw + + dd 0,0 + alib_init1 db 'lib_init',0 + aimg_is_img db 'img_is_img',0 ;определяет по данным, может ли библиотека сделать из них изображение + aimg_info db 'img_info',0 + aimg_from_file db 'img_from_file',0 + aimg_to_file db 'img_to_file',0 + aimg_from_rgb db 'img_from_rgb',0 + aimg_to_rgb db 'img_to_rgb',0 ;преобразование изображения в данные RGB + aimg_to_rgb2 db 'img_to_rgb2',0 + aimg_decode db 'img_decode',0 ;автоматически определяет формат графических данных + aimg_encode db 'img_encode',0 + aimg_create db 'img_create',0 + aimg_destroy db 'img_destroy',0 + aimg_destroy_layer db 'img_destroy_layer',0 + aimg_count db 'img_count',0 + aimg_lock_bits db 'img_lock_bits',0 + aimg_unlock_bits db 'img_unlock_bits',0 + aimg_flip db 'img_flip',0 + aimg_flip_layer db 'img_flip_layer',0 + aimg_rotate db 'img_rotate',0 + aimg_rotate_layer db 'img_rotate_layer',0 + aimg_draw db 'img_draw',0 + +align 4 +import_buf2d_lib: + dd sz_lib_init + buf2d_create dd sz_buf2d_create + buf2d_create_f_img dd sz_buf2d_create_f_img + buf2d_clear dd sz_buf2d_clear + buf2d_draw dd sz_buf2d_draw + buf2d_delete dd sz_buf2d_delete + buf2d_line dd sz_buf2d_line + buf2d_circle dd sz_buf2d_circle + buf2d_img_hdiv2 dd sz_buf2d_img_hdiv2 + buf2d_img_wdiv2 dd sz_buf2d_img_wdiv2 + buf2d_conv_24_to_8 dd sz_buf2d_conv_24_to_8 + buf2d_conv_24_to_32 dd sz_buf2d_conv_24_to_32 + buf2d_bit_blt dd sz_buf2d_bit_blt + buf2d_bit_blt_transp dd sz_buf2d_bit_blt_transp + buf2d_bit_blt_alpha dd sz_buf2d_bit_blt_alpha + buf2d_cruve_bezier dd sz_buf2d_cruve_bezier + buf2d_convert_text_matrix dd sz_buf2d_convert_text_matrix + buf2d_draw_text dd sz_buf2d_draw_text + buf2d_crop_color dd sz_buf2d_crop_color + buf2d_offset_h dd sz_buf2d_offset_h + dd 0,0 + sz_lib_init db 'lib_init',0 + sz_buf2d_create db 'buf2d_create',0 + sz_buf2d_create_f_img db 'buf2d_create_f_img',0 + sz_buf2d_clear db 'buf2d_clear',0 + sz_buf2d_draw db 'buf2d_draw',0 + sz_buf2d_delete db 'buf2d_delete',0 + sz_buf2d_line db 'buf2d_line',0 + sz_buf2d_circle db 'buf2d_circle',0 ;рисование окружности + sz_buf2d_img_hdiv2 db 'buf2d_img_hdiv2',0 + sz_buf2d_img_wdiv2 db 'buf2d_img_wdiv2',0 + sz_buf2d_conv_24_to_8 db 'buf2d_conv_24_to_8',0 + sz_buf2d_conv_24_to_32 db 'buf2d_conv_24_to_32',0 + sz_buf2d_bit_blt db 'buf2d_bit_blt',0 + sz_buf2d_bit_blt_transp db 'buf2d_bit_blt_transp',0 + sz_buf2d_bit_blt_alpha db 'buf2d_bit_blt_alpha',0 + sz_buf2d_cruve_bezier db 'buf2d_cruve_bezier',0 + sz_buf2d_convert_text_matrix db 'buf2d_convert_text_matrix',0 + sz_buf2d_draw_text db 'buf2d_draw_text',0 + sz_buf2d_crop_color db 'buf2d_crop_color',0 + sz_buf2d_offset_h db 'buf2d_offset_h',0 + +i_end: + rb 1024 + align 16 + procinfo process_information +stacktop: + sys_path rb 4096 + file_name: + rb 4096 + plugin_path: + rb 4096 + openfile_path: + rb 4096 + filename_area: + rb 256 +mem: \ No newline at end of file diff --git a/programs/games/nu_pogodi/trunk/nu_pogod.svg b/programs/games/nu_pogodi/trunk/nu_pogod.svg new file mode 100644 index 0000000000..7c5b937d94 --- /dev/null +++ b/programs/games/nu_pogodi/trunk/nu_pogod.svg @@ -0,0 +1,1296 @@ + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/programs/games/nu_pogodi/trunk/wolf.png b/programs/games/nu_pogodi/trunk/wolf.png new file mode 100644 index 0000000000000000000000000000000000000000..d8a9e61cc81dcd5635b8fd0e07666aca75758137 GIT binary patch literal 18548 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 literal 0 HcmV?d00001