Subversion Repositories Kolibri OS

Rev

Rev 5231 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
5229 raandoom 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
}