Subversion Repositories Kolibri OS

Rev

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

  1. #include "game.h"
  2.  
  3. struct {
  4.     rect    new_game_button;// new game button place
  5.     rect    score_rect;     // score place
  6.     __u8    over;           // flag for game over
  7. } game;
  8.  
  9. void game_draw_top()
  10. {
  11.     if (game.over)
  12.     {
  13.         __menuet__make_button(game.new_game_button.x,
  14.                               game.new_game_button.y,
  15.                               game.new_game_button.width,
  16.                               game.new_game_button.height,
  17.                               NEW_GAME_BUTTON,
  18.                               BOARD_BG_COLOR);
  19.         rect_draw_text(&game.new_game_button,"NEW GAME",8,GAME_BG_COLOR);
  20.     }
  21.  
  22.     rect_draw(&game.score_rect,BOARD_BG_COLOR);
  23.     rect_draw_value(&game.score_rect,board_score(),GAME_BG_COLOR);
  24. }
  25.  
  26. void game_init()
  27. {
  28.     game.over = false;
  29.     // place window at the center of screen
  30.     __u16 screen_w = 0;
  31.     __u16 screen_h = 0;
  32.     __menuet__get_screen_max(&screen_w,&screen_h);
  33.  
  34.     __menuet__window_redraw(1);
  35.  
  36.     __menuet__define_window((screen_w - WND_WIDTH) / 2,
  37.                             (screen_h - WND_HEIGHT) / 2,
  38.                             WND_WIDTH,
  39.                             WND_HEIGHT,
  40.                             GAME_BG_COLOR,
  41.                             0,
  42.                             (__u32)header);
  43.  
  44.     // find info about window client area
  45.     __menuet__get_process_table(&proc_info,PID_WHOAMI);
  46.  
  47.     // calc board
  48.     rect av_area = {0};
  49.     av_area.x = GAME_BORDER;
  50.     av_area.y = (SCORE_HEIGHT > GAME_BORDER) ? SCORE_HEIGHT : GAME_BORDER;
  51.     av_area.width = proc_info.client_width - av_area.x * 2;
  52.     av_area.height = proc_info.client_height - av_area.y - GAME_BORDER;
  53.     // minimal square
  54.     if (av_area.width < av_area.height)
  55.     {
  56.         av_area.y += (av_area.height - av_area.width) / 2;
  57.         av_area.height = av_area.width;
  58.     }
  59.     else // if (av_area.height < av_area.width)
  60.     {
  61.         av_area.x += (av_area.width - av_area.height) / 2;
  62.         av_area.width = av_area.height;
  63.     }
  64.  
  65.     board_init(&av_area);
  66.  
  67.     game.new_game_button.x = av_area.x;
  68.     game.new_game_button.y = (av_area.y - SCORE_HEIGHT) / 2;
  69.     game.new_game_button.width = (av_area.width - BOARD_SPACING) / 2;
  70.     game.new_game_button.height = SCORE_HEIGHT;
  71.  
  72.     game.score_rect.x = av_area.x + (av_area.width + BOARD_SPACING) / 2;
  73.     game.score_rect.y = (av_area.y - SCORE_HEIGHT) / 2;
  74.     game.score_rect.width = (av_area.width - BOARD_SPACING) / 2;
  75.     game.score_rect.height = SCORE_HEIGHT;
  76.  
  77.     game_draw_top();
  78.  
  79.     __menuet__window_redraw(2);
  80. }
  81.  
  82. void game_exit()
  83. {
  84.     board_delete();
  85. }
  86.  
  87. void game_redraw()
  88. {
  89.     __menuet__get_process_table(&proc_info,PID_WHOAMI);
  90.  
  91.     // start redraw
  92.     __menuet__window_redraw(1);
  93.  
  94.     __menuet__define_window(0,              // __u16 x1     : ignored
  95.                             0,              // __u16 y1     : ignored
  96.                             0,              // __u16 xsize  : ignored
  97.                             0,              // __u16 ysize  : ignored
  98.                             GAME_BG_COLOR,  // __u32 body_color
  99.                             0,              // __u32 grab_color
  100.                             (__u32)header); // __u32 frame_color or header
  101.  
  102.     game_draw_top();
  103.     board_redraw();
  104.  
  105.     // end redraw
  106.     __menuet__window_redraw(2);
  107. }
  108.  
  109. void game_move_up()
  110. {
  111.     if (board_up())
  112.     {
  113.         board_redraw();
  114.         __u8 added = board_add_random_tile();
  115.         board_redraw();
  116.  
  117.         game.over = !added || !board_has_moves();
  118.         game_draw_top();
  119.     }
  120. }
  121.  
  122. void game_move_down()
  123. {
  124.     if (board_down())
  125.     {
  126.         board_redraw();
  127.         __u8 added = board_add_random_tile();
  128.         board_redraw();
  129.  
  130.         game.over = !added || !board_has_moves();
  131.         game_draw_top();
  132.     }
  133. }
  134.  
  135. void game_move_left()
  136. {
  137.     if (board_left())
  138.     {
  139.         board_redraw();
  140.         __u8 added = board_add_random_tile();
  141.         board_redraw();
  142.  
  143.         game.over = !added || !board_has_moves();
  144.         game_draw_top();
  145.     }
  146. }
  147.  
  148. void game_move_right()
  149. {
  150.     if (board_right())
  151.     {
  152.         board_redraw();
  153.         __u8 added = board_add_random_tile();
  154.         board_redraw();
  155.  
  156.         game.over = !added || !board_has_moves();
  157.         game_draw_top();
  158.     }
  159. }
  160.