forked from KolibriOS/kolibrios
2048:
- load / save highscore testing TODO: - optimize tile drawing: maybe separate canvas for every tile - game over screen - last game save / load git-svn-id: svn://kolibrios.org@5232 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
3fdad8ab94
commit
518d1e922a
@ -1,3 +1,3 @@
|
|||||||
OUTFILE = 2048
|
OUTFILE = 2048
|
||||||
OBJS = main.o game.o board.o paint.o cell.o rect.o defines.o
|
OBJS = main.o game.o board.o config.o paint.o cell.o rect.o defines.o
|
||||||
include $(MENUETDEV)/makefiles/Makefile_for_program
|
include $(MENUETDEV)/makefiles/Makefile_for_program
|
||||||
|
@ -2,5 +2,5 @@ if tup.getconfig('NO_GCC') ~= "" then return end
|
|||||||
HELPERDIR = (tup.getconfig("HELPERDIR") == "") and "../.." or tup.getconfig("HELPERDIR")
|
HELPERDIR = (tup.getconfig("HELPERDIR") == "") and "../.." or tup.getconfig("HELPERDIR")
|
||||||
tup.include(HELPERDIR .. "/use_gcc.lua")
|
tup.include(HELPERDIR .. "/use_gcc.lua")
|
||||||
tup.include(HELPERDIR .. "/use_menuetlibc.lua")
|
tup.include(HELPERDIR .. "/use_menuetlibc.lua")
|
||||||
compile_gcc{"main.c", "defines.c", "rect.c", "paint.c", "cell.c", "board.c", "game.c"}
|
compile_gcc{"main.c", "defines.c", "rect.c", "paint.c", "cell.c", "config.c", "board.c", "game.c"}
|
||||||
link_gcc("2048")
|
link_gcc("2048")
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
#include "board.h"
|
#include "board.h"
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
rect base_cell = {0};
|
rect base_cell = {0};
|
||||||
tile null_tile = {0};
|
tile null_tile = {0};
|
||||||
@ -10,6 +11,7 @@ struct {
|
|||||||
__u16 empty_index[BOARD_MAP_SIZE];// empty cells indexes
|
__u16 empty_index[BOARD_MAP_SIZE];// empty cells indexes
|
||||||
__u16 empty_count; // empty cells count
|
__u16 empty_count; // empty cells count
|
||||||
__u32 score;
|
__u32 score;
|
||||||
|
__u32 highscore;
|
||||||
} board = {0};
|
} board = {0};
|
||||||
|
|
||||||
// Get tile index for row and column
|
// Get tile index for row and column
|
||||||
@ -56,6 +58,10 @@ __u32 random_u32(__u32 max);
|
|||||||
|
|
||||||
void board_init(rect* r)
|
void board_init(rect* r)
|
||||||
{
|
{
|
||||||
|
__u32 high = config_load_highscore();
|
||||||
|
if (high > board.highscore)
|
||||||
|
board.highscore = high;
|
||||||
|
|
||||||
// seed for random number generator
|
// seed for random number generator
|
||||||
srand(__menuet__getsystemclock());
|
srand(__menuet__getsystemclock());
|
||||||
|
|
||||||
@ -92,6 +98,7 @@ void board_init(rect* r)
|
|||||||
|
|
||||||
void board_delete()
|
void board_delete()
|
||||||
{
|
{
|
||||||
|
config_save_highscore(board.highscore);
|
||||||
canvas_delete();
|
canvas_delete();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -167,6 +174,8 @@ __u8 board_up()
|
|||||||
{
|
{
|
||||||
moved = true;
|
moved = true;
|
||||||
board.score += indtile->value * 2;
|
board.score += indtile->value * 2;
|
||||||
|
if (board.score > board.highscore)
|
||||||
|
board.highscore = board.score;
|
||||||
tempboard_merge_tile(temp_board,ind,preind);
|
tempboard_merge_tile(temp_board,ind,preind);
|
||||||
row = 0;
|
row = 0;
|
||||||
}
|
}
|
||||||
@ -217,6 +226,8 @@ __u8 board_down()
|
|||||||
{
|
{
|
||||||
moved = true;
|
moved = true;
|
||||||
board.score += indtile->value * 2;
|
board.score += indtile->value * 2;
|
||||||
|
if (board.score > board.highscore)
|
||||||
|
board.highscore = board.score;
|
||||||
tempboard_merge_tile(temp_board,ind,preind);
|
tempboard_merge_tile(temp_board,ind,preind);
|
||||||
row = BOARD_COUNT;
|
row = BOARD_COUNT;
|
||||||
}
|
}
|
||||||
@ -266,6 +277,8 @@ __u8 board_left()
|
|||||||
{
|
{
|
||||||
moved = true;
|
moved = true;
|
||||||
board.score += indtile->value * 2;
|
board.score += indtile->value * 2;
|
||||||
|
if (board.score > board.highscore)
|
||||||
|
board.highscore = board.score;
|
||||||
tempboard_merge_tile(temp_board,ind,preind);
|
tempboard_merge_tile(temp_board,ind,preind);
|
||||||
column = 0;
|
column = 0;
|
||||||
}
|
}
|
||||||
@ -316,6 +329,8 @@ __u8 board_right()
|
|||||||
{
|
{
|
||||||
moved = true;
|
moved = true;
|
||||||
board.score += indtile->value * 2;
|
board.score += indtile->value * 2;
|
||||||
|
if (board.score > board.highscore)
|
||||||
|
board.highscore = board.score;
|
||||||
tempboard_merge_tile(temp_board,ind,preind);
|
tempboard_merge_tile(temp_board,ind,preind);
|
||||||
column = BOARD_COUNT;
|
column = BOARD_COUNT;
|
||||||
}
|
}
|
||||||
@ -396,6 +411,11 @@ __u32 board_score()
|
|||||||
return board.score;
|
return board.score;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
__u32 board_highscore()
|
||||||
|
{
|
||||||
|
return board.highscore;
|
||||||
|
}
|
||||||
|
|
||||||
void board_update_empty_info()
|
void board_update_empty_info()
|
||||||
{
|
{
|
||||||
board.empty_count = 0;
|
board.empty_count = 0;
|
||||||
|
@ -23,6 +23,7 @@ __u8 board_has_moves();
|
|||||||
|
|
||||||
// Get score
|
// Get score
|
||||||
__u32 board_score();
|
__u32 board_score();
|
||||||
|
__u32 board_highscore();
|
||||||
|
|
||||||
// Try to move all tiles up
|
// Try to move all tiles up
|
||||||
// Will return true if something moved or false - if not
|
// Will return true if something moved or false - if not
|
||||||
|
55
programs/games/2048/config.c
Normal file
55
programs/games/2048/config.c
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
#pragma pack(push,1)
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
__u32 func;
|
||||||
|
__u32 l_off;
|
||||||
|
__u32 h_off_flags;
|
||||||
|
__u32 size;
|
||||||
|
char* data;
|
||||||
|
char null;
|
||||||
|
char* name;
|
||||||
|
} fs_info;
|
||||||
|
|
||||||
|
#pragma pack(pop)
|
||||||
|
|
||||||
|
char path[] = "/sys/games/2048.dat";
|
||||||
|
|
||||||
|
__u32 config_load_highscore()
|
||||||
|
{
|
||||||
|
__u32 highscore = 0;
|
||||||
|
|
||||||
|
fs_info cfg = {0};
|
||||||
|
cfg.func = 0;
|
||||||
|
cfg.size = 4;
|
||||||
|
cfg.data = (char*)&highscore;
|
||||||
|
cfg.name = path;
|
||||||
|
|
||||||
|
__u32 ret = 0;
|
||||||
|
__u32 rnum = 0;
|
||||||
|
|
||||||
|
__asm__ __volatile__("int $0x40":"=a"(ret),"=b"(rnum):
|
||||||
|
"a"(70),
|
||||||
|
"b"((__u32)(&cfg)));
|
||||||
|
|
||||||
|
if (ret || (rnum != 4)) highscore = 0;
|
||||||
|
|
||||||
|
return highscore;
|
||||||
|
}
|
||||||
|
|
||||||
|
void config_save_highscore(__u32 score)
|
||||||
|
{
|
||||||
|
fs_info cfg = {0};
|
||||||
|
cfg.func = 2;
|
||||||
|
cfg.size = 4;
|
||||||
|
cfg.data = (char*)&score;
|
||||||
|
cfg.name = path;
|
||||||
|
|
||||||
|
__u32 ret = 0;
|
||||||
|
__u32 wnum = 0;
|
||||||
|
|
||||||
|
__asm__ __volatile__("int $0x40":"=a"(ret),"=b"(wnum):
|
||||||
|
"a"(70),
|
||||||
|
"b"((__u32)(&cfg)));
|
||||||
|
}
|
12
programs/games/2048/config.h
Normal file
12
programs/games/2048/config.h
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
#ifndef CONFIG_H
|
||||||
|
#define CONFIG_H
|
||||||
|
|
||||||
|
#include "defines.h"
|
||||||
|
|
||||||
|
// Get saved highscore
|
||||||
|
__u32 config_load_highscore();
|
||||||
|
|
||||||
|
// Save current highscore
|
||||||
|
void config_save_highscore(__u32 score);
|
||||||
|
|
||||||
|
#endif // CONFIG_H
|
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
struct {
|
struct {
|
||||||
rect new_game_button;// new game button place
|
rect new_game_button;// new game button place
|
||||||
|
rect highscore_rect; // highscore place
|
||||||
rect score_rect; // score place
|
rect score_rect; // score place
|
||||||
__u8 over; // flag for game over
|
__u8 over; // flag for game over
|
||||||
} game;
|
} game;
|
||||||
@ -19,6 +20,9 @@ void game_draw_top()
|
|||||||
rect_draw_text(&game.new_game_button,"NEW GAME",8,GAME_BG_COLOR);
|
rect_draw_text(&game.new_game_button,"NEW GAME",8,GAME_BG_COLOR);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
rect_draw(&game.highscore_rect,BOARD_BG_COLOR);
|
||||||
|
rect_draw_value(&game.highscore_rect,board_highscore(),GAME_BG_COLOR);
|
||||||
|
|
||||||
rect_draw(&game.score_rect,BOARD_BG_COLOR);
|
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);
|
||||||
}
|
}
|
||||||
@ -66,12 +70,17 @@ void game_init()
|
|||||||
|
|
||||||
game.new_game_button.x = av_area.x;
|
game.new_game_button.x = av_area.x;
|
||||||
game.new_game_button.y = (av_area.y - SCORE_HEIGHT) / 2;
|
game.new_game_button.y = (av_area.y - SCORE_HEIGHT) / 2;
|
||||||
game.new_game_button.width = (av_area.width - BOARD_SPACING) / 2;
|
game.new_game_button.width = (av_area.width - BOARD_SPACING) / 3;
|
||||||
game.new_game_button.height = SCORE_HEIGHT;
|
game.new_game_button.height = SCORE_HEIGHT;
|
||||||
|
|
||||||
game.score_rect.x = av_area.x + (av_area.width + BOARD_SPACING) / 2;
|
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.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.y = (av_area.y - SCORE_HEIGHT) / 2;
|
||||||
game.score_rect.width = (av_area.width - BOARD_SPACING) / 2;
|
game.score_rect.width = (av_area.width - BOARD_SPACING) / 3;
|
||||||
game.score_rect.height = SCORE_HEIGHT;
|
game.score_rect.height = SCORE_HEIGHT;
|
||||||
|
|
||||||
game_draw_top();
|
game_draw_top();
|
||||||
|
Loading…
Reference in New Issue
Block a user