From 65fdda1f8abeaa7ccf45a2f1148f074ab91f0cb2 Mon Sep 17 00:00:00 2001 From: JuanJakobo Date: Wed, 26 Oct 2022 19:30:01 +0200 Subject: [PATCH 1/4] Snake Plugin: change file path --- applications/plugins/snake_game/helpers/snake_file_handler.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/applications/plugins/snake_game/helpers/snake_file_handler.h b/applications/plugins/snake_game/helpers/snake_file_handler.h index fbcc7131e..7ae367506 100644 --- a/applications/plugins/snake_game/helpers/snake_file_handler.h +++ b/applications/plugins/snake_game/helpers/snake_file_handler.h @@ -4,7 +4,7 @@ #include #include -#define SNAKE_GAME_FILE_PATH "/ext/apps/games/snake.stat" +#define SNAKE_GAME_FILE_PATH "/ext/apps/games/.snake" #define SNAKE_GAME_FILE_HEADER "Flipper Snake plugin run file" #define SNAKE_GAME_FILE_ACTUAL_VERSION 1 From 8304605551aab1fa3b9f7d194e995c66aa62fd12 Mon Sep 17 00:00:00 2001 From: JuanJakobo Date: Wed, 26 Oct 2022 19:30:38 +0200 Subject: [PATCH 2/4] Snake Plugin: put Storage handeling in openfile function --- .../plugins/snake_game/helpers/snake_file_handler.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/applications/plugins/snake_game/helpers/snake_file_handler.c b/applications/plugins/snake_game/helpers/snake_file_handler.c index efc3b2e94..139316260 100644 --- a/applications/plugins/snake_game/helpers/snake_file_handler.c +++ b/applications/plugins/snake_game/helpers/snake_file_handler.c @@ -13,7 +13,8 @@ static void snake_game_close_file(FlipperFormat* file) { furi_record_close(RECORD_STORAGE); } -static FlipperFormat* snake_game_open_file(Storage* storage) { +static FlipperFormat* snake_game_open_file() { + Storage* storage = furi_record_open(RECORD_STORAGE); FlipperFormat* file = flipper_format_file_alloc(storage); if(storage_common_stat(storage, SNAKE_GAME_FILE_PATH, NULL) == FSE_OK) { @@ -60,8 +61,7 @@ int16_t snake_game_save_score_to_file(int32_t 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); + FlipperFormat* file = snake_game_open_file(); uint32_t temp = snake_state->len; if(!flipper_format_insert_or_update_uint32(file, SNAKE_GAME_CONFIG_KEY_LEN,&temp, 1)){ @@ -105,8 +105,7 @@ void snake_game_save_game_to_file(SnakeState* const snake_state) { } bool snake_game_init_game_from_file(SnakeState* const snake_state) { - Storage* storage = furi_record_open(RECORD_STORAGE); - FlipperFormat* file = snake_game_open_file(storage); + FlipperFormat* file = snake_game_open_file(); FuriString* file_type = furi_string_alloc(); uint32_t version = 1; @@ -152,7 +151,6 @@ bool snake_game_init_game_from_file(SnakeState* const snake_state) { snake_state->nextMovement = temp; flipper_format_delete_key(file, SNAKE_GAME_CONFIG_KEY_NEXT_MOVEMENT); - array_size = 2; uint32_t temp_point_array[array_size]; if(!flipper_format_read_uint32(file, SNAKE_GAME_CONFIG_KEY_FRUIT_POINTS, temp_point_array, array_size)){ From b97affa562293832106ecc750dd72500ee4baebf Mon Sep 17 00:00:00 2001 From: JuanJakobo Date: Wed, 26 Oct 2022 19:31:12 +0200 Subject: [PATCH 3/4] Snake Plugin: put state game over handeling into function --- applications/plugins/snake_game/snake_game.c | 26 ++++++++++++-------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/applications/plugins/snake_game/snake_game.c b/applications/plugins/snake_game/snake_game.c index b316fb77d..3405a7b26 100644 --- a/applications/plugins/snake_game/snake_game.c +++ b/applications/plugins/snake_game/snake_game.c @@ -87,7 +87,7 @@ static void snake_game_render_callback(Canvas* const canvas, void* ctx) { canvas_set_font(canvas, FontSecondary); char buffer[18]; - snprintf(buffer, sizeof(buffer), "Score: %u", snake_state->len - 7); + snprintf(buffer, sizeof(buffer), "Score: %u", snake_state->len); canvas_draw_str_aligned(canvas, 64, 41, AlignCenter, AlignBottom, buffer); snprintf(buffer, sizeof(buffer), "Highscore: %d", snake_state->highscore); @@ -222,6 +222,18 @@ static void snake_game_move_snake(SnakeState* const snake_state, Point const nex snake_state->points[0] = next_step; } +static void snake_game_game_over(SnakeState* const snake_state, NotificationApp* notification) { + snake_state->state = GameStateGameOver; + snake_state->len = snake_state->len -7; + if(snake_state->len > snake_state->highscore){ + snake_state->isNewHighscore = true; + snake_state->highscore = snake_state->len; + } + + notification_message_block(notification, &sequence_fail); + +} + static void snake_game_process_game_step(SnakeState* const snake_state, NotificationApp* notification) { if(snake_state->state == GameStateGameOver) { @@ -241,9 +253,7 @@ static void snake_state->state = GameStateLastChance; 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); + snake_game_game_over(snake_state, notification); return; } } else { @@ -254,9 +264,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); + snake_game_game_over(snake_state, notification); return; } @@ -264,9 +272,7 @@ static void if(eatFruit) { 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); + snake_game_game_over(snake_state, notification); return; } } From b5899e8aa24fb1527865ef71733df0658492ebe9 Mon Sep 17 00:00:00 2001 From: JuanJakobo Date: Wed, 26 Oct 2022 19:31:51 +0200 Subject: [PATCH 4/4] Snake Plugin: get Highscore on start and only write to file if new highscore --- .../snake_game/helpers/snake_file_handler.c | 32 ++++++------------- .../snake_game/helpers/snake_file_handler.h | 2 +- .../plugins/snake_game/helpers/snake_types.h | 1 + applications/plugins/snake_game/snake_game.c | 4 +++ 4 files changed, 16 insertions(+), 23 deletions(-) diff --git a/applications/plugins/snake_game/helpers/snake_file_handler.c b/applications/plugins/snake_game/helpers/snake_file_handler.c index 139316260..79405cbf4 100644 --- a/applications/plugins/snake_game/helpers/snake_file_handler.c +++ b/applications/plugins/snake_game/helpers/snake_file_handler.c @@ -34,30 +34,14 @@ static FlipperFormat* snake_game_open_file() { 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; - } +void snake_game_save_score_to_file(int16_t highscore) { + FlipperFormat* file = snake_game_open_file(); + uint32_t temp = highscore; + if(!flipper_format_insert_or_update_uint32(file, SNAKE_GAME_CONFIG_HIGHSCORE,&temp, 1)){ + snake_game_close_file(file); + return; } snake_game_close_file(file); - return len; } void snake_game_save_game_to_file(SnakeState* const snake_state) { @@ -116,7 +100,11 @@ bool snake_game_init_game_from_file(SnakeState* const snake_state) { } furi_string_free(file_type); + uint32_t temp; + snake_state->highscore = (flipper_format_read_uint32(file, SNAKE_GAME_CONFIG_HIGHSCORE, &temp, 1)) ? temp : 0; + flipper_format_rewind(file); + if(!flipper_format_read_uint32(file, SNAKE_GAME_CONFIG_KEY_LEN, &temp, 1)){ snake_game_close_file(file); return false; diff --git a/applications/plugins/snake_game/helpers/snake_file_handler.h b/applications/plugins/snake_game/helpers/snake_file_handler.h index 7ae367506..25cda4506 100644 --- a/applications/plugins/snake_game/helpers/snake_file_handler.h +++ b/applications/plugins/snake_game/helpers/snake_file_handler.h @@ -16,7 +16,7 @@ #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_score_to_file(int16_t highscore); 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 f5768311f..08682f585 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; + bool isNewHighscore; int16_t highscore; Direction currentMovement; Direction nextMovement; // if backward of currentMovement, ignore diff --git a/applications/plugins/snake_game/snake_game.c b/applications/plugins/snake_game/snake_game.c index 3405a7b26..5658c1ac1 100644 --- a/applications/plugins/snake_game/snake_game.c +++ b/applications/plugins/snake_game/snake_game.c @@ -292,6 +292,8 @@ int32_t snake_game_app(void* p) { FuriMessageQueue* event_queue = furi_message_queue_alloc(8, sizeof(SnakeEvent)); SnakeState* snake_state = malloc(sizeof(SnakeState)); + snake_state->isNewHighscore = false; + snake_state->highscore = 0; if(!snake_game_init_game_from_file(snake_state)) snake_game_init_game(snake_state); @@ -365,6 +367,8 @@ int32_t snake_game_app(void* p) { release_mutex(&state_mutex, snake_state); } + if(snake_state->isNewHighscore) + snake_game_save_score_to_file(snake_state->highscore); // Wait for all notifications to be played and return backlight to normal state notification_message_block(notification, &sequence_display_backlight_enforce_auto);