Subversion Repositories Kolibri OS

Rev

Rev 1810 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1.  
  2.  
  3. #include "system/kolibri.h"
  4. #include "system/stdlib.h"
  5. #include "system/string.h"
  6.  
  7. #include "system/gblib.h"
  8.  
  9. #include "az3.h"
  10. #include "az4.h"
  11.  
  12. //=====================================
  13.  
  14. #define scrw (8*32)
  15. #define scrh (16+8*32)
  16.  
  17. //=====================================
  18.  
  19. typedef struct
  20. {
  21. char x;
  22. char y;
  23. } p_point;
  24.  
  25. //=====================================
  26.  
  27. char STR_TITLE[] = {"Piton 0.3.1"};
  28.  
  29. int mode;
  30. char score[10];
  31.  
  32. char scr[scrw*scrh*3];
  33. GB_BMP screen, az, azr;
  34.  
  35. char M[32][32];
  36. p_point z[32*32];
  37. p_point v;
  38. p_point r;
  39. int len;
  40.  
  41. unsigned color[] = {0xcccccc, 0xaa2222, 0x44bb, 0x7788aa};
  42.  
  43.  
  44. //=====================================
  45.  
  46. void az_putc(unsigned char c, int x, int y)
  47. {
  48. if (c > 191)
  49.         gb_image_set_t(&screen, x, y, &azr, (c-192)*8, 1, 8, 14, 0);
  50. else
  51.         gb_image_set_t(&screen, x, y, &az, (c-' ')*8, 1, 8, 14, 0);
  52. }
  53.  
  54. //=====================================
  55.  
  56. void az_puts(unsigned char *s, int x, int y)
  57. {
  58. unsigned i;
  59. i = 0;
  60. while (*(s+i))
  61.         {
  62.         az_putc(*(s+i), x+i*9, y);
  63.         i++;
  64.         }
  65.  
  66. }
  67.  
  68. //=====================================
  69.  
  70. az_puti(int n, int x, int y)
  71. {
  72. char c;
  73. int i = 0;
  74. do
  75.         {
  76.         c = n % 10 + '0';
  77.         az_putc(c, x-9*i, y);
  78.         i++;
  79.         }
  80.         while ((n /= 10) > 0);
  81. }
  82.  
  83. //=====================================
  84.  
  85. void clear()
  86. {
  87.  
  88. int x, y;
  89.  
  90. for (y = 0; y < 32; y++)
  91.         for (x = 0; x < 32; x++)
  92.                 M[x][y] = 0;
  93.  
  94. for (y = 0; y < 32; y++)
  95.         {
  96.         M[0][y] = 1;
  97.         M[31][y] = 1;
  98.         M[y][0] = 1;
  99.         M[y][31] = 1;
  100.         }
  101. }
  102.  
  103. //=====================================
  104.  
  105. void put_z()
  106. {
  107. int i;
  108.  
  109. for (i = 0; i < len; i++)
  110.         M[z[i].x][z[i].y] = 2;
  111.  
  112. }
  113.  
  114. //=====================================
  115.  
  116. void put_r()
  117. {
  118. M[r.x][r.y] = 3;
  119. }
  120.  
  121. //=====================================
  122.  
  123. void rabbit_new()
  124. {
  125.  
  126. for (;;)
  127.         {
  128.         r.x = rand()%29+1;
  129.         r.y = rand()%29+1;
  130.  
  131.         if (0 == M[r.x][r.y])
  132.                 return;
  133.         }
  134. }
  135. //=====================================
  136.  
  137. void game_start()
  138. {
  139.  
  140. clear();
  141.  
  142. v.x = 1;
  143. v.y = 0;
  144.  
  145. len = 2;
  146.  
  147. z[0].x = 16;
  148. z[0].y = 16;
  149.  
  150. z[1].x = 15;
  151. z[1].y = 16;
  152.  
  153. rabbit_new();
  154. put_r();
  155. put_z();
  156.  
  157. kol_sleep(30);
  158. }
  159.  
  160. //=====================================
  161.  
  162. void press_space()
  163. {
  164. az_puts("íàæìèòå Ïðîáåë", 10, 180);
  165. az_puts("÷òîáû ïðîäîëæèòü", 10, 195);
  166. }
  167.  
  168. //=====================================
  169.  
  170. void screen_draw()
  171. {
  172.  
  173. int x, y;
  174.  
  175. switch ( mode)
  176.         {
  177.         case 0:
  178.                 gb_bar(&screen, 0, 0, scrw, scrh, 0xbb);
  179.                 az_puts("Ï È Ò Î Í   0.3.1", 10, 60);
  180.                 az_puts("ðåìåéê äëÿ ÎÑ Êîëèáðè", 10, 120);
  181.                 az_puts("àâòîð: À. Áîãîìàç", 10, 135);
  182.                 press_space();
  183.                 break;
  184.        
  185.  
  186.         case 1:
  187.                 gb_bar(&screen, 0, 0, scrw, 16, 0xbb);
  188.                 az_puts("Î×ÊÈ:", 10, 0);
  189.                 az_puti(len-2, 120, 0);
  190.                 for (y = 0; y < 32; y++)
  191.                         for (x = 0; x < 32; x++)
  192.                                 gb_bar(&screen, x*8, y*8+16, 8, 8, color[ M[x][y] ]);
  193.  
  194.                 break;
  195.  
  196.         case 2:
  197.                 gb_bar(&screen, 0, 0, scrw, scrh, 0xbb0000);
  198.                 az_puts("Ï À Ó Ç À", 10, 60);
  199.                 press_space();
  200.                 break;
  201.  
  202.         case 3:
  203.                 gb_bar(&screen, 0, 0, scrw, scrh, 0xee0000);
  204.                 az_puts("Ê Î Í Å Ö    È Ã Ð Û", 10, 60);
  205.                 kol_screen_wait_rr();
  206.                 kol_paint_image(0, 0, scrw, scrh, screen.bmp);
  207.                 kol_sleep(170);
  208.                 mode = 0;
  209.                 return;
  210.         };
  211.  
  212. kol_screen_wait_rr();
  213. kol_paint_image(0, 0, scrw, scrh, screen.bmp);
  214.  
  215. }
  216.  
  217. //=====================================
  218.  
  219. void wnd_draw()
  220. {
  221. kol_paint_start();
  222. kol_wnd_define(280, 30, scrw+8, scrh+kol_skin_height()+4, 0x34888888, 0x34888888, STR_TITLE);
  223. screen_draw();
  224. kol_paint_end();
  225. }
  226.  
  227. //=====================================
  228.  
  229. int piton_move()
  230. {
  231. int i;
  232.  
  233. for (i = len-1; i > 0; i--)
  234.         {
  235.         z[i].x = z[i-1].x;
  236.         z[i].y = z[i-1].y;
  237.         }
  238.  
  239. z[0].x += v.x;
  240. z[0].y += v.y;
  241.  
  242. if ((1 == M[z[0].x][z[0].y])||(2 == M[z[0].x][z[0].y]))
  243.         return -1;
  244.  
  245. if (3 == M[z[0].x][z[0].y])
  246.         {
  247.         rabbit_new();
  248.         return 1;
  249.         }
  250.  
  251.  
  252. clear();
  253. put_r();
  254. put_z();
  255.  
  256. return 0;
  257. }
  258.  
  259. //=====================================
  260.  
  261. void kol_main()
  262. {
  263.  
  264. unsigned event, key;
  265. int res;
  266.  
  267. srand(kol_system_time_get()<<8);
  268.  
  269. screen.bmp = scr;
  270. screen.w = scrw;
  271. screen.h = scrh;
  272.  
  273. az.bmp = AZ3;
  274. az.w = 744;
  275. az.h = 15;
  276.  
  277. azr.bmp = AZ4;
  278. azr.w = 512;
  279. azr.h = 15;
  280.  
  281. mode = 0;
  282.  
  283. for (;;)
  284.         {
  285.         kol_sleep(7);
  286.  
  287.         if ( 1 == mode)
  288.                 {
  289.                 res = piton_move();
  290.  
  291.                 if (1 == res)
  292.                         len++;
  293.  
  294.                 if (-1 == res)
  295.                         mode = 3;
  296.  
  297.                 }
  298.        
  299.         screen_draw();
  300.         event = kol_event_check();
  301.  
  302.         switch (event)
  303.                 {
  304.                 case 1:
  305.                         wnd_draw();
  306.                         break;
  307.  
  308.                 case 2:
  309.                         key = (kol_key_get() & 0xff00)>>8;
  310.  
  311.                         switch (mode)
  312.                                 {
  313.  
  314.                                 case 0:
  315.                                         if (32 == key)
  316.                                                 {
  317.                                                 mode = 1;
  318.                                                 game_start();
  319.                                                 }
  320.                                         break;
  321.  
  322.                                 case 1:
  323.                                         switch (key)
  324.                                                 {
  325.                                                 case 27:
  326.                                                         mode = 0;
  327.                                                         break;
  328.                                                 case 32:
  329.                                                         mode = 2;
  330.                                                         break;
  331.                                                 case 178:
  332.                                                         if (0 == v.y)
  333.                                                                 {
  334.                                                                 v.x = 0;
  335.                                                                 v.y = -1;
  336.                                                                 }
  337.                                                         break;
  338.                                                 case 177:
  339.                                                         if (0 == v.y)
  340.                                                                 {
  341.                                                                 v.x = 0;
  342.                                                                 v.y = 1;
  343.                                                                 }
  344.                                                         break;
  345.                                                 case 176:
  346.                                                         if (0 == v.x)
  347.                                                                 {
  348.                                                                 v.x = -1;
  349.                                                                 v.y = 0;
  350.                                                                 }
  351.                                                         break;
  352.                                                 case 179:
  353.                                                         if (0 == v.x)
  354.                                                                 {
  355.                                                                 v.x = 1;
  356.                                                                 v.y = 0;
  357.                                                                 }
  358.                                                         break;
  359.                                                 };
  360.                                         break;
  361.  
  362.                                 case 2:
  363.                                         if (32 == key)
  364.                                                 mode = 1;
  365.                                         break;
  366.  
  367.                                 };
  368.  
  369.                         break;
  370.  
  371.                 case 3:
  372.                         if ( 1 == (kol_btn_get() & 0xff00)>>8 )
  373.                                 kol_exit();
  374.                         break;
  375.  
  376.                 };
  377.         }
  378.  
  379. }
  380.  
  381. //=====================================
  382.