diff --git a/applications/plugins/snake_game/helpers/snake_file_handler.c b/applications/plugins/snake_game/helpers/snake_file_handler.c index a60463c17..569bd8738 100644 --- a/applications/plugins/snake_game/helpers/snake_file_handler.c +++ b/applications/plugins/snake_game/helpers/snake_file_handler.c @@ -48,125 +48,134 @@ static FlipperFormat* snake_game_open_file() { 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)) { + if(file != NULL) { + 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; } - snake_game_close_file(file); } void snake_game_save_game_to_file(SnakeState* const snake_state) { 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)) { - snake_game_close_file(file); - return; - } + if(file != NULL) { + uint32_t temp = snake_state->len; + if(!flipper_format_insert_or_update_uint32(file, SNAKE_GAME_CONFIG_KEY_LEN, &temp, 1)) { + snake_game_close_file(file); + return; + } - uint16_t array_size = snake_state->len * 2; - uint32_t temp_array[array_size]; - for(int16_t i = 0, a = 0; a < array_size && i < snake_state->len; i++) { - temp_array[a++] = snake_state->points[i].x; - temp_array[a++] = snake_state->points[i].y; - } - if(!flipper_format_insert_or_update_uint32( - file, SNAKE_GAME_CONFIG_KEY_POINTS, temp_array, array_size)) { - snake_game_close_file(file); - return; - } + uint16_t array_size = snake_state->len * 2; + uint32_t temp_array[array_size]; + for(int16_t i = 0, a = 0; a < array_size && i < snake_state->len; i++) { + temp_array[a++] = snake_state->points[i].x; + temp_array[a++] = snake_state->points[i].y; + } + if(!flipper_format_insert_or_update_uint32( + file, SNAKE_GAME_CONFIG_KEY_POINTS, temp_array, array_size)) { + snake_game_close_file(file); + return; + } - temp = snake_state->currentMovement; - if(!flipper_format_insert_or_update_uint32( - file, SNAKE_GAME_CONFIG_KEY_CURRENT_MOVEMENT, &temp, 1)) { - snake_game_close_file(file); - return; - } + temp = snake_state->currentMovement; + if(!flipper_format_insert_or_update_uint32( + file, SNAKE_GAME_CONFIG_KEY_CURRENT_MOVEMENT, &temp, 1)) { + snake_game_close_file(file); + return; + } - temp = snake_state->nextMovement; - if(!flipper_format_insert_or_update_uint32( - file, SNAKE_GAME_CONFIG_KEY_NEXT_MOVEMENT, &temp, 1)) { - snake_game_close_file(file); - return; - } + temp = snake_state->nextMovement; + if(!flipper_format_insert_or_update_uint32( + file, SNAKE_GAME_CONFIG_KEY_NEXT_MOVEMENT, &temp, 1)) { + snake_game_close_file(file); + return; + } - array_size = 2; - uint32_t temp_point_array[array_size]; - temp_point_array[0] = snake_state->fruit.x; - temp_point_array[1] = snake_state->fruit.y; - if(!flipper_format_insert_or_update_uint32( - file, SNAKE_GAME_CONFIG_KEY_FRUIT_POINTS, temp_point_array, array_size)) { - snake_game_close_file(file); - return; - } + array_size = 2; + uint32_t temp_point_array[array_size]; + temp_point_array[0] = snake_state->fruit.x; + temp_point_array[1] = snake_state->fruit.y; + if(!flipper_format_insert_or_update_uint32( + file, SNAKE_GAME_CONFIG_KEY_FRUIT_POINTS, temp_point_array, array_size)) { + snake_game_close_file(file); + return; + } - snake_game_close_file(file); + snake_game_close_file(file); + } } bool snake_game_init_game_from_file(SnakeState* const snake_state) { FlipperFormat* file = snake_game_open_file(); - FuriString* file_type = furi_string_alloc(); - uint32_t version = 1; - if(!flipper_format_read_header(file, file_type, &version)) { + if(file != NULL) { + FuriString* file_type = furi_string_alloc(); + uint32_t version = 1; + if(!flipper_format_read_header(file, file_type, &version)) { + furi_string_free(file_type); + snake_game_close_file(file); + return false; + } 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; + } + snake_state->len = temp; + flipper_format_delete_key(file, SNAKE_GAME_CONFIG_KEY_LEN); + + uint16_t array_size = snake_state->len * 2; + uint32_t temp_array[array_size]; + if(!flipper_format_read_uint32( + file, SNAKE_GAME_CONFIG_KEY_POINTS, temp_array, array_size)) { + snake_game_close_file(file); + return false; + } + + for(int16_t i = 0, a = 0; a < array_size && i < snake_state->len; i++) { + snake_state->points[i].x = temp_array[a++]; + snake_state->points[i].y = temp_array[a++]; + } + flipper_format_delete_key(file, SNAKE_GAME_CONFIG_KEY_POINTS); + + if(!flipper_format_read_uint32(file, SNAKE_GAME_CONFIG_KEY_CURRENT_MOVEMENT, &temp, 1)) { + snake_game_close_file(file); + return false; + } + snake_state->currentMovement = temp; + flipper_format_delete_key(file, SNAKE_GAME_CONFIG_KEY_CURRENT_MOVEMENT); + + if(!flipper_format_read_uint32(file, SNAKE_GAME_CONFIG_KEY_NEXT_MOVEMENT, &temp, 1)) { + snake_game_close_file(file); + return false; + } + 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)) { + snake_game_close_file(file); + return false; + } + snake_state->fruit.x = temp_point_array[0]; + snake_state->fruit.y = temp_point_array[1]; + flipper_format_delete_key(file, SNAKE_GAME_CONFIG_KEY_FRUIT_POINTS); + snake_game_close_file(file); - return false; - } - 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; - } - snake_state->len = temp; - flipper_format_delete_key(file, SNAKE_GAME_CONFIG_KEY_LEN); - - uint16_t array_size = snake_state->len * 2; - uint32_t temp_array[array_size]; - if(!flipper_format_read_uint32(file, SNAKE_GAME_CONFIG_KEY_POINTS, temp_array, array_size)) { - snake_game_close_file(file); - return false; + return true; } - for(int16_t i = 0, a = 0; a < array_size && i < snake_state->len; i++) { - snake_state->points[i].x = temp_array[a++]; - snake_state->points[i].y = temp_array[a++]; - } - flipper_format_delete_key(file, SNAKE_GAME_CONFIG_KEY_POINTS); - - if(!flipper_format_read_uint32(file, SNAKE_GAME_CONFIG_KEY_CURRENT_MOVEMENT, &temp, 1)) { - snake_game_close_file(file); - return false; - } - snake_state->currentMovement = temp; - flipper_format_delete_key(file, SNAKE_GAME_CONFIG_KEY_CURRENT_MOVEMENT); - - if(!flipper_format_read_uint32(file, SNAKE_GAME_CONFIG_KEY_NEXT_MOVEMENT, &temp, 1)) { - snake_game_close_file(file); - return false; - } - 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)) { - snake_game_close_file(file); - return false; - } - snake_state->fruit.x = temp_point_array[0]; - snake_state->fruit.y = temp_point_array[1]; - flipper_format_delete_key(file, SNAKE_GAME_CONFIG_KEY_FRUIT_POINTS); - - snake_game_close_file(file); - - return true; + 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 586d9df94..178d5d8e0 100644 --- a/applications/plugins/snake_game/helpers/snake_file_handler.h +++ b/applications/plugins/snake_game/helpers/snake_file_handler.h @@ -4,8 +4,8 @@ #include #include -#define APPS_DATA EXT_PATH("apps_data") -#define SNAKE_GAME_FILE_DIR_PATH APPS_DATA "/snake_game" +#define APPS_DATA EXT_PATH("apps_data") +#define SNAKE_GAME_FILE_DIR_PATH APPS_DATA "/snake_game" #define SNAKE_GAME_FILE_PATH SNAKE_GAME_FILE_DIR_PATH "/.snake" #define SNAKE_GAME_FILE_HEADER "Flipper Snake plugin run file"