From 352d425605002a37acee1fbe8da73e0ec974a185 Mon Sep 17 00:00:00 2001 From: "Kirill Lipatov (Leency)" Date: Sun, 14 Feb 2016 18:42:49 +0000 Subject: [PATCH] delete cmm/ttf_viewer, upload Almaz game (unplayable because player can't move to the top) git-svn-id: svn://kolibrios.org@6218 a494cfbc-eb01-0410-851d-a64ba20cac60 --- programs/cmm/eolite/include/about.h | 25 +- programs/cmm/ttf_viewer/compile_en.bat | 11 - programs/cmm/ttf_viewer/compile_ru.bat | 11 - programs/cmm/ttf_viewer/ttf_viewer.c | 111 - programs/games/almaz/ALMAZ.ASM | 2174 ++++++++++++++++++++ programs/games/almaz/ASCGL.INC | 1385 +++++++++++++ programs/games/almaz/ASCL.INC | 835 ++++++++ programs/games/almaz/BULLET.BMP | Bin 0 -> 150 bytes programs/games/almaz/BULLET.GIF | Bin 0 -> 101 bytes programs/games/almaz/ENEMY.GIF | Bin 0 -> 763 bytes programs/games/almaz/ENEMY1.GIF | Bin 0 -> 270 bytes programs/games/almaz/ENEMY2.GIF | Bin 0 -> 203 bytes programs/games/almaz/EXPLODE1.GIF | Bin 0 -> 4865 bytes programs/games/almaz/KIRPICH.BMP | Bin 0 -> 3126 bytes programs/games/almaz/KIRPICH2.BMP | Bin 0 -> 3126 bytes programs/games/almaz/KIRPICH22.BMP | Bin 0 -> 3126 bytes programs/games/almaz/LESTNICA.BMP | Bin 0 -> 3126 bytes programs/games/almaz/OLD1234.BMP | Bin 0 -> 3126 bytes programs/games/almaz/OLDKIRPICH.BMP | Bin 0 -> 3126 bytes programs/games/almaz/WATER1.BMP | Bin 0 -> 3126 bytes programs/games/almaz/WATER2.BMP | Bin 0 -> 3126 bytes programs/games/almaz/almaz1.bmp | Bin 0 -> 3126 bytes programs/games/almaz/almaz2.bmp | Bin 0 -> 3126 bytes programs/games/almaz/almaz3.bmp | Bin 0 -> 3126 bytes programs/games/almaz/aniall.gif | Bin 0 -> 4248 bytes programs/games/almaz/build_ru.bat | 6 + programs/games/almaz/ded1.bmp | Bin 0 -> 602166 bytes programs/games/almaz/ded2.bmp | Bin 0 -> 602166 bytes programs/games/almaz/door1.BMP | Bin 0 -> 3126 bytes programs/games/almaz/door2.bmp | Bin 0 -> 3126 bytes programs/games/almaz/gold.bmp | Bin 0 -> 3126 bytes programs/games/almaz/gold2.bmp | Bin 0 -> 3126 bytes programs/games/almaz/level.bmp | Bin 0 -> 602166 bytes programs/games/almaz/level2.bmp | Bin 0 -> 201782 bytes programs/macros.inc | 6 +- programs/system/taskbar/trunk/drawappl.inc | 4 +- programs/system/taskbar/trunk/drawtray.inc | 2 +- programs/system/taskbar/trunk/drawwind.inc | 4 +- 38 files changed, 4418 insertions(+), 156 deletions(-) delete mode 100644 programs/cmm/ttf_viewer/compile_en.bat delete mode 100644 programs/cmm/ttf_viewer/compile_ru.bat delete mode 100644 programs/cmm/ttf_viewer/ttf_viewer.c create mode 100644 programs/games/almaz/ALMAZ.ASM create mode 100644 programs/games/almaz/ASCGL.INC create mode 100644 programs/games/almaz/ASCL.INC create mode 100644 programs/games/almaz/BULLET.BMP create mode 100644 programs/games/almaz/BULLET.GIF create mode 100644 programs/games/almaz/ENEMY.GIF create mode 100644 programs/games/almaz/ENEMY1.GIF create mode 100644 programs/games/almaz/ENEMY2.GIF create mode 100644 programs/games/almaz/EXPLODE1.GIF create mode 100644 programs/games/almaz/KIRPICH.BMP create mode 100644 programs/games/almaz/KIRPICH2.BMP create mode 100644 programs/games/almaz/KIRPICH22.BMP create mode 100644 programs/games/almaz/LESTNICA.BMP create mode 100644 programs/games/almaz/OLD1234.BMP create mode 100644 programs/games/almaz/OLDKIRPICH.BMP create mode 100644 programs/games/almaz/WATER1.BMP create mode 100644 programs/games/almaz/WATER2.BMP create mode 100644 programs/games/almaz/almaz1.bmp create mode 100644 programs/games/almaz/almaz2.bmp create mode 100644 programs/games/almaz/almaz3.bmp create mode 100644 programs/games/almaz/aniall.gif create mode 100644 programs/games/almaz/build_ru.bat create mode 100644 programs/games/almaz/ded1.bmp create mode 100644 programs/games/almaz/ded2.bmp create mode 100644 programs/games/almaz/door1.BMP create mode 100644 programs/games/almaz/door2.bmp create mode 100644 programs/games/almaz/gold.bmp create mode 100644 programs/games/almaz/gold2.bmp create mode 100644 programs/games/almaz/level.bmp create mode 100644 programs/games/almaz/level2.bmp diff --git a/programs/cmm/eolite/include/about.h b/programs/cmm/eolite/include/about.h index 18e1ce263e..8f13f4bfcd 100644 --- a/programs/cmm/eolite/include/about.h +++ b/programs/cmm/eolite/include/about.h @@ -3,25 +3,19 @@ #define BROWSER_PATH "/sys/network/webview" #define BROWSER_LINK "http://kolibri-n.org/inf/eolite/eolite_p1" -#ifdef LANG_RUS - ?define DEVELOPERS_TEXT "Разработчики:\nLeency Veliant PunkJoker Pavelyakov\nKolibriOS Team\n2008-2016" - ?define CLOSE_BUTTON_TEXT "Закрыть" -#else - ?define DEVELOPERS_TEXT "Developers:\nLeency Veliant PunkJoker Pavelyakov\nKolibriOS Team\n2008-2016" - ?define CLOSE_BUTTON_TEXT "Close" -#endif void about_dialog() { byte id; proc_info about_form; + int about_x; if (active_about) {cmd_free=2;ExitProcess();} else active_about=1; loop() switch(WaitEvent()) { case evButton: id=GetButtonID(); - IF (id==1) || (id==10) + IF (id==1) { active_about=0; cmd_free = 2; @@ -40,17 +34,18 @@ void about_dialog() break; case evReDraw: - DefineAndDrawWindow(Form.left+Form.width/2,Form.top+Form.height/2-114,440,200+GetSkinHeight(),0x34,system.color.work,0); + DefineAndDrawWindow(Form.left+Form.width/2,Form.top+Form.height/2-114,310,300+GetSkinHeight(),0x34,system.color.work,0); GetProcessInfo(#about_form, SelfInfo); if (about_form.status_window>2) break; logo_pal[0] = system.color.work; - PutPaletteImage(#logo,86,86,10,23,8,#logo_pal); - WriteTextB(112,16,0x82,0xD49CD2,ABOUT_TITLE); - WriteTextB(110,14,0x82,0xBF40BF,ABOUT_TITLE); - WriteTextLines(110,53,10010000b,0,DEVELOPERS_TEXT,21); + PutPaletteImage(#logo,86,86,about_form.cwidth-86/2,10,8,#logo_pal); + about_x = -strlen(ABOUT_TITLE)*18+about_form.cwidth/2; + WriteTextB(about_x+2,107,0x82,0xD49CD2,ABOUT_TITLE); + WriteTextB(about_x,105,0x82,0x9D129D,ABOUT_TITLE); + DrawRectangle3D(0,154,about_form.cwidth/5*3,1,system.color.work_dark,system.color.work_light); + WriteTextLines(7,163,0x90,system.color.work_text,"KolibriOS File Manager\nAuthors: Leency, Veliant\nPunkJoker, Pavelyakov\n(c) 2008 - 2016",20); #ifdef LANG_RUS - DrawFlatButton(about_form.cwidth-310,about_form.cheight-38,180,26,11,"История разработки"); + DrawFlatButton(about_form.cwidth-180/2,about_form.cheight-38,180,26,11,"История разработки"); #endif - DrawFlatButton(about_form.cwidth-110,about_form.cheight-38, 90,26,10,CLOSE_BUTTON_TEXT); } } diff --git a/programs/cmm/ttf_viewer/compile_en.bat b/programs/cmm/ttf_viewer/compile_en.bat deleted file mode 100644 index c4c8936254..0000000000 --- a/programs/cmm/ttf_viewer/compile_en.bat +++ /dev/null @@ -1,11 +0,0 @@ -@del lang.h-- -@echo #define LANG_ENG 1 >lang.h-- - -@del ttf_viewer -cls -c-- ttf_viewer.c -@rename ttf_viewer.com ttf_viewer -@del warning.txt -@del lang.h-- -@pause -kpack ttf_viewer diff --git a/programs/cmm/ttf_viewer/compile_ru.bat b/programs/cmm/ttf_viewer/compile_ru.bat deleted file mode 100644 index 4ffe4315ff..0000000000 --- a/programs/cmm/ttf_viewer/compile_ru.bat +++ /dev/null @@ -1,11 +0,0 @@ -@del lang.h-- -@echo #define LANG_RUS 1 >lang.h-- - -@del ttf_viewer -cls -c-- ttf_viewer.c -@rename ttf_viewer.com ttf_viewer -@del warning.txt -@del lang.h-- -@pause -kpack ttf_viewer diff --git a/programs/cmm/ttf_viewer/ttf_viewer.c b/programs/cmm/ttf_viewer/ttf_viewer.c deleted file mode 100644 index 84a91bc6e4..0000000000 --- a/programs/cmm/ttf_viewer/ttf_viewer.c +++ /dev/null @@ -1,111 +0,0 @@ -#ifndef AUTOBUILD -#include "lang.h--" -#endif - -#define MEMSIZE 397113 -#include "..\lib\strings.h" -#include "..\lib\mem.h" -#include "..\lib\file_system.h" -#include "..\lib\gui.h" -#include "..\lib\obj\truetype.h" -#include "..\lib\obj\proc_lib.h" -#include "..\lib\patterns\simple_open_dialog.h" - -char default_dir[] = "/rd/1"; -od_filter filter2 = {"TTF",0}; - -dword font_data; -stbtt_fontinfo font_info; -dword font_mem; - -proc_info Form; -char test_text[] = "The quick brown fox jumps over the lazy dog"; -char win_title[4096] = "TTF Viewer v0.1 - "; - -#ifdef LANG_RUS - ?define T_INTRO "Это простая программа для просмотра шрифтов формата TTF" - ?define T_INTRO_BUTTON_TEXT "Открыть шрифт" -#else - ?define T_INTRO "This is simple program to view TTF fonts." - ?define T_INTRO_BUTTON_TEXT "Open font" -#endif - - -void main() -{ - int id, key; - - load_dll(libtruetype, #truetype, 1); - load_dll(Proc_lib, #OpenDialog_init,0); - OpenDialog_init stdcall (#o_dialog); - - if (param[0]) OpenFont(#param); - - loop() - { - switch(WaitEvent()) - { - case evButton: - id=GetButtonID(); - if (id==1) ExitProcess(); - if (id==10) - { - OpenDialog_start stdcall (#o_dialog); - OpenFont(#openfile_path); - } - break; - - case evKey: - key = GetKey(); - break; - - case evReDraw: - draw_window(); - } - } -} - - -void draw_window() -{ - system.color.get(); - DefineAndDrawWindow(30, 100, 800, 250+GetSkinHeight(), 0x34, 0xFFFfff, #win_title); - GetProcessInfo(#Form, SelfInfo); - DrawFonts(); -} - - -word DrawFonts() -{ - if (!font_data) - { - WriteTextCenter(0,85,Form.cwidth,0x555555, T_INTRO); - DrawCaptButton(Form.cwidth - 140 / 2, Form.cheight - 30 / 2, 140, 30, 10, system.color.work_button, system.color.work_button_text, T_INTRO_BUTTON_TEXT); - return; - } - text_out stdcall (#test_text, #font_info, 10, 0x000000, 0xFFFfff, 3, 4); - text_out stdcall (#test_text, #font_info, 12, 0x000000, 0xFFFfff, 3, 18); - text_out stdcall (#test_text, #font_info, 24, 0x000000, 0xFFFfff, 3, 35); - text_out stdcall (#test_text, #font_info, 36, 0x000000, 0xFFFfff, 3, 60); - text_out stdcall (#test_text, #font_info, 48, 0x000000, 0xFFFfff, 3, 110); - text_out stdcall (#test_text, #font_info, 58, 0x000000, 0xFFFfff, 3, 170); -} - - -void OpenFont(dword font_path) -{ - BDVK FontFile_atr; - GetFileInfo(font_path, #FontFile_atr); - font_data = malloc(FontFile_atr.sizelo); - ReadFile(0, FontFile_atr.sizelo, #font_data, font_path); - init_font stdcall (#font_info, #font_data); - if (EAX==0) - { - font_data = 0; - notify("'Can\096t open font: init_font failed' - E"); - } - strcpy(#win_title + 18, font_path); - draw_window(); -} - -stop: diff --git a/programs/games/almaz/ALMAZ.ASM b/programs/games/almaz/ALMAZ.ASM new file mode 100644 index 0000000000..62299848e7 --- /dev/null +++ b/programs/games/almaz/ALMAZ.ASM @@ -0,0 +1,2174 @@ + +WND_COLOR equ 0x02aa00FF + +use32 + org 0x0 + db 'MENUET01' + dd 0x01 + dd START + dd I_END + dd 0x300000 + dd 0x27fff0 + dd 0x0 + dd 0x0 + +include 'lang.inc' +include '..\..\macros.inc' ; макросы облегчают жизнь ассемблерщиков! + +include 'ASCL.INC' +include 'ASCGL.INC' + + + +gif_hash_offset = gif_hash_area +COLOR_ORDER equ MENUETOS + +DELAY equ 2 ; Задержка перед переходом к следующему кадру в мсек + +START: +;**************** +; Открываем фаил +;**************** +openfile: +; and [entered],0 +; mov ecx,499*3*4 ;at start + xor ecx,ecx + mov ecx,1 + + ; Convert gif to animation format + giftoani workarea,Image,ecx + bmptoimg bullet_bmp, img_bullet + bmptoimg level_bmp, img_level + bmptoimg kirpich, img_area + bmptoimg kirpich2, img_area2 + bmptoimg kirpich3, img_area3 + bmptoimg lest_bmp, img_lestniza + bmptoimg water1_bmp, img_water1 + bmptoimg water2_bmp, img_water2 + bmptoimg door1_bmp, img_door1 + bmptoimg door2_bmp, img_door2 + + +red: + call timer + call draw_window +; call load_level +; delay 200 + +still: + timeevent DELAY,no_event, red, key, button + +no_event: + call draw_subimage + jmp still + + key: + ; блока движения персонажа + mov eax,2 + int 0x40 + cmp ah, 179 ; право 4 + je go_mov + cmp ah, 176 ; лево 1 + je go_mov + cmp ah, 178 ; верх 3 + je go_mov + cmp ah, 177 ; низ 2 + je go_mov + cmp ah, 120 ; низ 2 + je go_fire + cmp ah, 122 ; низ 2 + je go_fire + cmp ah, 239 ; низ 2 + je go_fire_left + cmp ah, 231 ; низ 2 + je go_fire + + + jmp no_mov ; if not left, right, up, down, then go NO MOV + + go_mov: + ;mov ebx, [v_mov2] + mov [v_mov2], ah + sub word [v_mov2], 175 ; отнимаем от кода клавиши 175 и остается 1,2,3 или 4 соответственно направления движения персонажа + jmp no_mov ; if not left, right, up, down, then go NO MOV + + go_fire_left: + xor eax,eax + mov ah, 122 + call fire + jmp no_mov + go_fire: + call fire + no_mov: + ; конец блока движения персонажа + jmp still + + button: + mov eax, 17 + int 0x40 + + cmp ah,1 + jne noclose + _close: + or eax,-1 + int 0x40 + noclose: + jmp still + +; ********************************************* +; ******* ОПРЕДЕЛЕНИЕ И ОТРИСОВКА ОКНА ******* +; ********************************************* + +draw_window: + startwd + + mov eax,0 + mov ebx,50*65536+522 + mov ecx,50*65536+536 + mov edx,WND_COLOR + mov esi,0x8050FFd0 + mov edi,0x005080d0 + int 0x40 + + label 8,6,'ПОДЗЕМЕЛЬЕ для Колибри ОС <<>> z/x стрелять',cl_White+font_Big + + mov eax,8 + mov ebx,(500)*65536+12 + mov ecx,5*65536+12 + mov edx,1 + mov esi,0x000000 + int 0x40 + + xor ecx,ecx + call draw_subimage + cmp [imgcount],1 + je .enddraw + + mov ecx,[img_index] + + call draw_subimage + + .enddraw: + + endwd + + +ret + +;******************************************* +; LABIRINT +;******************************************* + + labirint: + + ; вывод блоков лабиринта + cycle: + + mov eax, [Lab] + shl eax, 5 ; сдвиг регистра в право на 5 позиции все равно что умножили на 32 + mov [perem1], eax + mov eax, [Lab] + shr eax, 4 ; сдвиг регистра в лево + shl eax, 5 ; сдвиг обратно (все равно что целочисленное делениена 256) + mov [perem2], eax + shl eax, 4 ; все равно что отнимаем от координат ненужный прирост -> У-256*X + sbb dword [perem1], eax; + + mov ebx, [Lab] + sbb ebx, 1 + mov eax,[Dangeon + ebx] ; берет байт из дангеон + смещение + + cmp ah, 1 ; + je go_block + + cmp ah, 0 ; + je back_block + + cmp ah, 12 ; закраска фона за алмазом + je back_block + + cmp ah, 3 ; + je boom_block + + cmp ah, 16 ; + je door_block + + cmp ah, 2 ; закраска фона за алмазом + je cool_block + + jmp end_block + go_block: + imgtoimg img_area,dword [perem1],dword [perem2],canvas + jmp end_block + + cool_block: + imgtoimg img_area3,dword [perem1],dword [perem2],canvas + jmp end_block + + + back_block: + imgtoimg img_area2,dword [perem1],dword [perem2],canvas + jmp end_block + + door_block: + imgtoimg img_door1,dword [perem1],dword [perem2],canvas + + mov eax, [gold] + cmp ax, 10 ; если собрано более 10 алмазов дверь открыта + jna end_block + imgtoimg img_door2,dword [perem1],dword [perem2],canvas + jmp end_block + + + boom_block: + imgtoimg img_area,dword [perem1],dword [perem2],canvas + mov ebp,18 ; кадр + mov eax, dword [perem1] + mov dword [X_anime], eax + mov eax, dword [perem2] + mov dword [Y_anime], eax + call animashka + + mov ecx, [timer1] ; + and ecx, 15 + cmp ecx, 0 + jne end_block + + mov ebx, [Lab] + mov byte [Dangeon + ebx], 0 ; берет байт из дангеон + смещение + + + end_block: + + add word [Lab],1 + mov eax, [Lab] + + cmp eax, 256 ; if eax == 0 + je cycle_end ; jump to cycle_end: + jmp cycle ; + + cycle_end: + + mov eax, 0 + mov [Lab],eax + + ret ; END labirint + + +;******************************************* +; ЛЕСТНИЦА +;******************************************* + lestniza: + ; вывод блоков лабиринта + cycle2: + + mov eax, [Lab] + shl eax, 5 ; сдвиг регистра в право на 5 позиции все равно что умножили на 32 + mov [perem1], eax + mov eax, [Lab] + shr eax, 4 ; сдвиг регистра в лево + shl eax, 5 ; сдвиг обратно (все равно что целочисленное делениена 256) + mov [perem2], eax + shl eax, 4 ; все равно что отнимаем от координат ненужный прирост -> У-256*X + sbb dword [perem1], eax; + + + mov ebx, [Lab] + sbb ebx, 1 + mov eax,[Dangeon + ebx] ; берет байт из дангеон + смещение + + cmp ah, 8 ; + je go_lestniza + + jmp end_lestniza + go_lestniza: + + imgtoimg img_lestniza,dword [perem1],dword [perem2],canvas + end_lestniza: + + add word [Lab],1 + mov eax, [Lab] + + cmp eax, 256 ; if eax == 0 + je cycle2_end ; jump to cycle_end: + jmp cycle2 ; + + cycle2_end: + + mov eax, 0 + mov [Lab],eax + + + ret ; END lestniza + + + +;******************************************* +; ВОДА и АЛМАЗЫ +;******************************************* + water: + + ; вывод воды лабиринта + cycle3: + + mov eax, [Lab] + shl eax, 5 ; сдвиг регистра в право на 5 позиции все равно что умножили на 32 + mov [perem1], eax + mov eax, [Lab] + shr eax, 4 ; сдвиг регистра в лево + shl eax, 5 ; сдвиг обратно (все равно что целочисленное делениена 256) + mov [perem2], eax + shl eax, 4 ; все равно что отнимаем от координат ненужный прирост -> У-256*X + sbb dword [perem1], eax; + + + mov ebx, [Lab] + sbb ebx, 1 + mov eax,[Dangeon + ebx] ; берет байт из дангеон + смещение + + cmp ah, 4 ; + je go_water + + cmp ah, 12 ; рисование алмазов + je go_almaz + + jmp end_water + go_water: + mov eax,0 ; + mov eax, [timer1]; + and eax, 15 + cmp eax, 7 ; + jb go_water2 + + imgtoimg img_water1,dword [perem1],dword [perem2],canvas + jmp end_water + + go_water2: + imgtoimg img_water2,dword [perem1],dword [perem2],canvas + + jmp end_water + go_almaz: + + mov eax,0 ; + mov eax, [timer1]; + and eax, 31 + + cmp eax, 10 + ja almaz2 + + mov ebp,14 ; кадр + mov eax, dword [perem1] + mov dword [X_anime], eax + mov eax, dword [perem2] + mov dword [Y_anime], eax + call animashka + jmp end_water + + almaz2: + cmp eax, 20 + ja almaz3 + + mov ebp,15 ; кадр + mov eax, dword [perem1] + mov dword [X_anime], eax + mov eax, dword [perem2] + mov dword [Y_anime], eax + call animashka + jmp end_water + + almaz3: + mov ebp,16 ; кадр + mov eax, dword [perem1] + mov dword [X_anime], eax + mov eax, dword [perem2] + mov dword [Y_anime], eax + call animashka + + + end_water: + + add word [Lab],1 + mov eax, [Lab] + + cmp eax, 256 ; if eax == 0 + je cycle3_end ; jump to cycle_end: + jmp cycle3 ; + + cycle3_end: + + mov eax, 0 + mov [Lab],eax + + + ret ; END water + + +;******************************************* +; Выводим следующий кадр из списка картинок +;******************************************* +draw_subimage: + ;aframetoimg Image,32, 32,canvas,0x00ffffff ; НЕВИДИМЫЙ, прозрачный ЦВЕТ ИЛИ НЕ РИСУЕМЫЙ + + call labirint + call lestniza + call enemy_mas + call enemy_mov +;------------------------------------------------------------------------------- + mov ebx, [gold] + cmp bx, 5 ;увеличение скорости врагов если украл более 9 + jna lov_velo + call enemy_mas + call enemy_mov + lov_velo: +;------------------------------------------------------------------------------- +;------------------------------------------------------------------------------- + mov ebx, [gold] + cmp bx, 9 ;увеличение скорости врагов если украл более 9 + jna lov_velo2 + call enemy_mas + call enemy_mov + lov_velo2: +;------------------------------------------------------------------------------- +; call enemy_mas +; call enemy_mov + call hiro + call hiro_mov + call water + + call bullet_mov + call bullet_mov + call bullet_mov + call bullet_mas + call bullet_mov + call bullet_mov + call bullet_mov + call bullet_mas + call proverka_gold + call potop + + setimg 6,20,canvas + + call timer + call tablo +ret + +;@@@@@@@@@@@@@@@@@@ +animashka: +;!!!ВАЖНО перед вызовом процедуры должен быть установлен ebx[номер кадра] и x,y + + mov edi,coords + mov esi, Image ; гиф анимашка в памяти +; +; mov ebp, dword [edi+8] ;ecx здесь конкретный номер выводимого кадра +; inc ebp ; увеличение кадра +; cmp ebp,3 ; максимальное количество кадров !!!!!!! +; jna ok_fr ; если выводимы кадр меньше максимального количества кадров +;!!!!!!!!! mov ebp,2 ;обнуление кадра + +ok_fr: + mov dword [edi+8], ebp ;номер выводимого кадра +loo: + cmp ebp,0 ; если кадр нулевой то сразу на вывод ? + je setpic + movzx eax,word [esi+4] ; если нет то увеличиваем х у ? + movzx ebx,word [esi+6] + mul ebx ;dword [esi+4] умножает ebx на eax и результат в eax edx + mov ebx,3 ; количество кадров ??? + mul ebx + add eax,8 + add esi,eax + dec ebp + jmp loo +setpic: + + pushad +; aframetoimg esi,dword [edi], dword [edi+4],canvas,0x00ffffff ; НЕВИДИМЫЙ, прозрачный ЦВЕТ ИЛИ НЕ РИСУЕМЫЙ +; aframetoimg esi,32, 32,canvas,0x00ffffff ; НЕВИДИМЫЙ, прозрачный ЦВЕТ ИЛИ НЕ РИСУЕМЫЙ + aframetoimg esi,dword [X_anime],dword [Y_anime],canvas,0x00ffffff ; НЕВИДИМЫЙ, прозрачный ЦВЕТ ИЛИ НЕ РИСУЕМЫЙ + ;call enemy_mas + popad +ret +;@@@@@@@@@@@@@@ + + + ;-------------- TIMER -------------- + timer: + mov eax,0 ; + mov eax,[timer1] ; + add eax, 1; + mov [timer1], eax + + cmp eax, 64 ; таймер от 0 до 64 + je nul_timer + jmp timer_dalee + nul_timer : + mov [timer1], 0 + timer_dalee: + ret + ;-------------- TIMER -------------- + + + + + +;******************************************* +; ENEMY +;******************************************* + + enemy_mas: ; вывод ENEmy ENEMYYYYYYYYYYYYYYY ENEMYYYYYYYYYYYYYY !!! + + mov word [Lab2], 0 ; все делать в WORD один элемент в массиве +2 следующий враг соотвтетственно 6*2= + 12 + + cycle4: + + mov ebx, 0 + mov ecx, 0 + mov edx, 0 + mov esi, 0 + + mov word bx, [Lab2] + mov word ax,[Enemy+bx] ; берет байт из Enemy + смещение + + cmp ax, 1 ; обычный враг номер 1 + je go_enemy + + jmp end_enemy + go_enemy: + + add word bx, 2 ; X кооридината данного врага + mov word ax, [Enemy + bx] + mov word [X_enemy], ax + + add word bx, 2 ; Y кооридината данного врага + mov word ax, [Enemy + ebx] + mov word [Y_enemy], ax + + add word bx, 2 ; положение в массиве данного врага + mov word ax, [Enemy + ebx] + mov word [lab_enemy], ax + + add word bx, 2 ; направление движения данного врага + mov word ax, [Enemy + ebx] + mov word [mov_enemy], ax + + add word bx, 2 ; enemy LIFE + mov word ax, [Enemy + ebx] + mov word [life_enemy], ax + + cmp ax, 499; ; замороженные враги + ja enemy_dalee + mov ebp,2 ; кадр + mov eax, dword [X_enemy] + mov dword [X_anime], eax + mov eax, dword [Y_enemy] + mov dword [Y_anime], eax + call animashka + jmp enemy_bmp_end + + + + enemy_dalee: + xor eax,eax ; + mov eax, [X_enemy] ; + and eax, 15 + cmp ax, 7; + ja enemy_1 + + jmp enemy_2 + + enemy_1: + + mov ebp,0 ; кадр + mov eax, dword [X_enemy] + mov dword [X_anime], eax + mov eax, dword [Y_enemy] + mov dword [Y_anime], eax + call animashka + + jmp enemy_bmp_end + + enemy_2: + mov ebp,1 ; кадр + mov eax, dword [X_enemy] + mov dword [X_anime], eax + mov eax, dword [Y_enemy] + mov dword [Y_anime], eax + call animashka + enemy_bmp_end: + + end_enemy: + + mov eax, 0 + mov word ax, [Lab2] + + cmp ax, 96 ; if eax == 0 + je cycle4_end ; jump to cycle_end: + + add word [Lab2],12 + + jmp cycle4 ; + + cycle4_end: + + ret ; END eNEMYYYYYYYYYYYYYYY ENEMYYYYYYYYYYYYYY !!! + +;$$$$$$$$$$$$$$$$$$$$$$$$$$ +; ENEMY MOV +;$$$$$$$$$$$$$$$$$$$$$$$$$$ +enemy_mov: + mov word [Lab2], 0 ; все делать в WORD один элемент в массиве +2 следующий враг соотвтетственно 6*2= + 12 + + cycle5: + + mov ebx, 0 + mov ecx, 0 + mov edx, 0 + mov esi, 0 + + mov word bx, [Lab2] + mov word ax,[Enemy+bx] ; берет байт из Enemy + смещение + + cmp ax, 1 ; обычный враг номер 1 + je go_mov_enemy + + jmp end_mov_enemy + go_mov_enemy: + + add word bx, 2 ; X кооридината данного врага + mov word ax, [Enemy + bx] + mov word [X_enemy], ax + + add word bx, 2 ; Y кооридината данного врага + mov word ax, [Enemy + ebx] + mov word [Y_enemy], ax + + add word bx, 2 ; положение в массиве данного врага + mov word ax, [Enemy + ebx] + mov word [lab_enemy], ax + + add word bx, 2 ; направление движения данного врага + mov word ax, [Enemy + ebx] + mov word [mov_enemy], ax + + add word bx, 2 ; enemy LIFE + mov word ax, [Enemy + ebx] + mov word [life_enemy], ax + + cmp ax, 499; ; замороженные враги + ja dalee_enemy_mov + add ax, 1 + + mov word [Enemy + ebx], ax + + jmp end_mov_enemy + + dalee_enemy_mov: + ; блок поедания героя + mov ax, [Xpl] + add ax, 23 + cmp ax, [X_enemy] + jna ne_em + sbb ax, 45 + cmp ax, [X_enemy] + ja ne_em + mov ax, [Ypl] + add ax, 23 + cmp ax, [Y_enemy] + jna ne_em + sbb ax, 45 + cmp ax, [Y_enemy] + ja ne_em + call load_level ; DEAD HIRO + delay 150 + + ne_em: + ;Блок попадания 1 пули + + mov word bx, 0 + mov word ax,[Bullet + ebx] + cmp ax, 0 + je no_bullet + + add word bx, 2 ; [Xpl] + mov word cx, [Bullet + ebx] + + add word bx, 2 ; [Ypl] + mov word dx, [Bullet + ebx] + + cmp dx, [Y_enemy] + jna no_bullet + sbb dx, 32 + cmp dx, [Y_enemy] + ja no_bullet + cmp cx, [X_enemy] + jna no_bullet + sbb cx, 32 + cmp cx, [X_enemy] + ja no_bullet + mov word bx, [Lab2] + add word bx, 10 ; enemy LIFE + mov word [Enemy + ebx],0 + + mov byte [Bullet], 0 ; + + no_bullet: + + + ;БЛОК ПРИРОСТА ДВИЖЕНИЯ ВРАГОВ + mov word ax, [mov_enemy] ; + cmp ax, 1 ; left ; + jne next_2 ; + sbb word [X_enemy], 1 ; + mov word ax, [X_enemy] ; + mov word bx, [Lab2] ; + add word bx, 2 ; X кооридината данного врага + mov word [Enemy + bx], ax ; + ; + next_2: ; + cmp ax, 2 ; down ; + jne next_3 ; + add word [Y_enemy], 1 ; + mov word ax, [Y_enemy] ; + mov word bx, [Lab2] ; + add word bx, 4 ; Y кооридината данного врага + mov word [Enemy + bx], ax ; + ; + next_3: ; + cmp ax, 3 ; up ; + jne next_4 ; + sbb word [Y_enemy], 1 ; + mov word ax, [Y_enemy] ; + mov word bx, [Lab2] ; + add word bx, 4 ; Y кооридината данного врага + mov word [Enemy + bx], ax ; + ; + next_4: ; + cmp ax, 4 ; right ; + jne next_end + + ;Гравитационная заплатка лечит трабл - когда враг двигается слева на право то пролетает один пустой блок + mov word bx, [X_enemy] ; Это условие позволяет добежать до позиции напротив блока + and ebx, 31 ; X в позиции напротив блока + cmp bx, 0 ; + jne n4_dalee ; + mov bx,[lab_enemy] + add bx,16 + mov ax, [Dangeon + bx] + and eax,15 + cmp word ax, 0 + je next_end + cmp word ax, 4 + je next_end + ;конец заплатки + + n4_dalee: + ; + add word [X_enemy], 1 ; + mov word ax, [X_enemy] ; + mov word bx, [Lab2] ; + add word bx, 2 ; X кооридината данного врага + mov word [Enemy + bx], ax ; + ; + next_end: + ;END БЛОК ПРИРОСТА ДВИЖЕНИЯ ВРАГ + + ; + + ; Рандомный выбор на леснице + mov word bx, [X_enemy] ; Это условие позволяет добежать до позиции напротив блока + and ebx, 31 ; X в позиции напротив блока + cmp bx, 0 ; + jne end_les ; + mov word bx, [Y_enemy] ; Это условие позволяет добежать до позиции напротив блока + and ebx, 31 ; X в позиции напротив блока + cmp bx, 0 ; + jne end_les ; + + random 300, eax + + cmp eax, 150 + ja les2 + jmp end_up_or_down + les2: + + mov eax, [Ypl] + cmp eax, [Y_enemy] + jna bolee + mov word [mov_enemy],2 ; вниз + mov word ax, [mov_enemy] ; + mov word bx, [Lab2] ; + add word bx, 8 ; направление движения данного врага + mov word [Enemy + bx], ax ; + jmp end_les + + bolee: + mov word [mov_enemy],3 ; up + mov word ax, [mov_enemy] ; + mov word bx, [Lab2] ; + add word bx, 8 ; направление движения данного врага + mov word [Enemy + bx], ax ; + jmp end_les + + end_up_or_down: + + random 300, eax + cmp eax, 150 + ja les22 + jmp end_les + les22: + + mov eax, [Xpl] + cmp eax, [X_enemy] + jna bolee2 + mov word [mov_enemy],4 ; вниз + mov word ax, [mov_enemy] ; + mov word bx, [Lab2] ; + add word bx, 8 ; направление движения данного врага + mov word [Enemy + bx], ax ; + jmp end_les + + bolee2: + mov word [mov_enemy],1 ; up + mov word ax, [mov_enemy] ; + mov word bx, [Lab2] ; + add word bx, 8 ; направление движения данного врага + mov word [Enemy + bx], ax ; + + end_les: + ; end Рандомный выбор на леснице + + ;Гравитация + mov word bx, [X_enemy] ; Это условие позволяет добежать до позиции напротив блока + and ebx, 31 ; X в позиции напротив блока + cmp bx, 0 ; + jne end_grava ; + + mov bx,[lab_enemy] + add bx,16 + mov ax, [Dangeon + bx] + + and eax,15 + cmp word ax, 0 + je grava + cmp word ax, 4 + je grava + jmp end_grava + grava: + mov word [mov_enemy], 2 ; padenie ВРАГА + mov word ax, [mov_enemy] ; + mov word bx, [Lab2] ; + add word bx, 8 ; направление движения данного врага + mov word [Enemy + bx], ax ; + + end_grava: + ;конец гравитации + + ;блок расчета положения врага в лабиринте + mov eax, 0 ; + mov eax, [Y_enemy] ; + shr eax, 5 ; + shl eax, 4 ; + mov ebx, 0 ; + mov ebx, [X_enemy] ; + shr ebx, 5 ; + add eax, ebx ; + mov [lab_enemy], eax ; + mov word bx, [Lab2] ; + add word bx, 6 ; направление движения данного врага + mov word [Enemy + bx], ax ; + ;блок расчета положения врага в лабиринте + + + + + + + ;БЛОК ЗПАПРЕТА ДВижения + mov word bx, [Y_enemy] ; Это условие позволяет добежать до позиции напротив блока + and bx, 31 ; Y в позиции напротив блока + cmp bx, 0 ; + jne end_zapret ; + mov word ax, [X_enemy] ; Это условие позволяет добежать до позиции напротив блока + and ax, 31 ; X в позиции напротив блока + cmp ax, 0 ; + jne end_zapret ; + + mov word ax, [mov_enemy] ; Это условие позволяет добежать до позиции напротив блока + + cmp ax, 0 + jne duma1 + ; Рандомный выбор движения + mov eax, [timer1] + and eax, 3 + cmp eax, 0 + jne dalee_duma1 + add eax, 4 + dalee_duma1: + + mov word [mov_enemy], ax ; + mov word ax, [mov_enemy] ; + mov word bx, [Lab2] ; + add word bx, 8 ; направление движения данного врага + mov word [Enemy + bx], ax ; + + + + duma1: + cmp ax, 4 + jne duma2 ; прверка справа + mov bx,[lab_enemy] + add bx,1 + mov ax, [Dangeon + bx] + and eax,3 + cmp ax, 0 + jne duma_stop + jmp duma_end + + duma2: + cmp ax, 1 + jne duma3 ; слева + mov bx,[lab_enemy] + sbb bx,1 + mov ax, [Dangeon + bx] + and eax,3 + cmp ax, 0 + jne duma_stop + jmp duma_end + + duma3: + cmp ax, 2 + jne duma4 ; снизу + mov bx,[lab_enemy] + add bx,16 + mov ax, [Dangeon + bx] + and eax,3 + cmp ax, 0 + jne duma_stop + jmp duma_end + + duma4: + cmp ax, 3 + jne duma_stop ; сверху + + mov bx,[lab_enemy] ; если кирпич над головой + sbb bx,16 + mov ax, [Dangeon + bx] + and eax,3 + cmp ax, 0 ; если кирпич над головой + jne duma_stop + + mov bx,[lab_enemy] ; если враг не на леснице + mov ax, [Dangeon + bx] + and eax,15 + cmp ax, 8 + jne duma_stop + + jmp duma_end + + duma_stop: + + mov word [mov_enemy], 0 ; ОСТАНОВКА ВРАГА + mov word ax, [mov_enemy] ; + mov word bx, [Lab2] ; + add word bx, 8 ; направление движения данного врага + mov word [Enemy + bx], ax ; + + duma_end: + + end_zapret: + ;конец запрета + + end_mov_enemy: + + mov eax, 0 + mov word ax, [Lab2] + + cmp ax, 96 ; if eax == 0 + je cycle5_end ; jump to cycle_end: + + add word [Lab2],12 + + jmp cycle5 ; + + cycle5_end: + + +ret + +;***************************** +; HIRO +;***************************** + + hiro: + + mov ecx, [v_fire] ;стрельба + cmp ecx, 0 + je next_anima + cmp ecx, 1 + je wprawo + mov ebp,12 ; кадр + mov eax, dword [Xpl] + mov dword [X_anime], eax + mov eax, dword [Ypl] + mov dword [Y_anime], eax + call animashka + mov ecx, [timer1] ;стрельба + and ecx, 15 + cmp ecx, 0 + jne end_hiro + mov dword [v_fire], 0 + jmp end_hiro + + wprawo: + mov ebp,11 ; кадр + mov eax, dword [Xpl] + mov dword [X_anime], eax + mov eax, dword [Ypl] + mov dword [Y_anime], eax + call animashka + mov ecx, [timer1] ;стрельба + and ecx, 15 + cmp ecx, 0 + jne end_hiro + mov dword [v_fire], 0 + jmp end_hiro + + ;стрельба + jmp end_hiro + + next_anima: + mov eax, [v_mov] + cmp eax, 1 + jne next_r + mov eax,0 ; + mov eax, [Xpl]; + and eax, 15 + cmp eax, 7 ; + ja next_l1 + + mov ebp,3 ; кадр + mov eax, dword [Xpl] + mov dword [X_anime], eax + mov eax, dword [Ypl] + mov dword [Y_anime], eax + call animashka + jmp end_hiro + + next_l1: + mov ebp,5 ; кадр + mov eax, dword [Xpl] + mov dword [X_anime], eax + mov eax, dword [Ypl] + mov dword [Y_anime], eax + call animashka + pusha + mcall 55, eax, , , Music_mov ; звук выстрела + popa + + jmp end_hiro + + next_r: + cmp eax, 4 + jne next_d + + mov eax,0 ; + mov eax, [Xpl]; + and eax, 15 + cmp eax, 7 ; + ja next_d1 + + mov ebp,4 ; кадр + mov eax, dword [Xpl] + mov dword [X_anime], eax + mov eax, dword [Ypl] + mov dword [Y_anime], eax + call animashka + + pusha + mcall 55, eax, , , Music_mov ; звук выстрела + popa + jmp end_hiro + + next_d1: + mov ebp,6 ; кадр + mov eax, dword [Xpl] + mov dword [X_anime], eax + mov eax, dword [Ypl] + mov dword [Y_anime], eax + call animashka + + jmp end_hiro + + next_d: + cmp eax, 2 + jne next_u + mov ebp,13 ; кадр + mov eax, [temp2] + cmp eax, 8 + jne padaem + mov ebp,10 ; кадр + padaem: + mov eax, [temp5] + cmp eax, 8 + jne padaem2 + mov ebp,10 ; кадр + padaem2: + mov eax, dword [Xpl] + mov dword [X_anime], eax + mov eax, dword [Ypl] + mov dword [Y_anime], eax + call animashka + jmp end_hiro + + next_u: + cmp eax, 3 + jne next_s + mov eax,0 ; + mov eax, [Ypl]; + and eax, 15 + cmp eax, 7 ; + ja next_u1 + + mov ebp,10 ; кадр + mov eax, dword [Xpl] + mov dword [X_anime], eax + mov eax, dword [Ypl] + mov dword [Y_anime], eax + call animashka + jmp end_hiro + + next_u1: + mov ebp,9 ; кадр + mov eax, dword [Xpl] + mov dword [X_anime], eax + mov eax, dword [Ypl] + mov dword [Y_anime], eax + call animashka + + jmp end_hiro + + next_s: + cmp eax, 0 + jne next_s + mov ebp,17; кадр + mov eax, dword [Xpl] + mov dword [X_anime], eax + mov eax, dword [Ypl] + mov dword [Y_anime], eax + call animashka + jmp end_hiro + + end_hiro: + + ret ; END Hiro +;************** +; end HIRO +;************** + + +;**************** +; Hiro MOV +;**************** +hiro_mov: + + ;ПРЕГРАД + + ; вычисление соседних блоков + mov ebx, [hiro_lab] + sbb ebx,2 + mov eax,[Dangeon + bx] ; up + mov [temp1], ah ; temp4 + ; + add ebx,1 ; left hiro right + mov eax,[Dangeon + bx] ; temp1 temp2 temp3 + mov [temp2], ah ; + +;------------------------------------------------------------------------------- +; Сбор алмазов +;------------------------------------------------------------------------------- + mov ecx, [Ypl] ; Это условие позволяет добежать до позиции напротив блока + and ecx, 31 ; Y в позиции напротив блока + + mov edx, [Xpl] ; Это условие позволяет добежать до позиции напротив блока + and edx, 31 ; Y в позиции напротив блока + or edx,ecx ; Мы четко спозиционированы по Х и У + cmp edx, 0 + jne no_almaz + + cmp ah, 12 + jne no_almaz + xor cx, cx + add ebx,1 ; ЗАПЛАТКА !!! без нее почемуто обнуляет не алмазы а соседние блоки + mov [Dangeon + bx], ch + sbb ebx, 1 ; ЗАПЛАТКА !!! + mov ecx, [gold] + add ecx, 1 + mov [gold], ecx + pusha + mcall 55, eax, , , Music_almaz ; звук Almaz + popa + no_almaz: +;------------------------------------------------------------------------------- +; Сбор алмазов +;------------------------------------------------------------------------------- + ; down + add ebx,1 ; temp5 + mov eax,[Dangeon + bx] ; + mov [temp3], ah + + sbb ebx,16 ; !!!!!!!!!!!! + mov eax,[Dangeon + bx] ; при отсутствии библиотеки MACROS.INC ebx=17 + mov [temp4], ah + + add ebx,32 ; + mov eax,[Dangeon + bx] ; + mov [temp5], ah + ; вычисление соседних блоков + + + + + + ;разрешение на движение + mov eax,0 ; + mov eax,[v_mov2] ; + and eax,7 + and eax,2 + cmp eax, 2 + je smena + + mov ebx, [Ypl] ; Это условие позволяет добежать до позиции напротив блока + and ebx, 31 ; Y в позиции напротив блока + cmp ebx, 0 ; + jne end_tamgna ; + smena: + + mov eax,0 ; + mov eax,[v_mov2] ; + and eax,7 + and eax,2 + cmp eax, 0 + je smena2 + + mov ebx, [Xpl] ; Это условие позволяет добежать до позиции напротив блока + and ebx, 31 ; X в позиции напротив блока + cmp ebx, 0 ; + jne end_tamgna ; + + smena2: + mov eax, [v_mov2] + and eax, 7 + mov [v_mov], eax + end_tamgna: + ;разрешение на движение + + + ;УПИРАНИЕ В ПРЕГРАДУ + mov ebx, [Ypl] ; + and ebx, 31 ; Y в позиции напротив блока + cmp ebx, 0 ; + jne end_stop ; + mov eax, [Xpl] ; без макроса этого блока не было он был внутри блока упираний + and eax, 31 ; X в позиции напротив блока + cmp eax, 0 ; + jne end_stop ; + mov eax, [v_mov] + + cmp eax, 2 + je stop_d + jmp stop_u + + stop_d: + mov ebx, [temp5] + ;заплатка 2 равно 1 если бетон то это как кирпич, иначе герой проходит сквозь бетон + + cmp ebx, 2 + jne no_zaplat1 + + sbb ebx,1 + + no_zaplat1: + + and ebx,3 + or eax, ebx + + cmp eax, 2 + je end_stop + mov ebx, 0 + mov [v_mov], ebx + + stop_u: + cmp eax, 3 + jne stop_l + + mov ebx, [temp4] + and ebx,3 + and eax, ebx + + ; mov ebx, [Ypl] ; Это условие позволяет добежать до позиции напротив блока + ; and ebx, 31 ; Y в позиции напротив блока + ; cmp ebx, 0 ; + ; jne end_stop ; + + + cmp eax, 0 + je end_stop + mov ebx, 0 + mov [v_mov], ebx + + stop_l: + cmp eax, 1 + jne stop_r + + mov ebx, [temp1] + and ebx,3 + + ; mov eax, [Xpl] ; Это условие позволяет добежать до позиции напротив блока + ; and eax, 31 ; Y в позиции напротив блока + ; cmp eax, 0 ; + ; jne end_stop ; + + cmp ebx, 0 + je end_stop + mov ebx, 0 + mov [v_mov], ebx + + stop_r: + cmp eax, 4 + jne end_stop + + mov ebx, [temp3] + and ebx,3 + + cmp ebx, 0 + je end_stop + mov ebx, 0 + mov [v_mov], ebx + + end_stop: + ;ПРЕГРАДЫ + + + ;GRAVITACION + mov ebx, [Ypl] ; Это условие позволяет добежать до позиции напротив блока + and ebx, 31 ; Y в позиции напротив блока + + mov eax, [Xpl] ; Это условие позволяет добежать до позиции напротив блока + and eax, 31 ; Y в позиции напротив блока + or eax,ebx ; Мы четко спозиционированы по Х и У + cmp eax, 0 + jne end_grav + + mov ebx, [temp2] ; + cmp ebx, 0 ; запрет на прыжки вверх + jne end_grav ; + mov ebx, [v_mov] ; + cmp ebx, 3 ; + jne dalee_gra ; + mov ebx, 0 ; + mov [v_mov],ebx ; + mov ebx, 0 ; + mov [v_mov2],ebx ; + + dalee_gra: + add eax, [temp5] ; + cmp eax, 0 ; падение в пустоту + jne dalee_g ; + mov eax, 2 ; + mov [v_mov],eax ; + mov eax, 0 ; + mov [v_mov2],eax ; + + dalee_g: + cmp eax, 4 ; + jne dalee_g2 ; падение в воду + mov eax, 2 ; + mov [v_mov],eax ; + mov eax, 0 ; + mov [v_mov2],eax ; + + dalee_g2: + cmp eax, 12 ; + jne end_grav ; падение на алмаз + mov eax, 2 ; + mov [v_mov],eax ; + mov eax, 0 ; + mov [v_mov2],eax ; + + end_grav: + ;end GRAVITACION + + + + + ; ПРИРОСТ КООРДИНАТ ГЕРОЯ + mov eax,0 ; + mov eax,[v_mov] ; + cmp eax, 2 ; + je h_down ; + jmp proverka2 ; + jmp hiro_mov_end ; + h_down: ; + mov ebx, [Ypl] ; + add ebx, 2 ; 3 + mov [Ypl], ebx ; 1 4 + jmp hiro_mov_end ; + ; + proverka2: ; + cmp eax, 3 ; ; + je h_up ; PRIROST X Y + jmp proverka3 ; + jmp hiro_mov_end ; + h_up: ; + mov ebx, [Ypl] ; + sbb ebx, 2 ; + mov [Ypl], ebx ; + jmp hiro_mov_end ; + ; + proverka3: ; + cmp eax, 1 ; ; + je h_left ; + jmp proverka4 ; + jmp hiro_mov_end ; + h_left: ; + mov ebx, [Xpl] ; + sbb ebx, 2 ; + mov [Xpl], ebx ; + jmp hiro_mov_end ; + ; + proverka4: ; + cmp eax, 4 ; + je h_right ; + jmp hiro_mov_end ; + jmp hiro_mov_end ; + h_right: ; + mov ebx, [Xpl] ; + add ebx, 2 ; + mov [Xpl], ebx ; + jmp hiro_mov_end ;прирост + ; ПРИРОСТ КООРДИНАТ ГЕРОЯ + + hiro_mov_end: + + ; вычисляем положение героя в лабиринте + mov eax, 0 ; + mov dword eax, [Ypl] ; + shr eax, 5 ; + shl eax, 4 ; + mov ebx, 0 ; + mov dword ebx, [Xpl] ; + shr ebx, 5 ; + add eax, ebx ; + mov [hiro_lab], eax ; + ; вычисляем положение героя в лабиринте +ret +;**************** +; end Hiro mov +;**************** + + +;******************************************* +; BULLET +;******************************************* + bullet_mas: + mov word [Lab3], 0 ; все делать в WORD один элемент в массиве +2 следующий враг соотвтетственно 6*2= + 12 + cycle7: + mov word bx, [Lab3] + mov word ax, [Bullet+bx] ; берет байт из Enemy + смещение + + cmp ax, 1 ; bullet ok + je go_bullet + + jmp end_bullet + go_bullet: + + add word bx, 2 ; X кооридината данного врага + mov word ax, [Bullet + bx] + mov word [X_bul], ax + + add word bx, 2 ; X кооридината данного врага + mov word ax, [Bullet + bx] + mov word [Y_bul], ax + + imgtoimg img_bullet, dword [X_bul], dword [Y_bul],canvas + end_bullet: + + mov eax, 0 + mov word ax, [Lab3] + + cmp ax, 36 ; if eax == 0 + je cycle7_end ; jump to cycle_end: + + add word [Lab3],12 + + jmp cycle7 ; + + cycle7_end: + ret ; end BULLET +;------------------------------------------------------------------------------- + + +;******************************************* +; BULLET MOV +;******************************************* + bullet_mov: + mov word [Lab3], 0 ; все делать в WORD один элемент в массиве +2 следующий враг соотвтетственно 6*2= + 12 + + cycle8: + mov word bx, [Lab3] + mov word ax, [Bullet+bx] ; берет байт из Enemy + смещение + + cmp ax, 1 ; bullet ok + je go_bullet_mov + + jmp end_bullet_mov + go_bullet_mov: + + add word bx, 2 ; X кооридината данного врага + mov word ax, [Bullet + bx] + mov word [X_bul], ax + + add word bx, 2 ; X кооридината данного врага + mov word ax, [Bullet + bx] + mov word [Y_bul], ax + + add word bx, 2 ; + mov word ax, [Bullet + bx] + mov word [mov_bullet], ax + + cmp ax, 1 + jne bul_muv_left + mov word ax, [X_bul] + sbb ax, 2 + mov word bx, [Lab3] + add word bx, 2 + mov word [Bullet + bx], ax + + jmp end_bullet_mov + bul_muv_left: + mov word ax, [X_bul] + add ax, 2 + mov word bx, [Lab3] + add word bx, 2 + mov word [Bullet + bx], ax + + end_bullet_mov: + + ; вычисляем положение BULLET в лабиринте + mov eax, 0 ; + mov eax, [Y_bul] ; + shr eax, 5 ; + shl eax, 4 ; + mov ebx, 0 ; + mov ebx, [X_bul] ; + shr ebx, 5 ; + add eax, ebx ; + mov [lab_bullet], ax ; + ; вычисляем положение BULLET в лабиринте + + mov word bx,[lab_bullet] + mov dx, [Dangeon + bx] + and edx,3 + cmp dx, 0 + je letit_dalee + + cmp dx, 2 + je beton + mov byte [Dangeon + bx], 3 ; РАЗРУШЕНИЕ КИРПИЧЕЙ + beton: + mov bx, [Lab3] + mov byte [Bullet + ebx], 0 ; берет байт из Enemy + смещение + + + + + + letit_dalee: + mov eax, 0 + mov word ax, [Lab3] + + cmp ax, 36 ; if eax == 0 + je cycle8_end ; jump to cycle_end: + + add word [Lab3],12 + + jmp cycle8 ; + + cycle8_end: + + +ret ; end BULLET +;------------------------------------------------------------------------------- + +;------------------------------------------------------------------------------- +; TABLO TABLO TABLO TABLO TABLO TABLO +;***************************************** + tablo: + ; WIWOD CIFR + ;; mov eax, 13 + ; mov ebx, 140*65536 + 18 + ; mov ecx, 10*65536 + 8 + ; mov edx, 0x00ffffff + ; int 0x40 + ; outcount [numer_level],140,10,0x224466,3*65536 + + ; WIWOD CIFR + ; mov eax, 13 + ; mov ebx, 160*65536 + 18 + ; mov ecx, 10*65536 + 8 + ; mov edx, 0x00ffffff + ; int 0x40 + ; outcount [delta_level],160,10,0x224466,3*65536 + + ; WIWOD CIFR + ; mov eax, 13 + ; mov ebx, 180*65536 + 18 + ; mov ecx, 10*65536 + 8 + ; mov edx, 0x00ffffff + ; int 0x40 + ; outcount [delta_level_end],180,10,0x224466,3*65536 + + ret +;------------------------------------------------------------------------------- +fire: + sbb ah, 121 + mov [v_fire], ah + + mov word bx, 0 + mov cx, [Bullet + ebx] + cmp cx, 0 + jne end_fire + pusha + mcall 55, eax, , , Music_bah ; звук выстрела + popa + + mov byte [Bullet + ebx], 1 + + add word bx, 2 ; X кооридината данного врага + mov ax, [Xpl] + add ax, 8 + mov word [Bullet + ebx],ax + + add word bx, 2 ; X кооридината данного врага + mov ax, [Ypl] + add ax, 16 + mov word [Bullet + ebx],ax + + add word bx, 2 ; + mov ax,[v_fire] + mov word [Bullet + ebx],ax + + end_fire: +ret +;------------------------------------------------------------------------------- + + +;------------------------Загрузка уровней--------------------------------------- +load_level: + imgtoimg img_level,32,32,canvas + setimg 6,20,canvas + + xor eax,eax + xor ebx,ebx + xor edx,edx + xor ecx,ecx + mov dword [Bullet], eax + mov dword [Bullet+2], eax + mov dword [Bullet+4], eax + mov dword [Bullet+6], eax + mov dword [Bullet+8], eax + mov dword [Bullet+10], eax + mov byte [Lab], 1 + mov [lab_bullet], eax + mov [mov_bullet], eax + mov [X_bul], eax + mov [Y_bul], eax + mov [gold], eax + mov dword [Xpl], 32 + mov dword [Ypl], 448 + mov dword [hiro_lab],0 ; проекция героя в лабиринт + mov dword [v_mov], 0 + mov dword [v_mov2], 0 + mov dword [v_fire], 0 + + xor eax,eax + mov eax, [numer_level] + shl eax, 8 + mov dword [delta_level], eax + add eax, 256 + mov dword [delta_level_end], eax + + cycleL: + + xor ebx, ebx + mov ebx, [Lab] + add ebx, [delta_level] + mov ax,[Dangeon2 + ebx] ; берет байт из дангеон + смещение + + sbb ebx, [delta_level] + mov [Dangeon + ebx], ax ; берет байт из дангеон + смещение + add word [Lab],1 + mov eax, [Lab] + + + cmp eax, [delta_level_end] ; if eax == 0 + je cycleL_end ; jump to cycle_end: + jmp cycleL ; + cycleL_end: + + mov eax, 0 + mov [Lab],eax + + call enemy_plaz + +ret +;------------------------------------------------------------------------------- + +;************************************ +;GOLD +proverka_gold: +mov eax, [gold] + cmp ax, 10 + jna net_deneg + mov eax, [temp2] ; добежать до двери + cmp ax, 16 + jne net_deneg + mov ax, [numer_level] ; увеличение левела + + add ax, 1 + mov [numer_level], ax + mov [demon_kolvo], ax ; + + call load_level + delay 100 + + net_deneg: +ret + +;------------------------------------------------------------------------------- +; УТОП +potop: + mov eax, [temp2] ; добежать до двери + cmp ax, 4 + jne jiwoy + mov dword [gold], 0 ; увеличение левела + + call load_level + delay 100 + jiwoy: +ret + +;************************************ +;положение врагов на новом уровне +enemy_plaz: + mov word [Lab2], 0 ; все делать в WORD один элемент в массиве +2 следующий враг соотвтетственно 6*2= + 12 + mov ax, [demon_kolvo] + mov [demon], ax + + cycle55: + mov ebx, 0 + mov ecx, 0 + mov edx, 0 + mov esi, 0 + + mov cx, [demon] + cmp cx, 0 + je end_demon + mov word bx, [Lab2] ; + mov word [Enemy + bx], 1 ; + sbb cx, 1 + mov [demon], cx + end_demon: + + random 14, eax + add eax, 1 + shl eax,5 + mov word bx, [Lab2] ; + add word bx, 2 ; X кооридината данного врага + mov word [Enemy + bx], ax ; + ; + random 12, eax + add eax, 1 + shl eax,5 + mov word bx, [Lab2] ; + add word bx, 4 ; Y кооридината данного врага + mov word [Enemy + bx], ax ; + + mov word bx, [Lab2] ; + add word bx, 8 ; направление движения + mov word [Enemy + bx], 0 ; + add word bx, 2 ; жизнь + mov word [Enemy + bx], 500 ; + + + mov eax, 0 + mov word ax, [Lab2] + + cmp ax, 96 ; if eax == 0 + je cycle55_end ; jump to cycle_end: + + add word [Lab2],12 + + jmp cycle55 ; + + cycle55_end: + +ret + + +I_END: ; конец программы + + + +;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + Xpl: dd 32 ; координаты героя + Ypl: dd 448 + hiro_lab: dd 0 ; проекция героя в лабиринт + numer_level: dd 0 + delta_level: dd 0 + delta_level_end: dd 256 + demon: dd 0 + demon_kolvo: dd 1 + + gold: dd 0 + + X_enemy: dd 0 + Y_enemy: dd 0 + + + X_bul: dd 0 + Y_bul: dd 0 + + X_anime: dd 0 + Y_anime: dd 0 + + mov_bullet: dw 0 + lab_bullet: dw 0 + mov_enemy: dw 0 + lab_enemy: dw 0 + life_enemy: dw 0 + + anime : dd 0 ; переменная для анимации героя и пр + anime2 : dd 0 ; переменная для анимации героя и пр + + temp1: dd 0 + temp2: dd 0 + temp3: dd 0 + temp4: dd 0 + temp5: dd 0 + + + v_mov: dd 0 ; направления движения персонажа + v_mov2: dd 0 ; направления движения персонажа + v_fire: dd 0 ; направления движения персонажа + Lab: dd 0 + Lab2: dw 0 + Lab3: dw 0 + perem1: dd 0 + perem2: dd 0 + + timer1 dd 0 ; таймер используемый для анимации воды, врагов --- бегает от 0 до 10 + +;------------------------------------------------------------------------------- +;1 обычная стена, 2 непробиваемая, 4 вода, 8 лесница, 12 алмаз, 0 пустота 16 - exit +;------------------------------------------------------------------------------- +Dangeon: + db 2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2 + db 2,1,1,1,1,1,1,0,12,0,0,0,0,0,0,2 + db 2,0,12,12,0,0,0,8,1,8,1,1,1,0,0,2 + db 2,8,1,1,1,1,1,8,1,8,0,0,0,0,0,2 + db 2,8,0,0,0,0,0,8,1,8,2,4,4,2,0,2 + db 2,8,2,4,4,4,2,8,1,8,2,2,2,2,0,2 + db 2,0,2,2,2,2,2,8,1,8,0,0,0,0,0,2 + db 2,0,1,0,0,0,0,8,1,1,1,1,1,1,8,2 + db 2,0,1,1,8,1,1,1,0,0,0,0,0,0,8,2 + db 2,12,1,1,8,0,12,0,1,8,1,1,8,1,1,2 + db 2,0,0,0,8,8,1,8,0,8,0,0,0,0,0,2 + db 2,12,1,8,1,8,1,1,8,1,1,1,1,1,1,2 + db 2,0,1,8,12,12,0,0,0,0,0,0,0,0,0,2 + db 2,0,1,1,1,1,1,8,1,1,1,0,0,0,0,2 + db 2,0,0,0,12,0,0,8,0,0,0,16,0,12,12,2 + db 2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2 + +Dangeon2: + db 2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2 + db 2,1,1,0,1,1,1,0,12,0,0,0,0,0,0,2 + db 2,0,12,12,0,0,0,8,1,8,1,1,1,0,0,2 + db 2,8,1,1,1,1,1,8,1,8,0,0,0,0,0,2 + db 2,8,0,0,0,0,0,8,1,8,2,4,4,2,0,2 ;0 + db 2,8,2,4,4,4,2,8,1,8,2,2,2,2,0,2 + db 2,0,2,2,2,2,2,8,1,8,0,0,0,0,0,2 + db 2,0,1,0,0,0,0,8,1,1,1,1,1,1,8,2 + db 2,0,1,1,8,1,1,1,0,0,0,0,0,0,8,2 + db 2,12,1,1,8,0,12,0,1,8,1,1,8,1,1,2 + db 2,0,0,0,8,8,1,8,0,8,0,0,0,0,0,2 + db 2,12,1,8,1,8,1,1,8,1,1,1,1,1,1,2 + db 2,0,1,8,12,12,0,0,0,0,0,0,0,0,0,2 + db 2,0,1,1,1,1,1,8,1,1,1,0,0,0,0,2 + db 2,0,0,0,12,0,0,8,0,0,0,16,0,12,12,2 + db 2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2 + db 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2;------------------------------------------------------------------------------- + db 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2 + db 2,0,0,0,0,0,0,0,0,0,0,16,0,0,0,2 + db 2,12,1,8,1,0,0,0,0,0,0,1,8,0,0,2 + db 2,0,1,8,1,0,0,0,0,0,0,1,0,8,0,2 ;1 + db 2,12,1,8,1,1,0,0,0,0,1,1,0,8,0,2 + db 2,0,1,8,1,0,12,12,12,12,0,1,8,8,0,2 + db 2,12,1,8,1,0,1,1,1,1,0,1,8,0,0,2 + db 2,0,1,8,0,0,0,0,0,0,0,0,8,0,0,2 + db 2,0,1,1,1,1,8,1,8,1,1,1,1,1,8,2 + db 2,0,0,0,12,0,8,0,8,0,0,0,12,0,8,2 + db 2,0,1,1,1,1,1,0,1,8,1,1,8,1,1,2 + db 2,0,0,0,0,0,0,0,0,8,1,0,8,0,0,2 + db 2,0,1,1,1,1,1,8,1,1,1,1,1,1,8,2 + db 2,0,0,12,0,0,0,8,0,0,12,0,0,0,8,2 + db 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2;------------------------------------------------------------------------------- + db 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2 + db 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2 + db 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2 + db 2,0,0,0,0,0,0,0,0,12,0,12,0,0,0,2 + db 2,0,0,0,0,0,0,8,1,1,1,1,1,1,0,2 ;2 + db 2,0,8,0,12,12,0,8,0,0,0,0,0,2,4,2 + db 2,0,8,1,1,1,1,0,0,0,0,0,0,2,2,2 + db 2,0,8,0,0,0,0,12,1,1,1,1,0,0,0,2 + db 2,0,8,1,0,1,0,12,0,0,0,0,0,0,0,2 + db 2,0,8,0,1,1,12,12,0,0,0,8,1,1,1,2 + db 2,0,8,0,12,0,0,12,0,0,0,8,0,12,0,2 + db 2,0,8,0,0,0,8,1,8,0,0,1,8,1,8,2 + db 2,0,8,0,0,8,1,1,1,8,0,0,8,0,8,2 + db 2,0,1,1,1,1,1,1,1,1,1,1,1,1,8,2 + db 2,0,0,0,0,0,0,0,16,0,0,0,0,0,8,2 + db 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2;------------------------------------------------------------------------------- + db 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2 + db 2,0,0,0,0,12,0,0,0,0,0,0,16,0,0,2 + db 2,0,8,1,1,1,1,1,1,1,1,1,1,1,0,2 + db 2,0,8,0,0,0,0,0,12,0,0,0,0,0,0,2 + db 2,0,8,0,0,0,0,1,8,1,0,0,0,0,0,2 + db 2,0,8,0,0,0,1,1,8,1,1,0,0,0,0,2 + db 2,0,8,0,12,1,1,1,8,1,1,1,12,0,0,2 + db 2,0,8,0,1,1,12,1,8,1,12,1,1,0,0,2 + db 2,0,0,1,1,1,1,1,8,1,1,1,1,0,0,2 ;3 + db 2,0,1,0,0,0,0,0,8,1,0,0,0,1,0,2 + db 2,0,1,0,1,1,1,1,8,1,1,1,0,1,0,2 + db 2,0,1,1,12,1,12,1,8,1,1,1,0,1,0,2 + db 2,0,1,1,1,1,1,1,8,1,1,1,0,1,0,2 + db 2,0,1,1,12,1,12,1,8,1,1,1,12,1,0,2 + db 2,0,0,0,0,0,0,0,8,0,0,0,0,0,0,2 + db 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2;------------------------------------------------------------------------------- + db 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2 + db 2,0,12,0,0,0,0,0,0,0,0,0,16,0,0,2 + db 2,0,1,8,1,1,1,1,1,1,8,1,1,1,8,2 + db 2,0,0,8,0,0,0,0,0,0,8,0,0,0,8,2 + db 2,0,1,1,1,1,1,8,1,1,1,1,1,1,0,2 + db 2,0,0,12,0,0,12,8,0,0,12,0,0,0,0,2 + db 2,12,1,1,1,8,1,1,1,1,8,1,1,1,8,2 + db 2,0,0,0,0,8,0,0,0,0,8,0,0,0,8,2 + db 2,8,1,1,1,1,1,1,8,1,1,1,1,1,0,2 ;4 + db 2,8,0,0,0,12,0,0,8,0,0,12,0,0,0,2 + db 2,0,1,8,1,1,1,1,1,1,1,1,8,1,0,2 + db 2,0,0,8,12,0,0,0,0,12,0,0,8,0,0,2 + db 2,8,1,1,1,1,1,1,8,1,1,1,1,1,8,2 + db 2,8,12,0,0,0,0,0,0,0,0,0,0,12,8,2 + db 2,8,2,4,4,4,4,4,4,4,4,4,4,2,8,2 + db 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2;------------------------------------------------------------------------------- + db 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2 + db 2,8,1,8,12,8,1,8,1,8,1,8,1,8,1,2 + db 2,8,2,8,1,8,1,8,1,8,1,8,12,8,12,2 + db 2,8,1,8,1,8,2,8,12,8,1,8,1,8,1,2 + db 2,8,12,8,0,8,0,8,0,8,0,8,0,8,0,2 + db 2,1,8,1,1,1,1,1,8,1,1,1,1,1,8,2 + db 2,0,8,0,0,0,0,0,8,0,0,12,0,0,8,2 + db 2,0,8,12,0,2,12,0,8,1,1,1,1,1,8,2 + db 2,0,1,1,8,1,1,1,8,0,0,0,0,0,8,2 ;5 + db 2,0,1,0,8,0,0,0,8,0,0,12,0,0,8,2 + db 2,0,1,0,8,0,0,0,8,1,1,1,1,1,8,2 + db 2,0,1,12,8,0,0,2,8,0,0,0,0,0,8,2 + db 2,8,1,1,1,1,8,1,1,1,1,8,1,1,1,2 + db 2,8,0,0,0,0,8,2,0,0,2,8,0,0,0,2 + db 2,0,8,0,12,8,8,2,4,4,2,8,0,0,16,2 + db 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2;------------------------------------------------------------------------------- + db 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2 + db 2,0,8,0,8,0,8,0,8,0,0,8,0,8,16,2 + db 2,1,8,1,8,1,8,1,8,1,1,8,1,8,1,2 + db 2,0,8,0,8,0,8,0,8,8,0,8,0,8,0,2 + db 2,1,1,8,1,1,1,1,1,8,1,1,8,1,1,2 + db 2,0,0,8,8,0,12,8,0,8,8,12,8,8,0,2 + db 2,1,1,1,8,1,1,8,1,1,8,1,1,8,1,2 + db 2,0,8,0,8,0,12,8,0,0,8,0,12,8,0,2 ;6 + db 2,1,8,1,1,1,1,1,8,1,1,1,1,1,1,2 + db 2,0,8,0,12,8,0,0,8,12,0,8,0,0,0,2 + db 2,1,8,1,1,8,1,1,8,1,1,8,1,1,1,2 + db 2,0,0,8,0,8,8,0,8,8,0,8,8,0,0,2 + db 2,1,1,8,1,1,8,1,1,8,1,1,8,1,1,2 + db 2,0,0,8,12,0,8,0,12,8,0,12,8,12,12,2 + db 2,8,8,1,1,1,1,1,1,1,1,1,1,1,1,2 + db 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2;------------------------------------------------------------------------------- + db 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2 + db 2,0,12,0,12,0,12,0,0,12,0,12,0,0,0,2 + db 2,1,1,1,8,1,1,1,1,1,1,8,1,1,1,2 + db 2,0,0,0,8,0,0,12,0,0,0,8,0,0,0,2 + db 2,1,1,1,1,1,1,1,8,1,1,1,1,1,1,2 + db 2,0,0,0,12,0,0,0,8,12,0,0,0,0,0,2 + db 2,1,1,1,8,1,1,1,1,1,1,8,1,1,1,2 + db 2,0,0,0,8,0,0,0,0,0,0,8,0,0,0,2 ; 7 + db 2,1,1,1,1,1,1,1,1,1,1,1,1,8,1,2 + db 2,0,0,0,0,0,0,0,0,0,0,0,0,8,0,2 + db 2,1,1,1,1,1,1,8,1,1,1,1,1,8,1,2 + db 2,0,0,0,0,0,0,8,0,0,0,0,0,8,0,2 + db 2,1,1,8,1,8,1,1,8,1,8,1,1,1,1,2 + db 2,0,0,8,0,8,12,0,8,0,8,12,0,0,16,2 + db 2,8,1,1,1,1,1,1,1,1,1,1,1,1,1,2 + db 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2;------------------------------------------------------------------------------- + db 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2 + db 2,0,0,0,0,0,0,0,0,0,0,0,0,16,0,2 + db 2,8,8,8,8,8,8,8,8,8,8,8,8,8,8,2 + db 2,0,8,0,8,0,12,0,0,8,0,8,0,0,0,2 + db 2,8,8,8,8,8,8,8,8,8,8,8,8,8,8,2 + db 2,0,0,8,12,0,0,8,0,0,8,0,0,0,0,2 + db 2,8,8,8,8,8,8,8,8,8,8,8,8,8,8,2 + db 2,0,0,0,0,0,0,0,0,8,0,0,0,12,0,2 + db 2,8,8,8,8,8,8,8,8,8,8,8,8,8,8,2 + db 2,0,8,0,0,0,8,12,0,0,8,0,8,12,0,2 + db 2,8,8,8,8,8,8,8,8,8,8,8,8,8,8,2 + db 2,0,0,8,0,0,0,0,12,8,0,12,8,0,0,2 + db 2,8,8,8,8,8,8,8,8,8,8,8,8,8,8,2 + db 2,0,0,8,0,8,12,0,0,8,12,0,8,12,0,2 + db 2,8,8,8,8,8,8,8,8,8,8,8,8,8,8,2 + db 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2;------------------------------------------------------------------------------- + + +;------------------------------------------------------------------------------- +Bullet: dw 0,0,0,0,0,0 + dw 0,0,0,0,0,0 + dw 0,0,0,0,0,0 + dw 0,0,0,0,0,0 +;------------------------------------------------------------------------------- + + +Enemy: dw 1,448,128,0,0,500 ;враги класс,Х,У,положение в лабиринте,направление движения,жизнь + dw 0,32,32,0,0,0 + dw 0,64,32,0,0,0 + dw 0,416,32,0,0,0 + dw 0,256,256,0,0,0 + dw 0,256,224,0,0,0 + dw 0,320,192,0,0,0 + dw 0,32,256,0,0,0 + dw 0,448,448,0,0,0 + +;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +bullet_bmp: +file 'bullet.bmp' +rb 1 + +level_bmp: +file 'level2.bmp' +rb 1 + +kirpich: +file 'kirpich.bmp' +rb 1 + +kirpich3: +file 'kirpich2.bmp' +rb 1 + +kirpich2: +file 'oldkirpich.bmp' +rb 1 + +lest_bmp: +file 'lestnica.bmp' +rb 1 + +water1_bmp: +file 'water1.bmp' +rb 1 + +water2_bmp: +file 'water2.bmp' +rb 1 + +door1_bmp: +file 'door1.bmp' +rb 1 + +door2_bmp: +file 'door2.bmp' +rb 1 + + +img_level: +rb 448*448*3+8 + +;img_ded1: +;rb 448*448*3+8 + +img_area: +rb 32*32*3+8 + +img_area2: +rb 32*32*3+8 + +img_area3: +rb 32*32*3+8 + +img_bullet: +rb 4*8*3+8 + +img_lestniza: +rb 32*32*3+8 + +img_water1: +rb 32*32*3+8 + +img_water2: +rb 32*32*3+8 + +img_door1: +rb 32*32*3+8 + +img_door2: +rb 32*32*3+8 + +img_enemy1: +rb 32*32*3+8 + +img_enemy2: +rb 32*32*3+8 + + +Music_bah: + db 0x0f, 0x09, 0 + +Music_mov: + db 0x00, 0x00, 0 + +Music_almaz: + db 0x09, 0x03, 0 + +entered rd 1 + +imgcount rd 1 ; кол-во всего кадров в анимации +img_index rd 1 ; номер текущего кадра + +;hashtable rd 4096 ; рабочая область для РеадГИФ процедуры +workarea: +file 'aniall.gif' + + +;temp rb 0x100000 ; место для ГИФ фаила +rb 10 + +canvas: +xs dd 512 +ys dd 512 + rb 512*512*3 + +gif_hash_area: +rd 4096+1 + +coords: +rd 2 + +Image: diff --git a/programs/games/almaz/ASCGL.INC b/programs/games/almaz/ASCGL.INC new file mode 100644 index 0000000000..d637dc2f56 --- /dev/null +++ b/programs/games/almaz/ASCGL.INC @@ -0,0 +1,1385 @@ +lang equ ru + +; +; Assembler +; SMALL +; CODE +; Graphics +; Libary +; +; Ver 0.18 By Pavlushin Evgeni (RUSSIA) +; www.waptap@mail.ru + +;InfoList +;0.01 LoadImage +;0.02 SetBmp +;0.03 Bmptoimg, Setimg ~01.03.2004 +;0.04 Bug deleted, copyimg ~03.05.2004 +;0.05 fullimg, collimg ~05.05.2004 +;0.06 getimg ~09.05.2004 +;0.07 convbmp ~13.05.2004 +;0.08 fps ~14.05.2004 +;0.09 drawfbox ~03.06.2004 +;0.10 all macros optimized by halyavin, add at ~07.06.2004 +;0.11 many macros optimized by halyavin, add at ~30.08.2004 +;0.12 bmptoimg ~07.09.2004 +;0.13 imgtoimg ~08.09.2004 +;0.14 imgtoimg modify not brake bmp pict! ~09.09.2004 +;0.15 giftoimg, giftoani ~10.09.2004 +;0.16 setframe, rgbtobgr, setbmp deleted ~20.09.2004 +;0.17 modification giftoimg, giftoani, getframeoff ~01.10.2004 +;0.18 aframetoimg,aimgtoimg,frametoimg ~03.10.2004 + +aframetoimg_use_count=0 +macro aframetoimg img, x, y, canvas,acol +{ +local loo,loo2,acolor +aframetoimg_use_count=aframetoimg_use_count+1 +if aframetoimg_use_count = 1 + + jmp end_aframetoimg_proc + +acolor dd 0 +aframetoimg_proc: +;getout coord + mov [acolor],ebp + + mov edx,ebx ;img ;xsize + movzx eax,word [edx] + add eax,esi ;y cor + +; mov eax,esi ;y cor + mul dword [ecx] ;canvas xsize + add eax,edi ;x cor + + mov ebp,ebx ;img ;xsize + movzx edx,word [ebp] + add eax,edx + + mov ebp,eax + shl eax,1 + add ebp,eax + add ebp,ecx ;canvas+8;start + add ebp,8 +;get img size + add ebx,4 + mov eax,ebx ;img ;xsize + movzx esi,word [eax] + movzx edi,word [eax+2] + add ebx,4 + mov edx,ebx ;img+8 +loo2: +push esi +loo: +;test on alpha color + mov eax,[edx] + shl eax,8 + shr eax,8 + cmp eax,[acolor] + jne yx + add edx,3 + add ebp,3 + jmp nx +yx: + + mov al,byte [edx] + mov byte [ebp],al + inc ebp + inc edx + mov al,byte [edx] + mov byte [ebp],al + inc ebp + inc edx + mov al,byte [edx] + mov byte [ebp],al + inc ebp + inc edx +nx: + dec esi + jnz loo +pop esi + sub ebp,3 + mov eax,[ecx] ;offset = offset+((canxsize-imgxsize)*3) + sub eax,esi + add ebp,eax + shl eax,1 + add ebp,eax + + add ebp,3 + + dec edi + jnz loo2 + ret +end_aframetoimg_proc: +end if + push img + push canvas + push x + push y + push acol + pop ebp + pop esi + pop edi + pop ecx + pop ebx + call aframetoimg_proc +} + +frametoimg_use_count=0 +macro frametoimg img, x, y, canvas +{ +local loo,loo2 +frametoimg_use_count=frametoimg_use_count+1 +if frametoimg_use_count = 1 + + jmp end_frametoimg_proc + +frametoimg_proc: +;getout coord + mov edx,ebx ;img ;xsize + movzx eax,word [edx] + add eax,esi ;y cor + +; mov eax,esi ;y cor + mul dword [ecx] ;canvas xsize + add eax,edi ;x cor + + mov ebp,ebx ;img ;xsize + movzx edx,word [ebp] + add eax,edx + + mov ebp,eax + shl eax,1 + add ebp,eax + add ebp,ecx ;canvas+8;start + add ebp,8 +;get img size + add ebx,4 + mov eax,ebx ;img ;xsize + movzx esi,word [eax] + movzx edi,word [eax+2] + add ebx,4 + mov edx,ebx ;img+8 +loo2: +push esi +loo: + mov al,byte [edx] + mov byte [ebp],al + inc ebp + inc edx + mov al,byte [edx] + mov byte [ebp],al + inc ebp + inc edx + mov al,byte [edx] + mov byte [ebp],al + inc ebp + inc edx + + dec esi + jnz loo +pop esi + sub ebp,3 + mov eax,[ecx] ;offset = offset+((canxsize-imgxsize)*3) + sub eax,esi + add ebp,eax + shl eax,1 + add ebp,eax + + add ebp,3 + + dec edi + jnz loo2 + ret +end_frametoimg_proc: +end if + push img + push canvas + push x + push y + pop esi + pop edi + pop ecx + pop ebx + call frametoimg_proc +} + + +aimgtoimg_use_count=0 +macro aimgtoimg img, x, y, canvas,acol +{ +local loo,loo2,acolor +aimgtoimg_use_count=aimgtoimg_use_count+1 +if aimgtoimg_use_count = 1 + + jmp end_aimgtoimg_proc + +acolor dd 0 +aimgtoimg_proc: +;getout coord + mov [acolor],ebp + + mov eax,esi ;y cor + mul dword [ecx] ;canvas xsize + add eax,edi ;x cor + mov ebp,eax + shl eax,1 + add ebp,eax + add ebp,ecx ;canvas+8;start + add ebp,8 +;get img size + mov eax,ebx ;img ;xsize + mov esi,[eax] + add ebx,4 + mov eax,ebx ; img+4 ;ysize + mov edi,[eax] + add ebx,4 + mov edx,ebx ;img+8 +loo2: +push esi +loo: + +;test on alpha color + mov eax,[edx] + shl eax,8 + shr eax,8 + cmp eax,[acolor] + jne yx + add edx,3 + add ebp,3 + jmp nx +yx: + + mov al,byte [edx] + mov byte [ebp],al + inc ebp + inc edx + mov al,byte [edx] + mov byte [ebp],al + inc ebp + inc edx + mov al,byte [edx] + mov byte [ebp],al + inc ebp + inc edx +nx: + dec esi + jnz loo +pop esi + sub ebp,3 + mov eax,[ecx] ;offset = offset+((canxsize-imgxsize)*3) + sub eax,esi + add ebp,eax + shl eax,1 + add ebp,eax + + add ebp,3 + + dec edi + jnz loo2 + ret +end_aimgtoimg_proc: +end if + push img + push canvas + push x + push y + push acol + pop ebp + pop esi + pop edi + pop ecx + pop ebx + call aimgtoimg_proc +} + + + + +imgtoimg_use_count=0 +macro imgtoimg img, x, y, canvas +{ +local loo,loo2 +imgtoimg_use_count=imgtoimg_use_count+1 +if imgtoimg_use_count = 1 + + jmp end_imgtoimg_proc +imgtoimg_proc: +;getout coord + mov eax,esi ;y cor + mul dword [ecx] ;canvas xsize + add eax,edi ;x cor + mov ebp,eax + shl eax,1 + add ebp,eax + add ebp,ecx ;canvas+8;start + add ebp,8 +;get img size + mov eax,ebx ;img ;xsize + mov esi,[eax] + add ebx,4 + mov eax,ebx ; img+4 ;ysize + mov edi,[eax] + add ebx,4 + mov edx,ebx ;img+8 +loo2: +push esi +loo: + mov al,byte [edx] + mov byte [ebp],al + inc ebp + inc edx + mov al,byte [edx] + mov byte [ebp],al + inc ebp + inc edx + mov al,byte [edx] + mov byte [ebp],al + inc ebp + inc edx + dec esi + jnz loo +pop esi + sub ebp,3 + mov eax,[ecx] ;offset = offset+((canxsize-imgxsize)*3) + sub eax,esi + add ebp,eax + shl eax,1 + add ebp,eax + + add ebp,3 + + dec edi + jnz loo2 + ret +end_imgtoimg_proc: +end if + push img + push canvas + push x + push y + pop esi + pop edi + pop ecx + pop ebx + call imgtoimg_proc +} + + +;DrawBox +macro drawfbox x,y,xs,ys,color +{ + wordstoreg ebx,x,xs ;x*65536+xs + wordstoreg ecx,y,ys ;y*65536+ys + mov edx,color + mov eax,13 + int 0x40 +} + +; FPS - Set Frame Per Second Display +fps_show_frequency=40 +macro fps x,y,color,delcolor +{ +local spdat,savetime,new_time,fps,fps_cntr,out_fps,new_time,ttt +local no_out_fps + jmp spdat +savetime dd 0 +fps_cntr dd 0 +fps dd 0 +ttt dd 0 +spdat: +get_time: + mov eax,3 + int 0x40 + cmp eax,[savetime] + jne new_time + inc [fps_cntr] + cmp dword [ttt],0 + je out_fps + dec dword [ttt] + jmp no_out_fps +new_time: + mov [savetime],eax + mov ebx,[fps_cntr] + mov [fps],ebx + mov [fps_cntr],0 +out_fps: +if ~(delcolor eq ) + mov ebx,x*65536+30 + mov ecx,y*65536+7 + mov edx,delcolor + mov eax,13 + int 0x40 +end if + mov dword [ttt],fps_show_frequency + mov eax,47 + mov ebx,5*65536 +; mov bl,0 + mov edx,x*65536+y + mov esi,color + mov ecx,[fps] + int 0x40 +no_out_fps: +} + +; COLLIMG - Collusion image's +_1dbounce_count=0; +macro collimg img1_off,x1,y1,img2_off,x2,y2,otv +{ +local bounce,exit,anot,bc,nbc + mov esi,[img1_off] ;xs1 + mov edi,[img2_off] ;ys2 + mov eax,x1 ; + mov ebx,x2 ; + call _1dbounce + mov edx,ecx + mov esi,[img1_off+4] ;ys1 + mov edi,[img2_off+4] ;ys2 + mov eax,y1 ; + mov ebx,y2 ; + call _1dbounce + add edx,ecx + cmp edx,2 + je bounce + mov otv,0 + jmp exit +_1dbounce_count=_1dbounce_count+1 +if _1dbounce_count = 1 +_1dbounce: + cmp ebx,eax + jb anot + add eax,esi + cmp eax,ebx + jbe nbc +bc: + mov ecx,1 + ret +anot: + add ebx,edi + cmp ebx,eax + ja bc +nbc: + xor ecx,ecx + ret +end if +bounce: + mov otv,1 +exit: +} + +macro rgbtobgr image +{ +local loo + mov eax,[image] + mul dword [image+4] + mov ecx,eax + mov esi,image+8 +; add esi,8 +loo: + mov al,[esi] + mov bl,[esi+2] + mov [esi],bl + mov [esi+2],al + add esi,3 + dec ecx + jnz loo +} + + +macro setimg x , y ,arg3 +{ + mov eax,7 + mov ebx,arg3 + add ebx,8 + mov cx,[arg3] + shl ecx,16 + add cx,[arg3+4] +; wordstoreg ecx,[arg3],[arg3+4] + wordstoreg edx, x , y ;arg1*65536+arg2 + int 0x40 +} + +macro setframe x , y ,arg3 +{ + mov eax,7 + mov ebx,arg3 + add ebx,8 + wordstoreg edx, x , y ;arg1*65536+arg2 + add edx,dword [arg3] + mov ecx,dword [arg3+4] + int 0x40 +} + + +macro getimg imgsrc,x,y,xs,ys,imgdest +{ +local cyc +if xs eqtype 0 + mov dword [imgdest],xs +else + mov eax,xs + mov dword [imgdest],eax +end if +if ys eqtype 0 + mov dword [imgdest+4],ys +else + mov eax,ys + mov dword [imgdest+4],eax +end if + + mov eax,dword [imgsrc] ;getx size +; lea ecx,[eax+2*eax] + mov ecx,eax + shl ecx,1 + add ecx,eax + + mov ebx,y + mul ebx + add eax,x + mov edx,ecx + lea eax,[eax+2*eax] ;eax=offset on imsrc +; mov ebp,eax +; shl eax,1 +; add eax,ebp + + mov ecx,xs + mov ebx,ys + + mov edi,8+imgdest + lea esi,[eax+8+imgsrc] +; mov esi,eax +; add esi,8 +; add esi,imgsrc + + cld +cyc: + movsw + movsb + dec ecx + jne cyc + add esi,edx + mov ecx,xs + sub esi,ecx + sub esi,ecx + sub esi,ecx + dec ebx + jne cyc +} + +macro copyimg img2_off,img1_off +{ + mov eax,dword [img1_off] + mov ebx,dword [img1_off+4] + mul ebx + lea ecx,[eax+2*eax] + lea esi,[img1_off+8] + lea edi,[img2_off+8] + cld + rep movsb +} + +macro fullimg img_off,xs,ys,color +{ +local cop + mov eax,xs + mov ebx,ys + mov dword [img_off],eax + mov dword [img_off+4],ebx + mul ebx + lea ebp,[eax+2*eax] + mov esi,color +if color eqtype 0 + mov ecx,color/65536 +else + mov ecx,esi + shr ecx,16 +end if + xor edi,edi +cop: + mov word [img_off+8+edi],si + add edi,2 + mov byte [img_off+8+edi],cl + inc edi + cmp edi,ebp + jne cop +} + + + + ; number of frame in ecx + ; callculatin offset of raw data + +macro getframeoff num_of_frame,offset_of_animation,offset_of_frame +{ +local loo,setpic + mov ebp,num_of_frame ;ecx + mov esi,offset_of_animation;Image +loo: + cmp ebp,0 + je setpic + movzx eax,word [esi+4] + movzx ebx,word [esi+6] + mul ebx ;dword [esi+4] + mov ebx,3 + mul ebx + add eax,8 + add esi,eax + dec ebp + jmp loo +setpic: + mov dword offset_of_frame,esi +} + + +; BMPTOIMG -Convert BMP format TO IMG format +; (SYNTAX) BMPTOIMG BMP_source_offset,IMG_dest_ofset +; (SAMPLE) View BMPLS.ASM sample. +; ( NOTE ) This is macros is not brake bmp structure! Tested in 32,8,4 bits + + +bmptoimg_data_area_count=0 +macro bmptoimg bmp_load_area,img_dest_area +{ +local fileinfo,string,end_bmp,nodix +local converttable,noaddelem,nextbit,convert1bpp,convert4bpp,convert2 +local nextelem,convertno32,nomorestring,convert1,nextstring,yespicsize +;local qwe,bmpfn + +; convert: + movzx eax,word [bmp_load_area+28] + mul dword [bmp_load_area+18] + add eax,31 + shr eax,5 + mov dword [bmptoimg_data_area_dwps],eax ;dwps-doublewords per string + shl eax,2 + mov dword [bmptoimg_data_area_bps],eax ;bps-bytes per string + + cmp dword [bmp_load_area+34],0 + jne yespicsize ;if picture size is defined + mul dword [bmp_load_area+22] + mov dword [bmp_load_area+34],eax + + yespicsize: + mov ebp,img_dest_area+8 + + mov eax,bmp_load_area + mov ebx,eax + add ebx, [bmp_load_area+2];file size + inc ebx + mov dword [bmptoimg_soi],ebx ;soi-start of image area for drawing + + add eax, [bmp_load_area+10] + mov dword [bmptoimg_data_area_sop],eax ;sop-start of picture in file + add eax, [bmp_load_area+34] + mov dword [bmptoimg_data_area_eop],eax ;eop-end of picture in file + mov eax, [bmp_load_area+18] + lea eax,[eax+2*eax] ;3x pixels in eax + + mov edi,dword [bmptoimg_soi] ;initializing + mov esi,dword [bmptoimg_data_area_eop] + sub esi,dword [bmptoimg_data_area_bps] + + + nextstring: + push edi + push ebp + cmp word [bmp_load_area+28],24 + jne convertno32 + + mov edi,ebp + mov ecx,[bmptoimg_data_area_dwps] + cld + rep movsd + + convert1: + pop ebp + pop edi + sub esi,dword [bmptoimg_data_area_bps] + sub esi,dword [bmptoimg_data_area_bps] + cmp esi,dword [bmptoimg_data_area_sop] + jb end_bmp + add edi,eax + add ebp,eax + jmp nextstring + + convertno32: + mov ebx,bmp_load_area + add ebx, [bmp_load_area+14] + add ebx,14 ;start of color table + push esi + add esi,dword [bmptoimg_data_area_bps] + mov dword [bmptoimg_data_area_eos],esi + pop esi + nextelem: + push eax + movzx eax,byte [esi] + cmp word [bmp_load_area+28],4 + je convert4bpp + cmp word [bmp_load_area+28],1 + je convert1bpp + call converttable + + convert2: + pop eax + inc esi + cmp esi,dword [bmptoimg_data_area_eos] + jae convert1 + add edi,3 + + add ebp,3 + + jmp nextelem + + convert4bpp: + shl ax,4 + shr al,4 + push ax + movzx eax,ah + call converttable + add edi,3 + + add ebp,3 + + pop ax + movzx eax,al + call converttable + jmp convert2 + + convert1bpp: + mov ecx,eax + mov edx,7 + nextbit: + xor eax,eax + bt ecx,edx + jnc noaddelem + inc eax + noaddelem: + push edx + call converttable + pop edx + dec edx + js convert2 + add edi,3 + + add ebp,3 + + jmp nextbit + + converttable: + shl eax,2 + add eax,ebx + mov edx, dword [eax] +; mov dword [edi],edx + mov [ebp],edx + ret + +bmptoimg_data_area_count=bmptoimg_data_area_count+1 +if bmptoimg_data_area_count = 1 +; DATA AREA +bmptoimg_soi dd 0 +bmptoimg_data_area_bps dd 0 +bmptoimg_data_area_dwps dd 0 +bmptoimg_data_area_sop dd 0 +bmptoimg_data_area_eop dd 0 +bmptoimg_data_area_eos dd 0 +end if + +end_bmp: + mov eax,dword [bmp_load_area+18] + mov ebx,dword [bmp_load_area+22] + mov dword [img_dest_area],eax + mov dword [img_dest_area+4],ebx +} + +; For convert RGB to BGR +COLOR_ORDER equ MENUETOS + +macro giftoani gifsrc,imgsrc,num_of_frames +{ +local hasharea, ReadGIF, nextblock,_null +local globalColor, img_count, cur_info, img_start +local codesize, compsize, bit_count, CC, EOI, Palette +local block_ofs, table_ptr, gifmacend +local no_gc, block_skip, no_comm, noextblock, uselocal +local setPal, filltable, reinit, cycle, zadd, noinc +local notintable, er, zend, nxt, continue, ex, Gif_skipmap +local Gif_get_sym, shift, nextbl, noblock, loop1, exx +local Gif_output, next, loop2 + +_null = 0x1000 ; 0x1000 + +; jmp sss +; if defined gif_hash_offset +; else +; hasharea: +; times 4096 dd 0 ;4096 +; end if +;sss: + + mov esi,gifsrc ;Указатель на ГИФ фаил в памяти + mov edi,imgsrc ;Указатель на список картинок + + if defined gif_hash_offset + mov eax,gif_hash_offset ;Рабочая область минимум 4096*4 байт + else + mov eax,hasharea ;Рабочая область минимум 4096*4 байт + end if + + call ReadGIF + push ecx + pop dword num_of_frames + jmp gifmacend + + if defined gif_hash_offset + else + hasharea: + times 4096 dd 0 ;4096 + end if + +ReadGIF: + push esi edi + mov [table_ptr],eax + mov [cur_info],edi + xor eax,eax + mov [globalColor],eax + mov [img_count],eax + inc eax + cmp dword[esi],'GIF8' + jne er ; signature + mov ecx,[esi+0xa] + inc eax + add esi,0xd + mov edi,esi + bt ecx,7 + jnc nextblock + mov [globalColor],esi + call Gif_skipmap +nextblock: + cmp byte[edi],0x21 + jne noextblock + inc edi + cmp byte[edi],0xf9 ; Graphic Control Ext + jne no_gc + add edi,7 + jmp nextblock +no_gc: + cmp byte[edi],0xfe ; Comment Ext + jne no_comm + inc edi +block_skip: + movzx eax,byte[edi] + lea edi,[edi+eax+1] + cmp byte[edi],0 + jnz block_skip + inc edi + jmp nextblock +no_comm: + cmp byte[edi],0xff ; Application Ext + jne nextblock + add edi,13 + jmp block_skip +noextblock: + cmp byte[edi],0x2c ; image beginning + jne er + inc [img_count] + inc edi + mov esi,[cur_info] + xchg esi,edi + movsd + movsd + + push edi + movzx ecx,word[esi] + inc esi + bt ecx,7 + jc uselocal + push [globalColor] + mov edi,esi + jmp setPal +uselocal: + call Gif_skipmap + push esi +setPal: + movzx ecx,byte[edi] + inc ecx + mov [codesize],ecx + dec ecx + pop [Palette] + lea esi,[edi+1] + mov edi,[table_ptr] + xor eax,eax + cld + lodsb ; eax - block_count + add eax,esi + mov [block_ofs],eax + mov [bit_count],8 + mov eax,1 + shl eax,cl + mov [CC],eax + inc eax + mov [EOI],eax + lea ecx,[eax-1] + mov eax, _null shl 16 +filltable: + stosd + inc eax + loop filltable + pop edi + mov [img_start],edi +reinit: + mov edx,[EOI] + inc edx + push [codesize] + pop [compsize] + call Gif_get_sym + cmp eax,[CC] + je reinit + call Gif_output +cycle: + movzx ebx,ax + call Gif_get_sym + cmp eax,edx + jae notintable + cmp eax,[CC] + je reinit + cmp eax,[EOI] + je zend + call Gif_output +zadd: + push eax + mov eax,[table_ptr] + mov [eax+edx*4],ebx + pop eax + cmp edx,0xFFF + jae cycle + inc edx + bsr ebx,edx + cmp ebx,[compsize] + jne noinc + inc [compsize] +noinc: + jmp cycle +notintable: + push eax + mov eax,ebx + call Gif_output + push ebx + movzx eax,bx + call Gif_output + pop ebx eax + jmp zadd +er: + pop edi + jmp ex +zend: +; mov eax,[.cur_info] ; skip offset to next frame +; mov [eax],edi + mov [cur_info],edi + add esi,2 + xchg esi,edi +nxt: + cmp byte[edi],0 + jnz continue + inc edi + jmp nxt +continue: + cmp byte[edi],0x3b ;read next frame + jne nextblock + xor eax,eax + stosd + mov ecx,[img_count] +ex: + pop edi esi + ret + +Gif_skipmap: +; in: ecx - image descriptor, esi - pointer to colormap +; out: edi - pointer to area after colormap + + and ecx,111b + inc ecx ; color map size + mov ebx,1 + shl ebx,cl + lea ebx,[ebx*2+ebx] + lea edi,[esi+ebx] + ret + +Gif_get_sym: + mov ecx,[compsize] + push ecx + xor eax,eax +shift: + ror byte[esi],1 + rcr eax,1 + dec [bit_count] + jnz loop1 + inc esi + cmp esi,[block_ofs] + jb noblock + push eax + xor eax,eax + lodsb + test eax,eax + jnz nextbl + mov eax,[EOI] + sub esi,2 + add esp,8 + jmp exx +nextbl: + add eax,esi + mov [block_ofs],eax + pop eax +noblock: + mov [bit_count],8 +loop1: + loop shift + pop ecx + rol eax,cl +exx: + xor ecx,ecx + ret + +Gif_output: + push esi eax edx + mov edx,[table_ptr] +next: + push word[edx+eax*4] + mov ax,word[edx+eax*4+2] + inc ecx + cmp ax,_null + jnz next + shl ebx,16 + mov bx,[esp] +loop2: + pop ax + + lea esi,[eax+eax*2] + add esi,[Palette] + + if COLOR_ORDER eq MENUETOS + mov esi,[esi] + bswap esi + shr esi,8 + mov [edi],esi + add edi,3 + else + movsw + movsb + end if + + loop loop2 + pop edx eax esi + ret + + globalColor dd 1 + img_count dd 1 + cur_info dd 1 ; image table pointer + img_start dd 1 + codesize dd 1 + compsize dd 1 + bit_count dd 1 + CC dd 1 + EOI dd 1 + Palette dd 1 + block_ofs dd 1 + table_ptr dd 1 + +gifmacend: +} + + + +macro giftoimg gifsrc,imgsrc +{ +local hasharea, ReadGIF, nextblock,_null +local globalColor, img_count, cur_info, img_start +local codesize, compsize, bit_count, CC, EOI, Palette +local block_ofs, table_ptr, gifmacend +local no_gc, block_skip, no_comm, noextblock, uselocal +local setPal, filltable, reinit, cycle, zadd, noinc +local notintable, er, zend, nxt, continue, ex, Gif_skipmap +local Gif_get_sym, shift, nextbl, noblock, loop1, exx +local Gif_output, next, loop2 + +_null fix 0x1000 ; 0x1000 + + mov esi,gifsrc ;Указатель на ГИФ фаил в памяти + mov edi,imgsrc ;Указатель на список картинок + + if defined gif_hash_offset + mov eax,gif_hash_offset ;Рабочая область минимум 4096*4 байт + else + mov eax,hasharea ;Рабочая область минимум 4096*4 байт + end if + + call ReadGIF + jmp gifmacend + + if defined gif_hash_offset + else + hasharea: + times 4096 dd 0 ;4096 + end if + +ReadGIF: + push esi edi + mov [table_ptr],eax + mov [cur_info],edi + xor eax,eax + mov [globalColor],eax + mov [img_count],eax + inc eax + cmp dword[esi],'GIF8' + jne er ; signature + mov ecx,[esi+0xa] + inc eax + add esi,0xd + mov edi,esi + bt ecx,7 + jnc nextblock + mov [globalColor],esi + call Gif_skipmap +nextblock: + cmp byte[edi],0x21 + jne noextblock + inc edi + cmp byte[edi],0xf9 ; Graphic Control Ext + jne no_gc + add edi,7 + jmp nextblock +no_gc: + cmp byte[edi],0xfe ; Comment Ext + jne no_comm + inc edi +block_skip: + movzx eax,byte[edi] + lea edi,[edi+eax+1] + cmp byte[edi],0 + jnz block_skip + inc edi + jmp nextblock +no_comm: + cmp byte[edi],0xff ; Application Ext + jne nextblock + add edi,13 + jmp block_skip +noextblock: + cmp byte[edi],0x2c ; image beginning + jne er + inc [img_count] + inc edi + mov esi,[cur_info] + xchg esi,edi +; movsd +; movsd + + mov bp,word[esi+4] + movzx ebx,bp + mov [edi],ebx + + mov bp,word[esi+6] + movzx ebx,bp + mov [edi+4],ebx + + add edi,8 + add esi,8 + + push edi + movzx ecx,word[esi] + inc esi + bt ecx,7 + jc uselocal + push [globalColor] + mov edi,esi + jmp setPal +uselocal: + call Gif_skipmap + push esi +setPal: + movzx ecx,byte[edi] + inc ecx + mov [codesize],ecx + dec ecx + pop [Palette] + lea esi,[edi+1] + mov edi,[table_ptr] + xor eax,eax + cld + lodsb ; eax - block_count + add eax,esi + mov [block_ofs],eax + mov [bit_count],8 + mov eax,1 + shl eax,cl + mov [CC],eax + inc eax + mov [EOI],eax + lea ecx,[eax-1] + mov eax, _null shl 16 +filltable: + stosd + inc eax + loop filltable + pop edi + mov [img_start],edi +reinit: + mov edx,[EOI] + inc edx + push [codesize] + pop [compsize] + call Gif_get_sym + cmp eax,[CC] + je reinit + call Gif_output +cycle: + movzx ebx,ax + call Gif_get_sym + cmp eax,edx + jae notintable + cmp eax,[CC] + je reinit + cmp eax,[EOI] + je zend + call Gif_output +zadd: + push eax + mov eax,[table_ptr] + mov [eax+edx*4],ebx + pop eax + cmp edx,0xFFF + jae cycle + inc edx + bsr ebx,edx + cmp ebx,[compsize] + jne noinc + inc [compsize] +noinc: + jmp cycle +notintable: + push eax + mov eax,ebx + call Gif_output + push ebx + movzx eax,bx + call Gif_output + pop ebx eax + jmp zadd +er: + pop edi + jmp ex +zend: +; mov eax,[.cur_info] ; skip offset to next frame +; mov [eax],edi + mov [cur_info],edi + add esi,2 + xchg esi,edi +nxt: + cmp byte[edi],0 + jnz continue + inc edi + jmp nxt +continue: +; cmp byte[edi],0x3b ;read next frame +; jne nextblock + xor eax,eax + stosd + mov ecx,[img_count] +ex: + pop edi esi + ret + +Gif_skipmap: +; in: ecx - image descriptor, esi - pointer to colormap +; out: edi - pointer to area after colormap + + and ecx,111b + inc ecx ; color map size + mov ebx,1 + shl ebx,cl + lea ebx,[ebx*2+ebx] + lea edi,[esi+ebx] + ret + +Gif_get_sym: + mov ecx,[compsize] + push ecx + xor eax,eax +shift: + ror byte[esi],1 + rcr eax,1 + dec [bit_count] + jnz loop1 + inc esi + cmp esi,[block_ofs] + jb noblock + push eax + xor eax,eax + lodsb + test eax,eax + jnz nextbl + mov eax,[EOI] + sub esi,2 + add esp,8 + jmp exx +nextbl: + add eax,esi + mov [block_ofs],eax + pop eax +noblock: + mov [bit_count],8 +loop1: + loop shift + pop ecx + rol eax,cl +exx: + xor ecx,ecx + ret + +Gif_output: + push esi eax edx + mov edx,[table_ptr] +next: + push word[edx+eax*4] + mov ax,word[edx+eax*4+2] + inc ecx + cmp ax,_null + jnz next + shl ebx,16 + mov bx,[esp] +loop2: + pop ax + + lea esi,[eax+eax*2] + add esi,[Palette] + + if COLOR_ORDER eq MENUETOS + mov esi,[esi] + bswap esi + shr esi,8 + mov [edi],esi + add edi,3 + else + movsw + movsb + end if + + loop loop2 + pop edx eax esi + ret + + globalColor dd 1 + img_count dd 1 + cur_info dd 1 ; image table pointer + img_start dd 1 + codesize dd 1 + compsize dd 1 + bit_count dd 1 + CC dd 1 + EOI dd 1 + Palette dd 1 + block_ofs dd 1 + table_ptr dd 1 + +gifmacend: +} + diff --git a/programs/games/almaz/ASCL.INC b/programs/games/almaz/ASCL.INC new file mode 100644 index 0000000000..f5a3cf2db3 --- /dev/null +++ b/programs/games/almaz/ASCL.INC @@ -0,0 +1,835 @@ +lang equ ru ; ru en fr ge fi + +; +; Assembler +; SMALL +; CODE +; Libary +; +; Ver 0.14 By Pavlushin Evgeni (RUSSIA) +; www.waptap@mail.ru + +;Please compile aplications on FASM ver1.54 or higer!!! + +;InfoList +;0.01 scank,putpix,puttxt +;0.02 label,random,colors +;0.03 window,startwd,endwd,attributes +;0.04 close,delay,scevent ~30.04.2004 +;0.05 small random, ~04.05.2004 +;0.06 wtevent ~09.05.2004 +;0.07 timeevent ~23.05.2004 +;0.08 txtput ~14.06.2004 +;0.09 opendialog,savedialog ~20.06.2004 +;0.10 wordstoreg by halyavin, add at ~30.08.2004 +; random bug deleted eax is use. +;0.11 loadfile from me +puttxt bug del ~07.09.2004 +;0.12 open/save dialog ~13.09.2004 +;0.13 dialogs bugs deleted +;0.14 drawlbut ~03.10.2004 + +; LOADFILE +; (SYNTAX) LOADFILE 'full_path_to_file',file_load_area,file_temp_area +; (SAMPLE) LOADFILE '/rd/1/clock.bmp',load_area,temp_area + +macro loadfile file_name,file_load_area,file_temp_area +{ +local open,fileinfo,string + jmp open +fileinfo: + dd 0 + dd 0 + dd 1 + dd file_load_area + dd file_temp_area +string: + db file_name,0 +open: + mov dword [fileinfo+8],1 ; how many blocks to read (1) + mov eax,58 + mov ebx,fileinfo + int 0x40 + mov eax,[file_load_area+2] + shr eax,9 ; поделим на 512 и прибавим 1 - получим число блоков + inc eax + mov dword [fileinfo+8],eax + mov eax,58 + mov ebx,fileinfo + int 0x40 +} + + +macro wordstoreg reg,hiword,loword +{ +if hiword eqtype 0 & loword eqtype 0 + mov reg,hiword*65536+loword +else if hiword eqtype 12 & loword eqtype eax + mov reg,hiword*65536 + add reg,loword +else if hiword eqtype 12 & loword eqtype [123] + mov reg,hiword*65536 + add reg,loword +else + mov reg,hiword + shl reg,16 + add reg,loword +end if +} + + +; DRAW BUTTON with label + +macro drawlbut x,y,xs,ys,text,id,bcolor,tcolor +{ +local asd,lab + jmp asd +lab db text ;arg label +asd: + wordstoreg ebx,x,xs + wordstoreg ecx,y,ys + mov edx,id + mov esi,bcolor + mov eax,8 + int 0x40 + + mov eax,asd-lab ;calc size + mov ebx,6 + mul ebx + mov esi,eax + + mov eax,xs + sub eax,esi + shr eax,1 + add eax,x + + mov edx,ys + sub edx,7 + shr edx,1 + add edx,y + + mov ebx,eax + shl ebx,16 + add ebx,edx + + mov ecx,tcolor ;arg4 color + mov edx,lab + mov esi,asd-lab ;calc size + mov eax,4 + int 0x40 +} + + +macro opendialog redproc,openoff,erroff,path +{ +local new_d, get_loops, dlg_pid_get, DLGPID, num_of_proc +local run_fileinfo, param +local getmesloop, loox, mred, mkey, mbutton, mgetmes +local dlg_is_work, ready, procinfo +; +; STEP 1 Run SYSXTREE with parametrs MYPID 4 bytes in dec, +; 1 byte space, 1 byte type of dialog (O - Open ,S - Save) +; + + cld +;; mov esi,path + mov edi,path + mov eax,0 + mov ecx,200 + rep stosb + +;mov [get_loops],0 +mov [dlg_pid_get],0 + +; Get my PID in dec format 4 bytes + mov eax,9 + mov ebx,procinfo + mov ecx,-1 + int 0x40 + +; convert eax bin to param dec + mov eax,dword [procinfo+30] ;offset of myPID + mov edi,param+4-1 ;offset to 4 bytes + mov ecx,4 + mov ebx,10 + cld +new_d: + xor edx,edx + div ebx + add dl,'0' + mov [edi],dl + dec edi + loop new_d + +; wirite 1 byte space to param + mov [param+4],byte 32 ;Space for next parametr +; and 1 byte type of dialog to param + mov [param+5],byte 'O' ;Get Open dialog (Use 'S' for Save dialog) + +; +; STEP2 prepare IPC area for get messages +; + +; prepare IPC area + mov [path],dword 0 + mov [path+4],dword 8 + +; define IPC memory + mov eax,60 + mov ebx,1 ; define IPC + mov ecx,path ; offset of area + mov edx,150 ; size 150 bytes + int 0x40 + +; change wanted events list 7-bit IPC event + mov eax,40 + mov ebx,01000111b + int 0x40 + +; +; STEP 3 run SYSTEM XTREE with parameters +; + + mov eax,58 + mov ebx,run_fileinfo + int 0x40 + + call redproc + + mov [get_loops],0 +getmesloop: + mov eax,23 + mov ebx,50 ;0.5 sec + int 0x40 + + cmp eax,1 + je mred + cmp eax,2 + je mkey + cmp eax,3 + je mbutton + cmp eax,7 + je mgetmes + +; Get number of procces + mov ebx,procinfo + mov ecx,-1 + mov eax,9 + int 0x40 + mov ebp,eax + +loox: + mov eax,9 + mov ebx,procinfo + mov ecx,ebp + int 0x40 + mov eax,[DLGPID] + cmp [procinfo+30],eax ;IF Dialog find + je dlg_is_work ;jmp to dlg_is_work + dec ebp + jnz loox + + jmp erroff + +dlg_is_work: + cmp [procinfo+50],word 9 ;If slot state 9 - dialog is terminated + je erroff ;TESTODP2 terminated too + + cmp [dlg_pid_get],dword 1 + je getmesloop + inc [get_loops] + cmp [get_loops],4 ;2 sec if DLG_PID not get, TESTOP2 terminated + jae erroff + jmp getmesloop + +mred: + call redproc + jmp getmesloop +mkey: + mov eax,2 + int 0x40 ; read (eax=2) + jmp getmesloop +mbutton: + mov eax,17 ; get id + int 0x40 + cmp ah,1 ; button id=1 ? + jne getmesloop + mov eax,-1 ; close this program + int 0x40 +mgetmes: + +; If dlg_pid_get then second message get jmp to still + cmp [dlg_pid_get],dword 1 + je ready + +; First message is number of PID SYSXTREE dialog + +; convert PID dec to PID bin + movzx eax,byte [path+16] + sub eax,48 + imul eax,10 + movzx ebx,byte [path+16+1] + add eax,ebx + sub eax,48 + imul eax,10 + movzx ebx,byte [path+16+2] + add eax,ebx + sub eax,48 + imul eax,10 + movzx ebx,byte [path+16+3] + add eax,ebx + sub eax,48 + mov [DLGPID],eax + +; Claear and prepare IPC area for next message + mov [path],dword 0 + mov [path+4],dword 8 + mov [path+8],dword 0 + mov [path+12],dword 0 + mov [path+16],dword 0 + +; Set dlg_pid_get for get next message + mov [dlg_pid_get],dword 1 + call redproc ;show DLG_PID + jmp getmesloop + +ready: +; +; The second message get +; Second message is 100 bytes path to SAVE/OPEN file +; shl path string on 16 bytes +; + cld + mov esi,path+16 + mov edi,path + mov ecx,200 + rep movsb + mov [edi],byte 0 + + jmp openoff + + +; DATA AREA +get_loops dd 0 +dlg_pid_get dd 0 +DLGPID dd 0 + +param: + dd 0 ; My dec PID + dd 0,0 ; Type of dialog + +run_fileinfo: + dd 16 + dd 0 + dd param + dd 0 + dd procinfo ; 0x10000 +;run_filepath + db '/RD/1/SYSXTREE',0 + +procinfo: +times 256 db 0 +} + + +macro savedialog redproc,openoff,erroff,path +{ +local new_d, get_loops, dlg_pid_get, DLGPID, num_of_proc +local run_fileinfo, run_filepath, param +local getmesloop, loox, mred, mkey, mbutton, mgetmes +local dlg_is_work, ready, procinfo +; +; STEP 1 Run SYSXTREE with parametrs MYPID 4 bytes in dec, +; 1 byte space, 1 byte type of dialog (O - Open ,S - Save) +; + + cld +;; mov esi,path + mov edi,path + mov eax,0 + mov ecx,200 + rep stosb + +;mov [get_loops],0 +mov [dlg_pid_get],0 + +; Get my PID in dec format 4 bytes + mov eax,9 + mov ebx,procinfo + mov ecx,-1 + int 0x40 + +; convert eax bin to param dec + mov eax,dword [procinfo+30] ;offset of myPID + mov edi,param+4-1 ;offset to 4 bytes + mov ecx,4 + mov ebx,10 + cld +new_d: + xor edx,edx + div ebx + add dl,'0' + mov [edi],dl + dec edi + loop new_d + +; wirite 1 byte space to param + mov [param+4],byte 32 ;Space for next parametr +; and 1 byte type of dialog to param + mov [param+5],byte 'S' ;Get Open dialog (Use 'S' for Save dialog) + +; +; STEP2 prepare IPC area for get messages +; + +; prepare IPC area + mov [path],dword 0 + mov [path+4],dword 8 + +; define IPC memory + mov eax,60 + mov ebx,1 ; define IPC + mov ecx,path ; offset of area + mov edx,120 ; size 150 bytes + int 0x40 + +; change wanted events list 7-bit IPC event + mov eax,40 + mov ebx,01000111b + int 0x40 + +; +; STEP 3 run SYSTEM XTREE with parameters +; + + mov eax,58 + mov ebx,run_fileinfo + int 0x40 + + call redproc + + mov [get_loops],0 +getmesloop: + mov eax,23 + mov ebx,50 ;0.5 sec + int 0x40 + + cmp eax,1 + je mred + cmp eax,2 + je mkey + cmp eax,3 + je mbutton + cmp eax,7 + je mgetmes + +; Get number of procces + mov ebx,procinfo + mov ecx,-1 + mov eax,9 + int 0x40 + mov ebp,eax + +loox: + mov eax,9 + mov ebx,procinfo + mov ecx,ebp + int 0x40 + mov eax,[DLGPID] + cmp [procinfo+30],eax ;IF Dialog find + je dlg_is_work ;jmp to dlg_is_work + dec ebp + jnz loox + + jmp erroff + +dlg_is_work: + cmp [procinfo+50],word 9 ;If slot state 9 - dialog is terminated + je erroff ;TESTODP2 terminated too + + cmp [dlg_pid_get],dword 1 + je getmesloop + inc [get_loops] + cmp [get_loops],4 ;2 sec if DLG_PID not get, TESTOP2 terminated + jae erroff + jmp getmesloop + +mred: + call redproc + jmp getmesloop +mkey: + int 0x40 ; read (eax=2) + jmp getmesloop +mbutton: + mov eax,17 ; get id + int 0x40 + cmp ah,1 ; button id=1 ? + jne getmesloop + mov eax,-1 ; close this program + int 0x40 +mgetmes: + +; If dlg_pid_get then second message get jmp to still + cmp [dlg_pid_get],dword 1 + je ready + +; First message is number of PID SYSXTREE dialog + +; convert PID dec to PID bin + movzx eax,byte [path+16] + sub eax,48 + imul eax,10 + movzx ebx,byte [path+16+1] + add eax,ebx + sub eax,48 + imul eax,10 + movzx ebx,byte [path+16+2] + add eax,ebx + sub eax,48 + imul eax,10 + movzx ebx,byte [path+16+3] + add eax,ebx + sub eax,48 + mov [DLGPID],eax + +; Claear and prepare IPC area for next message + mov [path],dword 0 + mov [path+4],dword 8 + mov [path+8],dword 0 + mov [path+12],dword 0 + mov [path+16],dword 0 + +; Set dlg_pid_get for get next message + mov [dlg_pid_get],dword 1 + call redproc ;show DLG_PID + jmp getmesloop + +ready: +; +; The second message get +; Second message is 100 bytes path to SAVE/OPEN file +; shl path string on 16 bytes +; + cld + mov esi,path+16 + mov edi,path + mov ecx,200 + rep movsb + mov [edi],byte 0 + + jmp openoff + + +; DATA AREA +get_loops dd 0 +dlg_pid_get dd 0 +DLGPID dd 0 + +param: + rb 4 ; My dec PID + rb 6 ; Type of dialog + +run_fileinfo: + dd 16 + dd 0 + dd param + dd 0 + dd procinfo +run_filepath: + db '/RD/1/SYSXTREE',0 + +procinfo: +times 256 db 0 +} + + + + +; RANDOM - generate random count (small) +; (SYNTAX) RANDOM MaxCount,OutArgument +; (SAMPLE) RANDOM 10000,eax +; ( NOTE ) Maxint<65536 ; use random 65536,eax for more combinations + +randomuse = 0 + +macro random arg1,arg2 +{ +local rxproc +randomuse = randomuse + 1 + + jmp rxproc + +if defined randomuse & randomuse = 1 +randomproc: + jmp rnj +rsx1 dw 0x4321 +rsx2 dw 0x1234 +rnj: +; mov eax,arg1 + push bx + push cx + push dx + push si + push di + mov cx,ax + mov ax,word ptr rsx1 + mov bx,word ptr rsx2 + mov si,ax + mov di,bx + mov dl,ah + mov ah,al + mov al,bh + mov bh,bl + xor bl,bl + rcr dl,1 + rcr ax,1 + rcr bx,1 + add bx,di + adc ax,si + add bx,0x62e9 + adc ax,0x3619 + mov word ptr rsx1,bx + mov word ptr rsx2,ax + xor dx,dx + cmp ax,0 + je nodiv + cmp cx,0 + je nodiv + div cx +nodiv: + mov ax,dx + pop di + pop si + pop dx + pop cx + pop bx + and eax,0000ffffh +; mov arg2,0 +; mov arg2,eax + ret +end if + +rxproc: + mov eax,arg1 + call randomproc + mov arg2,eax +} + +macro scank +{ + mov eax,10 + int 0x40 +} + +macro putpix x,y,color +{ + mov ebx,x + mov ecx,y + mov edx,color + mov eax,1 + int 0x40 +} + +macro puttxt x,y,offs,size,color +{ +; mov ebx,x +; shl ebx,16 +; add ebx,y + wordstoreg ebx,x,y + mov ecx,color + mov edx,offs + mov esi,size + mov eax,4 + int 0x40 +} + +macro outcount data, x, y, color, numtype +{ + mov ecx,data + mov ebx,numtype + mov bl,0 +; mov edx,x*65536+y + wordstoreg edx,x,y + mov esi,color + mov eax,47 + int 0x40 +} + +; SCEVENT - Scan event + +macro scevent red,key,but +{ + mov eax,11 + int 0x40 + dec eax + jz red + dec eax + jz key + dec eax + jz but +} + +; WTEVENT - Wait event + +macro wtevent red,key,but +{ + mov eax,10 + int 0x40 + dec eax + jz red + dec eax + jz key + dec eax + jz but +} + +; TIMEEVENT - Wite for event with timeout + +macro timeevent xfps,noevent,red,key,but +{ + mov eax,23 + mov ebx,xfps + int 0x40 + cmp eax,0 + je noevent + dec eax + jz red + dec eax + jz key + dec eax + jz but +} + + +; CLOSE - Close program + +macro close +{ + mov eax,-1 + int 0x40 +} + +; DELAY - Create delay 1/100 sec +; (SYNTAX) Delay time +; (SAMPLE) Delay 100 ;delay 2 sec 1/100*200=2 sec + +macro delay arg1 +{ + mov eax,5 + mov ebx,arg1 + int 0x40 +} + +; WINDOW - Draw window +; (SYNTAX) WINDOW Xstart,Ystart,'Text',Color +; (SAMPLE) WINDOW 10,10,640+8,480+24,window_Skinned + +macro window arg1,arg2,arg3,arg4,arg5 +{ +; mov ebx,arg1*65536+arg3 +; mov ecx,arg2*65536+arg4 + wordstoreg ebx,arg1,arg3 + wordstoreg ecx,arg2,arg4 + mov edx,arg5 + mov eax,0 + int 0x40 +} + +macro colorwindow arg1,arg2,arg3,arg4,arg5,arg6,arg7 +{ + mov ebx,arg1*65536+arg3 + mov ecx,arg2*65536+arg4 + mov edx,arg5 + mov esi,arg6 + mov edi,arg7 + mov eax,0 + int 0x40 +} + + +; STARTWD - Start of window draw + +macro startwd +{ + mov eax,12 + mov ebx,1 + int 0x40 +} + +; ENDWD - End window draw + +macro endwd +{ + mov eax,12 + mov ebx,2 + int 0x40 +} + +; LABEL - Put text to frame +; (SYNTAX) LABEL Xstart,Ystart,'Text',Color +; (SAMPLE) LABEL 10,12,'Hello World!',cl_Green+font_Big + +macro label arg1,arg2,arg3,arg4 +{ +local asd,lab + jmp asd +lab db arg3 ;arg label +asd: +; mov ebx,arg1 ;arg1=y arg2=x +; shl ebx,16 +; add ebx,arg2 + wordstoreg ebx,arg1,arg2 + mov ecx,arg4 ;arg4 color + mov edx,lab + mov esi,asd-lab ;calc size + mov eax,4 + int 0x40 +} + +;Key's +key_Up equ 178 +key_Down equ 177 +key_Right equ 179 +key_Left equ 176 +key_Esc equ 27 +key_Space equ 32 +key_Enter equ 13 +key_Bspace equ 8 +key_F1 equ 50 +key_F2 equ 51 +key_F3 equ 52 +key_F4 equ 53 +key_F5 equ 54 +key_F6 equ 55 +key_F7 equ 56 +key_F8 equ 57 +key_F9 equ 48 +key_F10 equ 49 +key_F11 equ 68 +key_F12 equ 255 +key_Home equ 180 +key_End equ 181 +key_PgUp equ 184 +key_PgDown equ 183 + +;Attributes + +;Window Attributes +window_Skinned equ 0x03000000 +window_Type2 equ 0x02000000 +window_Type1 equ 0x00000000 +window_Reserve equ 0x01000000 + +;Font Attributes +font_Big equ 0x10000000 + +;Colors +cl_White equ 0x00ffffff +cl_Black equ 0x00000000 +cl_Grey equ 0x00888888 +cl_Red equ 0x00ff0000 +cl_Lime equ 0x0000ff00 +cl_Green equ 0x0000af00 +cl_Blue equ 0x000000ff +cl_Purple equ 0x008080ff +cl_Violet equ 0x008040ff +cl_Cyan equ 0x0040e0ff diff --git a/programs/games/almaz/BULLET.BMP b/programs/games/almaz/BULLET.BMP new file mode 100644 index 0000000000000000000000000000000000000000..cc52acd53bc14fc234863f340f7be9c68b92256e GIT binary patch literal 150 zcmZ?royGtGW-0#lXa%_@CR)H6+;CF~HSG&w!bcfq_8>h=GbY7#0EP q|3Cx+K=Knv91NJnHJEsIDX_2|mY5vrv_Wpp_s-C7CVdka7_0$aAQ|fb literal 0 HcmV?d00001 diff --git a/programs/games/almaz/ENEMY.GIF b/programs/games/almaz/ENEMY.GIF new file mode 100644 index 0000000000000000000000000000000000000000..f4776fd5cc7f81fd23f1b355587550968db2572c GIT binary patch literal 763 zcmZ?wbhEHbRA5kGP-0+E{K>-0#lXa%_@CR)H6+;CF~HSG&w!bc0VstjqyrQN>Qi7? z#Lxg@{s(~uhW{Wo1TfFi*d_Dt!bZ=l%of>yUX?^^c*QBqOHN(1Myw`x&faM`%wJwL zz1X_fs;}AM!P|~~kpfL7kJ^qt`CL{U6nX7+=XZ$;W@dK_9AcS6N;-#P6`+4@JO z|HebR#kbGpzy4BJD_H2|mD*J9+0fBb@7>#EZ9So8(&Q;Y!P84SXGT`nw%9uwSJYG} zFOi-T8?h=%F>=G=&Fi+>&e+Mw3HK}!-l(O_8`GB-g$KRAZmQwT_Iz{Yc1`}Acku$B z_g%f2`zluQ*6}~VQM$2B6|K?5?QLB}J<6SZEnSn^r?gIM5}Y-A&TNugT1TWy`C1$} zcsU(o41^T)`fVP*6`Q+l)wO$E*-tBXn#G$MAiGrP1JI>!U)Gx4KmNxn(l7z&QuUVh z#xCXJp6>p(i9wTVrcRsguO@xXFIg-0#lXa%_@CR)H6+;CF~HSG&w!bc0VqY3kPc8K&?p6l zMGOrf=6?`qVE7MWLjdzEja@STE^PF?%50JS=T%9xhF6@zyyVnHYs6}D=j@%9!~Eq{ z(~GTpt@@fB9=z??7b(zW@~G|Tlh0+vL6O&9cYc?sU}ko=;1O%ye-0#lXa%_@CR)H6+;CF~HSG&w!bcfq_8>h=Ga}7#1-! zfSCV5pn>5(hz$YEwHmu*{$1GUd6n5B`_HSAXbrD8g?Y)Ti`IzMdSn(I=nFii0Arz3!a8v?x62{dH3fXSU~?E4OR%=e&y-_`L7x v&D>Y9lDCfk369c@ZK`OEE^cq@D(X@0>}%h%dGFSruxr9*f literal 0 HcmV?d00001 diff --git a/programs/games/almaz/EXPLODE1.GIF b/programs/games/almaz/EXPLODE1.GIF new file mode 100644 index 0000000000000000000000000000000000000000..d4a74a9f3bc995d484c4ad0655eb94d3f4c15847 GIT binary patch literal 4865 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 literal 0 HcmV?d00001 diff --git a/programs/games/almaz/KIRPICH2.BMP b/programs/games/almaz/KIRPICH2.BMP new file mode 100644 index 0000000000000000000000000000000000000000..00200d964dadbd11c3ec3faa49fe545d1cd27716 GIT binary patch literal 3126 zcmZ?rHRE9b12Z700mKSW%*Y@CWB~zG9>Rf;5i|x23=O0rWEYXDmpJwRAyyEhm|N-; zNr-{rKM*0CPm*?mibu`IA4H?!Ga5d~Apl7aq>{+_msGt3)uWbgpyC1#LRLH!*;vb1 zWRGA~K(Qc72~3G;$Y}|}hC~*`3lNhr)lecbYCitZ8x5b)@WCGf$g;SKR^!s$VSnE4FG`am7o9s literal 0 HcmV?d00001 diff --git a/programs/games/almaz/KIRPICH22.BMP b/programs/games/almaz/KIRPICH22.BMP new file mode 100644 index 0000000000000000000000000000000000000000..ab33b06030ead4df70bb087197883c3b77fa3672 GIT binary patch literal 3126 zcmZ?rHRE9b12Z700mKSW%*Y@CWB~zG9>Rf;KWPboRsfA}pc#Oh5AnpKM~^7C3fU-R z^G}^R1>{o2e7I3?^MNi0vVnkd^O21L8c3h;M|L*YALJ02PQ~hepdhk!#Ir}u#~)Us z;WHXOzz`VCU+`owTK>R;0>~IGACN->lTBp!0F{vq&@9E8KGD=r!iAd;aqwvS3K*F5 LZ(jjpfp!1@>yrpl literal 0 HcmV?d00001 diff --git a/programs/games/almaz/LESTNICA.BMP b/programs/games/almaz/LESTNICA.BMP new file mode 100644 index 0000000000000000000000000000000000000000..eaea62f38e775a53a6ff888bb0fe4c8f0c47b7b0 GIT binary patch literal 3126 zcmeHJF%H8Z40QKCpkqc}kh$vKA?k;CP2a)OdSGOe-~rJ_tr`#@$H0Nl2g>a}pDC3Y zy+fOFJJAIeN*?DA?!EW)c;@OBatl0tg{G?sWjZ^yF!5_ALg=q+Dk3<_#`!^fq7Z`O z%SP`T>5u>i&->wX5*2@~A7+ow(3ox$%5=uKQg#lGKlHEiC~wUV=)Y0(GObP}4{3nw z`y~q-jlaaNgX(|$L9a+CQ60g@`!Af7Mj^!wX`)7E@8It<*w~eyp?{^f(&u;of8-)G T8g(jpp$1r7x<<@$nu-4c@~r_; literal 0 HcmV?d00001 diff --git a/programs/games/almaz/OLD1234.BMP b/programs/games/almaz/OLD1234.BMP new file mode 100644 index 0000000000000000000000000000000000000000..0088304ed75b8a891b9d99a070cb17d5183a0f33 GIT binary patch literal 3126 zcmeHGF%Ezr48+|BI5PSIXXEald>T))iUZA&BZLwc8X?eY4s*R8=Qg`HHrZEM{#%n< zH9D%a>6#UPCZg2E6 wuSb+fn$?rk*FuAzD`uik!T;!I^gPdW@O(;%j%~@{yzmxOp(gzzFaE-R12@p=Q2+n{ literal 0 HcmV?d00001 diff --git a/programs/games/almaz/OLDKIRPICH.BMP b/programs/games/almaz/OLDKIRPICH.BMP new file mode 100644 index 0000000000000000000000000000000000000000..0088304ed75b8a891b9d99a070cb17d5183a0f33 GIT binary patch literal 3126 zcmeHGF%Ezr48+|BI5PSIXXEald>T))iUZA&BZLwc8X?eY4s*R8=Qg`HHrZEM{#%n< zH9D%a>6#UPCZg2E6 wuSb+fn$?rk*FuAzD`uik!T;!I^gPdW@O(;%j%~@{yzmxOp(gzzFaE-R12@p=Q2+n{ literal 0 HcmV?d00001 diff --git a/programs/games/almaz/WATER1.BMP b/programs/games/almaz/WATER1.BMP new file mode 100644 index 0000000000000000000000000000000000000000..87f0887c45df7d2a7d2b567a41fdfb89be3975cd GIT binary patch literal 3126 zcmZ?rHRE9b12Z700mKSW%*Y@CWB~zC{sXCKf MHyPPRh)Oi|05OUAC;$Ke literal 0 HcmV?d00001 diff --git a/programs/games/almaz/almaz1.bmp b/programs/games/almaz/almaz1.bmp new file mode 100644 index 0000000000000000000000000000000000000000..8dda9a0c145884dc2864a7cc116c925cadee2bf9 GIT binary patch literal 3126 zcmeH`%Nc_p5QND+1$fLc6<9#-_GA+l=OI1V0gf47LWqFowtUM93jge`@EZEN`m`SY ziT*JCraFw!%y&-cbwR_*f>n)6TrhV3Xa^TO9o!}hxSFPG(n;WNz_o_NcwXWg-1F!8 zR2CWdj^8YC2xp1FZ;;5teefZ_O5!Ix%P*9uf=4OTN@$H}BQqzHWO|&^$PTZZ%Oc_9 z*oP9^&s~o|AOR+`z<@>xkEKL8oC)qF9Nb8_m}?`?R4?ME)6713EftUoNCl(< JQh~o!UFtr5yC7ocU x;lwodBy_?Q(pdObI5XHv2%HX30;kgluZk>a^|rd<2i^hifOo(<;2pTQ17C7~0G$8; literal 0 HcmV?d00001 diff --git a/programs/games/almaz/almaz3.bmp b/programs/games/almaz/almaz3.bmp new file mode 100644 index 0000000000000000000000000000000000000000..c3dbe329a953d3346e1305412932a42af229587c GIT binary patch literal 3126 zcmeH`!4ZQX5Jk;B1>~4xDzJdu(^HzTI1lN;4&v9(?l^$L5_4N-#TDWG85TOojm)L7XFzgM*BK#OKHAQ}{Rn zyXCh_WZ^k}i$n<{9 literal 0 HcmV?d00001 diff --git a/programs/games/almaz/aniall.gif b/programs/games/almaz/aniall.gif new file mode 100644 index 0000000000000000000000000000000000000000..367424b374e90671840511c709f2b89b78bf33fd GIT binary patch literal 4248 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.inc +@fasm ALMAZ.asm ALMAZ +@erase lang.inc +@kpack ALMAZ +@pause \ No newline at end of file diff --git a/programs/games/almaz/ded1.bmp b/programs/games/almaz/ded1.bmp new file mode 100644 index 0000000000000000000000000000000000000000..019686a66fce161f5596f2885ef3b912f229f57e GIT binary patch literal 602166 zcmeI5G4dcgPKSq(;sO*WAS5E*BBwYE3E>nG85sv4CgcEQRFQK7?y>aSUW~_*-Ll;+ z%iZ6r|J$quSv&J~w%*_T?O*@ZpZ@smufIP2{>$U<|M-*h??3tR=f9bM{P^Sd zb94UZ&mTYdfdB*`009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;| zfB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U< z00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa z0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV= z5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHaf zKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_ z009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=b^^cu^)LHDJRtx92z;5que0;_Uq(Ug z5P$##x(F~oyKvzQ0SG|gBv1^`V+$DwKmY;|xFo>vyhMZp1Rwwbl>qZo#exw65P-lX z0p{l=A{-z90SHI}3{S}f3j`nl0Sf`v;k)kSh^EQSv@VjiD*!%F{l ze7-`!jeu;<+;Y2&Ja}3UXGsyp7M8qfWXr+Br}wPtpNz(&$t@kMEs|$#p&qO`+wEOp zyPWMB@PxoE1l0b_jkjb;LGs9HoxXN0((#$aWkxml<*C!5_pIul8;yAz*}J0U&S~AH zL3K`{@`dVo7;~Srt~q0efHQ&Ala0lVlGH2%@zpqE#&&i!X8TC`+Iv>@FN`Vp<)Sz! zw__15PhC1lC5NSUs>`_+1Um$L2t3`cx5QV2B%=x{eN`9gk<-}gpNE<`d&GI-co8#K zE7yhdxs`6cmaeeUxi=mD5bz`*JNB^LCE%9eYLL^|)>%8)IHewG_~)Ny&Yp4RBQ)Y1 z!E?28eOLA(a#vXCTts6Fflvfw#~zlu6wU`%BiI%89#{R1G-l48Ddr<2sRN+~j-+(A zES3wnr3!+4ih$a*hw&B&YVfYe&JkwP&73`%s1Xih7qLdDb{sW(`^ddtmkYSJ9HM=M zz;k^&8CgAk7`yJJD~RfBOgD2jrMM-?5p5vOz>y^Tmc?=bw^TupuMv2zZzm&99#8jZ zk7M^t!P8>q?7cybXaiyfjwIQ)ES3wnr3!+4jey#>hjE^R8rdFp@_0&Qk7M^t!P8>q zY&*yiIXM^?17Ze_7{wUfmJ2ZI#0>(8fZDXDG5HKH)ZoTw>e<6+Jf6GRL#dv5sK$Ec z>={;#a2gwV)lX_D)iW6fj-<1kHlCGkDMG#& zc9RDWOCC9`RnM9+ol+OIQ>uL+!oU$V^{{cdfMMkv{3ZdlV{_vqmONBi8)GK_d|^B* z-SQx5J?thA9+ng~U#Om{F+ZiQ)l)U&K!kxKwd`Z| z!Wd0;n=wiys>PT>J*yhkfU0LQ4jf5mZ&@rCa7z^g`3M2ou1De0cvyyk%tV_xD+L>) zscthysYJEN6o;EM9v1buG!C2{I3n}TSe6Tz5zpCA5oq+P{4`8PhB_?9XftPJ3S%_Y zZN?~-NQ)Z(bd#Utan&LZ9v0Oz83&G}v$rgk3%I2Uf_#C1?A27Y{B&5-*RI7(sF|}; zq%oT6He-}Zq(#P0KJwFHNnaa_frA4_8UoU%uCUTM#bE(~AOvKW9+sr7{WZB+7Bit{ z&Pr{@XsX+cQ7S1cYVhRK{+it6V&LGw5t&z7y25rj%UoC>;6UKAOQpk@DjDan7(>mR zl_`wTjBYaiVHrDnc}hB{*$bmQbyy0YVmol8h@ft}!ge{U=`cdzQ3940wfI;>&cspA z9!5)E>7zy)c9RDWi!nuh)^fz+lgB*Q1E&U#$h^|h6}HP+=E4GjrwLeE)Z$~&IT>g2 zcv5JOWA{wK(_-MP<%q>6X-JEKQv*j*y2he6tn_aL=Mw}x3CQL=EUEyzr+WM}P6nAg zo`l)s*gaG5wCFu+_qTfvi#ZMsWJ&27i{7x(zY&~I5O5kt zjg0bBR}j@%##Aj`XI1CJI3M|ppvG5&C*#18bhfeR4cqJANX;h*+(@9eGkg7|)a@e7 z2<|%D<$QpB+J7L0yzaX!ve>&K69)og1Y}R1mPR!7NW))#dMLsXR_0PIs({9E)nAP) zjrOyuXG7JIOFberBulUVK#G*>_JtIGdkO+Vpo@U)$-~l)pdPtAmB&;gi0Q>RN#LkgZmhzTA#dR zfj~|`_Tgd49op;marNtru_0zA>~XdcIek)7q_6FT<*dc0k;Q&o^&BuZ#60~;s(m^m z@gYzUkWF}63b)3#9ijGh*xpcbe0nHsN~*?BU)zhzv#P^kY=_Oi+9T9Fd+m94|8=3( zUjP|DPN3+(bKA?L5k&noW3*`Nif;*+eALM4YkP5d_R^sp|NLqUqPh(jEs`GfDKtNt zi{KFW6oKM#<=anjpjZe%00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;| zfB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U< zAQAZ8&!6}Hq{u8F009WRfWW;IayZ%xNKyg>Annc$AP9k& z!_7@qkXt|o1R$^%0k;_yKha(nhgt|gU@d|8GtF7y+Up=Y1R$^l0q422SGp~35Rnjo zz!Cy`O|vCxm)r|UApn8k1eT1W9g_yXN8~{O0?q_>oMQ_$JKqlJAOL~L1QyPs9aBfX zO0+=$0-gkRoM6i}dtMN^AOL}w1eOn?eFen4P*gzx0&WEM9be0pyWJ6qAOL}w1eQ;s zeFen4P*gzx0&WEM9be0pyWJ6qAOL}Y1eTAW-30`^QzStE0zL$GA79J$`&<)QAOL}Y z1eVXA-30`^QzStE0zL$GA79J$`&<)QAOL}Y1eVXA-30`^QzStE0zL$GA79J$`&<)Q zAOL}Y1eVXA-30`^QzStE0zL$GA79J$`&<)QAOL}Y1eVXA-30`^QzStE0zL$GA79J$ z`&<)QAOL}Y1eVXA-30`^QzStE0zL$GA79J$`&<)QAOL}Y1eVXA-30`^QzStE0zL$G zA79J$`&<)QAOL}Y1eVXA-30`^QzStE0zL$GA79J$`&<)QAOL}Y1eVXA-30`^QzStE z0zL$GA79J$`&<)QAOL}Y1eVXA-30`^QzStE0zL$GA79J$`&<)QAOL}Y1eVXA-30`^ zQzStE0zL$GA79J$`&<)QAOL}Y1eVXA-30`^QzStE0zL$GA79J$`&<)QAOL}Y1eVXA z-30`^QzStE0zL$GA79J$`&<)QAOL}Y1eVXA-30`^QzStE0zL$GA79J$`&<)QAOL}Y z1eVXA-30`^QzStE0zL$GA79J$`&<)QAOL}Y1eVXA-30`^QzStE0zL$GA79J$`&<)Q zAOL}Y1eVXA-30`^QzStE0zL$GA79J$`&<)QAOL}Y1eVXA-30`^QzStE0zL$GA79J$ z`&<)QAOL}Y1eVXA-30`^QzStE0zL$GA79J$`&<)QAOL}Y1eVXA-30`^QzStE0zL$G zA79J$`&<)QAOL}Y1eVXA-30`^QzStE0zL$GA79J$`&<)QAOL}Y1eVXA-30`^QzStE z0zL$GA79J$`&<)QAOL}Y1eVXA-30`^QzStE0zL$GA79J$`&<)QAOL}Y1eVXA-30`^ zQzStE0zL$GA79J$`&<)QAOL}Y1eVXA-30`^QzStE0zL$GA79J$`&<)QAOL}Y1eVXA z-30`^QzStE0zL$GA79J$`&<)QAOL}Y1eVXA-30`^QzStE0zL$GA79J$`&<)QAOL}Y z1eVXA-30`^QzStE0zL$GA79J$`&<)QAOL}Y1eVXA-30`^QzStE0zL$GA79J$`&<)Q zAOL}Y1eVXA-30`^QzStE0zL$GA79J$`&<)QAOL}Y1eVXA-30`^QzStE0zL$GA79J$ z`&<)QAOL}Y1eVXA-30`^QzStE0zL$GA79J$`&<)QAOL}Y1eVXA-30`^QzStE0zL$G zA79J$`&<)QAOL}Y1eVXA-30`^QzStE0zL$GA79J$`&<)QAOL}Y1eVXA-30`^QzStE z0zL$GA79J$`&<)QAOL}Y1eVXA-30`^QzStE0zL$GA79J$`&<)QAOL}Y1eVXA-30`^ zQzStE0zL$GA79J$`&<)QAOL}Y1eVXA-30`^QzStE0zL$GA79J$`&<)QAOL}Y1eVXA z-30`^QzStE0zL$GA79J$`&<)QAOL}Y1eVXA-30`^QzStE0zL$GA79J$`&<)QAOL}Y z1eVXA-30`^QzStE0zL$GA79J$`&<)QAOL}Y1eVXA-30`^QzStE0zL$GA79J$`&<)Q zAOL}Y1eVXA-30`^QzStE0zL$GA79J$`&<)QAOL}Y1eVXA-30`^QzStE0zL$GA79J$ z`&<)QAOL}Y1eVXA-30`^QzStE0zL$GA79J$`&<)QAOL}Y1eVXA-30`^QzStE0zL$G zA79J$`&<)QAOL}Y1eVXA-30`^QzStE0zL$GA79J$`&<)QAOL}Y1eVXA-30`^QzStE z0zL$GA79J$`&<)QAOL}Y1eVXA-30`^QzStE0zL$GA79J$`&<)QAOL}Y1eVXA-30`^ zQzStE0zL$GA79J$`&<)QAOL}Y1eVXA-30`^QzStE0zL$GA79J$`&<)QAOL}Y1eVXA z-30`^QzStE0zL$GA79J$`&<)QAOL}Y1eVXA-30`^QzStE0zL$GA79J$`&<)QAOL}Y z1eVXA-30`^QzStE0zL$GA79J$`&<)QAOL}Y1eVXA-30`^QzStE0zL$GA79J$`&<)Q zAOL}Y1eVXA-30`^QzStE0zL$GA79J$`&<)QAOL}Y1eVXA-30`^QzStE0zL$GA79J$ z`&<)QAOL}Y1eVXA-30`^QzStE0zL$GA79J$`&<)QAOL}Y1eVXA-30`^QzStE0zL$M z#@FBd)9;;seCj%~_*@fNAOL}Y1fG~P&ZE+p?ukm7p8;DMNf2-&aL-iv-H+e>?uT)X z1#!El@Sptp^M_lnk_ZCP2n>#qKMc%cX68RZ2IGK?->UfebL=PDg`x)n5O5>VH#B}7 znECKL)&qkp$dO+P=^UhPH$@@{Kp+|c>-=m^&U5|*8HNKgewm+VrRFIb?LyH50SLGe zxSpSe$@#+hX`Z5PH$@@{Kp+}{*8DV2&ezV*t0@}oHqiqC2zU~x&d<*b&*S&|%J1Kc z@+-fc_q-``K>z~L2q^Qj7#)V~z&~;fb>w<}o)E+ojdq*pfdB;D2q?qz7!ihnnS4Tx z!C^6}oQnnX^9O(069N$Ue*)zQ{oe3Ar|!k%Ojv#$p>F?8Mu<(6GONoD^o7pa1ti9!0)Kv_Sv@O9=dNgw}rvIys|) zAHN=cyb_dkBfpZJqADO5-3OdA>ARve2m?b8we2Q){{pLj~^OMQRE5-@i4uOsu9on>IQeT*6o zw?|PN!8e+FcS-F+YQL%HJi7$r41tFT7(4uzS*dMqoN87{H>S)&-8GT6i*wmv#(Sx` z6$P9X#sLBk5xDHt^N+(9ov&`Q33Qv-OL>RGZOK0Q%g$oR*I-&MBKhS17Yemi z3ZuNk6w1D+DaQ_hCkV7VGk*fdx@dTHD_?=M{Mldp*Vs>6?eTRUQ87urxs@0%$)65I z!=$a+Duwa#_KX^CX#+_B3j}fk?QTq+pD&7rSGSk1;BXilp6OIu`Q-EY=D;kfw)aW8 zi@Zb+AY_30>`JK;nl6BVaEohda7Mc*Yo-Ew3M~C z!RB|-?wRwe+A4){rgPeAyV{`ka6WE_;n4t%Hfw(T48p$cS$4b-`T@g!h`TzPH3uvh<4d12K4n=QYq-_}M+h1)MugxoTRMaQds zYPdcHss`b(7u|JkMO!HWiiTIWmd;WIJY-bL_(Q2jGcYGF30N*=m(Hnm!fF51aHtjA zKy-9M?bQ41H4csEu*)lGl+gGjfn1Ib91a2vr0LUMog+ITS>87Xx++Q>ibcBU!`>Be zQ|F@mv`rk;#a^#KE#cCbP#g=!qlLgF(!*iL&dEC=UvK*4CuQdZign%q=cmbB!H*Z^ zpW7TlZN1|wsMS)lCpebTfzLspMl!c=+BvBiibe1Te!IM){Cu0=^07{zZr2bYV5+WI z6cB3LO%M+a^vfgGK>-o113_mb9bFLz<0RBW+OZ}~75ZVQ#)o4TkgZEGA<`|htm zElM>q7`q6l40GcPIww7ud~xq1jTSAhG_CV%mFwh|7SW0t(35H@7P9=dB+oufXh9p{6p zS*@;jXsAKdbYYEZ3B4SOxA3M{P?UCV(==c)KtM%$8ei5q>f;JK3hctvy2gfv8p^I@ zt*0t}j6?n?UiJ#|($4k3(BMcSAbBRs`#MK`VryUhOm?-L$%#>mIivIGvo+1BlV=w1 zdj&a-GzVCW5y)W{>sNM;`qrL);7`O?3ptF%B@S$Bk)NnyK4wkrK;i0DbWV zR3eZ_%EendM}2Yg57{$%zx5U5LxA-R0kv%o<6Ao?)mwXpK0}~4OHFMm=b=R{?_uvP zVcx$X=ArUm`3h#n1!oHawZ?m8=M=@(-sAjBzcE5hP zMQQ4`@mhNy{=9!fj4IyK*wA)f(SJNYB#>7bJXfoV`DPR&je$H zh6Yvh5@SPT{>fPK>6RaCtexw9%`2$AeeClD)Si4z=cv^+jE%?JH4u888+ngU4Z*8E zwFS4ocFoK))RHpa@e1Zg1Q8kp)XscI=cuJ!8ZB?XcRV)y+v$$4mx32MT#BD}SXkW) zUP0sG^XV1>YJa|UMDmnrOO*Lq$SGUl+hs3ZFeUcoIRf*=h7YL~vC zbJV)JjK)`QoR+7XF=m&}IL^lEF5QAuwDl`!Jb6CdOF*{k)}15EnXz0x_J%{(%sk`F zNR4y0!KC&nj`*Zx>sN5^h#*>nKx&w@*t&C46*n$wul`2+jcOx@%85nRd1%}B6*L|@ zpKd20+j!s3k+s}t$>08s>l+mk>P7;azJlB5Lmn{4o7=y<&Y7I+O*=;x@{r}O;rWm} z!rnq)$5-&^9J{3YX!fwdC6*mKM^@or85pDvsz`AQfxTYAqvOTS^HCXLgBN`E>YPG+ zkZnF%gGfR~7lFNA!E>{v3)*usB1bL|?bSJjc(xF@g}_Fy;L+LA1@loQVS^WlHtL*0 zIa>(aMPQd#@aRkB% zA5s`OY)&t1=j0+;L*P*YF<-$$Gvr>94~dK%HU}89b8>~OA@DSTn6Kc88FD+xCqxF1 znKO*pIk`gC5O|tEz*q3Z40#CS6H+6`%rOS+oLnAj2sjW3^$H#u9nWEWNO0J&Imu9+ zlM7=F0XG7nUcnP{<57}N2o4@I@eI{DNfiqScoGQp3Z57pkHUOHaPXLkXQ<9es#rk4 zlR&6faPR1Fz<96VU80>}Lv@bBU6TR=l0c|eaN_`xl|Es)QSe5gPLiQI=ZVWDCIl`C zM0*9djFHQ#?{c_B?RG&5l(0UJ7@AXIj$10 zTr@rn0zVCZ{rK_I@RR@hUaITKkiH$860XlNWu+Z;aCZs8LIf)j9l1!GfX z3Bxg|FF0kS?c6y=Rk%UGlfbH1V4O3aD2iN0g|BogP^jBgoui7u2!SO8*1m%F@L2*R zC2eba_tylWu~^$V4PktOfE$5OuizX?Znd`)?LHyT>i+&8|8<~{HktElsLrtn#s>no z6W|rpkPeKUI7jlL22|z8Yil~EMh5#^30QjG;`3HMd0hizC(e<{Lh|G1+R_yk9~l`7 z1a=`{>2QnBF7?jnj57=el;nj^9zR1_y29d<3u6s|y$D!3+~TuW)njT0#!j3gdC3E+ z^5f^)(iIjT85s)%b|GNtaEs3__0H%V7&~!}QWQQQtcYOg3X4w>mMsJ}B4Fuoi_bigYIF_!k_@sa= zA`q}#89or`B``K^LY*o~9@bXGVG98WK%h-vc-q7{C<`3ZCgWg%00bb=ATTy+LY-2p z8&Igm!3Y5eK%hooV9rE4qLwxwQjLQV0uX>ejljU133cS&x@ys|LjVF0kOV>v!vQg} zqSG=E>Nrx1h8+SBfPf@0HfQ3Tk`oY>vk-|A? zC>DjAWm`mG3jqi~phmzlQdA!`pz3*POrb748xARmTr^IppJW6q5P$##Bms4RSd22% zVX+*PJ}H#^WVfUs>cSr9^i+djga8B}kO=fnmE1oC$rrhUeVroMk4VoHL|sV#ON$x@ zBLpA-fs?@H3~4y13>*H9PbpNx=kikuqAo6vO9wR$#(fDG{=MYJe+hNB+g;EWmOyGr zKn@MNMMgU;_T#x{>aN__yH@oiV{f#>Kb>Wm}lgq%->Svqf08YYAM=keY)kyXJgp z&pYH;U;5V^R8@tsc2?SpgKV7%6kRdAb(XEB8x~(2RD)w&ML-S>qeT^LJS*LbCXo(C zi>gW*jnNJ_c@~Qsfubvhw{C(PiH5}&2OBB)AbGbMWK$GQa#-$}tD;{__Ato+nUDiLR~8-gUfimc3Ls7`IYY&0-9Ay48YU zf0)281Lv4OvQMPtVM)W2>P@u_LwMD}t{IX$t1X&4^sePA=#6mttHNr=rLb_dARADvaWwgSf76jf8S1pC&URz1 zbL7?XjZ^BUnnH_R4Va9U2>1*WP=`!mlzk#Ca>69bu(sZV zg=}>zl}k%f-dOZ%!+(-M8VCc6TIzvN`H@EFZh7QyS)f&KZxfH0d>d}M%gFQ zk_L-h%*g9HTgX=S8;Flq|f>Q*Y3mPReyD~d#E$P6sn^acXvM;e`zyIIz4oqP>TKpirLQTBvYwP4|SOV&hDU7mDq$R?r zDP*f#sa#qbwWLpBFZ6xFx&~41e2F4=9$2?Krz_y4R2*UwP=`!mlzk#CX|TwJTj7Ol zbt{!ii!4D}+=?Pm*C5KBE$DLpuC;8N!;<$&S2T-Md;$_shfHBqTct4Ool~scsxD-! z+d{UwE%d8fx1vbYHHdO&3%cCDYkk={UC}I3@d-#k9WsScZI!~P4w=*FR&^m;-4?Rd zZKIa-$*ri5C+eC)xwDa5exz%C**RU&jB0U%W+=}{mqTVTV z_;(Q-h<_fr?3~`nU9xcwLO>ldg;8yl!YC(9vba@R$X2(7Y;~KIHx_P1eLPX`6gvF7 zhz-O)k6d<6Z{#l7I0qr14w=HJwn|})Flq|f>b8)rZX30vPeHEl^)h;=(Ba?3WFY=| z-YInWcM%(ie;&E) zoZiS?vT+VVKpirLQEipNC?`y^xK&!nR=0(0b(@qo7H&m-IZ^KjI{mwdjioqFU3N}y zPSerAs zT^%x~(XFmRwz|zV*Vc_%(kHi~zMSY&^K)$Yf4My()UFPh!dRO#xjhXQxo|79kgaZW z&9${GL0a63`fQ?s;W;*f1`=61XCUln?|R?D)gel0_zc$Wq8wx4GupIw@}~9x8#bCxNlCHb8GIk)?A6A`j^2$XWvGkSUC{ zZprNtMol4G-R7EW>qaf<)7o2mefHkrGYq6R(dlpLoPo&0Rd8?>0d>d}##*=J_B2@J z!mYGIwz|zV*VeKGX>lv+vx&Oq&oHH~EXmo@Imy|+7_NeYs|ct=rZCpJCAZ57lPqqf z6|&WBuDP~O${P!}qCT6*K6VbzVM<+DlC!0AlCym=Tm=VL5m1LrVXSpaZjUf(3fby5 z*IZjSYDu3~-Pd>W+Q-h}IgF(%OLDe!PI5LbhD+e!LIUcLDU7vl$?a*d$c0;Vg=}@3 zYp$(j3DV+L)MpbJ$Ij_COsOkNa<+6%a<(jn^>c770d>d}##*=Jb~#~^#jU_Xwz|zV z*VajSW8qfRmlIhg&*3wJ$e5yVGj>jKs^rF&11JA910;`QU)wv!7;~ls&MqXN4w=GO>z3S}28&#{RaeMXx4GupT9zO! zZbf}Lk!AQy^0A~Sd}?iT*kzv_mg2a&ovec6s|ct=rZ6@dCVf&n=QO&NR>)SjNpNG) zs3m=JE9&Ek)M=B9^KeoqY|onz6v6&BA^bL!r1Pa^Q+o0r_rsnLbke{ ztR#mH+Du#C;*(|!xJnVH+$V)(ijfnrpu+jh?|Kli$E z)Jg(rJX#iw=aA3I+FEAEvM&L3U>3$k!=z8OZaM63a0=P#HVJMl8nvWPZbgyEfq-Rf zCLcP-;YM~zp$?hC*l3vaDGe66a6?hZR<}uTVjE#m#pX7u|mK)W!Llv^sZ4%sAB;}1oTS>I9%+L0XSjOh*(`cLHQ=?(h zr?wKl?nOWyGKI0-Gw0XT9&+IZq>!y{Cu>R7xfMks2Li_VdD%RvJsJy#a!BDuKpirL z@v?0WhX@T*$X2(LwWKoLE{H@91RC@6AO872)7Q)9N$t^CIFv&QHv;OADU6qG!~Ar+ zFA_aLAWg`|V)7NFiTZ?oVy+@kj7oJo**R{dsp1RcWG%b`x7+kgbTmn0avq-!2Rg^| zMs~?nj2Cq~**R_~RPlvzvKHp2+iiL#Dw;&y(m9?tvP&+tRSM%|=eVILWUJfBT9}`1 zx9OQkZI!}E=Xl=8F1d;(QMZ$wNUl=EAVSc*Zre~s}Nz^T!<9Q>yo{7{}DU5WE=Z)-=t7sB+JKZ_I{p0r_Khw3OKdBX^q99;jFN4l` z{S`k{;B@B%8a30kFh2v`=0gpyhNW{BDT9}`K zZqxIX(K(*9-;`^*bC$h0i*k$4n{Ja@ECeiFVezr#!skr{EL~yoiNM67)8Z4M7BqMg zuylpR$5S)8A`q~2g~f+jA`n2s7y(O%TYSc{b824#maee)L?B?%Y4M3r3mQBLSh~XE z*YsNFZrJ3nVfDK|%v+HAvl~5)&pRep_k@k@XNf0~6Lu@EFXHnAV6v zP8qbsO8`|+K=G3uXFE^aI1W3Om$&T|_WG7?-Ww|%4u`+b@#Wg*>~r=%|KET5-ygj_ zUH?S?{SW%@UtbIVy>@%^$$h)MKOSzv-y1F<00d4#Kz5>SpHv{01p+_-2)IMQR?FO| zyKSH#AOHk_z*q!w@>t>@TPaop0zd!=I6|OAB<&bSn?Wf+00;nqQ3&LO@x9EIiyu`l z)&T-Q00_81ASs3!;e6pvPIR#)6afT)01z00fR@1*Drw&6xkF0EB0vBL0DpE7Pz7${j0_bKmZ5;f%6fFq_03M6CqKO^LK>`fB+Bx0!nLXS>>w2?ziI zAaD)>k*t;67KmjWqSKzUTdWEMfB+C^gn*W{LQkxZ=Dp6@sC=XW0zd!=oP&Utwctr= zp$<-lX{Vk@o^v*gRe=By00J!#NXi;HwE(h5PvN1Qp{J0iMfu1v4Fa#d_S%O({9*b# zSuy!P_`wfGLwsz0_OqYy5Ib>%7!w$$ARvz-+c^!Cehy|sjz%`eNaK|KV$rh@kkm)^ zf4N`MNm?pz$<`hYIBQ2(7YOhnWFwM3o>4+=QzO7DS}u6s@x{QPB4mRT~` z=HOsN<>3|xG(jLbW_(=FHKM9YZkwQiB&`sLDEsrD{~R)tLPkgH?|=Wh^hCFEh;5zZ z*T4QXkCG9sPNLdsU&sRlBm&V%lZViQ9hFydD|ZL`ECeE^pr2cm<0rO5r|G& zxHV3x9!h42oO;&do@j}Z+g&se@Hhey5rJs>rVm~Gs43ZJCmV9K&Zcis@pq}Hp2s(Z z3_u`E$c2~zZ@~E+! zxgy|b4HWN|k$DSa79@k={Y&(XBz}n<(XI5j z=V%QS&-KHw5uooA(VN)A``F2*-=su;(-nRn-A{k|(?{qd^)sgb$Ni$GS-Qx~MN%>0 z08o+kUN8y-S|L!OIblk!fTIa>?eL)gXc@Wfz)uJS*~~$jd-x0t(i7(W@z7F8iZmoN zDCd9PFXJUYmB$iFHi!cPV-U#oh2bwL%$S}WdQdQP)01o2&XV0-A?DlP{`UX6Uo+|_ zQG5lCutz5d*pkAd71i?GLL;Yy5BdvNmthr~U1rKRzxhpu;(Oow9^2ZWr#|E9kytBv z{tRI`ia9?$i|QC%5_^`R0~-MXe5wl#-6>5xg{#Z3OK~SRUSfaplbMqk z>u>t~A?ytCh2KBQ@&1>;{H3Hqin$bn*zDQ}6rOnw%eBvge$HQR6!KD-urS-;u-)SM z_a<>96T$Mxp2+y)AO9GBUHr#B_A#1H&#rVuF?35Yocx!+{G|?%o*>2H9sBgwsgP6u zR;a-+VmTnt8v*W-LPK^nY#!q|s z+WiWfijd^5Rg!Q~J>g||h$KCf!9jJUC)gBBzm7gkiT)A#UWNw`y;Wak+f_~u zj&g=}|c>C?Q$(Bfxc*Lm6Z2nI*-qT}iFEHSUEOF#Pt^_WR&pq< zk!=@~P64u{x88b73t(=8{K4+g`-@1pNW}zxmB?LZ0%HPE9YhuUp$a8&t;z;Y$@t)%dq zJZ&g;1vW@)NJ0rYf4T9j!7siVpsS)V?F^pZ{`R-d^|MJoBFWSUoYnQ^ofsl>U3Q{B z+QL~#^8c8^&%B3Q^%g@^X> zFcykkgJrP9*v)1HJie(1GyL#=g$kobO@8DH&vhkG7%`NDN~M?QbR_`^pBZOlI5fmd zJcy5+K52iU?28~E&uUkjo69ijy46Uihq~^uBsrDzFZV0dCbt~Dg(xh&bErx~ zK||pKk4Qz!6B?0ni4rL6n2R(Zwz&WT_DOC#D!VLc8yy-AC8y_{ZFf?5bk-D7 zI|+T#$9KQ`-G9DcWE{otvQ3ALFNVO;lmAG3Bz?N6cRf*tM~dk^7y6k*c(L}uc7OmO zkUZ+moss(Os-+HyGBmHSVM19d|Hvf0vZhP#OM3K!UwA?Nlb`&AJ}{0x@QD7VOHR?Y zPNHKT@lYA`W1HdQn7{hfua@A3MgszCBT&)>kHknxA-ke~qYRG}(|fKgHTpH4^cvjW zJE@k(%D^x;X2;Bv9?Z(0GfIvWCw-Fu*kUBuN z-Qda5D8nPgbe&7TYDtzFeWj7)H1`ym`#cVrP1>YjNuY90l1eIuGkp5fpZ?L0e#F17 zIr!;YUGlqKG=(mmF#JS6Ps!nl&H@5gLm<}+5Bj-n+0b2Scz6~Y57yIfI`lJOd$q>F zet|$hpog}w?n%QCOgSW{u-&7`CON6X@H<23hu`Uv8woZ&(b1O>>7rY*fANc7@TRmO zKUyvtr3c0PmsJ0jd_>giMvs~yoAEhHoFU|wtAw{maXlJ0v=R`wG6K3I9`|s&MF#h& zHlj$neY}j`8A8pU``qXBb|MeG5lC-PdPpJVt+xN?{fg2?x1@XYMFYC@^j!~qJUv}f zIYaVDiX%v`+&I`f5C{lFP0{3bw_$e!nv~Hs32#Aun?`CHJv7p%Y|urK@(YPPQ5y6` z(cITXLk0@g`X-knTPCcwWlmaA=Ap;Y04aJ02mk?zKy#^)eOF;OucvuJ-W2px9wgX6 z;DQJ=mlsON3Uk!xQB3okys7ZOroY?%=9_PF3>ndDVL8Nh^oIOs7A+KgmtQ_Bl1)#! zbVXmZ$P<#wS>gHfg57~F1A$!xnk!65C>wCs?o>nbv~nXXVp2krB6fc@|MYVH z=oP-Z6c(b_)O7Kp(nzKyG1PwJ+f^JKz9P!EWIUzX@Cigf00^WJXs$DyP_|*x=1BjB ztY69(+4OuE^i9S@cJ8;&aTt9e^o{$)o?t|4>Dws&@!N# z@qPsrjr5amzx1UqNtvy)=|#Mp$jRA=9zi)+e)Uz_98hTRTsHWezyJb3KqKHmpgh;W z-y;9Q7rsC?OPT!U5jp8AhYi2~POtarqO|t+--9Z?(z-&Gyxr~}3G(VQK_~+!k@i!* z4S#?D5Xd6nS-U*cCcmZf8a2??c^J`HX70|bCT8UYU)<+%o_gcsFMNGSdf0t7M$c-Aft zweiCksR-GB{p(-(@lP7`tVjXjqL<#!X8K?I9Zj@rdcM_`Aq-=&hvNjs~1a>=|+zwC}K+9?4ZMUj&(JYxU>Ado|#lT2|ZcFI2{ zZP2%{m*|0zREu6ghhHK`YR3CzBZws5CXMj@eJO^K{q#!S{8Y^lPahycAG$$Ta+MM% z{Z>8N5kHHDDbUYc*T4@10s=jRC~DXqON_}0{Y0Ap0U%%?&_jrVeuhV*VE0(X$QcQE zbqz94^x~SHJn6~s-|iQEdM3Tre*bAr&bi(6+l1tJ?i*6kQ)skwH2NR+D?ADR;0HgD z`KA5zN<4p2PTE2|zNNqBV;m<80f9>)V5m^tQ0PJK@o-z0s$y2G059*4CZu0D&k3T} z(e&b-bnE`f!|#9eFzHW1g6?nW3fuC*v-k>0eS8g~?lKv$~R&lHXQQi3ZseOjpPjhF-mYV6#rnr5-b|Ss;)^;E-8nAnlr zdcokv47c{&CZk*cFRcxZVZ&aU!-BD^ezf9lOi4gVjNYB}PzIfZJf!F0`}L%jQ9yVz zDsTDey<400e_o6N0U%%tNa1K`I__V(l{VcL=6NJ6)F7AU8ra|%X&8&jFtQ`T;k44& zjVTEziIIzHn=QO!vbcVZ_Z-Y^u=fTLZ9R1CeNP|a{Ms8^t z9K9Hq$;p2DBIf;Pg|u)*kx$Z=`BXUevk}cLxh`UeIoTt1iJg%VO`*|fR&*Op54So-dy*5`N%3Kd z-073O;SUf10y_vKMdPTGx{doWGM+l|`8t}mBK~=)r+>K;cCtqrJepii{z$l-)x-|M zWu&@m+x}ZaIfK?@9QZ$Y_sp0JQd}_((>uB|Why2uiMsJ3pAVK{1 zq5QdE&ZdpsdSn1k-(5(~DzSGptwj2oB(bX{1fZW#10Zk|ft+F-@>BQO?a8C8RAd}l zf`es-$mUg!8k~n$i3|=P<7jgGH8p7?1=umPqAj5%B5Wt2eL+8u_738KKqM4(w?ST{ zu(04rC)+$qM&XKbN@R1|YJ(Hzis67@(A&!ot!1lUNL3QEyJ$rcdY>m<@sI6qc>N9p zfWSTiImI~Y55f`}JW`uv*UK1VEg2Ts$+UG&&Rkf@+i$=9jcg4nQWEWnilG3Gfqs_s2x5Rh4goC` z)gGxZoJ2aKMh>?!AZI5hCY`wq!5>YL!CY|8_}bULM)CA_Fvw;ViqaalK_Tw~_Tn*; zr|?_!E0S}P^0|?I^4@c&1%4m^1SA67GF=U+RNUs$kO6GV0Nds%kr6f(IrVMf-rs!l z&1f$Fo)Eh{Il3!uhPrZ|CP|_nc&Du~4)TP+1_D4JhXA)sZ$l~%>wq+50NFI8Ju+Sg zaJ=3N4{1XO8y@=IZgfRSqN+AzB1Y>}UDbIl$CFoWt=ke;1!R1LKhf?mezz+m~fJ7kILAIZJFly3@TTVrW zJv~I)g^e8L%APY7%v00eRf zCdG{h}|N(iL!Ekqi%+^f!G{d`Oj)N|Mmr>V@d7ede({ zAkYed!iLI)<@!_#Alp%JGG~b4DP)i*8R^hT3QE;NKU*D6G{p{f zKFV8`#z*d#^sxQ<>#wuj#Hho^$>DTThCIXCZbFlvBzl9=j|1iBe0r!vo?&fkQl|Fk4N8v(I$YK8 zc&|kn`0%`doxNqxlOp^Ua99X=E&YhXNN!WwXHnpG-8K3hyJ(Am+v9plVNyV(&1$orA-5^* zQ}Fk^XxqL+wlxs&d}7DfCIy7;^)xfu5${wQ%`SVrl!CC+T=x0(NN(EuLxFj08&Qchl zp9@F^wjdCgKtD^HGaI+t{yHF=YxMyQ#jd9fB%Aj~Q_(aqfx!C+KtHuUv=M}9vuHqU zPn(TGKcPtzB5(!$qz1PYAR28W2-9YX(6Dct?Q+BO=X~0R6V`Q4w}CLL;v zKs4H9#d(uNXxO*Swz&;D@6`_svX{NrTD?hU6D8(H?Li#5Kew$q)YbtWZMEFgc^D1b zXt~F2(0Q*`2-&~hYpvd-vxyS(qxK+<+@ITqO=_z_7;U)Rys1tA%KbT%{X3{PovGRQ zT}#Z5+JmZfe{LJ9(5@^rTx<4Jqp@;-4rTui>P_gU1pS~rh$HvswyhA^ve0&|sk4m+ z%KbT%?K`M9FR!2UjbHgkQlRZ~NO6B|+p5rLS!i4Rz-*&|n&2GzFLAvJp`T^{TX3KZ z1521=shot4u6`>!LcPQAGjg$il!a*Dd7*sNTX@nEwRzD6DMZFzBZ{ z{k)~#PESr;8UZb#I;Oj4D?38H!=RrhAOQU=JN(_7@WlcyWZ^|cPH$WQwUr&A-eD)G zNAE2?n*WW@zT5VX{BDu9_4kaV$37)(>*Q=+4#jQs6)D5$| z<3R+pW=fA#OKscd;K9Oj)ANVIE~oYAa6OUAFnsZu7Cav)=x6K4yqp@G?w4w*ZLOKo zV@pz}tzA|>Ny1neW|FhvwVsa>^b`7deo5d{DWts+^t1nC zuvANJOSRNC^mAB8VxgH3uw`x7DD)HhsSwB?3R})wkIvN3sC6s?!xYk9DBmg&@S0sB^KtG|M(9Z=L8Cy670q7_66Z&~d>tWFa5P*I{KcSxsG%~hu3Ifni=qL2^ zl-9$d3m^dfgnmLl7ieT`;S>a*pU}_6^z)QH!lFPRLSVChALQ}T{IAM={MYazLqI_O zwq$KTD`om$o6$}P=MRNlPJT2x#<&Fnry#K9k7(UczEwK)<^|Jg&6J+BZa#Z$zB_@L zKNNO3`O#CF1&acK2!SnsMC*p~t5rhpS?EUoxsc=3cH;A=qb&DMS(zsz?MIvbwl}9>C~GS zOe@t=+s{gw{@3Qa6PWo!VV9F1jgB#HfxsyUZ22QvH$UYqYu zVCD~nT~2=VlxD%AKp;Y3%OBCYp?s@!>dgzLm1?Q&XQfR4YxCU+%>1FS%gK*M#~8Oj z;1mS5{1L4i%C}0V-n?L1t(nr3*3DAi^y>7XY_%sB1(Yoc2 zXx&i0RXX+N1=C8k)b_JdrvJ71?gVE3P}t?5rhpS?EUoxsc=3cH;AXrG4e*l2wUM%EGpI?}r3k7(UczEwK)<^|JAwbb^rQl|g4 z`R)W}{!rNE(mmOr9(L-|(e)SDMft2I-4(z^NVwfXJ@X8usv<>W^@G-BUI z>rgOKmLSlV)-8WT>xS~J(y2Eum{zK#wx5+U{jbe;CouDe!Y(I2TGBZOWBNAQ!D0~J z3W2_~ZuuixH1cq} zDt&r$a=B~%zm>FZK7050?!(d1Q?wg@YkcW0gMK!K_>6SjY2Ehv>1Y7-^K3nTR?76h zdwfGbU-jG>9gj6zBJhe!VYOUf+v}&J0nktAr$*rDDcX&{HNHf9y)qlGfpo(Wc*Ui# zT2`?^Kl?m!X$|S-Nk3?od7FRrAf2%NF>BcbluNYN3$yVuNH-RN7hH;)W>svB^;33j zx|O=g$Yqz4m>;zVf!6w%H9Pc&U`>yCeBBu^aTWu~s0RM!>Cpru#~HGtC3HQv?)&X-9+VH|VEscX%2j0R3#x zsz_0cKw2)9w>V!uaD#p})(WK42tYsc9f*jYI~pv!K|gi7!_ydnO8snbzIRfj z`zqz#NrYif2&4#1`#M&=)ktgO#zVR#5P*Jm>{Fyx2&A<#1e znCrS$T}AEAaxzn@pR&GW1~?rekfks+(6Rols^h!1;XKK;@>Zc)$AQ0Dbrs$EUa5Y{ z`udiF?ClW9QkWWOx2(#vRdxJ45?8goQc$3uFW@bO?ZqT@A{#qW{bczXFOPJ65U?mr zjrFPGL+K2!S06Q^So`R%x~u9Z;%^rEzuHrUdH!zSr(Wjf34^O+j(pYb+d0B zuT&@P`#Kg>oSLdEj_n@ksuE--D-&pHUgEa;~|PnZY(2Yc&yrP^rU*Ri1D z)Kq10Z1+G{#n5i|DNIFlfoX$&)igdMmlhDzdkDvSp>$xPi|9_F&!sBx}y3;i^>cBP*c%_XN~x@C~tPbIWr zx5dc93hnm%ZO~6Ve;z>KBKk@F*uK|_GfFimp42PQZ85U2a=S518}##ldf@pJ`k8A$ zYT?|_A%7$Vhvw#jt7~&r4DBwer{XpTQKf%_enLMFAOQW$HCnYsMF}HKh(_yft7~&r z4DCItr{cB_!0fCI`guS-@caq=Otum?a&q*LlT!ub(A;D&CrpmoPM+(b7%DZYr{dP$ z@8Qu6`U(9!fWQ>`SDdpY7)61viA~_WsxyVBQBYAi(8-dH1L}e2Pw1y^uBc~qK)EMM z6>iI?>&Pgf4lq2?+;fYeI+OKOIE^hI9@?Ov(9Z)1_}9;hhBBsVfA^=x5YT$%c($%5Rg|$XT92 zMkce#0NYMZ_f|}iB?uTzwDu76 z)8Mz{8vLR!fB+CELBMFDwTGae2EQdI2QfeZ2pCPY_7L>b;1_)X z1b{#Z0!9<9Jp}zU_$@g(hyemXz-XeihoGMZzvv4f00c@9Fq&xXA?T;UZ^_9)3=jYU zMiZ?)1pPGlMPC2`AW(vU(L`$xK|c+COHK}AfB+CMnrQ7I=%>Li`T__5ff59aCR%$4 z`f2c6a&iy@1b~3iL~9R0KMj7-7eD|AlptU<(b_}MPlMl*lY8vK@=9K-+tAYe4n+C$J!gJ1Lo5C8%t2pCPY_7L>b;J4)DAO;8k z0i%i59)f-v{Gu;_01zlaz-XeihoGMZza=LJF+cza7)`YH5cJdF7kvQ)fItZXMiZ?) z1pPGlEjc-e0Rlk4Xri@;pq~c6=nEhK1WFJvnrQ7I=%>MN$;m+s5C8&36RkZ2{WSPR zUjP9hP=bKbL~9R0KMj6MPR=4R?`00cc3WhFy*F}g0F5SEdnnU3;WQ-9+}dbFyBjJU zx09}1<4b?1(h}#Zn_PF=0;QEey$1<=lxXy0Cnx?b-W?g;v605x}m+s$RSd2ZCsd31DO zgC8wzKRySM?cdMaE@JDYmbx#DCR%$4`f2d1&q+s5yS^#PWVd;4v?z6P&^E5Yi)$(l z%t2)Pi_U-}*Ew^e6@`q4>*$IVo1!T>h-`n|TE?tx;Qxb+ zwJPDT!J2(EiP!9#I#PcUfbq^-hwBIoubQKxknwOGU9nmBf0M;#<_2 z1Yo@L*5^8kP+b+{;X1lv-M(nn7y#|^j&8P7{9!DPVmDv>cE66FlKFO;-D9W2b~Np+ z&vlfjx+;!tc6@x@zG&7M0PXU|!JrAob#%q*tvKJkF0-m zv*Y6**&WU84WM1#c({@)7NJmr)Z8)9&lmlWJSyXzxBge|*gn4Uc({(P`1l?vLq7oR z@{Vq{Q+#&+Ib7ECLqA`1LZ`!aH0^EX>*!|3$Ipyz#~+A0LT$gXq@ko-58k*3a1R7(5g6L4bx#r3Yw)3@To2ybUco#d5F;?ORiU4C2y~qV{fv78 z_duW&feG}pt9l^$^$;lS4aD6M@bSR_XC71IAV5EXz~vBdvtgq#cZVQr!w@jIaC4M~ zfq{iCkARy)Z#3ra(B)Yi_e5%N;pQmeH~@iB2)H@)Mq};{jRI?&Ou5~W!G)Wn zwj2U(4!zNsyF<&d;#a5*F5Da?90wpU3IR8V-e}C-p;2J@m9>Egy!b7zk{UNhX&@Ll z5f?|m(V@>arfkw+qeIR^AWM^@qjd46#`cFH;ONk28x#6@o?7aIn5D_lQPNez0|a^? z;ONk28x#6Dg??Hz^*Fl72?WL<;7BBm4MRT-aQqBa(d4ImR00H!A^`ntguol0efMgA zUVM0*`baGO%qcyu9-EJzSi}PXHwgG_`8JK25=NiKww$~e0FY|#)N)${*po)nx^fY)cL~m>a`Gne)>dUimITW zkkE@G;ImKLG-irgpZlG(sx~y?`4b3Ci-6D0ZPS?0PrQDgwlPzO_gXKFr$7Mu=@Wq| zs_Ol}xhXmbMJ|uP6wN4$?A@4hE!fov^rmU~#>57vK%lxo&YIY}G0)o9V(a#%X^Q4T zk;@}6UEB6<%;^B}S#WQfmTydKa0&!`cArsI@5VHi#!xu|y=j`FxlrWt2$Xk(lgQqU z>13O;m(iQ1C)=F8jNUX&(Of8Uc?72G)836a9UwjnK9Q#7dlnlUjDXJ;tE=k7 z#;hy&nzK%%X>fC4x#ba9sfAB$%#~p5y_XYdTE3mJ!NCahZkCbxPi)MQ+njx^6KNXU zTv%>-1ZHnWS^tTRDa(LuBXA;3%eON&I2Zx@sLwTeVq?w))VbB3NYmiv!g9+aaBeHL zUH!zyY`c-QvzY63Ig__y~5~pjd=x9^d6_9>6CWHqJt68 z2lZ;6=^FED1cm)hN7LX&#&V}1aLs0vyPmEwW%1Xsr=#hVcE+NE5x7nR=5{(=W9Bxp zwtqUB1~)R6I|YHYo33Pc(=}$vrq+v@j;2%E8H)}^V7*2=x})hD^XLZGh@Xz8!HtaN zPC;Oe=6Ylo(>3NJo1J&=bTpmP&RBFX0`oRhtIDTq%vKwpE6;Q^4Q^yCcM1Y?HBpah zr)$g}Ao$M-noiM&#TNB{&ZnyojX4EnplLBFJ7qgl9QC=1L}O0D7ic;~a28v1ilaVP zk!Z{*_ySFfN!cmenc}F=RU{g73cf(oDT1@uqEj68xr#(%PQe#wT1?7L+0GP4eXb(W zm{aftnobd%#TK37sLxd-8gmN1K+|GUcFK09IO=m1iN>6QFVJ*~;4HT26i0ooBGH&r z@CBNtpsA!tP+5Y~EHPkn3Z_8Q6f~6-2`Woank5EoPQestnu4a1B0*&dO0&d(%_*1y zO;gZRQY5G>L1~s4usH=&plJ%4N{R%PB`D1j12(5%3N%eYQ%RAavIM1BV!-AUOo65; zXeucZRF?(ItTBXY}iGWR(Ju36S_JDxRmp$sC{)^OL6Jd{D1fp5CX_IA- z&a%hr)M@i&k6s6*(|2kUVUM0(JPMEq*kswGG7oGI2-tktqaNzNNDVd-_UJ_*nq`|d zS@!5Gd%RAaHedGWbx=Ber#2Dx=;_6y0EvK2mOU!-!1jQE&6hnotbV%;i~<2500e*l z5C8%|00;m9AOHk_01yBIKmZ5;0U!VbfB+Bx0zd!=00AHX1b_e#00KY&2mk>f00e*l z5C8%|00;m9AOHk_01yBIKmZ5;0U&T?1ol1!X7^)aN&_ANd03HHs1O0LSqRh=VPMlg zP2k8sN97fQ&2p^#M}kdoUBM%6yRDpD^ft6~I{iSVm++1912BimVdSFvB zqHS>Gfur&oG=tIuHp`Lp5GlFSHrND59uQcm2Hj=SgN~bvYssCq!KMc`H80Wwjy!Nw zUW4RL+hDUCNe_{lLFoaT;K&04E7c(TOWWwUxwzI0N)Oodz@}tG+u+CpN98qW2BimV zmLusQQgWwlunCSlAh1#my33>o9XA)(k~?jKO%H5pUZe*cdEltL2Faba!Dcy<9wIe^ z(gQZZkp~1;szLUbw$X8OajhAY99*-rUy19 zBiaT>9yltmK{F^lV6z-a50R2PZG%m49*- zW;v1`A|-d)2Akl>0|G16pu0?Z&~bBdExFS+*z~}r=0$qIkq3^-YmnS&8*G*%=^;`x zC_P{k9C<)sr5a>^X&W6k7uT9W=>eM_*p!TD8ytDysJsTvp!9&vawI)OO764`Ho=hx z1Xij+cbW8{48nni}Zja4;+=(Ai2{v*eplVL!@RePNNP38r+-VzZf+G(ItW<;UGU-9b&Be9k zPTOG91Dl!`=>bO`I4Z9}a;I&uS&pQKNX?-1fK71Z0fCijko~1?blhBAYX+qUYB-yM;;JZsRrF;(u0nhi)+c9w!x+cHZ?EO1CBg! zR9=JRPTOF!97zw6nnCFSo8ZU;0xQ)Z`%ByCxVgC23`!5!^uVTMMBCuV14rdGXa=PR zY?dSGAyRUuZLkTBJRq=A4Z6#u2OT#T*OEJJgG~=?YF?xV9C_fVyavggw!vmOk{%*8 zgVF;w%Q=#`jkF)(Xk?vOs{{eCS%T6mF<{d_Q{c!yN97fQ&2p^#M}kdo_ZU-qcCy{uY~&4N9;Dkk&p%jU}-op;x(R&MiUkFJV|w|&_x*rVR| sf_iMe>`|cS4FQ`kd(_)r2G?VQgHa#=1b_e#00KY&2mk>f&=!IJ4@yr%$^ZZW literal 0 HcmV?d00001 diff --git a/programs/games/almaz/door1.BMP b/programs/games/almaz/door1.BMP new file mode 100644 index 0000000000000000000000000000000000000000..14211c47cfa52136a309d271eae725416c646fe2 GIT binary patch literal 3126 zcmds&F>(VT3`I$w1Eh566S!v5r^t;s+TP50vVcW^!Q)+;XfOt?cxcf#{{Fdrx`*B9 zuY4}?^WnZ2Vez?6v=1RTADs3KuD>$PZ9JXD1IHZgewTh0U++GP7x=}m;|m;Pmo@pr z-nMNWA9x`7Q}S1i)dO(s1pO#nd%w$X=Vzx)pcYK^lvV1Xd|E-a$SALPle8@B# zaAy9bjWv9cXz@l>z+}q8d_FyX)c-oZ>VFwO>i-meSX|$w`qbpLFHU3ECy&%`1@@|b zSPOw>mq$MS?)@o(7K>%lN!J5kTf-mS{|Wdue{%mH=a29I!~FQ-E6<-2OKG%cP!{NL z{!u?*bNf&H>bTlz>nUH~%khXr%fA2{V9L?bT2HxL$*G9lAK?4^ghis+WQ#I^>GVlJ s1~QN{vbJmK$?{P^x~wd+GkfW{iUdIDZPU%Uvq5r=vh^wG@!jSB0sjIj_5c6? literal 0 HcmV?d00001 diff --git a/programs/games/almaz/door2.bmp b/programs/games/almaz/door2.bmp new file mode 100644 index 0000000000000000000000000000000000000000..b0bf6c97dd0083b3888b7f599b23573a339d68e6 GIT binary patch literal 3126 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

)o=M)$C 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%0A6F>J^k%WIU&R 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 literal 0 HcmV?d00001 diff --git a/programs/games/almaz/level2.bmp b/programs/games/almaz/level2.bmp new file mode 100644 index 0000000000000000000000000000000000000000..c8c2750f3a9dc68c6afd82f3fed9ad26365a089f GIT binary patch literal 201782 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