level.c 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. #include <game/level.h>
  2. /****** Level ******/
  3. static void level_start(Level *level, GameManager *manager, void *context)
  4. {
  5. UNUSED(manager);
  6. LevelContext *level_context = context;
  7. // check if the world exists
  8. // if (!world_exists(level_context->id))
  9. // {
  10. // FURI_LOG_E("Game", "World does not exist");
  11. // easy_flipper_dialog("[WORLD ERROR]", "No world data installed.\n\n\nSettings -> Game ->\nInstall Official World Pack");
  12. // draw_example_world(level);
  13. // return;
  14. // }
  15. // draw the world
  16. // FuriString *world_data = load_furi_world(level_context->id);
  17. // if (!world_data)
  18. // {
  19. // FURI_LOG_E("Game", "Failed to load world data");
  20. // draw_example_world(level);
  21. // return;
  22. // }
  23. // if (!draw_json_world_furi(level, load_furi_world(level_context->id)))
  24. // {
  25. // FURI_LOG_E("Game", "World exists but failed to draw.");
  26. // draw_example_world(level);
  27. // }
  28. // furi_string_free(world_data);
  29. if (level_context->index == 0)
  30. draw_tree_world(level);
  31. else
  32. draw_example_world(level);
  33. }
  34. static void level_alloc_tree_world(Level *level, GameManager *manager, void *context)
  35. {
  36. UNUSED(level);
  37. LevelContext *level_context = context;
  38. snprintf(level_context->id, sizeof(level_context->id), "tree_world");
  39. level_context->index = 0;
  40. // Add player entity to the level
  41. player_spawn(level, manager);
  42. }
  43. static void level_alloc_example_world(Level *level, GameManager *manager, void *context)
  44. {
  45. UNUSED(level);
  46. LevelContext *level_context = context;
  47. snprintf(level_context->id, sizeof(level_context->id), "example_world");
  48. level_context->index = 1;
  49. // Add player entity to the level
  50. player_spawn(level, manager);
  51. }
  52. Level *level_tree;
  53. Level *level_example;
  54. const LevelBehaviour tree_level = {
  55. .alloc = level_alloc_tree_world, // called once, when level allocated
  56. .free = NULL, // called once, when level freed
  57. .start = level_start, // called when level is changed to this level
  58. .stop = NULL, // called when level is changed from this level
  59. .context_size = sizeof(LevelContext), // size of level context, will be automatically allocated and freed
  60. };
  61. const LevelBehaviour example_level = {
  62. .alloc = level_alloc_example_world,
  63. .free = NULL,
  64. .start = level_start,
  65. .stop = NULL,
  66. .context_size = sizeof(LevelContext),
  67. };
  68. void level_alloc_world(Level *level, GameManager *manager, void *context)
  69. {
  70. UNUSED(level);
  71. LevelContext *level_context = context;
  72. snprintf(level_context->id, sizeof(level_context->id), "%s", level_contexts[level_context->index].id);
  73. level_context->index = level_contexts[level_context->index].index;
  74. // Add player entity to the level
  75. player_spawn(level, manager);
  76. }
  77. bool level_load_all(GameManager *game_manager)
  78. {
  79. char file_path[128];
  80. snprintf(
  81. file_path,
  82. sizeof(file_path),
  83. STORAGE_EXT_PATH_PREFIX "/apps_data/flip_world/worlds/world_list.json");
  84. FuriString *world_list = flipper_http_load_from_file(file_path);
  85. if (!world_list)
  86. {
  87. FURI_LOG_E(TAG, "Failed to load world list");
  88. return false;
  89. }
  90. for (int i = 0; i < 10; i++)
  91. {
  92. FuriString *world_id = get_json_array_value_furi("names", i, world_list);
  93. if (!world_id)
  94. {
  95. FURI_LOG_E(TAG, "Failed to get world id");
  96. break;
  97. }
  98. snprintf(level_contexts[i].id, sizeof(level_contexts[i].id), "%s", furi_string_get_cstr(world_id));
  99. level_contexts[i].index = i;
  100. LevelBehaviour *new_behavior = malloc(sizeof(LevelBehaviour));
  101. if (!new_behavior)
  102. {
  103. FURI_LOG_E(TAG, "Failed to allocate memory for level behavior");
  104. furi_string_free(world_id);
  105. furi_string_free(world_list);
  106. return false;
  107. }
  108. *new_behavior = (LevelBehaviour){
  109. .alloc = level_alloc_world,
  110. .free = NULL,
  111. .start = level_start,
  112. .stop = NULL,
  113. .context_size = sizeof(LevelContext),
  114. };
  115. level_count++;
  116. game_manager_add_level(game_manager, new_behavior);
  117. furi_string_free(world_id);
  118. }
  119. furi_string_free(world_list);
  120. return true;
  121. }
  122. LevelContext level_contexts[] = {0};
  123. Level *levels[] = {0};
  124. int level_count = 0;