Просмотр исходного кода

fix freeze when entering a new world

jblanked 1 год назад
Родитель
Сommit
ad44831fec
3 измененных файлов с 21 добавлено и 15 удалено
  1. 1 1
      callback/callback.c
  2. 15 12
      game/game.c
  3. 5 2
      game/level.c

+ 1 - 1
callback/callback.c

@@ -664,7 +664,7 @@ static char *flip_world_parse_world_list(DataLoaderModel *model)
 {
     if (model->request_index == 0)
     {
-        return "World List Fetched";
+        return "Welcome to FlipWorld!\n\n\n\nPress BACK to return if this\ndoesn't automatically close.";
     }
     else if (model->request_index == 1)
     {

+ 15 - 12
game/game.c

@@ -1,23 +1,20 @@
 #include "game.h"
 
 /****** Entities: Player ******/
-Level *levels[10];
+static Level *levels[10];
+static int level_count = 0;
+static bool has_pressed_ok = false;
 
 static Level *get_next_level(GameManager *manager)
 {
+    has_pressed_ok = false;
     Level *current_level = game_manager_current_level_get(manager);
-    for (int i = 0; i < 10; i++)
+    for (int i = 0; i < level_count; i++)
     {
         if (levels[i] == current_level)
         {
-            if (levels[i + 1] != NULL)
-            {
-                return levels[i + 1];
-            }
-            else
-            {
-                return levels[0];
-            }
+            // check if i+1 is out of bounds, if so, return the first level
+            return levels[(i + 1) % level_count];
         }
     }
     return levels[0] ? levels[0] : game_manager_add_level(manager, generic_level("town_world", 0));
@@ -86,8 +83,12 @@ static void player_update(Entity *self, GameManager *manager, void *context)
     // switch levels if holding OK
     if (input.held & GameKeyOk)
     {
-        game_manager_next_level_set(manager, get_next_level(manager));
-        furi_delay_ms(500);
+        if (!has_pressed_ok)
+        {
+            has_pressed_ok = true;
+            game_manager_next_level_set(manager, get_next_level(manager));
+            furi_delay_ms(500);
+        }
         return;
     }
 
@@ -164,6 +165,7 @@ static void game_start(GameManager *game_manager, void *ctx)
         FURI_LOG_E("Game", "Failed to load world list");
         levels[0] = game_manager_add_level(game_manager, generic_level("town_world", 0));
         levels[1] = game_manager_add_level(game_manager, generic_level("tree_world", 1));
+        level_count = 2;
         return;
     }
     for (int i = 0; i < 10; i++)
@@ -175,6 +177,7 @@ static void game_start(GameManager *game_manager, void *ctx)
         }
         levels[i] = game_manager_add_level(game_manager, generic_level(furi_string_get_cstr(world_name), i));
         furi_string_free(world_name);
+        level_count++;
     }
     furi_string_free(world_list);
 }

+ 5 - 2
game/level.c

@@ -3,6 +3,8 @@
 static void level_start(Level *level, GameManager *manager, void *context)
 {
     UNUSED(manager);
+    level_clear(level);
+    player_spawn(level, manager);
     LevelContext *level_context = context;
     // check if the world exists
     if (!world_exists(level_context->id))
@@ -76,6 +78,8 @@ static void level_generic_free()
 
 static void level_alloc_generic_world(Level *level, GameManager *manager, void *context)
 {
+    UNUSED(manager);
+    UNUSED(level);
     if (!level_context_generic)
     {
         FURI_LOG_E("Game", "Generic level context not set");
@@ -85,13 +89,12 @@ static void level_alloc_generic_world(Level *level, GameManager *manager, void *
     snprintf(level_context->id, sizeof(level_context->id), "%s", level_context_generic->id);
     level_context->index = level_context_generic->index;
     level_context->app = level_context_generic->app;
-    player_spawn(level, manager);
 }
 
 // Do NOT touch (this is for dynamic level creation)
 const LevelBehaviour _generic_level = {
     .alloc = level_alloc_generic_world,   // called once, when level allocated
-    .free = NULL,                         // called once, when level freed
+    .free = level_generic_free,           // called once, when level freed
     .start = level_start,                 // called when level is changed to this level
     .stop = NULL,                         // called when level is changed from this level
     .context_size = sizeof(LevelContext), // size of level context, will be automatically allocated and freed