Subversion Repositories Kolibri OS

Rev

Rev 5231 | Go to most recent revision | Details | Compare with Previous | 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
5232 raandoom 5
    rect    highscore_rect; // highscore place
5229 raandoom 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
 
5232 raandoom 23
    rect_draw(&game.highscore_rect,BOARD_BG_COLOR);
24
    rect_draw_value(&game.highscore_rect,board_highscore(),GAME_BG_COLOR);
25
 
5229 raandoom 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;
5232 raandoom 73
    game.new_game_button.width = (av_area.width - BOARD_SPACING) / 3;
5229 raandoom 74
    game.new_game_button.height = SCORE_HEIGHT;
75
 
5232 raandoom 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;
5229 raandoom 82
    game.score_rect.y = (av_area.y - SCORE_HEIGHT) / 2;
5232 raandoom 83
    game.score_rect.width = (av_area.width - BOARD_SPACING) / 3;
5229 raandoom 84
    game.score_rect.height = SCORE_HEIGHT;
85
 
86
    game_draw_top();
87
 
88
    __menuet__window_redraw(2);
89
}
90
 
5231 raandoom 91
void game_exit()
92
{
93
    board_delete();
94
}
95
 
5229 raandoom 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
}