Subversion Repositories Kolibri OS

Rev

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

  1. #include "rsplatform.h"
  2.  
  3. #include "../rsgame.h"
  4.  
  5. rs_app_t rs_app;
  6.  
  7.  
  8.  
  9.  
  10. // set this macro to zero (0) if bug is fixed
  11. #define FIX_MENUETOS_LEGACY_ONE_PIXEL_BORDER_GAP_BUG (-1)
  12.  
  13. // Fixed frame rate, set to 25
  14. #define GAME_REQUIRED_FPS 25
  15.  
  16.  
  17.  
  18. //extern char   PATH[256];
  19. //extern char   PARAM[256];
  20.  
  21. int window_width, window_height;
  22.  
  23. int fps = 0;
  24. int dt = 1;
  25. int draw_dt = 1;
  26. int area_width = 160;
  27. int area_height = 160;
  28.  
  29. int low_performance_counter = 0;
  30.  
  31. int logic_halted = 0;
  32.  
  33. int w_plus = 0;
  34.  
  35.  
  36.  
  37.  
  38.  
  39. #define     BIT_SET(var,mask)   { var |= (mask); }
  40. #define     BIT_CLEAR(var,mask) { var &= ~(mask); }
  41. #define     BIT_TOGGLE(var,mask) { var ^= (mask); }
  42.  
  43. #define     IS_BIT_SET(var,mask)      ( (var) & (mask) )
  44. #define     IS_BIT_CLEARED(var,mask)  (!( (var) & (mask) ))
  45.  
  46.  
  47. void BoardPuts(const char *s)
  48. {
  49.         unsigned int i = 0;
  50.         while(*(s + i))
  51.         {
  52.                 asm volatile ("int $0x40"::"a"(63), "b"(1), "c"(*(s + i)));
  53.                 i++;
  54.         }
  55. }
  56.  
  57. void board_write_integer(const char *s, int i) {
  58.  
  59.         char tmp[16];
  60.        
  61.        
  62.  
  63. };
  64.  
  65.  
  66. void kol_wnd_resize(unsigned w, unsigned h)
  67. {
  68.         asm volatile ("int $0x40"::"a"(67), "b"(-1), "c"(-1), "d"(w), "S"(h));
  69. }
  70.  
  71.  
  72.  
  73.  
  74. void wnd_draw()
  75. {
  76.  
  77.         char tmp[] = "Fps:000 | Heliothryx Beta by Roman Shuvalov";
  78.        
  79.         kol_paint_start();
  80.  
  81.         tmp[4] = '0' + ( (fps/100) % 10 );
  82.         tmp[5] = '0' + ( (fps/10) % 10 );
  83.         tmp[6] = '0' + ( (fps) % 10 );
  84.  
  85.        
  86.         if (!logic_halted) {
  87.                 kol_wnd_define(100, 100, window_width, window_height, 0x74ddddff, 0x34ddddff, "Heliothryx");
  88.                 kol_wnd_caption(tmp);
  89.                 GameProcess();
  90.         }
  91.         else {
  92.                 kol_wnd_define(100, 100, window_width, window_height, 0x34ddddff, 0x34ddddff, "Heliothryx");
  93.                 //kol_paint_bar(0, 0, window_width, window_height, 0xffffffff);
  94.                 kol_paint_string(20, 20, "Performance is too low. Halted. ", 0x902222ff);
  95.         };
  96.  
  97.         kol_paint_end();
  98.  
  99. }
  100.  
  101.  
  102.  
  103.  
  104. /// ===========================================================
  105.  
  106. void kol_main()
  107. {
  108.  
  109.         BoardPuts("Hello, Heliothryx!\n");
  110.        
  111.         int    err;
  112.     int    version =-1;
  113.  
  114.     if((err = InitSound(&version)) !=0 ){
  115.         BoardPuts("Sound Error 1\n");
  116.     };
  117.  
  118.     if( (SOUND_VERSION>(version&0xFFFF)) ||
  119.         (SOUND_VERSION<(version >> 16))){
  120.         BoardPuts("Sound Error 2\n");
  121.     }
  122.  
  123.  
  124.         unsigned event;
  125.         unsigned key;
  126.         unsigned key_up;
  127.        
  128.         unsigned btn;
  129.         unsigned pos, x, y;
  130.         int gx, gy;
  131.  
  132.         //srand(kol_system_time_get());
  133.  
  134.         // kol_event_mask( 0xC0000027 ); // enable using of mouse
  135.         kol_event_mask(7); // keyboard only
  136.        
  137.         kol_key_mode_set(1);
  138.        
  139.         area_width = 640;
  140.         area_height = 360;
  141.  
  142.         // Initializing variables
  143.         window_width = FIX_MENUETOS_LEGACY_ONE_PIXEL_BORDER_GAP_BUG + area_width + 10; // 2 x 5px border
  144.         window_height = FIX_MENUETOS_LEGACY_ONE_PIXEL_BORDER_GAP_BUG + kol_skin_height() + area_height + 5; // bottom 5px border
  145.  
  146.  
  147.         GameInit();
  148.  
  149.         wnd_draw();
  150.  
  151.         fps = 0;
  152.        
  153.         unsigned int tick_start = kol_time_tick();
  154.         unsigned int tick_current = tick_start;
  155.         unsigned int tick_last = tick_start;
  156.        
  157.         unsigned int fps_counter = 0;
  158.         int wait_time;
  159.         int already_drawn = 0;
  160.        
  161.         float xf;
  162.         float xfs;
  163.         int xfs_i;
  164.        
  165.         while (1) {
  166.                 tick_last = tick_current;
  167.                 tick_current = kol_time_tick();
  168.                 dt = tick_current - tick_last;
  169.                 tick_last = tick_current;
  170.                
  171.                 already_drawn = 0;
  172.                
  173.                 while (( event = kol_event_wait_time(1) )) {
  174.                
  175.                         switch (event) {
  176.                
  177.                                 case 1:
  178.                                         wnd_draw(); // <--- need to clear event!
  179.                                         already_drawn = 1;
  180.                                         break;
  181.  
  182.                                 case 2:
  183.                                         key = kol_key_get();
  184.                                         key = (key & 0xff00)>>8;      
  185.                                         key_up = key & 0x80;                          
  186.                                         key = key & 0x7F;
  187.                                        
  188.                                         if (!logic_halted) {
  189.                                        
  190.                                                     if (key_up) {
  191.                                                             GameKeyUp(key);
  192.                                                     }
  193.                                                     else {
  194.                                                             GameKeyDown(key);
  195.                                                     };
  196.                                        
  197.                                         };
  198.                                
  199.                                         break;
  200.                        
  201.                                 case 3:
  202.                                         switch ((kol_btn_get() & 0xff00)>>8)
  203.                                                 {
  204.                                                 case 1: // close button
  205.                                                         kol_exit();
  206.                                                 case 2: // 'new' button
  207.                                                         //init_board();
  208.                                                         //wnd_draw();
  209.                                                         break;
  210.                                                 }
  211.                                         break;
  212.                        
  213.                                 case 6:
  214.                                         btn = kol_mouse_btn(); // read mouse button
  215.                                         pos = kol_mouse_posw(); // read mouse position
  216.                                         x = pos / 65536;
  217.                                         y = pos % 65536;
  218.                                         if (x > window_width)
  219.                                                 x=0;
  220.                                         if (y > window_height)
  221.                                                 y=0;
  222.  
  223.                                
  224.                                         break;
  225.                         }
  226.                        
  227.                 };
  228.                
  229.                
  230.                 if (!already_drawn) {
  231.                         wnd_draw();
  232.                 };
  233.                
  234.                
  235.                 fps_counter++;        
  236.                
  237.                 tick_current = kol_time_tick();
  238.                
  239.                 if (tick_current > tick_start+100) {
  240.                         fps = fps_counter;
  241.                         fps_counter = 0;
  242.                         tick_start += 100;
  243.                 };
  244.        
  245.                 draw_dt = tick_current - tick_last;
  246.                
  247.                 wait_time = (100/GAME_REQUIRED_FPS) - draw_dt;
  248.                 if (wait_time <= 0) {
  249.                         wait_time = 1;
  250.                 };
  251.                 kol_sleep(wait_time);
  252.                
  253.                 if (draw_dt > 10) {
  254.                         low_performance_counter++;
  255.                 }
  256.                 else {
  257.                         low_performance_counter--;
  258.                         if (low_performance_counter < 0) {
  259.                                 low_performance_counter = 0;
  260.                         };
  261.                 };
  262.                
  263.                 if (low_performance_counter > 6) {
  264.                         logic_halted = 1;
  265.                         window_width = 280;
  266.                         window_height = 80;
  267.                         kol_wnd_caption("Heliothryx");
  268.                         kol_wnd_resize(window_width, window_height);
  269.                 };
  270.  
  271.  
  272.         }
  273.  
  274.         GameTerm();
  275.  
  276.         kol_exit();
  277. }
  278.