diff --git a/programs/games/flood-it/build.bat b/programs/games/flood-it/build.bat new file mode 100644 index 000000000..8d79a654c --- /dev/null +++ b/programs/games/flood-it/build.bat @@ -0,0 +1,5 @@ +@del *. +@For /R %%i In (*.c) Do c-- "%%i" +@rename *.com *. +@pause +@del warning.txt diff --git a/programs/games/flood-it/compile_eng.bat b/programs/games/flood-it/compile_eng.bat deleted file mode 100644 index 947b137f8..000000000 --- a/programs/games/flood-it/compile_eng.bat +++ /dev/null @@ -1,9 +0,0 @@ -@del lang.h-- -@echo #define LANG_ENG 1 >lang.h-- -C-- flood-it.c -@del flood-it -@rename flood-it.com flood-it -@kpack flood-it -@del lang.h-- -@del warning.txt -@pause \ No newline at end of file diff --git a/programs/games/flood-it/compile_rus.bat b/programs/games/flood-it/compile_rus.bat deleted file mode 100644 index bcd55f9b4..000000000 --- a/programs/games/flood-it/compile_rus.bat +++ /dev/null @@ -1,9 +0,0 @@ -@del lang.h-- -@echo #define LANG_RUS 1 >lang.h-- -C-- flood-it.c -@del flood-it -@rename flood-it.com flood-it -@kpack flood-it -@del lang.h-- -@del warning.txt -@pause \ No newline at end of file diff --git a/programs/games/flood-it/flood-it.c b/programs/games/flood-it/flood-it.c index fe458d8c2..ac228941d 100644 --- a/programs/games/flood-it/flood-it.c +++ b/programs/games/flood-it/flood-it.c @@ -1,49 +1,44 @@ -//Leency 06.10.2011, Flood-it! v2.41, GPL +// SPDX-License-Identifier: GPL-2.0-only +// Flood-it! - Strategy game: Flood the board with one color, within a step limit. +// Copyright (C) 2011-2025 Leency #include "lib\kolibri.h" #include "lib\random.h" -#ifndef AUTOBUILD -#include "lang.h--" -#endif - system_colors sc; proc_info Form; -dword stak[100]; //окно помощи +dword help_window_stak[100]; -//уровни сложности -int DIFFICULTY_LEV_PARAMS[]={ 28, 14, 25, //легко - 17, 28, 50}; //тяжело - -//по-умолчанию "легко" -int BLOCK_SIZE = 28; //размер квадратика -int BLOCKS_NUM = 14; //количество квадратиков по Х и по Y -int MAX_CLICKS = 25; //максимальное количество кликов до выигрыша +#define DEFAULT_BLOCK_COUNT 14 +#define DEFAULT_MAX_CLICKS 25 +#define MAX_BLOCK_SIZE 28 +char board_size = -1; +int BLOCK_SIZE; //cell size +int BLOCKS_NUM; //number of cells by X and Y +int MAX_CLICKS; //max clicks for win +int CLICKS; //how many clicks user already did +int game_end; -int CLICKS = 0; //сколько ходов уже сделал игрок +#define USER_PANEL_WIDTH 144 -#define USER_PANEL_WIDTH 119 - -//шесть цветов используется в игре для квадратиков, седьмой же (последний) для того, -//чтобы отметить квадратики в процессе заливки -dword FIELD_COLORS[]= {0xf18db6, 0x605ca8, 0xfddc80, 0xdc4a20, 0x46b1e2, 0x7e9d1e, 0x232323, 0}; -char *BOARD_SIZES[]={ "S", "L", 0 }; +//six colors are used in a game for a cells +//and seventh color is used to mark a cell during filling process +dword FIELD_COLORS[] = {0xf18db6, 0x605ca8, 0xfddc80, 0xdc4a20, 0x46b1e2, 0x7e9d1e, 0x232323}; +char BOARD_SIZES[] = "S\0L"; #ifdef LANG_RUS char *BUTTON_CAPTIONS[]={ " ‡ ­®ў® [F2]", " Џ®¬®йм [F1]", " ‚л室 [Esc]", 0}; - char CLICKS_TEXT[]=" Љ«ЁЄЁ: /"; - char LEVELS_TEXT[]="Џ®«Ґ:"; + char CLICKS_TEXT[]="Љ«ЁЄ®ў: /"; + char LEVELS_TEXT[]=" Џ®«Ґ:"; char HELP_WINDOW_CAPTION[]="Џ®¬®йм"; char *HELP_TEXT[]={ "Љ Є ЁЈа вм ў® Flood-it?", "", - "‡ Ї®«­ЁвҐ Ї®«Ґ ®¤­Ё¬ 梥⮬ §  ®Ја ­ЁзҐ­­®Ґ зЁб«® 室®ў.", - "€Ја  ­ зЁ­ Ґвбп б ўҐае­Ґ© «Ґў®© Є«ҐвЄЁ. ‚лЎҐаЁвҐ 梥в, ­ ¦ ў ­  ®¤Ё­ Ё§", - "Єў ¤а вЁЄ®ў б«Ґў , Ё Є«ҐвЄЁ ®Єа бпвбп нвЁ¬ 梥⮬ - в Є ўл ЇаЁб®Ґ¤Ё­ЁвҐ", - "б®бҐ¤­ЁҐ Є«ҐвЄЁ в®© ¦Ґ ®Єа бЄЁ. ‡ еў вЁвм Ї®«Ґ ­г¦­® §  ¬Ё­Ё¬ «м­®Ґ", - "зЁб«® 室®ў. Џ®и Ј®ў п бва вҐЈЁп б Ё­вҐаҐб­л¬ ЇаЁ­жЁЇ®¬ - Ё§¬Ґ­Ёбм,", - "зв®Ўл Ї®ЎҐ¤Ёвм!", + "‚лЎҐаЁвҐ 梥в, ­ ¦ ў ­  ®¤Ё­ Ё§ Єў ¤а вЁЄ®ў. Љ«ҐвЄЁ ®Єа бпвбп", + "нвЁ¬ 梥⮬ ЌЂ—€ЌЂџ ‘ ‚…ђ•Ќ…‰ ‹…‚Ћ‰ - в Є ўл ЇаЁб®Ґ¤Ё­ЁвҐ", + "б®бҐ¤­ЁҐ Є«ҐвЄЁ в®© ¦Ґ ®Єа бЄЁ. ‡ еў вЁвм Ї®«Ґ ­г¦­® § ", + "®Ја ­ЁзҐ­­®Ґ зЁб«® 室®ў. „®бвгЇ­® ¤ў  а §¬Ґа  ¤®бЄЁ.", "", "€Ја вм в Є¦Ґ ¬®¦­® Є« ўЁи ¬Ё:", "[Q] [W] [E]", @@ -62,28 +57,25 @@ char *BOARD_SIZES[]={ "S", "L", 0 }; "vajutades nuppudele vasakul. Kui sa muudad vдrvi pragusel alal,", "siis iga kokkupuutuv sama vдrv muutub samaks. Nii saad ujutada", "teised alad mдnguvдljal ьle. Valida saad 2 mдnguvдlja suuruse", - "vahel. Proovi vдli ьle ujutada etteandtud kдikude arvuga!", - "Kaasahaarav ja lхbus!", + "vahel.", "", "Mдngida saab ka klaviatuuriga:", "[Q] [W] [E]", "[A] [S] [D]", 0}; #else - char *BUTTON_CAPTIONS[]={ "New Game [F2]", "Help [F1]", "Exit [Esc]", 0}; + char *BUTTON_CAPTIONS[]={ "Restart [F2]", " Help [F1]", " Exit [Esc]", 0}; char CLICKS_TEXT[]="Clicks: /"; char LEVELS_TEXT[]="Board:"; char HELP_WINDOW_CAPTION[]="Help"; char *HELP_TEXT[]={ "How to play Flood-it?", "", - "Flood the whole board with one color within the allowed steps.", - "You start from the top left corner and progress by selecting one", + "You start from the TOP LEFT corner and progress by selecting one", "of the colored buttons on the left. When you change your current area", "color, every adjacent square with the same color also changes, that", - "way you can flood other areas of the board. Select from 3 sizes of", + "way you can flood other areas of the board. Select from 2 sizes of", "the board and try to flood-it in the least amount of steps!", - "Addictive and Fun!", "", "You can also play with keyboard:", "[Q] [W] [E]", @@ -92,7 +84,7 @@ char *BOARD_SIZES[]={ "S", "L", 0 }; #endif -unsigned char color_matrix[28*28]; //цвета для поля с квадратиками +unsigned char color_matrix[28*28]; //our field unsigned char loss_matrix[14*14]={ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, @@ -132,152 +124,160 @@ void main() { int key, id; + set_board_size(0); //small board by default new_game(); - loop() + loop() switch(WaitEvent()) { - switch(WaitEvent()) - { - case evButton: - id = GetButtonID(); - IF (id==1) || (id==4) ExitProcess(); - IF (id==2) goto _NEW_GAME_MARK; - IF (id==3) goto _HELP_MARK; - IF (id>=100) - { - make_turn(id-100); + case evButton: + id = GetButtonID(); + IF (id==1) || (id==4) ExitProcess(); + IF (id==2) goto _NEW_GAME_MARK; + IF (id==3) goto _HELP_MARK; + IF (id>=100) { + make_turn(id-100); + } + if (id==10) set_board_size(0); + if (id==11) set_board_size(1); + break; + case evKey: + key = GetKeyScancode(); + IF (key==01) //Escape + ExitProcess(); + IF (key==59) //F1 + { + _HELP_MARK: + CreateThread(#help_thread,#help_window_stak); break; - } - if (id>=10) - { - id=id-10*3; - - IF (BLOCK_SIZE == DIFFICULTY_LEV_PARAMS[id]) break; //выбран тот же размер - - BLOCK_SIZE = DIFFICULTY_LEV_PARAMS[id]; //размер квадратика - BLOCKS_NUM = DIFFICULTY_LEV_PARAMS[id+1]; //количество квадратиков по Х и по Y - MAX_CLICKS = DIFFICULTY_LEV_PARAMS[id+2]; //максимальное количество кликов до выигрыша - + } + IF (key==60) //F2 + { + _NEW_GAME_MARK: new_game(); - - MoveSize(-1, -1, BLOCK_SIZE*BLOCKS_NUM +14+USER_PANEL_WIDTH, BLOCK_SIZE*BLOCKS_NUM +GetSkinHeight()+14); - } - break; - case evKey: - key = GetKeyScancode(); - IF (key==01) //Escape - ExitProcess(); - IF (key==59) //F1 - { - _HELP_MARK: - CreateThread(#help,#stak); - } - IF (key==60) //F2 - { - _NEW_GAME_MARK: - new_game(); - draw_clicks_num(); - draw_field(); - } - IF (key==16) make_turn(0); //Q - IF (key==17) make_turn(1); //W - IF (key==18) make_turn(2); //E - IF (key==30) make_turn(3); //A - IF (key==31) make_turn(4); //S - IF (key==32) make_turn(5); //D - break; - case evReDraw: - draw_window(); - } + draw_clicks_num(); + draw_field(); + break; + } + IF (key==16) make_turn(0); //Q + IF (key==17) make_turn(1); //W + IF (key==18) make_turn(2); //E + IF (key==30) make_turn(3); //A + IF (key==31) make_turn(4); //S + IF (key==32) make_turn(5); //D + break; + case evReDraw: + draw_window(); + } +} + +void set_board_size(char s) +{ + if (board_size != s) { + board_size = s; + + BLOCKS_NUM = board_size + 1 * DEFAULT_BLOCK_COUNT; + MAX_CLICKS = board_size + 1 * DEFAULT_MAX_CLICKS; + + BLOCK_SIZE = GetScreenHeight() - 70 / BLOCKS_NUM; + if (BLOCK_SIZE > MAX_BLOCK_SIZE) BLOCK_SIZE = MAX_BLOCK_SIZE; + + new_game(); + + MoveSize(-1, -1, BLOCK_SIZE*BLOCKS_NUM +14+USER_PANEL_WIDTH, + BLOCK_SIZE*BLOCKS_NUM +GetSkinHeight()+14); } } void make_turn(int turn_id) { - IF (color_matrix[0]==turn_id) return; //если цвет первой фишки такой же, игнорируем бессмысленный ход - IF (CLICKS>=MAX_CLICKS) return; //если игра закончена - - CLICKS++; - draw_clicks_num(); - - fill_field(turn_id); - draw_field(); - check_for_end(); //если игра закончена + IF (color_matrix[0]==turn_id) return; //ignore no-sence click: first item color is equal to a new color + IF (!game_is_ended()) { + CLICKS++; + draw_clicks_num(); + fill_field(turn_id); + if (!game_is_ended()) draw_field(); + } } - void draw_window() { - int i, j; + int i; #define BUTTON_SIZE 28 sc.get(); - DefineAndDrawWindow(300,176, BLOCK_SIZE*BLOCKS_NUM +14+USER_PANEL_WIDTH, BLOCK_SIZE*BLOCKS_NUM +GetSkinHeight()+14, 0x74,sc.work,0,0,"Flood-it!"); + DefineAndDrawWindow(300,176, BLOCK_SIZE*BLOCKS_NUM +14+USER_PANEL_WIDTH, + BLOCK_SIZE*BLOCKS_NUM +GetSkinHeight()+14, 0x74,0,"Flood-it!"); - //проверяем не схлопнуто ли окно в заголовок + // Fix rolled-up bug GetProcessInfo(#Form, SelfInfo); IF (Form.status_window==4) return; - //закрашиваем фон -> уменьшает перерисовку + // Fill background to reduce window redraw for (i=0;i<=4;i++) { - IF (i<>4) - DrawRegion(USER_PANEL_WIDTH+i-5,i, BLOCK_SIZE*BLOCKS_NUM +9-i-i, BLOCK_SIZE*BLOCKS_NUM+9-i-i, sc.work); - else - DrawRegion(USER_PANEL_WIDTH+i-5,i, BLOCK_SIZE*BLOCKS_NUM +9-i-i, BLOCK_SIZE*BLOCKS_NUM+9-i-i, sc.work_graph); //ободок + ESI = sc.work; + IF (i==4) ESI = sc.work_graph; + DrawRegion(USER_PANEL_WIDTH+i-5,i, BLOCK_SIZE*BLOCKS_NUM +9-i-i, ESI); } DrawBar(0,0, USER_PANEL_WIDTH-5, BLOCK_SIZE*BLOCKS_NUM+10, sc.work); - - //кнопочки заливки + + // Main buttons to fill the board + #define FILL_BUTTON_SIZE BUTTON_SIZE+8 + for (i=0;i<6;i++) + DefineButton(i%3*FILL_BUTTON_SIZE+17,i/3*FILL_BUTTON_SIZE+15,FILL_BUTTON_SIZE,FILL_BUTTON_SIZE, i+100,FIELD_COLORS[i]); + + // Menu buttons + for (i=0;i<3;i++) + { + DefineButton(17,i*31+140, 13*8+6, 25, i+2,sc.work_button); + WriteText(17+4,i*31+146,0x90,sc.work_button_text,BUTTON_CAPTIONS[i],0); + } + + // Board size + WriteText(17,BLOCKS_NUM*BLOCK_SIZE-25+7,0x90,sc.work_text,#LEVELS_TEXT,0); for (i=0;i<2;i++) - for (j=0;j<3;j++) - DefineButton(j*BUTTON_SIZE+17,i*BUTTON_SIZE+15,BUTTON_SIZE,BUTTON_SIZE, i*3+j+100,FIELD_COLORS[i*3+j]); - - //кнопочки действий - for (j=0;j<3;j++) { - DefineButton(17,j*25+120, 13*6+6, 20, j+2,sc.work_button); - WriteText(17+4,j*25+127,0x80,sc.work_button_text,BUTTON_CAPTIONS[j],0); - } + IF (board_size == i) { + ESI=sc.work_button; + EDI=sc.work_button_text; + } ELSE { + ESI = sc.work; + EDI = sc.work_text; + } - //кнопочки выбора уровня сложности - WriteText(17,BLOCKS_NUM*BLOCK_SIZE-20+7,0x80,sc.work_text,#LEVELS_TEXT,0); - for (j=0;j<2;j++) - { - DefineButton(j*25+56,BLOCKS_NUM*BLOCK_SIZE-20, 20,20, j+10,sc.work_button); - - IF (BLOCK_SIZE == DIFFICULTY_LEV_PARAMS[j*3]) EDI=0x800080; - else EDI=sc.work_button_text; - - WriteText(j*25+56+8,BLOCKS_NUM*BLOCK_SIZE-20+7,0x80,EDI,BOARD_SIZES[j],0); - WriteText(j*25+56+9,BLOCKS_NUM*BLOCK_SIZE-20+7,0x80,EDI,BOARD_SIZES[j],0); + DefineButton(i*32+69,BLOCKS_NUM*BLOCK_SIZE-24, 26,25, i+10,ESI); + WriteText(i*32+69+9,BLOCKS_NUM*BLOCK_SIZE-24+6,0x90,EDI,#BOARD_SIZES+i+i,0); + $add ebx, 1<<16 //bold + $int 0x40 } - draw_clicks_num(); - + draw_clicks_num(); draw_field(); - } +void randomly_fill_the_board() +{ + int i; + for (i=0;iold_color_id) continue; //если фишка не нужного цвета идём дальше - IF (color_matrix[i*BLOCKS_NUM+j]==MARKED) continue; //если фишка уже отмечена, идём далее + cur_cell = i*BLOCKS_NUM+j; + IF (color_matrix[cur_cell]<>old_color_id) continue; //if not a needed color then continue + IF (color_matrix[cur_cell]==MARKED) continue; //if already marked then continue - IF (j>0) && (color_matrix[i*BLOCKS_NUM+j-1]==MARKED) color_matrix[i*BLOCKS_NUM+j]=MARKED; //смотрим левый - IF (i>0) && (color_matrix[i-1*BLOCKS_NUM+j]==MARKED) color_matrix[i*BLOCKS_NUM+j]=MARKED; //смотрим верхний - IF (j0) && (color_matrix[i*BLOCKS_NUM+j-1]==MARKED) color_matrix[cur_cell]=MARKED; //left + IF (i>0) && (color_matrix[i-1*BLOCKS_NUM+j]==MARKED) color_matrix[cur_cell]=MARKED; //top + IF (j=MAX_CLICKS) //если проигрыш - { - IF (CLICKS==MAX_CLICKS) //выигрышь на последнем ходе - { - for (i=0;icolor_matrix[0]) goto _loss_MARK; - goto _WIN_MARK; - } - - _loss_MARK: - - for (i=0;i<14;i++) - for (j=0;j<14;j++) - { - IF (BLOCK_SIZE == DIFFICULTY_LEV_PARAMS[0]) - { - ii=i; - jj=j; - } - else - { - ii=i*2; - jj=j*2; - } - color_matrix[ii*BLOCKS_NUM+jj]=loss_matrix[i*14+j]; - color_matrix[ii+1*BLOCKS_NUM+jj]=loss_matrix[i*14+j]; - color_matrix[ii*BLOCKS_NUM+jj+1]=loss_matrix[i*14+j]; - color_matrix[ii+1*BLOCKS_NUM+jj+1]=loss_matrix[i*14+j]; - draw_field(); - //Pause(5); - } - - return 1; - } - - for (i=0;icolor_matrix[0]) return 0; - - //всё поле одного цвета и фишек меньше MAX_CLICKS -> победа - - _WIN_MARK: - - for (i=0;i<25;i++) - { - new_game(); - draw_field(); - Pause(7); - } - - CLICKS=MAX_CLICKS; - - for (i=0;i<14;i++) + for (i=0;i<14;i++) { for (j=0;j<14;j++) { - IF (BLOCK_SIZE == DIFFICULTY_LEV_PARAMS[0]) //заливка для полей разного размера разная - { - ii=i; - jj=j; - } - else - { - ii=i*2; - jj=j*2; - } - color_matrix[ii*BLOCKS_NUM+jj]=win_matrix[i*14+j]; - color_matrix[ii+1*BLOCKS_NUM+jj]=win_matrix[i*14+j]; - color_matrix[ii*BLOCKS_NUM+jj+1]=win_matrix[i*14+j]; - color_matrix[ii+1*BLOCKS_NUM+jj+1]=win_matrix[i*14+j]; + ii = board_size * 2 + i; + jj = board_size * 2 + j; + color_matrix[ii*BLOCKS_NUM+jj]= + color_matrix[ii+1*BLOCKS_NUM+jj]= + color_matrix[ii*BLOCKS_NUM+jj+1]= + color_matrix[ii+1*BLOCKS_NUM+jj+1]=ESBYTE[i*14+j+matrix]; + draw_field(); + } + } +} + +int field_is_solid() +{ + int i; + if (game_end) return 1; + game_end = 1; + for (i=0;icolor_matrix[0]) game_end = 0; + } + return game_end; +} + +int game_is_ended() +{ + int i; + + if (game_end) return 1; + + if (CLICKS>=MAX_CLICKS) //check for game end via max_clicks + { + IF (CLICKS==MAX_CLICKS) //probably user won on the last step + { + if (field_is_solid()) goto _WIN_MARK; + } + draw_win_or_loose_animation(#loss_matrix); + return 1; + } else { + if (!field_is_solid()) return 0; + + //field is solid and CLICKS win + + _WIN_MARK: + + for (i=0;i<25;i++) + { + randomly_fill_the_board(); draw_field(); - //Pause(5); - } - return 1; + Pause(7); + } + + draw_win_or_loose_animation(#win_matrix); + return 1; + } } void draw_clicks_num() { - #define TEXT_X 21 - #define TEXT_Y 92 + #define TEXT_X 19 + #define TEXT_Y 100 - DrawBar(TEXT_X, TEXT_Y, USER_PANEL_WIDTH-TEXT_X-3,9, sc.work); + DrawBar(TEXT_X, TEXT_Y, USER_PANEL_WIDTH-TEXT_X-5,16, sc.work); - WriteText(TEXT_X,TEXT_Y,0x80,sc.work_text,#CLICKS_TEXT,0); + WriteText(TEXT_X,TEXT_Y,0x90,sc.work_text,#CLICKS_TEXT,0); - IF (CLICKS<10) EBX=9*6+TEXT_X; - else EBX=8*6+TEXT_X; + IF (CLICKS<10) EBX=9*8+TEXT_X; + else EBX=8*8+TEXT_X; - WriteText(EBX,TEXT_Y,0x80,sc.work_text,IntToStr(CLICKS),0); + WriteText(EBX,TEXT_Y,0x90,sc.work_text,itoa_nosign(CLICKS),0); - WriteText(11*6+TEXT_X,TEXT_Y,0x80,sc.work_text,IntToStr(MAX_CLICKS),0); + WriteText(11*8+TEXT_X,TEXT_Y,0x90,sc.work_text,itoa_nosign(MAX_CLICKS),0); } @@ -417,7 +400,7 @@ void draw_field() } -void help() +void help_thread() { int i; @@ -429,10 +412,10 @@ void help() IF (GetKeyScancode()==001) ExitProcess(); //Esc break; case evReDraw: - for (i=0; HELP_TEXT[i]<>0; i++;) {}; - DefineAndDrawWindow(400,200,610,i*19+25+GetSkinHeight(),0x34,sc.work,0,0,#HELP_WINDOW_CAPTION); - WriteText(6,12,0x90,sc.work_text,HELP_TEXT[0],0); //это для жирного шрифта - for (i=0; HELP_TEXT[i]<>0; i++;) WriteText(5,i*19+12,0x90,sc.work_text,HELP_TEXT[i],0); + //for (i=0; HELP_TEXT[i]<>0; i++;) {}; //calculate line numbers, predefined i=12 used to reduce size + DefineAndDrawWindow(400,200,612,12*19+25+GetSkinHeight(),0x34,sc.work,#HELP_WINDOW_CAPTION); + WriteText(6,12,0x90,sc.work_text,HELP_TEXT[0],0); //for a bold text + for (i=0; HELP_TEXT[i]<>0; i++;) WriteText(7,i*19+12,0x90,sc.work_text,HELP_TEXT[i],0); } } diff --git a/programs/games/flood-it/lib/kolibri.h b/programs/games/flood-it/lib/kolibri.h index 6f6d86d11..d12ba56ee 100644 --- a/programs/games/flood-it/lib/kolibri.h +++ b/programs/games/flood-it/lib/kolibri.h @@ -23,6 +23,10 @@ dword I_Path = 0; #define BT_HIDE 0x40000000 #define BT_NOFRAME 0x20000000 +#define bool char +#define true 1 +#define false 0 + //------------------------------------------------------------------------- @@ -94,16 +98,11 @@ inline fastcall Pause(dword EBX) //------------------------------------------------------------------------------ -char buffer[11]=""; -inline fastcall dword IntToStr(dword ESI) +char buffer[5]; +inline fastcall dword itoa_nosign(dword ESI) { $mov edi, #buffer $mov ecx, 10 - $test esi, esi - $jns f1 - $mov al, '-' - $stosb - $neg esi f1: $mov eax, esi $push -'0' @@ -126,7 +125,7 @@ f3: //------------------------------------------------------------------------------ -void DefineAndDrawWindow(dword x,y,sizeX,sizeY,byte mainAreaType,dword mainAreaColour,byte headerType,dword headerColour,EDI) +void DefineAndDrawWindow(dword x,y,sizeX,sizeY,byte mainAreaType,dword mainAreaColour,EDI) { EAX = 12; // function 12:tell os about windowdraw EBX = 1; @@ -135,7 +134,7 @@ void DefineAndDrawWindow(dword x,y,sizeX,sizeY,byte mainAreaType,dword mainAreaC EBX = x << 16 + sizeX; ECX = y << 16 + sizeY; EDX = mainAreaType << 24 | mainAreaColour; - ESI = headerType << 24 | headerColour; + ESI = 0; $xor eax,eax $int 0x40 @@ -166,6 +165,13 @@ dword GetSkinHeight() $pop ebx } +inline fastcall int GetScreenHeight() +{ + $mov eax, 14 + $int 0x40 + $and eax,0x0000FFFF +} + void WriteText(dword x,y,byte fontType, dword color, EDX, ESI) { EAX = 4; @@ -190,12 +196,20 @@ void DefineButton(dword x,y,w,h,EDX,ESI) $int 0x40 } -void DrawRegion(dword x,y,width,height,EDX) +void DrawRegion(dword x,y,s,EDX) { - DrawBar(x,y,width,1,EDX); - DrawBar(x,y+height,width,1,EDX); - DrawBar(x,y,1,height,EDX); - DrawBar(x+width,y,1,height+1,EDX); + EAX = 13; + EBX = x<<16+s; + ECX = y<<16+1; + $int 0x40 + ECX = y+s<<16+1; + $int 0x40 + EBX = x<<16+1; + ECX = y<<16+s; + $int 0x40 + EBX = x+s<<16+1; + ECX = y<<16+s+1; + $int 0x40 } inline fastcall dword WriteDebug(dword EDX)