Subversion Repositories Kolibri OS

Rev

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