#include "game.h" struct { rect reset_button; // new game button place rect highscore_rect; // highscore place rect score_rect; // score place rect over_rect; // game over window __u8 over; // flag for game over } game; void game_draw_ui() { __menuet__make_button(game.reset_button.x, game.reset_button.y, game.reset_button.width, game.reset_button.height, NEW_GAME_BUTTON, BOARD_BG_COLOR); rect_draw_text(&game.reset_button,"Restart",7,GAME_BG_COLOR,0); rect_draw(&game.highscore_rect,BOARD_BG_COLOR); rect_draw_value(&game.highscore_rect,board_highscore(),GAME_BG_COLOR,0); rect_draw(&game.score_rect,BOARD_BG_COLOR); rect_draw_value(&game.score_rect,board_score(),GAME_BG_COLOR,0); if (game.over) { __u16 line_step = FONT_HEIGHT * 2; rect_draw(&game.over_rect,BOARD_BG_COLOR); rect line_rect = { .x = game.over_rect.x, .y = game.over_rect.y + line_step, .width = game.over_rect.width, .height = line_step }; rect_draw_text(&line_rect,"It looks like there is",22,0xFFFFFF,0); line_rect.y += line_step; rect_draw_text(&line_rect,"no more moves",13,0xFFFFFF,0); line_rect.y += line_step; rect_draw_text(&line_rect,"available",9,0xFFFFFF,0); } } void game_init() { game.over = false; // place window at the center of screen __u16 screen_w = 0; __u16 screen_h = 0; __menuet__get_screen_max(&screen_w,&screen_h); __menuet__window_redraw(1); __menuet__define_window((screen_w - WND_WIDTH) / 2, (screen_h - WND_HEIGHT) / 2, WND_WIDTH, WND_HEIGHT, 0x34 << 24 | GAME_BG_COLOR, 0, (__u32)header); // find info about window client area __menuet__get_process_table(&proc_info,PID_WHOAMI); // calc board rect av_area = {0}; av_area.x = GAME_BORDER; av_area.y = (SCORE_HEIGHT > GAME_BORDER) ? SCORE_HEIGHT : GAME_BORDER; av_area.width = proc_info.client_width - av_area.x * 2; av_area.height = proc_info.client_height - av_area.y - GAME_BORDER; // minimal square if (av_area.width < av_area.height) { av_area.y += (av_area.height - av_area.width) / 2; av_area.height = av_area.width; } else // if (av_area.height < av_area.width) { av_area.x += (av_area.width - av_area.height) / 2; av_area.width = av_area.height; } board_init(&av_area); rect top_base = { .x = av_area.x, .y = (av_area.y - SCORE_HEIGHT) / 2, .width = (av_area.width - BOARD_SPACING * 2) / 3, .height = SCORE_HEIGHT }; game.reset_button = top_base; top_base.x += top_base.width + BOARD_SPACING; game.highscore_rect = top_base; top_base.x += top_base.width + BOARD_SPACING; game.score_rect = top_base; av_area.x += av_area.width / 4; av_area.y += av_area.height / 4; av_area.width /= 2; av_area.height /= 2; game.over_rect = av_area; game_draw_ui(); __menuet__window_redraw(2); } void game_exit() { board_delete(); } void game_redraw() { __menuet__get_process_table(&proc_info,PID_WHOAMI); // start redraw __menuet__window_redraw(1); __menuet__define_window(0, // __u16 x1 : ignored 0, // __u16 y1 : ignored 0, // __u16 xsize : ignored 0, // __u16 ysize : ignored 0x34 << 24 | GAME_BG_COLOR, // __u32 body_color 0, // __u32 grab_color (__u32)header); // __u32 frame_color or header game_draw_ui(); board_redraw(); // end redraw __menuet__window_redraw(2); } void game_move_up() { if (board_up()) { board_redraw(); __u8 added = board_add_random_tile(); board_redraw(); game.over = !added || !board_has_moves(); game_draw_ui(); } } void game_move_down() { if (board_down()) { board_redraw(); __u8 added = board_add_random_tile(); board_redraw(); game.over = !added || !board_has_moves(); game_draw_ui(); } } void game_move_left() { if (board_left()) { board_redraw(); __u8 added = board_add_random_tile(); board_redraw(); game.over = !added || !board_has_moves(); game_draw_ui(); } } void game_move_right() { if (board_right()) { board_redraw(); __u8 added = board_add_random_tile(); board_redraw(); game.over = !added || !board_has_moves(); game_draw_ui(); } }