From 1c48c24f72078992dfd7bd2359d91ac377d3bb10 Mon Sep 17 00:00:00 2001 From: leency Date: Fri, 28 Mar 2025 03:58:28 +0200 Subject: [PATCH] Floot-It v3.0 - adopt window size to screen size - bigger fonts - proper colored 'S' and 'L' buttons - fix issue: after won the game clicks count always increased to max - code refactoring, translate comments to English --- programs/games/flood-it/compile_eng.bat | 9 - programs/games/flood-it/compile_rus.bat | 9 - programs/games/flood-it/flood-it.c | 464 ++++++++++++------------ programs/games/flood-it/lib/kolibri.h | 42 ++- 4 files changed, 253 insertions(+), 271 deletions(-) delete mode 100644 programs/games/flood-it/compile_eng.bat delete mode 100644 programs/games/flood-it/compile_rus.bat 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..74784ddf6 100644 --- a/programs/games/flood-it/flood-it.c +++ b/programs/games/flood-it/flood-it.c @@ -1,76 +1,72 @@ -//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 *BUTTON_CAPTIONS[]={ " пїЅпїЅпїЅпїЅпїЅпїЅ [F2]", " пїЅпїЅпїЅпїЅпїЅпїЅ [F1]", " ��室 [Esc]", 0}; + char CLICKS_TEXT[]=" пїЅпїЅпїЅпїЅпїЅ: /"; + char LEVELS_TEXT[]=" пїЅпїЅпїЅпїЅ:"; - char HELP_WINDOW_CAPTION[]="Џ®¬®йм"; - char *HELP_TEXT[]={ "Љ Є ЁЈа вм ў® Flood-it?", + char HELP_WINDOW_CAPTION[]="пїЅпїЅпїЅпїЅпїЅпїЅ"; + char *HELP_TEXT[]={ "пїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅ пїЅпїЅ Flood-it?", "", - "‡ Ї®«­ЁвҐ Ї®«Ґ ®¤­Ё¬ 梥⮬ §  ®Ја ­ЁзҐ­­®Ґ зЁб«® 室®ў.", - "€Ја  ­ зЁ­ Ґвбп б ўҐае­Ґ© «Ґў®© Є«ҐвЄЁ. ‚лЎҐаЁвҐ 梥в, ­ ¦ ў ­  ®¤Ё­ Ё§", - "Єў ¤а вЁЄ®ў б«Ґў , Ё Є«ҐвЄЁ ®Єа бпвбп нвЁ¬ 梥⮬ - в Є ўл ЇаЁб®Ґ¤Ё­ЁвҐ", - "б®бҐ¤­ЁҐ Є«ҐвЄЁ в®© ¦Ґ ®Єа бЄЁ. ‡ еў вЁвм Ї®«Ґ ­г¦­® §  ¬Ё­Ё¬ «м­®Ґ", - "зЁб«® 室®ў. Џ®и Ј®ў п бва вҐЈЁп б Ё­вҐаҐб­л¬ ЇаЁ­жЁЇ®¬ - Ё§¬Ґ­Ёбм,", - "зв®Ўл Ї®ЎҐ¤Ёвм!", + "пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅ 梥⮬ пїЅпїЅ ��࠭�祭��� пїЅб«® 室��.", + "пїЅпїЅпїЅ пїЅпїЅзЁ­пїЅпїЅпїЅпїЅпїЅ пїЅ пїЅпїЅпїЅе­ҐпїЅ пїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅвЄЁ. пїЅлЎҐпїЅпїЅ 梥�, пїЅпїЅпїЅпїЅпїЅ пїЅпїЅ пїЅпїЅпїЅпїЅ пїЅпїЅ", + "пїЅпїЅпїЅпїЅпїЅвЁЄпїЅпїЅ б«ҐпїЅпїЅ, пїЅ пїЅпїЅпїЅвЄЁ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅвЁ¬ 梥⮬ - в Є пїЅпїЅ ��ᮥ�����", + "�ᥤ��� пїЅпїЅпїЅвЄЁ в®© пїЅпїЅ пїЅпїЅпїЅбЄЁ. пїЅпїЅеў пїЅпїЅпїЅ пїЅпїЅпїЅпїЅ пїЅг¦­пїЅ пїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅм­®пїЅ", + "пїЅб«® 室��. пїЅпїЅи ЈпїЅпїЅпїЅпїЅ ���⥣�� пїЅ пїЅпїЅпїЅпїЅпїЅпїЅ пїЅаЁ­жЁЇпїЅпїЅ - пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ,", + "пїЅв®ЎпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ!", "", - "€Ја вм в Є¦Ґ ¬®¦­® Є« ўЁи ¬Ё:", + "пїЅпїЅпїЅпїЅпїЅ в ЄпїЅпїЅ пїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅи ¬пїЅ:", "[Q] [W] [E]", "[A] [S] [D]", 0}; #elif LANG_EST - char *BUTTON_CAPTIONS[]={ "Uus mдng [F2]", "Abi [F1]", "Vдlju [Esc]", 0}; + char *BUTTON_CAPTIONS[]={ "Uus mпїЅng [F2]", "Abi [F1]", "VпїЅlju [Esc]", 0}; char CLICKS_TEXT[]="Klikki: /"; - char LEVELS_TEXT[]="Vдli:"; + char LEVELS_TEXT[]="VпїЅli:"; char HELP_WINDOW_CAPTION[]="Help"; - char *HELP_TEXT[]={ "Kuidas mдngida mдngu Flood-it?", + char *HELP_TEXT[]={ "Kuidas mпїЅngida mпїЅngu Flood-it?", "", - "Ujuta kogu mдnguvдli ьle ьhe vдrviga lubatud kдikude arvuga.", - "Mдngu alustad ьlemisest vasakust nurgast ja edened valides ьhe vдrvi", - "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!", + "Ujuta kogu mпїЅnguvпїЅli пїЅle пїЅhe vпїЅrviga lubatud kпїЅikude arvuga.", + "MпїЅngu alustad пїЅlemisest vasakust nurgast ja edened valides пїЅhe vпїЅrvi", + "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!", "", - "Mдngida saab ka klaviatuuriga:", + "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:"; @@ -83,7 +79,6 @@ char *BOARD_SIZES[]={ "S", "L", 0 }; "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", "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 +87,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 +127,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 +403,7 @@ void draw_field() } -void help() +void help_thread() { int i; @@ -429,10 +415,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)