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    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_redraw()
  83. {
  84.     __menuet__get_process_table(&proc_info,PID_WHOAMI);
  85.  
  86.     // start redraw
  87.     __menuet__window_redraw(1);
  88.  
  89.     vsync();
  90.     __menuet__define_window(0,              // __u16 x1     : ignored
  91.                             0,              // __u16 y1     : ignored
  92.                             0,              // __u16 xsize  : ignored
  93.                             0,              // __u16 ysize  : ignored
  94.                             GAME_BG_COLOR,  // __u32 body_color
  95.                             0,              // __u32 grab_color
  96.                             (__u32)header); // __u32 frame_color or header
  97.  
  98.     game_draw_top();
  99.     board_redraw();
  100.  
  101.     // end redraw
  102.     __menuet__window_redraw(2);
  103. }
  104.  
  105. void game_move_up()
  106. {
  107.     if (board_up())
  108.     {
  109.         board_redraw();
  110.         __u8 added = board_add_random_tile();
  111.         board_redraw();
  112.  
  113.         game.over = !added || !board_has_moves();
  114.         game_draw_top();
  115.     }
  116. }
  117.  
  118. void game_move_down()
  119. {
  120.     if (board_down())
  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_left()
  132. {
  133.     if (board_left())
  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_right()
  145. {
  146.     if (board_right())
  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.