From e4eed9e36dc21349b59ba1d35f2161b09655a137 Mon Sep 17 00:00:00 2001 From: maxcodehack Date: Fri, 2 Oct 2020 07:23:01 +0000 Subject: [PATCH] Fridge - Add victory screen, and print to board a message - Add random restart git-svn-id: svn://kolibrios.org@8084 a494cfbc-eb01-0410-851d-a64ba20cac60 --- programs/games/fridge/fridge.c | 306 ++++++++++++++--------- programs/games/fridge/how_to_compile.txt | 4 +- 2 files changed, 192 insertions(+), 118 deletions(-) diff --git a/programs/games/fridge/fridge.c b/programs/games/fridge/fridge.c index 4a748e0b74..10f040704e 100644 --- a/programs/games/fridge/fridge.c +++ b/programs/games/fridge/fridge.c @@ -2,35 +2,47 @@ #include #include #include +#include #include "kolibri_libimg.h" -/* - EVENTS LOOK LIKE IN C-- -*/ - -#define evReDraw 1 -#define evKey 2 -#define evButton 3 +//EVENTS LOOK LIKE IN C-- +#define evReDraw 1 +#define evKey 2 +#define evButton 3 +#define evExit 4 +#define evDesktop 5 +#define evMouse 6 +#define evIPC 7 +#define evNetwork 8 +#define evDebug 9 + +#define RESTART 99 + +#define b_color 0xbbbbbb #define _size 4 - #define bs 44 - int field[_size][_size] = { {0, 0, 0, 1}, {0, 0, 1, 0}, {0, 0, 0, 1}, {1, 0, 0, 0} + /*{0, 0, 0, 0}, + {0, 0, 0, 0}, + {0, 0, 0, 0}, + {0, 0, 0, 0}*/ }; +short vict = 0; +short debug_pr = 0; + +char* title = "Fridge"; -char* title = "Fridge v0.1"; // PICTURES LOADING CODE - char temp_path[4096]; char* HOR; char* VER; @@ -38,130 +50,190 @@ char* VER; char* load_file_inmem(char* fname, int32_t* read_sz) { - FILE *f = fopen(fname, "rb"); - if (!f) { - exit(1); - } - if (fseek(f, 0, SEEK_END)) { - exit(1); - } - int filesize = ftell(f); - rewind(f); - char* fdata = malloc(filesize); - if(!fdata) { - exit(1); - } - *read_sz = fread(fdata, 1, filesize, f); - if (ferror(f)) { - exit(1); - } - fclose(f); + FILE *f = fopen(fname, "rb"); + if (!f) { + exit(1); + } + if (fseek(f, 0, SEEK_END)) { + exit(1); + } + int filesize = ftell(f); + rewind(f); + char* fdata = malloc(filesize); + if(!fdata) { + exit(1); + } + *read_sz = fread(fdata, 1, filesize, f); + if (ferror(f)) { + exit(1); + } + fclose(f); - return fdata; + return fdata; } - - void load_pict() { - const int icon_rgb_size = bs*bs; - char *image_data, - *filedata; - - strcpy(temp_path, "h.png"); + const int icon_rgb_size = bs*bs; + char *image_data, + *filedata; + + strcpy(temp_path, "h.png"); - int32_t read_bytes; - filedata = load_file_inmem(temp_path, &read_bytes); - HOR = malloc(icon_rgb_size * 3); - - image_data = img_decode(filedata, read_bytes, 0); - - img_to_rgb2(image_data, HOR); - - - strcpy(temp_path, "v.png"); + int32_t read_bytes; + filedata = load_file_inmem(temp_path, &read_bytes); + HOR = malloc(icon_rgb_size * 3); + + image_data = img_decode(filedata, read_bytes, 0); + + img_to_rgb2(image_data, HOR); + + + strcpy(temp_path, "v.png"); - filedata = load_file_inmem(temp_path, &read_bytes); - VER = malloc(icon_rgb_size * 3); - - image_data = img_decode(filedata, read_bytes, 0); - - img_to_rgb2(image_data, VER); - - img_destroy(image_data); - free(filedata); + filedata = load_file_inmem(temp_path, &read_bytes); + VER = malloc(icon_rgb_size * 3); + + image_data = img_decode(filedata, read_bytes, 0); + + img_to_rgb2(image_data, VER); + + img_destroy(image_data); + free(filedata); } +// END OF PICTURES LOAD CODE - -// END OF PIC LOAD CODE - - void redraw_buttons() { - for (int j = 5, yy = 0; yy<_size; j+=bs, yy++) - for (int i = 15, xx = 0; xx<_size; i+=bs, xx++) - { - define_button(65536 * i + (bs-1), 65536 * j + (bs-1), ((xx+1)*10)+yy+1, 0xbbbbbb); - - if (field[yy][xx]) draw_bitmap(VER, i, j, bs, bs); - else draw_bitmap(HOR, i, j, bs, bs); - } + for (int j = 5, yy = 0; yy<_size; j+=bs, yy++) + for (int i = 15, xx = 0; xx<_size; i+=bs, xx++) + { + define_button(65536 * i + (bs-1), 65536 * j + (bs-1), ((xx+1)*10)+yy+1, b_color); + + if (field[yy][xx]) draw_bitmap(VER, i, j, bs, bs); + else draw_bitmap(HOR, i, j, bs, bs); + } } -void draw_window(){ - BeginDraw(); - DrawWindow(215,100,220, 220,title,0xbbbbbb,0x34); - redraw_buttons(); - EndDraw(); +void draw_game_window(){ + BeginDraw(); + DrawWindow(215,100,220, 220,title,b_color,0x34); + redraw_buttons(); + EndDraw(); } + + +static inline +void draw_text_sysNEW(const char *text, int x, int y, int len, int fontType, color_t color) +{ + __asm__ __volatile__( + "int $0x40" + ::"a"(4),"d"(text), + "b"((x << 16) | y), + "S"(len),"c"(fontType<<24+color) + :"memory"); +} + +void SetUp() { + for (int y = 0; y<_size; y++) + for (int x = 0; x<_size; x++) + { + field[x][y] = rand() % 2; + } +} + +void draw_victory_window() { + BeginDraw(); + DrawWindow(215,100,220, 220,title,b_color,0x34); + + draw_text_sysNEW("Ну вы, и", 10, 10, strlen("Ну вы, и"), 0xB1, 0x000000); + draw_text_sysNEW("медвежатник,", 10, 50, strlen("Ну вы, и медвежатник,"), 0xB1, 0x000000); + draw_text_sysNEW("Шеф!", 12, 90, strlen("Шеф!"), 0xB1, 0x000000); + + if (debug_pr) { + printf("Fridge: Very great!\n"); + debug_pr = 0; + } + + define_button(65536 * ((220/2)-(50)) + 140, 65536 * 140 + 25+12, RESTART, 0x9A9A9A); + draw_text_sysNEW("Заново", 80, 145, strlen("Заново"), 0xB1, 0x000000); + EndDraw(); +} + + + void Button() { - int id = get_os_button(); - if (id == 1) exit(0); else - { - int x = (id/10)-1; - int y = (id%10)-1; - - for (int i = 0; i<_size; i++) - if (field[i][x]) field[i][x] = 0; else field[i][x] = 1; - - for (int i = 0; i<_size; i++) - if (field[y][i]) field[y][i] = 0; else field[y][i] = 1; + int id = get_os_button(); + if (id == 1) exit(0); else + if (id == RESTART) { + SetUp(); + vict = 0; + draw_game_window(); + } else + { + int x = (id/10)-1; + int y = (id%10)-1; - if (field[y][x]) field[y][x] = 0; else field[y][x] = 1; - - redraw_buttons(); - } + for (int i = 0; i<_size; i++) + if (field[i][x]) field[i][x] = 0; else field[i][x] = 1; + + for (int i = 0; i<_size; i++) + if (field[y][i]) field[y][i] = 0; else field[y][i] = 1; + + if (field[y][x]) field[y][x] = 0; else field[y][x] = 1; + + redraw_buttons(); + } } -int main(int argc, char **argv) -{ - if (kolibri_libimg_init() == -1) - { - printf("Can not load libimg.obj!\n"); - exit(1); - } - - load_pict(); - - draw_window(); - while(1) - { - switch(get_os_event()) - { - case evButton: - Button(); - - break; - - case evKey: - get_key(); - break; - - case evReDraw: - draw_window(); - break; - } - } + +int fridge_opened() { + int fr_op = 0; + for (int y = 0; y<_size; y++) + for (int x = 0; x<_size; x++) + { + fr_op += field[x][y]; + } + if (fr_op == 0) return 1; + return 0; +} + + +int main() +{ + srand(time(0)); + + if (kolibri_libimg_init() == -1) + { + printf("Can not load libimg.obj!\n"); + exit(1); + } + load_pict(); + + draw_game_window(); + while(1) + { + switch(get_os_event()) + { + case evButton: + Button(); + if (fridge_opened()) { + vict = 1; + debug_pr = 1; + draw_victory_window(); + } + break; + + case evKey: + get_key(); + break; + + case evReDraw: + if (!vict) draw_game_window(); + else draw_victory_window(); + break; + } + } } diff --git a/programs/games/fridge/how_to_compile.txt b/programs/games/fridge/how_to_compile.txt index addc6523a8..3479808644 100644 --- a/programs/games/fridge/how_to_compile.txt +++ b/programs/games/fridge/how_to_compile.txt @@ -1 +1,3 @@ -To compilation, you need to have kolibri_libimg.h and loadlibimg.o from C_Layer in this catalog \ No newline at end of file +To compilation, you need to have kolibri_libimg.h from /contrib/C_Layer/INCLUDES int this folder +You need to have loadlibimg.o from /contrib/C_Layer/OBJ (rename loadlibimg.obj to loadlibimg.o) too in this folder +