/programs/games/2048/config.c |
---|
22,7 → 22,7 |
fs_info cfg = {0}; |
cfg.func = 0; |
cfg.size = 4; |
cfg.size = sizeof(__u32); |
cfg.data = (char*)&highscore; |
cfg.name = path; |
31,7 → 31,8 |
__asm__ __volatile__("int $0x40":"=a"(ret),"=b"(rnum): |
"a"(70), |
"b"((__u32)(&cfg))); |
"b"((__u32)(&cfg)): |
"memory"); |
if (ret || (rnum != 4)) highscore = 0; |
42,7 → 43,7 |
{ |
fs_info cfg = {0}; |
cfg.func = 2; |
cfg.size = 4; |
cfg.size = sizeof(__u32); |
cfg.data = (char*)&score; |
cfg.name = path; |
51,5 → 52,6 |
__asm__ __volatile__("int $0x40":"=a"(ret),"=b"(wnum): |
"a"(70), |
"b"((__u32)(&cfg))); |
"b"((__u32)(&cfg)): |
"memory"); |
} |
/programs/games/2048/defines.c |
---|
16,3 → 16,9 |
inline void vsync() { |
__asm__ __volatile__("int $0x40"::"a"(18),"b"(14)); |
} |
// Get text length in pixels |
inline __u32 text_length_px(__u32 len) |
{ |
return len * FONT_WIDTH + len; |
} |
/programs/games/2048/defines.h |
---|
10,6 → 10,8 |
inline void clear_key_buffer(); |
inline void vsync(); |
inline __u32 text_length_px(__u32 len); |
#define false (0) |
#define true (1) |
26,7 → 28,7 |
#define WND_HEIGHT (400) // main window height |
#define GAME_BORDER (30) // minimum border size around board |
#define GAME_BG_COLOR (0x34FAF8EF) // main window background color |
#define GAME_BG_COLOR (0xFAF8EF) // main window background color |
#define SCORE_HEIGHT (21) // minimum height for score text |
/programs/games/2048/game.c |
---|
1,31 → 1,50 |
#include "game.h" |
struct { |
rect new_game_button;// new game button place |
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_top() |
void game_draw_ui() |
{ |
if (game.over) |
{ |
__menuet__make_button(game.new_game_button.x, |
game.new_game_button.y, |
game.new_game_button.width, |
game.new_game_button.height, |
__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.new_game_button,"NEW GAME",8,GAME_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); |
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); |
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() |
{ |
41,7 → 60,7 |
(screen_h - WND_HEIGHT) / 2, |
WND_WIDTH, |
WND_HEIGHT, |
GAME_BG_COLOR, |
0x34 << 24 | GAME_BG_COLOR, |
0, |
(__u32)header); |
68,23 → 87,30 |
board_init(&av_area); |
game.new_game_button.x = av_area.x; |
game.new_game_button.y = (av_area.y - SCORE_HEIGHT) / 2; |
game.new_game_button.width = (av_area.width - BOARD_SPACING) / 3; |
game.new_game_button.height = SCORE_HEIGHT; |
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.highscore_rect.x = av_area.x + (av_area.width + BOARD_SPACING) / 3; |
game.highscore_rect.y = (av_area.y - SCORE_HEIGHT) / 2; |
game.highscore_rect.width = (av_area.width - BOARD_SPACING) / 3; |
game.highscore_rect.height = SCORE_HEIGHT; |
game.reset_button = top_base; |
game.score_rect.x = av_area.x + (av_area.width + BOARD_SPACING) * 2 / 3; |
game.score_rect.y = (av_area.y - SCORE_HEIGHT) / 2; |
game.score_rect.width = (av_area.width - BOARD_SPACING) / 3; |
game.score_rect.height = SCORE_HEIGHT; |
top_base.x += top_base.width + BOARD_SPACING; |
game.highscore_rect = top_base; |
game_draw_top(); |
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); |
} |
104,11 → 130,11 |
0, // __u16 y1 : ignored |
0, // __u16 xsize : ignored |
0, // __u16 ysize : ignored |
GAME_BG_COLOR, // __u32 body_color |
0x34 << 24 | GAME_BG_COLOR, // __u32 body_color |
0, // __u32 grab_color |
(__u32)header); // __u32 frame_color or header |
game_draw_top(); |
game_draw_ui(); |
board_redraw(); |
// end redraw |
124,7 → 150,7 |
board_redraw(); |
game.over = !added || !board_has_moves(); |
game_draw_top(); |
game_draw_ui(); |
} |
} |
137,7 → 163,7 |
board_redraw(); |
game.over = !added || !board_has_moves(); |
game_draw_top(); |
game_draw_ui(); |
} |
} |
150,7 → 176,7 |
board_redraw(); |
game.over = !added || !board_has_moves(); |
game_draw_top(); |
game_draw_ui(); |
} |
} |
163,6 → 189,6 |
board_redraw(); |
game.over = !added || !board_has_moves(); |
game_draw_top(); |
game_draw_ui(); |
} |
} |
/programs/games/2048/rect.c |
---|
57,42 → 57,29 |
(from->height == to->height); |
} |
void rect_draw_text(rect *r, char *txt, __u32 len, __u32 color) |
void rect_draw_text(rect *r, char *txt, __u32 len, __u32 color, __u32 frame_color) |
{ |
__menuet__write_text(r->x + 1 + (r->width - len * FONT_WIDTH - len) / 2, |
// right down shadow |
__menuet__write_text(r->x + 1 + (r->width - text_length_px(len)) / 2, |
r->y + 1 + (r->height - FONT_HEIGHT) / 2, |
0xFFFFFF,txt,len); |
__menuet__write_text(r->x - 1 + (r->width - len * FONT_WIDTH - len) / 2, |
r->y - 1 + (r->height - FONT_HEIGHT) / 2, |
0xFFFFFF,txt,len); |
__menuet__write_text(r->x - 1 + (r->width - len * FONT_WIDTH - len) / 2, |
r->y + 1 + (r->height - FONT_HEIGHT) / 2, |
0xFFFFFF,txt,len); |
__menuet__write_text(r->x + 1 + (r->width - len * FONT_WIDTH - len) / 2, |
r->y - 1 + (r->height - FONT_HEIGHT) / 2, |
0xFFFFFF,txt,len); |
__menuet__write_text(r->x + 1 + (r->width - len * FONT_WIDTH - len) / 2, |
frame_color,txt,len); |
// right shadow |
__menuet__write_text(r->x + 1 + (r->width - text_length_px(len)) / 2, |
r->y + (r->height - FONT_HEIGHT) / 2, |
0xFFFFFF,txt,len); |
__menuet__write_text(r->x - 1 + (r->width - len * FONT_WIDTH - len) / 2, |
r->y + (r->height - FONT_HEIGHT) / 2, |
0xFFFFFF,txt,len); |
__menuet__write_text(r->x + (r->width - len * FONT_WIDTH - len) / 2, |
frame_color,txt,len); |
// down shadow |
__menuet__write_text(r->x + (r->width - text_length_px(len)) / 2, |
r->y + 1 + (r->height - FONT_HEIGHT) / 2, |
0xFFFFFF,txt,len); |
__menuet__write_text(r->x + (r->width - len * FONT_WIDTH - len) / 2, |
r->y - 1 + (r->height - FONT_HEIGHT) / 2, |
0xFFFFFF,txt,len); |
frame_color,txt,len); |
__menuet__write_text(r->x + (r->width - len * FONT_WIDTH - len) / 2, |
__menuet__write_text(r->x + (r->width - text_length_px(len)) / 2, |
r->y + (r->height - FONT_HEIGHT) / 2, |
0,txt,len); |
color,txt,len); |
} |
void rect_draw_value(rect* r, __u32 v, __u32 color) |
void rect_draw_value(rect* r, __u32 v, __u32 color, __u32 frame_color) |
{ |
char buffer[16] = {0}; |
__u32 length = strlen(itoa(v,buffer,10)); |
rect_draw_text(r,buffer,length,color); |
rect_draw_text(r,buffer,length,color,frame_color); |
} |
/programs/games/2048/rect.h |
---|
24,9 → 24,9 |
__u8 rect_transform(rect* from, rect* to, __u16 step); |
// Draw text at the rect center |
void rect_draw_text(rect* r, char* txt, __u32 len, __u32 color); |
void rect_draw_text(rect* r, char* txt, __u32 len, __u32 color, __u32 frame_color); |
// Draw value as text at the rect center |
void rect_draw_value(rect* r, __u32 v, __u32 color); |
void rect_draw_value(rect* r, __u32 v, __u32 color, __u32 frame_color); |
#endif // RECT_H |