optimize pipes.raw
menu: new menu component git-svn-id: svn://kolibrios.org@7773 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
14f3457eb8
commit
2289d86d71
@ -227,6 +227,14 @@
|
|||||||
DrawPopupShadow(x,y,w,h-1,skinned);
|
DrawPopupShadow(x,y,w,h-1,skinned);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
:void Draw3DPopup(dword x,y,w,h)
|
||||||
|
{
|
||||||
|
DrawRectangle3D(x,y,w,h, system.color.work_dark, system.color.work_graph);
|
||||||
|
DrawBar(x+1,y+1,w-1,1,system.color.work_light);
|
||||||
|
DrawBar(x+1,y+2,1,h-2,system.color.work_light);
|
||||||
|
DrawPopupShadow(x,y,w,h-1,0);
|
||||||
|
}
|
||||||
|
|
||||||
:void DrawPopupShadow(dword x,y,w,h,skinned)
|
:void DrawPopupShadow(dword x,y,w,h,skinned)
|
||||||
{
|
{
|
||||||
PutShadow(w+x+1,y,1,h+2,skinned,2);
|
PutShadow(w+x+1,y,1,h+2,skinned,2);
|
||||||
@ -291,6 +299,16 @@
|
|||||||
PutPixel(x+w+1, y+h, dark);
|
PutPixel(x+w+1, y+h, dark);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
:bool is_the_skin_dark()
|
||||||
|
{
|
||||||
|
dword bg_col = system.color.work;
|
||||||
|
if (GrayScaleImage(#bg_col,1,1)<65) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//this function increase falue and return it
|
//this function increase falue and return it
|
||||||
//useful for list of controls which goes one after one
|
//useful for list of controls which goes one after one
|
||||||
:struct incn
|
:struct incn
|
||||||
|
@ -216,6 +216,28 @@
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
:void get_path_name(dword BUF,PATH)
|
||||||
|
{
|
||||||
|
dword beg = PATH;
|
||||||
|
dword pos = PATH;
|
||||||
|
dword sav = PATH;
|
||||||
|
dword i;
|
||||||
|
while(DSBYTE[pos])
|
||||||
|
{
|
||||||
|
if(DSBYTE[pos]=='/')sav = pos;
|
||||||
|
pos++;
|
||||||
|
}
|
||||||
|
i = sav-beg;
|
||||||
|
while(i)
|
||||||
|
{
|
||||||
|
DSBYTE[BUF] = DSBYTE[beg];
|
||||||
|
beg++;
|
||||||
|
BUF++;
|
||||||
|
i--;
|
||||||
|
}
|
||||||
|
DSBYTE[BUF] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
:struct __PATH
|
:struct __PATH
|
||||||
{
|
{
|
||||||
dword file(...);
|
dword file(...);
|
||||||
@ -225,14 +247,18 @@
|
|||||||
:char __PATH_NEW[4096];
|
:char __PATH_NEW[4096];
|
||||||
:dword __PATH::path(dword PATH)
|
:dword __PATH::path(dword PATH)
|
||||||
{
|
{
|
||||||
|
char self_dir[4096];
|
||||||
dword pos;
|
dword pos;
|
||||||
if(!PATH) return self.dir;
|
|
||||||
|
get_path_name(#self_dir,I_Path);
|
||||||
|
|
||||||
|
if(!PATH) return #self_dir;
|
||||||
pos = PATH;
|
pos = PATH;
|
||||||
if(DSBYTE[pos]=='/') || (!strncmp(PATH,"./",2))
|
if(DSBYTE[pos]=='/') || (!strncmp(PATH,"./",2))
|
||||||
{
|
{
|
||||||
return PATH;
|
return PATH;
|
||||||
}
|
}
|
||||||
strcpy(#__PATH_NEW, self.dir);
|
strcpy(#__PATH_NEW, #self_dir);
|
||||||
chrcat(#__PATH_NEW, '/');
|
chrcat(#__PATH_NEW, '/');
|
||||||
strcpy(#__PATH_NEW, PATH);
|
strcpy(#__PATH_NEW, PATH);
|
||||||
return #__PATH_NEW;
|
return #__PATH_NEW;
|
||||||
|
91
programs/cmm/lib/ipc.h
Normal file
91
programs/cmm/lib/ipc.h
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
#ifndef INCLUDE_IPC_H
|
||||||
|
#define INCLUDE_IPC_H
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
======================================================================
|
||||||
|
=========== Функция 60 - Inter Process Communication (IPC). ==========
|
||||||
|
======================================================================
|
||||||
|
IPC применяется для посылок сообщений от одного процесса/потока
|
||||||
|
другому. При этом следует предварительно договориться о том, как
|
||||||
|
интерпретировать конкретное сообщение.
|
||||||
|
|
||||||
|
-------- Подфункция 1 - установить область для получения IPC ---------
|
||||||
|
Вызывается процессом-приёмником.
|
||||||
|
Параметры:
|
||||||
|
* eax = 60 - номер функции
|
||||||
|
* ebx = 1 - номер подфункции
|
||||||
|
* ecx = указатель на буфер
|
||||||
|
* edx = размер буфера
|
||||||
|
Возвращаемое значение:
|
||||||
|
* eax = 0 - всегда успешно
|
||||||
|
Формат IPC-буфера:
|
||||||
|
* +0: dword: если здесь не 0, то буфер считается заблокированным;
|
||||||
|
блокируйте/разблокируйте буфер, когда вы с ним активно работаете
|
||||||
|
и вам надо, чтобы извне не изменялись данные буфера
|
||||||
|
(не поступали новые сообщения)
|
||||||
|
* +4: dword: занято места в буфере (в байтах)
|
||||||
|
* +8: первое сообщение
|
||||||
|
* +8+n: второе сообщение
|
||||||
|
* ...
|
||||||
|
Формат сообщения:
|
||||||
|
* +0: dword: PID процесса/потока, пославшего сообщение
|
||||||
|
* +4: dword: длина сообщения (не считая этот заголовок)
|
||||||
|
* +8: n*byte: данные сообщения
|
||||||
|
|
||||||
|
--------------- Подфункция 2 - послать сообщение IPC. ----------------
|
||||||
|
Вызывается процессом-инициатором.
|
||||||
|
Параметры:
|
||||||
|
* eax = 60 - номер функции
|
||||||
|
* ebx = 2 - номер подфункции
|
||||||
|
* ecx = PID приёмника
|
||||||
|
* edx = указатель на данные сообщения
|
||||||
|
* esi = длина сообщения (в байтах)
|
||||||
|
Возвращаемое значение:
|
||||||
|
* eax = 0 - успешно
|
||||||
|
* eax = 1 - приёмник не определил буфер для IPC-сообщений
|
||||||
|
(может быть, ещё не успел, а может быть, это не тот поток,
|
||||||
|
который нужен)
|
||||||
|
* eax = 2 - приёмник заблокировал IPC-буфер;
|
||||||
|
попробуйте немного подождать
|
||||||
|
* eax = 3 - переполнение IPC-буфера приёмника
|
||||||
|
* eax = 4 - процесса/потока с таким PID не существует
|
||||||
|
Замечания:
|
||||||
|
* Система сразу после записи IPC-сообщения в буфер посылает
|
||||||
|
потоку-приёмнику событие с кодом 7 (см. коды событий).
|
||||||
|
|
||||||
|
---------------------- Константы для регистров: ----------------------
|
||||||
|
eax - SF_IPC (60)
|
||||||
|
ebx - SSF_SET_AREA (1), SSF_SEND_MESSAGE (2)
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
inline fastcall void IpcSetArea(ECX, EDX)
|
||||||
|
{
|
||||||
|
$eax, 60
|
||||||
|
$ebx, 1
|
||||||
|
// ecx = указатель на буфер
|
||||||
|
// edx = размер буфера
|
||||||
|
$int 64
|
||||||
|
// eax = 0 - всегда успешно
|
||||||
|
}
|
||||||
|
|
||||||
|
inline fastcall int SendIpcMessage(ECX, EDX, ESI)
|
||||||
|
{
|
||||||
|
$eax, 60
|
||||||
|
$ebx, 2
|
||||||
|
// ecx = PID приёмника
|
||||||
|
// edx = указатель на данные сообщения
|
||||||
|
// esi = длина сообщения (в байтах)
|
||||||
|
$int 64
|
||||||
|
// eax = 0 - успешно
|
||||||
|
// eax = 1 - приёмник не определил буфер для IPC-сообщений
|
||||||
|
// (может быть, ещё не успел, а может быть, это
|
||||||
|
// не тот поток, который нужен)
|
||||||
|
// eax = 2 - приёмник заблокировал IPC-буфер;
|
||||||
|
// попробуйте немного подождать
|
||||||
|
// eax = 3 - переполнение IPC-буфера приёмника
|
||||||
|
// eax = 4 - процесса/потока с таким PID не существует
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
@ -661,67 +661,17 @@ inline fastcall dword GetStartTime()
|
|||||||
DrawBar(x+37,y+10,2,2,color);
|
DrawBar(x+37,y+10,2,2,color);
|
||||||
}
|
}
|
||||||
|
|
||||||
:void __path_name__(dword BUF,PATH)
|
dword __generator; // random number generator init
|
||||||
{
|
|
||||||
dword beg = PATH;
|
|
||||||
dword pos = PATH;
|
|
||||||
dword sav = PATH;
|
|
||||||
dword i;
|
|
||||||
while(DSBYTE[pos])
|
|
||||||
{
|
|
||||||
if(DSBYTE[pos]=='/')sav = pos;
|
|
||||||
pos++;
|
|
||||||
}
|
|
||||||
i = sav-beg;
|
|
||||||
while(i)
|
|
||||||
{
|
|
||||||
DSBYTE[BUF] = DSBYTE[beg];
|
|
||||||
beg++;
|
|
||||||
BUF++;
|
|
||||||
i--;
|
|
||||||
}
|
|
||||||
/*while(DSBYTE[beg])
|
|
||||||
{
|
|
||||||
DSBYTE[BUF1] = DSBYTE[beg];
|
|
||||||
beg++;
|
|
||||||
BUF1++;
|
|
||||||
}*/
|
|
||||||
//DSBYTE[BUF1] = 0;
|
|
||||||
DSBYTE[BUF] = 0;
|
|
||||||
}
|
|
||||||
char __BUF_DIR__[4096];
|
|
||||||
:struct SELF
|
|
||||||
{
|
|
||||||
dword dir;
|
|
||||||
dword file;
|
|
||||||
dword path;
|
|
||||||
} self;
|
|
||||||
|
|
||||||
dword __generator; // random number generator - äëÿ ãåíåðàöèè ñëó÷àéíûõ ÷èñåë
|
|
||||||
|
|
||||||
:dword program_path_length;
|
|
||||||
|
|
||||||
//The initialization of the initial data before running
|
//The initialization of the initial data before running
|
||||||
void ______INIT______()
|
void ______INIT______()
|
||||||
{
|
{
|
||||||
//if (program_path[0]!='/') I_Path++;
|
|
||||||
|
|
||||||
self.dir = #__BUF_DIR__;
|
|
||||||
self.file = 0;
|
|
||||||
self.path = I_Path;
|
|
||||||
__path_name__(#__BUF_DIR__,I_Path);
|
|
||||||
|
|
||||||
skin_height = GetSkinHeight();
|
skin_height = GetSkinHeight();
|
||||||
screen.width = GetScreenWidth()+1;
|
screen.width = GetScreenWidth()+1;
|
||||||
screen.height = GetScreenHeight()+1;
|
screen.height = GetScreenHeight()+1;
|
||||||
|
|
||||||
__generator = GetStartTime();
|
__generator = GetStartTime();
|
||||||
|
|
||||||
mem_init();
|
mem_init();
|
||||||
|
|
||||||
|
|
||||||
main();
|
main();
|
||||||
ExitProcess();
|
|
||||||
}
|
}
|
||||||
______STOP______:
|
______STOP______:
|
||||||
#endif
|
#endif
|
||||||
@ -733,3 +683,7 @@ ______STOP______:
|
|||||||
#ifndef INCLUDE_DEBUG_H
|
#ifndef INCLUDE_DEBUG_H
|
||||||
#include "../lib/debug.h"
|
#include "../lib/debug.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef INCLUDE_IPC_H
|
||||||
|
#include "../lib/ipc.h"
|
||||||
|
#endif
|
@ -98,7 +98,33 @@ L2:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline fastcall dword memopen(ECX, EDX, ESI)
|
||||||
|
{
|
||||||
|
$push ebx
|
||||||
|
$mov eax, 68
|
||||||
|
$mov ebx, 22
|
||||||
|
// ecx = area name, 31 symbols max
|
||||||
|
// edx = area size for SHM_CREATE SHM_OPEN_ALWAYS
|
||||||
|
// esi = flags, see the list below:
|
||||||
|
#define SHM_OPEN 0x00
|
||||||
|
#define SHM_OPEN_ALWAYS 0x04
|
||||||
|
#define SHM_CREATE 0x08
|
||||||
|
#define SHM_READ 0x00
|
||||||
|
#define SHM_WRITE 0x01
|
||||||
|
$int 0x40
|
||||||
|
$pop ebx
|
||||||
|
// eax, edx - please check system documentation
|
||||||
|
}
|
||||||
|
|
||||||
|
inline fastcall dword memclose(ECX)
|
||||||
|
{
|
||||||
|
$push ebx
|
||||||
|
$mov eax, 68
|
||||||
|
$mov ebx, 23
|
||||||
|
$int 0x40
|
||||||
|
$pop ebx
|
||||||
|
// eax destroyed
|
||||||
|
}
|
||||||
|
|
||||||
#define mem_Alloc malloc
|
#define mem_Alloc malloc
|
||||||
#define mem_ReAlloc realloc
|
#define mem_ReAlloc realloc
|
||||||
|
6
programs/cmm/menu/Tupfile.lua
Normal file
6
programs/cmm/menu/Tupfile.lua
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
if tup.getconfig("NO_CMM") ~= "" then return end
|
||||||
|
if tup.getconfig("LANG") == "ru"
|
||||||
|
then C_LANG = "LANG_RUS"
|
||||||
|
else C_LANG = "LANG_ENG" -- this includes default case without config
|
||||||
|
end
|
||||||
|
tup.rule("menu.c", "c-- /D=AUTOBUILD /D=$(C_LANG) %f" .. tup.getconfig("KPACK_CMD"), "menu.com")
|
5
programs/cmm/menu/build.bat
Normal file
5
programs/cmm/menu/build.bat
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
@del menu
|
||||||
|
@c-- menu.c
|
||||||
|
@rename menu.com menu
|
||||||
|
@del warning.txt
|
||||||
|
@pause
|
180
programs/cmm/menu/menu.c
Normal file
180
programs/cmm/menu/menu.c
Normal file
@ -0,0 +1,180 @@
|
|||||||
|
#define MEMSIZE 4096*40
|
||||||
|
|
||||||
|
#include "../lib/io.h"
|
||||||
|
#include "../lib/gui.h"
|
||||||
|
#include "../lib/collection.h"
|
||||||
|
#include "../lib/list_box.h"
|
||||||
|
#include "../lib/fs.h"
|
||||||
|
|
||||||
|
#define ITEM_H 19
|
||||||
|
|
||||||
|
llist menu1;
|
||||||
|
collection names;
|
||||||
|
collection hotkeys;
|
||||||
|
dword shared_mem;
|
||||||
|
|
||||||
|
int win_x, win_y;
|
||||||
|
|
||||||
|
int max_name_len;
|
||||||
|
int max_hotkey_len;
|
||||||
|
|
||||||
|
int selected = 0;
|
||||||
|
|
||||||
|
dword cur_param = #param;
|
||||||
|
int GetNextParam()
|
||||||
|
{
|
||||||
|
int result;
|
||||||
|
dword next_param = strchr(cur_param, ' ');
|
||||||
|
ESBYTE[next_param] = '\0';
|
||||||
|
result = atoi(cur_param);
|
||||||
|
cur_param = next_param+1;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
void GetWindowPosition()
|
||||||
|
{
|
||||||
|
int position;
|
||||||
|
shared_mem = GetNextParam();
|
||||||
|
debugval("shared_mem", ESDWORD[shared_mem]);
|
||||||
|
win_x = GetNextParam();
|
||||||
|
win_y = GetNextParam();
|
||||||
|
selected = GetNextParam();
|
||||||
|
position = GetNextParam();
|
||||||
|
if (position==2) win_x -= menu1.w;
|
||||||
|
if (position==3) {
|
||||||
|
win_x -= menu1.w;
|
||||||
|
win_y -= menu1.h;
|
||||||
|
}
|
||||||
|
if (position==4) win_y -= menu1.h;
|
||||||
|
}
|
||||||
|
|
||||||
|
void GetMenuItems(dword current_name)
|
||||||
|
{
|
||||||
|
dword next_name = strchr(current_name, '\n');
|
||||||
|
dword hotkey = strchr(current_name, '|');
|
||||||
|
|
||||||
|
ESBYTE[next_name] = '\0';
|
||||||
|
|
||||||
|
if (hotkey) && (hotkey < next_name) {
|
||||||
|
ESBYTE[hotkey] = '\0';
|
||||||
|
} else {
|
||||||
|
if (hotkey) && (!next_name) {
|
||||||
|
ESBYTE[hotkey] = '\0';
|
||||||
|
} else {
|
||||||
|
hotkey = " ";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
hotkeys.add(hotkey+1);
|
||||||
|
names.add(current_name);
|
||||||
|
|
||||||
|
if (next_name) GetMenuItems(next_name+2);
|
||||||
|
}
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
proc_info Form;
|
||||||
|
|
||||||
|
GetMenuItems(strchr(#param, '\n') + 2);
|
||||||
|
max_name_len = strlen(names.get(0)) * 6;
|
||||||
|
max_hotkey_len = strlen(hotkeys.get(0)) * 6;
|
||||||
|
|
||||||
|
//selected = ESDWORD[shared_mem];
|
||||||
|
|
||||||
|
menu1.count = names.count;
|
||||||
|
menu1.SetFont(6, 9, 0x80);
|
||||||
|
menu1.SetSizes(2,2, max_name_len + max_hotkey_len + 23, menu1.count*ITEM_H, ITEM_H);
|
||||||
|
menu1.cur_y = -1;
|
||||||
|
|
||||||
|
GetWindowPosition();
|
||||||
|
|
||||||
|
SetEventMask(EVM_REDRAW + EVM_KEY + EVM_BUTTON + EVM_MOUSE);
|
||||||
|
loop() switch(WaitEvent())
|
||||||
|
{
|
||||||
|
case evMouse:
|
||||||
|
GetProcessInfo(#Form, SelfInfo);
|
||||||
|
if (!CheckActiveProcess(Form.ID)) exit();
|
||||||
|
mouse.get();
|
||||||
|
if (menu1.ProcessMouse(mouse.x, mouse.y)) draw_list();
|
||||||
|
if (mouse.lkm)&&(mouse.up) click();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case evKey:
|
||||||
|
GetKeys();
|
||||||
|
ProcessKeys();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case evReDraw:
|
||||||
|
DefineAndDrawWindow(win_x, win_y, menu1.w+4, menu1.h+3, 0x01, 0, 0, 0x01fffFFF);
|
||||||
|
system.color.get();
|
||||||
|
Draw3DPopup(0,0,menu1.w+2,menu1.h+2);
|
||||||
|
draw_list();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ProcessKeys()
|
||||||
|
{
|
||||||
|
switch(key_scancode)
|
||||||
|
{
|
||||||
|
case SCAN_CODE_ESC:
|
||||||
|
exit();
|
||||||
|
|
||||||
|
case SCAN_CODE_ENTER:
|
||||||
|
click();
|
||||||
|
|
||||||
|
case SCAN_CODE_DOWN:
|
||||||
|
if (!menu1.KeyDown()) menu1.KeyHome();
|
||||||
|
draw_list();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SCAN_CODE_UP:
|
||||||
|
if (!menu1.KeyUp()) menu1.KeyEnd();
|
||||||
|
draw_list();
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
if (menu1.ProcessKey(key_scancode)) draw_list();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void draw_list()
|
||||||
|
{
|
||||||
|
int i, item_y;
|
||||||
|
|
||||||
|
dword active_background_color = MixColors(system.color.work_button, system.color.work,230);
|
||||||
|
dword active_top_border_color = MixColors(system.color.work_graph, system.color.work_button,240);
|
||||||
|
dword inactive_text_shadow_color = MixColors(system.color.work,0xFFFfff,150);
|
||||||
|
dword text_color;
|
||||||
|
bool skin_dark = is_the_skin_dark();
|
||||||
|
|
||||||
|
for (i=0; i<menu1.count; i++;)
|
||||||
|
{
|
||||||
|
item_y = i*ITEM_H+menu1.y;
|
||||||
|
if (i==menu1.cur_y) {
|
||||||
|
text_color = system.color.work_button_text;
|
||||||
|
DrawBar(menu1.x, item_y+1, menu1.w, ITEM_H-2, active_background_color);
|
||||||
|
DrawBar(menu1.x, item_y, menu1.w, 1, active_top_border_color);
|
||||||
|
DrawBar(menu1.x, item_y+ITEM_H-1, menu1.w, 1, system.color.work_light);
|
||||||
|
WriteText(13 + max_name_len, item_y + menu1.text_y, 0x80, text_color, hotkeys.get(i));
|
||||||
|
} else {
|
||||||
|
text_color = system.color.work_text;
|
||||||
|
DrawBar(menu1.x, item_y, menu1.w, ITEM_H, system.color.work);
|
||||||
|
if (!skin_dark) WriteText(13+1, item_y + menu1.text_y +1, 0x80, inactive_text_shadow_color, names.get(i));
|
||||||
|
WriteText(13 + max_name_len, item_y + menu1.text_y, 0x80, system.color.work_graph, hotkeys.get(i));
|
||||||
|
}
|
||||||
|
WriteText(13, item_y + menu1.text_y, 0x80, text_color, names.get(i));
|
||||||
|
}
|
||||||
|
if (selected) WriteText(5, selected*ITEM_H + menu1.y + menu1.text_y, 0x80, 0xEE0000, "\x10");
|
||||||
|
}
|
||||||
|
|
||||||
|
void click()
|
||||||
|
{
|
||||||
|
ESDWORD[shared_mem] = menu1.cur_y + 1;
|
||||||
|
ExitProcess();
|
||||||
|
}
|
||||||
|
|
||||||
|
void exit()
|
||||||
|
{
|
||||||
|
ESDWORD[shared_mem] = 0;
|
||||||
|
ExitProcess();
|
||||||
|
}
|
@ -1,6 +1,6 @@
|
|||||||
;
|
;
|
||||||
; pipes kolibri
|
; pipes kolibri
|
||||||
; v1.41
|
; v1.42
|
||||||
; 2006 by Mario Birkner
|
; 2006 by Mario Birkner
|
||||||
;
|
;
|
||||||
; l.mod. 29.01.19
|
; l.mod. 29.01.19
|
||||||
@ -274,11 +274,8 @@ pusha
|
|||||||
mov ecx,dword [speed]
|
mov ecx,dword [speed]
|
||||||
add byte [esi],10
|
add byte [esi],10
|
||||||
.down:
|
.down:
|
||||||
mov eax,5
|
mcall 5, 2
|
||||||
mov ebx,2
|
mcall 11
|
||||||
mcall
|
|
||||||
mov eax,11
|
|
||||||
mcall
|
|
||||||
cmp eax,1
|
cmp eax,1
|
||||||
jne .nored
|
jne .nored
|
||||||
call draw_window
|
call draw_window
|
||||||
@ -299,9 +296,7 @@ pusha
|
|||||||
cmp [stat],1
|
cmp [stat],1
|
||||||
jne .loose
|
jne .loose
|
||||||
call draw_message
|
call draw_message
|
||||||
mov eax,5
|
mcall 5, 500
|
||||||
mov ebx,500
|
|
||||||
mcall
|
|
||||||
mov [stat],0
|
mov [stat],0
|
||||||
inc [level]
|
inc [level]
|
||||||
cmp [speed],6 ;waterflowdelay < 6 ?
|
cmp [speed],6 ;waterflowdelay < 6 ?
|
||||||
@ -321,14 +316,10 @@ ret
|
|||||||
|
|
||||||
show_score:
|
show_score:
|
||||||
pusha
|
pusha
|
||||||
mov eax,47
|
|
||||||
mov ebx,0x20000
|
|
||||||
mov ecx,[time]
|
|
||||||
mov edx,60*65536+395
|
|
||||||
mov esi,fg2color
|
mov esi,fg2color
|
||||||
mov edi,bgcolor
|
mov edi,bgcolor
|
||||||
or esi,0x50000000
|
or esi,0x50000000
|
||||||
mcall
|
mcall 47, 0x20000, [time], <60,395>
|
||||||
mov ebx,0x50000
|
mov ebx,0x50000
|
||||||
mov ecx,[score]
|
mov ecx,[score]
|
||||||
if lang eq et
|
if lang eq et
|
||||||
@ -407,23 +398,23 @@ pusha
|
|||||||
cmp ebx,0
|
cmp ebx,0
|
||||||
jz .nowcolor
|
jz .nowcolor
|
||||||
mov ebx,eax
|
mov ebx,eax
|
||||||
cmp ebx,0x00B0B5B0
|
cmp ebx,0x00B0B4B0
|
||||||
jne .nog1
|
jne .nog1
|
||||||
jmp .wcolor
|
jmp .wcolor
|
||||||
.nog1:
|
.nog1:
|
||||||
cmp ebx,0x00A0A5A0
|
cmp ebx,0x00A0A4A0
|
||||||
jne .nog2
|
jne .nog2
|
||||||
jmp .wcolor
|
jmp .wcolor
|
||||||
.nog2:
|
.nog2:
|
||||||
cmp ebx,0x00909590
|
cmp ebx,0x00909490
|
||||||
jne .nog3
|
jne .nog3
|
||||||
jmp .wcolor
|
jmp .wcolor
|
||||||
.nog3:
|
.nog3:
|
||||||
cmp ebx,0x00808580
|
cmp ebx,0x00808480
|
||||||
jne .nog4
|
jne .nog4
|
||||||
jmp .wcolor
|
jmp .wcolor
|
||||||
.nog4:
|
.nog4:
|
||||||
cmp ebx,0x00707570
|
cmp ebx,0x00707470
|
||||||
jne .nowcolor
|
jne .nowcolor
|
||||||
jmp .wcolor
|
jmp .wcolor
|
||||||
.wcolor:
|
.wcolor:
|
||||||
@ -453,22 +444,17 @@ pusha
|
|||||||
|
|
||||||
cmp [stat],3
|
cmp [stat],3
|
||||||
jne .stat1
|
jne .stat1
|
||||||
mov eax,4
|
|
||||||
mov ebx,159 shl 16 +202
|
|
||||||
mov edx,lbl_new_game
|
|
||||||
mov ecx,btcolor
|
mov ecx,btcolor
|
||||||
or ecx,0xB0000000
|
or ecx,0xB0000000
|
||||||
mcall
|
mcall 4, <159,202>,,lbl_new_game
|
||||||
jmp .nomessage
|
jmp .nomessage
|
||||||
|
|
||||||
.stat1:
|
.stat1:
|
||||||
cmp [stat],1
|
cmp [stat],1
|
||||||
je .winmessage
|
je .winmessage
|
||||||
mov eax,4
|
|
||||||
mov ebx,170 shl 16 +196
|
|
||||||
mov edx,lbl_gameover
|
|
||||||
mov ecx,btcolor OR 0xB0000000
|
mov ecx,btcolor OR 0xB0000000
|
||||||
mcall
|
mcall 4, <170,196>, , lbl_gameover
|
||||||
add ebx,8 shl 16 +17
|
add ebx,8 shl 16 +17
|
||||||
mov edx,lbl_yscore
|
mov edx,lbl_yscore
|
||||||
mcall
|
mcall
|
||||||
@ -481,12 +467,9 @@ pusha
|
|||||||
mcall
|
mcall
|
||||||
jmp .nomessage
|
jmp .nomessage
|
||||||
.winmessage:
|
.winmessage:
|
||||||
mov eax,4
|
|
||||||
mov ebx,124 shl 16 +194
|
|
||||||
mov edx,lbl_win
|
|
||||||
mov ecx,btcolor
|
mov ecx,btcolor
|
||||||
or ecx,0xB0000000
|
or ecx,0xB0000000
|
||||||
mcall
|
mcall 4, <124,194>, , lbl_win
|
||||||
add ebx,17
|
add ebx,17
|
||||||
add edx,lbl_win2-lbl_win
|
add edx,lbl_win2-lbl_win
|
||||||
mcall
|
mcall
|
||||||
@ -515,10 +498,7 @@ pusha
|
|||||||
pop edx
|
pop edx
|
||||||
push ebx
|
push ebx
|
||||||
push ecx
|
push ecx
|
||||||
mov eax,7
|
mcall 7, 0x10000, <32,32>
|
||||||
mov ebx,0x10000
|
|
||||||
mov ecx,32 shl 16 +32
|
|
||||||
mcall
|
|
||||||
pop ecx
|
pop ecx
|
||||||
pop ebx
|
pop ebx
|
||||||
add edx,33 shl 16
|
add edx,33 shl 16
|
||||||
@ -563,7 +543,7 @@ pusha
|
|||||||
mov ebx,18 shl 16 +395
|
mov ebx,18 shl 16 +395
|
||||||
mov edx,lbl_score
|
mov edx,lbl_score
|
||||||
mcall
|
mcall
|
||||||
mov ebx,340 shl 16 +405
|
mov ebx,360 shl 16 +405
|
||||||
mov ecx,fg3color
|
mov ecx,fg3color
|
||||||
mov edx,lbl_copy
|
mov edx,lbl_copy
|
||||||
mcall
|
mcall
|
||||||
@ -584,7 +564,6 @@ lbl_win db ' T u b l i ! ',0
|
|||||||
lbl_win2 db ' Lähme edasi! ',0
|
lbl_win2 db ' Lähme edasi! ',0
|
||||||
lbl_yscore db 'Sinu tulemus:',0
|
lbl_yscore db 'Sinu tulemus:',0
|
||||||
lbl_toolbar db 'Uus mäng: Lihtne Keskmine Raske',0
|
lbl_toolbar db 'Uus mäng: Lihtne Keskmine Raske',0
|
||||||
lbl_copy db 'v1.41 2006,Mario Birkner',0
|
|
||||||
lbl_score db ' Aeg: Tulemus: Tase:',0
|
lbl_score db ' Aeg: Tulemus: Tase:',0
|
||||||
else
|
else
|
||||||
lbl_title db 'Pipes',0
|
lbl_title db 'Pipes',0
|
||||||
@ -594,10 +573,11 @@ lbl_win db ' G r e a t ! ',0
|
|||||||
lbl_win2 db " Let's keep going! ",0
|
lbl_win2 db " Let's keep going! ",0
|
||||||
lbl_yscore db 'Your Score:',0
|
lbl_yscore db 'Your Score:',0
|
||||||
lbl_toolbar db 'New Game: Easy Normal Hard',0
|
lbl_toolbar db 'New Game: Easy Normal Hard',0
|
||||||
lbl_copy db 'v1.41 2006,Mario Birkner',0
|
|
||||||
lbl_score db 'Time: Score: Level:',0
|
lbl_score db 'Time: Score: Level:',0
|
||||||
end if
|
end if
|
||||||
|
|
||||||
|
lbl_copy db '2006, Mario Birkner',0
|
||||||
|
|
||||||
;=================================================
|
;=================================================
|
||||||
; DATA - VARS
|
; DATA - VARS
|
||||||
;=================================================
|
;=================================================
|
||||||
|
BIN
programs/games/pipes/pipes.png
Normal file
BIN
programs/games/pipes/pipes.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 4.5 KiB |
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue
Block a user