Subversion Repositories Kolibri OS

Rev

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