Subversion Repositories Kolibri OS

Rev

Rev 8081 | Rev 8324 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. #include <kos32sys.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <stdio.h>
  5. #include <time.h>
  6.  
  7. #include "kolibri_libimg.h"
  8.  
  9.  
  10.  
  11. //EVENTS LOOK LIKE IN C--
  12. #define evReDraw  1
  13. #define evKey     2
  14. #define evButton  3
  15. #define evExit    4
  16. #define evDesktop 5
  17. #define evMouse   6
  18. #define evIPC     7
  19. #define evNetwork 8
  20. #define evDebug   9
  21.  
  22.  
  23. #define RESTART 99
  24.  
  25. #define b_color 0xbbbbbb
  26. #define _size 4
  27. #define bs 44
  28.  
  29. int field[_size][_size] = {
  30.         {0, 0, 0, 1},
  31.         {0, 0, 1, 0},
  32.         {0, 0, 0, 1},
  33.         {1, 0, 0, 0}
  34.         /*{0, 0, 0, 0},
  35.         {0, 0, 0, 0},
  36.         {0, 0, 0, 0},
  37.         {0, 0, 0, 0}*/
  38. };
  39. short vict = 0;
  40. short debug_pr = 0;
  41.  
  42. char* title = "Fridge";
  43.  
  44.  
  45. // PICTURES LOADING CODE
  46. char temp_path[4096];
  47. char* HOR;
  48. char* VER;
  49.  
  50.  
  51. char*   load_file_inmem(char* fname, int32_t* read_sz)
  52. {
  53.                 FILE *f = fopen(fname, "rb");
  54.                 if (!f) {
  55.                         exit(1);
  56.                 }
  57.                 if (fseek(f, 0, SEEK_END)) {
  58.                         exit(1);
  59.                 }
  60.                 int filesize = ftell(f);
  61.                 rewind(f);
  62.                 char* fdata = malloc(filesize);
  63.                 if(!fdata) {
  64.                         exit(1);
  65.                 }
  66.                 *read_sz = fread(fdata, 1, filesize, f);
  67.                 if (ferror(f)) {
  68.                         exit(1);
  69.                 }
  70.                 fclose(f);
  71.  
  72.                 return fdata;
  73. }
  74.  
  75.  
  76. void load_pict() {
  77.                 const int icon_rgb_size = bs*bs;
  78.                 char *image_data,
  79.                          *filedata;
  80.                
  81.                 strcpy(temp_path, "h.png");
  82.  
  83.                 int32_t read_bytes;
  84.                 filedata = load_file_inmem(temp_path, &read_bytes);
  85.                 HOR = malloc(icon_rgb_size * 3);
  86.                
  87.                 image_data = img_decode(filedata, read_bytes, 0);
  88.                
  89.                 img_to_rgb2(image_data, HOR);
  90.                
  91.                
  92.                 strcpy(temp_path, "v.png");
  93.  
  94.                 filedata = load_file_inmem(temp_path, &read_bytes);
  95.                 VER = malloc(icon_rgb_size * 3);
  96.                
  97.                 image_data = img_decode(filedata, read_bytes, 0);
  98.                
  99.                 img_to_rgb2(image_data, VER);
  100.                
  101.                 img_destroy(image_data);
  102.                 free(filedata);
  103. }
  104. // END OF PICTURES LOAD CODE
  105.  
  106.  
  107.  
  108. void redraw_buttons() {
  109.                 for (int j = 5, yy = 0; yy<_size; j+=bs, yy++)
  110.                                 for (int i = 15, xx = 0; xx<_size; i+=bs, xx++)
  111.                                 {
  112.                                         define_button(65536 * i + (bs-1), 65536 * j + (bs-1), ((xx+1)*10)+yy+1, b_color);
  113.                                        
  114.                                         if (field[yy][xx]) draw_bitmap(VER, i, j, bs, bs);
  115.                                         else draw_bitmap(HOR, i, j, bs, bs);
  116.                                 }
  117. }
  118.  
  119. void draw_game_window(){
  120.                 BeginDraw();
  121.                 DrawWindow(215,100,220, 220,title,b_color,0x34);
  122.                 redraw_buttons();
  123.                 EndDraw();
  124. }
  125.  
  126.  
  127.  
  128. static inline
  129. void draw_text_sysNEW(const char *text, int x, int y, int len, int fontType, color_t color)
  130. {
  131.                 __asm__ __volatile__(
  132.                 "int $0x40"
  133.                 ::"a"(4),"d"(text),
  134.                   "b"((x << 16) | y),
  135.                   "S"(len),"c"(fontType<<24+color)
  136.                  :"memory");
  137. }
  138.  
  139. void SetUp() {
  140.                 for (int y = 0; y<_size; y++)
  141.                                         for (int x = 0; x<_size; x++)
  142.                                         {
  143.                                                 field[x][y] = rand() % 2;
  144.                                         }
  145. }
  146.  
  147. void draw_victory_window() {
  148.                 BeginDraw();
  149.                 DrawWindow(215,100,220, 220,title,b_color,0x34);
  150.                
  151.                 draw_text_sysNEW("Ну вы, и", 10, 10, strlen("Ну вы, и"), 0xB1, 0x000000);
  152.                 draw_text_sysNEW("медвежатник,", 10, 50, strlen("Ну вы, и медвежатник,"), 0xB1, 0x000000);
  153.                 draw_text_sysNEW("Шеф!", 12, 90, strlen("Шеф!"), 0xB1, 0x000000);
  154.                
  155.                 if (debug_pr) {
  156.                         printf("Fridge: Very great!\n");
  157.                         debug_pr = 0;
  158.                 }
  159.                
  160.                 define_button(65536 * ((220/2)-(50)) + 140, 65536 * 140 + 25+12, RESTART, 0x9A9A9A);
  161.                 draw_text_sysNEW("Заново", 80, 145, strlen("Заново"), 0xB1, 0x000000);
  162.                 EndDraw();
  163. }
  164.  
  165.  
  166.  
  167. void Button() {
  168.                 int id = get_os_button();
  169.                 if (id == 1) exit(0); else
  170.                 if (id == RESTART) {
  171.                         SetUp();
  172.                         vict = 0;
  173.                         draw_game_window();
  174.                 } else
  175.                 {
  176.                         int x = (id/10)-1;
  177.                         int y = (id%10)-1;
  178.                        
  179.                         for (int i = 0; i<_size; i++)
  180.                                 if (field[i][x]) field[i][x] = 0; else field[i][x] = 1;
  181.                        
  182.                         for (int i = 0; i<_size; i++)
  183.                                 if (field[y][i]) field[y][i] = 0; else field[y][i] = 1;
  184.                                
  185.                         if (field[y][x]) field[y][x] = 0; else field[y][x] = 1;
  186.                        
  187.                         redraw_buttons();
  188.                 }
  189. }
  190.  
  191.  
  192. int fridge_opened() {
  193.                 int fr_op = 0;
  194.                 for (int y = 0; y<_size; y++)
  195.                                 for (int x = 0; x<_size; x++)
  196.                                 {
  197.                                         fr_op += field[x][y];
  198.                                 }
  199.                 if (fr_op == 0) return 1;
  200.                 return 0;
  201. }
  202.  
  203.  
  204. int main()
  205. {
  206.                 srand(time(0));
  207.                
  208.                 if (kolibri_libimg_init() == -1)
  209.                 {
  210.                         printf("Can not load libimg.obj!\n");
  211.                         exit(1);
  212.                 }
  213.                 load_pict();
  214.                
  215.                 draw_game_window();
  216.                 while(1)
  217.                 {
  218.                         switch(get_os_event())
  219.                         {
  220.                                 case evButton:
  221.                                         Button();
  222.                                         if (fridge_opened()) {
  223.                                                 vict = 1;
  224.                                                 debug_pr = 1;
  225.                                                 draw_victory_window();
  226.                                         }
  227.                                         break;
  228.                          
  229.                                 case evKey:
  230.                                         get_key();
  231.                                         break;
  232.                                  
  233.                                 case evReDraw:
  234.                                         if (!vict) draw_game_window();
  235.                                         else draw_victory_window();
  236.                                         break;
  237.                         }
  238.                 }
  239. }
  240.