diff --git a/applications/plugins/snake_game/helpers/snake_file_handler.c b/applications/plugins/snake_game/helpers/snake_file_handler.c index 415c840de..efc3b2e94 100644 --- a/applications/plugins/snake_game/helpers/snake_file_handler.c +++ b/applications/plugins/snake_game/helpers/snake_file_handler.c @@ -33,6 +33,32 @@ static FlipperFormat* snake_game_open_file(Storage* storage) { return file; } +int16_t snake_game_save_score_to_file(int32_t len) { + Storage* storage = furi_record_open(RECORD_STORAGE); + FlipperFormat* file = snake_game_open_file(storage); + + len = len - 7; + int32_t temp; + if(!flipper_format_read_int32(file, SNAKE_GAME_CONFIG_HIGHSCORE, &temp, 1)){ + if(!flipper_format_insert_or_update_int32(file, SNAKE_GAME_CONFIG_HIGHSCORE, &len, 1)){ + snake_game_close_file(file); + return -1; + } + }else{ + if(len > temp){ + flipper_format_rewind(file); + if(!flipper_format_insert_or_update_int32(file, SNAKE_GAME_CONFIG_HIGHSCORE, &len, 1)){ + snake_game_close_file(file); + return -1; + } + }else{ + len = temp; + } + } + snake_game_close_file(file); + return len; +} + void snake_game_save_game_to_file(SnakeState* const snake_state) { Storage* storage = furi_record_open(RECORD_STORAGE); FlipperFormat* file = snake_game_open_file(storage); diff --git a/applications/plugins/snake_game/helpers/snake_file_handler.h b/applications/plugins/snake_game/helpers/snake_file_handler.h index 3a89114c3..fbcc7131e 100644 --- a/applications/plugins/snake_game/helpers/snake_file_handler.h +++ b/applications/plugins/snake_game/helpers/snake_file_handler.h @@ -14,6 +14,9 @@ #define SNAKE_GAME_CONFIG_KEY_CURRENT_MOVEMENT "CurrentMovement" #define SNAKE_GAME_CONFIG_KEY_NEXT_MOVEMENT "NextMovement" #define SNAKE_GAME_CONFIG_KEY_FRUIT_POINTS "FruitPoints" +#define SNAKE_GAME_CONFIG_HIGHSCORE "Highscore" + +int16_t snake_game_save_score_to_file(int32_t length); void snake_game_save_game_to_file(SnakeState* const snake_state); diff --git a/applications/plugins/snake_game/helpers/snake_types.h b/applications/plugins/snake_game/helpers/snake_types.h index da3638970..f5768311f 100644 --- a/applications/plugins/snake_game/helpers/snake_types.h +++ b/applications/plugins/snake_game/helpers/snake_types.h @@ -42,6 +42,7 @@ typedef enum { typedef struct { Point points[MAX_SNAKE_LEN]; uint16_t len; + int16_t highscore; Direction currentMovement; Direction nextMovement; // if backward of currentMovement, ignore Point fruit; diff --git a/applications/plugins/snake_game/snake_game.c b/applications/plugins/snake_game/snake_game.c index 0b6cd85f3..b316fb77d 100644 --- a/applications/plugins/snake_game/snake_game.c +++ b/applications/plugins/snake_game/snake_game.c @@ -77,18 +77,21 @@ static void snake_game_render_callback(Canvas* const canvas, void* ctx) { if(snake_state->state == GameStateGameOver) { // Screen is 128x64 px canvas_set_color(canvas, ColorWhite); - canvas_draw_box(canvas, 34, 20, 62, 24); + canvas_draw_box(canvas, 32, 20, 64, 34); canvas_set_color(canvas, ColorBlack); - canvas_draw_frame(canvas, 34, 20, 62, 24); + canvas_draw_frame(canvas, 32, 20, 64, 34); canvas_set_font(canvas, FontPrimary); canvas_draw_str(canvas, 37, 31, "Game Over"); canvas_set_font(canvas, FontSecondary); - char buffer[12]; + char buffer[18]; snprintf(buffer, sizeof(buffer), "Score: %u", snake_state->len - 7); canvas_draw_str_aligned(canvas, 64, 41, AlignCenter, AlignBottom, buffer); + + snprintf(buffer, sizeof(buffer), "Highscore: %d", snake_state->highscore); + canvas_draw_str_aligned(canvas, 64, 51, AlignCenter, AlignBottom, buffer); } release_mutex((ValueMutex*)ctx, snake_state); @@ -239,6 +242,7 @@ static void return; } else if(snake_state->state == GameStateLastChance) { snake_state->state = GameStateGameOver; + snake_state->highscore = snake_game_save_score_to_file(snake_state->len); notification_message_block(notification, &sequence_fail); return; } @@ -251,6 +255,7 @@ static void crush = snake_game_collision_with_tail(snake_state, next_step); if(crush) { snake_state->state = GameStateGameOver; + snake_state->highscore = snake_game_save_score_to_file(snake_state->len); notification_message_block(notification, &sequence_fail); return; } @@ -260,6 +265,7 @@ static void snake_state->len++; if(snake_state->len >= MAX_SNAKE_LEN) { snake_state->state = GameStateGameOver; + snake_state->highscore = snake_game_save_score_to_file(snake_state->len); notification_message_block(notification, &sequence_fail); return; }