Subversion Repositories Kolibri OS

Rev

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

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