Subversion Repositories Kolibri OS

Rev

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

  1. /*
  2. THE BUS
  3. Copyright (C) 2008, 2012, 2017 Leency
  4. Menu image from Freepik.com
  5. D O N K E Y
  6. Copyright (C) 2008 O.Bogomaz
  7. */
  8.  
  9. #define MEMSIZE 1024 * 60;
  10.  
  11. #include "..\lib\kolibri.h"
  12. #include "..\lib\random.h"
  13.  
  14. #include "..\lib\obj\libio_lib.h"
  15. #include "..\lib\obj\libimg_lib.h"
  16. #include "..\lib\patterns\libimg_load_skin.h"
  17.  
  18. #define SCALE 2
  19.  
  20. #include "draw_scalled.h"
  21.  
  22. libimg_image menu;
  23. libimg_image road;
  24. libimg_image objects;
  25.  
  26. int lives=0, level=0, score=0;
  27. int don_x, don_y, don_h, don_w=39, don_type, don_image_y;
  28. int don_h_mas[8] = { 18,36,18,37,12,32,24,37 };
  29. int bus_x, bus_w=21, bus_y=145, bus_h=44;
  30.  
  31. #define SCR_MENU_MAIN   1
  32. #define SCR_GAME        2
  33. #define SCR_PAUSE       3
  34.  
  35. #define RAND -1
  36.  
  37. #define WIN_X 258
  38. #define WIN_Y 191
  39.  
  40. int screen_type=SCR_MENU_MAIN;
  41.  
  42. #define COLOR_ROAD 0x6D879B;
  43.  
  44. int active_menu_item=0;
  45.  
  46. char *ITEMS_LIST[]={
  47. "New game",
  48. "Control keys",
  49. "About",
  50. "Exit",
  51. 0};
  52.  
  53.  
  54. void DrawObstacle(signed int x, y) {
  55.         int don_offset_y;
  56.         int image_h;
  57.  
  58.         if (y >= 0) {
  59.                 image_h = don_h;
  60.                 don_offset_y = don_image_y;
  61.         }
  62.         else {
  63.                 image_h = don_h + y;
  64.                 don_offset_y = don_image_y - y;
  65.                 y = 0;
  66.         }
  67.  
  68.         debugval("y", y);
  69.         debugval("don_h", don_h);
  70.         debugval("image_h", image_h);
  71.         debugval("don_offset_y", don_offset_y);
  72.         DrawScaledImage(objects.image, x, y, don_w, image_h, 0, don_offset_y);
  73. }
  74. void DrawBus(dword x, y) { DrawScaledImage(objects.image, x, y, bus_w, bus_h, 0, 222); }
  75. void DrawBoom(dword x, y) { DrawScaledImage(objects.image, x, y, 39, 33, 0, 268); }
  76. void DrawHighway() { DrawScaledImage(road.image, 0,0, WIN_X, WIN_Y, 0, 0); }
  77. void DrawMenuBackground() { DrawScaledImage(menu.image, 0, 0, WIN_X, WIN_Y, 0, 0); }
  78.  
  79. void main()
  80. {
  81.         randomize();
  82.         GetNewObstacle(RAND);
  83.  
  84.         load_dll(libio,  #libio_init,1);
  85.         load_dll(libimg, #libimg_init,1);
  86.         Libimg_LoadImage(#menu, "/sys/fonts/menu.png");
  87.         Libimg_LoadImage(#road, "/sys/fonts/road.png");
  88.         Libimg_LoadImage(#objects, "/sys/fonts/objects.png");
  89.        
  90.         loop()
  91.         {
  92.                 WaitEventTimeout(1);
  93.  
  94.                 switch(EAX & 0xFF)
  95.                 {
  96.                         case evKey:
  97.                                 GetKeys();
  98.                                 if (key_scancode == SCAN_CODE_ESC)
  99.                                 {
  100.                                         if (screen_type==SCR_GAME) SetScreen(SCR_MENU_MAIN);
  101.                                         else if (screen_type==SCR_MENU_MAIN) ExitProcess();
  102.                                 }
  103.                                 if (key_scancode == SCAN_CODE_DOWN) && (screen_type==SCR_MENU_MAIN)
  104.                                 {
  105.                                         if (active_menu_item<>3) active_menu_item++; ELSE active_menu_item=0;
  106.                                         DrawMenuList();
  107.                                 }
  108.                                 if (key_scancode == SCAN_CODE_UP) && (screen_type==SCR_MENU_MAIN)
  109.                                 {
  110.                                         if (active_menu_item<>0) active_menu_item--; ELSE active_menu_item=3;
  111.                                         DrawMenuList();
  112.                                 }
  113.                                 if (key_scancode == SCAN_CODE_ENTER) && (screen_type==SCR_MENU_MAIN)
  114.                                 {
  115.                                         if (active_menu_item==0)
  116.                                         {
  117.                                                 lives=3;
  118.                                                 level=0;
  119.                                                 score=0;
  120.                                                 SetScreen(SCR_GAME);
  121.                                         }
  122.                                         if (active_menu_item==1) notify("'The Bus\nControl keys:\nLeft, Right, Space\nPress P key for pause'tI");
  123.                                         if (active_menu_item==2) notify("'The Bus\nVersion v0.4 Alpha\n\nAuthor: Leency\nMenu image from Freepik.com'tI");
  124.                                         if (active_menu_item==3) ExitProcess();
  125.                                 }                              
  126.                                 if (key_scancode == SCAN_CODE_SPACE) && (screen_type==SCR_GAME)
  127.                                 {
  128.                                         DrawScaledBar(bus_x*40+100, bus_y, bus_w, bus_h+1, COLOR_ROAD);
  129.                                         if (bus_x==1) bus_x=0; else bus_x=1;
  130.                                 }
  131.                                 if (key_scancode == SCAN_CODE_LEFT) && (screen_type==SCR_GAME)
  132.                                 {
  133.                                         if (bus_x==0) break;
  134.                                         DrawScaledBar(bus_x*40+100, bus_y, bus_w, bus_h+1, COLOR_ROAD);
  135.                                         bus_x=0;
  136.                                 }
  137.                                 if (key_scancode == SCAN_CODE_RIGHT) && (screen_type==SCR_GAME)
  138.                                 {
  139.                                         if (bus_x==1) break;
  140.                                         DrawScaledBar(bus_x*40+100, bus_y, bus_w, bus_h+1, COLOR_ROAD);
  141.                                         bus_x=1;
  142.                                 }
  143.                                 if (key_scancode == SCAN_CODE_KEY_P)
  144.                                 {
  145.                                         if (screen_type==SCR_MENU_MAIN) break;
  146.                                         else if (screen_type==SCR_GAME) SetScreen(SCR_PAUSE);
  147.                                         else if (screen_type==SCR_PAUSE) SetScreen(SCR_GAME);
  148.                                 }
  149.                                 break;
  150.                                
  151.                         case evReDraw:
  152.                                 DefineAndDrawWindow(250,150,WIN_X * SCALE-1+10,WIN_Y * SCALE-1+skin_height+5,0x74,0,"The Bus",0);
  153.                                 DrawScreen();
  154.                                 break;
  155.                                
  156.                         case evButton:
  157.                                 ExitProcess();
  158.                                 break;
  159.                                
  160.                         default:
  161.                                 if (screen_type==SCR_GAME) DrawRoad();
  162.                                 break;
  163.                 }
  164.         }
  165. }
  166.  
  167. void WriteScore() {
  168.         DrawScaledImage(road.image, 10, 83, 60, 12, 10, 82);
  169.         WriteScaledText(10, 70, 0x80, 0xFFFFFF, "Score");
  170.         WriteScaledText(10, 83, 0x80, 0xFFFFFF, itoa(score));
  171. }
  172.  
  173. void SetScreen(dword _screen_type) {
  174.         screen_type = _screen_type;
  175.         DrawScreen();
  176. }
  177.  
  178. void DrawScreen()
  179. {
  180.         int i;
  181.         if (screen_type==SCR_MENU_MAIN)
  182.         {
  183.                 DrawMenuBackground();
  184.                 WriteScaledText(10, 10, 0x80, 0xE8783F, "TAKE THE CHILDREN HOME");
  185.                 $add ebx, 2 << 16
  186.                 $int 64
  187.                 DrawMenuList();
  188.         }
  189.         if (screen_type==SCR_GAME) || (screen_type==SCR_PAUSE)
  190.         {
  191.                 DrawHighway();
  192.                 WriteScaledText(10, 10, 0x80, 0xFFFFFF, "Lives");
  193.                 WriteScaledText(10, 23, 0x80, 0xFFFFFF, itoa(lives));
  194.                 WriteScaledText(10, 40, 0x80, 0xFFFFFF, "Level");
  195.                 WriteScaledText(10, 53, 0x80, 0xFFFFFF, itoa(level));
  196.                 WriteScore();
  197.                 DrawRoad();
  198.                 if (screen_type==SCR_PAUSE) {
  199.                         DrawScaledBar(0,0,70,30,0xFF0000);
  200.                         WriteScaledText(5,7,0x81,0xFFFfff,"PAUSE");                    
  201.                 }
  202.         }
  203.         /*
  204.         if (screen_type==SCR_PAUSE)
  205.         {
  206.                 for (i = 0; i < 8; i++) //calculate image y offset for current obstacle
  207.                 {
  208.                         GetNewObstacle(i);
  209.                         DrawObstacle(don_w+1*i, 10);
  210.                 }
  211.         }
  212.         */
  213. }
  214.  
  215.  
  216. void DrawMenuList()
  217. {
  218.         int j;
  219.         for (j=0; j<4; j++) DrawMenuItem(j, j);
  220. }
  221.  
  222. void DrawMenuItem(int item_n, text_n)
  223. {
  224.         dword color;
  225.         if (active_menu_item==item_n) color = 0xFF0000; else color = 0xFFffff;
  226.         WriteScaledText(10+1, item_n*28+48+1, 0x80, 0xAAAaaa, ITEMS_LIST[text_n]);
  227.         WriteScaledText(10, item_n*28+48, 0x80, color, ITEMS_LIST[text_n]);
  228. }
  229.  
  230.  
  231. void DrawGameOverMessage()
  232. {
  233.         DrawScaledBar(0, 0, WIN_X, WIN_Y, 0xF3E1BD);
  234.         WriteScaledText(20, 20, 0x80, 0xA48C74, "GAME OVER");
  235.         WriteScaledText(20, 40, 0x80, 0xA48C74, "FINAL SCORE");
  236.         WriteScaledText(20, 70, 0x84, 0xA48C74, itoa(score));
  237.         $add ecx, 2 << 16
  238.         $int 64
  239.         pause(350);    
  240.         active_menu_item=0;
  241.         SetScreen(SCR_MENU_MAIN);      
  242. }
  243.  
  244. void DrawAccident()
  245. {
  246.         DrawBus(bus_x*40+100,bus_y);
  247.         DrawBoom(bus_x*40+90,151);
  248.         pause(150);
  249.         lives--;
  250.         don_y = -don_h;
  251.         DrawScreen();
  252.         if (lives>0) DrawScaledBar(bus_x*40+90, 147-17, 39, 45+23, COLOR_ROAD);
  253. }
  254.  
  255. void GetNewObstacle(int N)
  256. {
  257.         int i;
  258.         don_x = random(2);
  259.         if (N==RAND) {
  260.                 don_type = random(7);
  261.         }
  262.         else {
  263.                 don_type = N;
  264.         }
  265.         don_h = don_h_mas[don_type];
  266.         don_y = -don_h+1;
  267.         don_image_y = 0;
  268.         for (i = 0; i < don_type; i++) //calculate image y offset for current obstacle
  269.         {
  270.                 don_image_y += don_h_mas[i]+1;
  271.         }
  272. }
  273.  
  274. #define LINE_LENGTH 10
  275. void DrawRoad()
  276. {
  277.         int y, line_y;
  278.        
  279.         if ((don_x == bus_x)&&(don_y + don_h > bus_y )&&(don_y < bus_y + don_h )) DrawAccident();
  280.        
  281.         if (lives==0) {
  282.                 DrawGameOverMessage();
  283.                 return;
  284.         }
  285.        
  286.         if (screen_type != SCR_PAUSE)
  287.         {
  288.                 line_y+=2;
  289.                 don_y+=2;
  290.         }
  291.  
  292.         //the beginning of the white dashed line between two roadways
  293.         if (line_y>=20) {
  294.                 line_y=0;
  295.         }
  296.         else
  297.         {
  298.                 DrawScaledBar(129, 0, 1, line_y, COLOR_ROAD);
  299.                 DrawScaledBar(129, 0, 1, line_y-LINE_LENGTH, 0xDDE9F2);
  300.         }
  301.         for (y=0; y<WIN_Y-20; y+=20) //white dashed line between two roadways
  302.         {
  303.                 DrawScaledBar(129, line_y+y, 1, LINE_LENGTH, 0xDDE9F2);
  304.                 DrawScaledBar(129, line_y+y+LINE_LENGTH, 1, LINE_LENGTH, COLOR_ROAD);
  305.         }
  306.         if (don_y >= WIN_Y)
  307.         {
  308.                 GetNewObstacle(RAND);
  309.                 score++;
  310.                 WriteScore();
  311.         }
  312.         DrawScaledBar(don_x*don_w+93, don_y-2, 30, 2, COLOR_ROAD); //Fill donkey old parts
  313.         DrawObstacle(don_x*don_w+90,don_y);
  314.         DrawBus(bus_x*40+100,147);
  315. }
  316.  
  317.  
  318.  
  319.  
  320.  
  321. stop:
  322.