forked from KolibriOS/kolibrios
7b22babed6
- fix load / save highscore - added message about game over - beautify text draw TODO: - optimize tile drawing: maybe separate canvas for every tile git-svn-id: svn://kolibrios.org@5238 a494cfbc-eb01-0410-851d-a64ba20cac60
195 lines
5.0 KiB
C
195 lines
5.0 KiB
C
#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();
|
|
}
|
|
}
|