game_manager.c 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. #include "game_manager.h"
  2. #include "level_i.h"
  3. #include <furi.h>
  4. #include <m-list.h>
  5. #include <storage/storage.h>
  6. typedef struct {
  7. Sprite* sprite;
  8. FuriString* path;
  9. } SpriteCache;
  10. LIST_DEF(LevelList, Level*, M_POD_OPLIST);
  11. LIST_DEF(SpriteCacheList, SpriteCache, M_POD_OPLIST);
  12. struct GameManager {
  13. LevelList_t levels;
  14. Level* current_level;
  15. Level* next_level;
  16. GameEngine* engine;
  17. InputState input;
  18. void* game_context;
  19. SpriteCacheList_t sprites;
  20. };
  21. GameManager* game_manager_alloc() {
  22. GameManager* manager = malloc(sizeof(GameManager));
  23. LevelList_init(manager->levels);
  24. manager->current_level = NULL;
  25. manager->next_level = NULL;
  26. manager->engine = NULL;
  27. manager->game_context = NULL;
  28. memset(&manager->input, 0, sizeof(InputState));
  29. SpriteCacheList_init(manager->sprites);
  30. return manager;
  31. }
  32. void game_manager_free(GameManager* manager) {
  33. level_call_stop(manager->current_level);
  34. // Free all levels
  35. {
  36. LevelList_it_t it;
  37. LevelList_it(it, manager->levels);
  38. while(!LevelList_end_p(it)) {
  39. level_call_free(*LevelList_cref(it));
  40. level_free(*LevelList_cref(it));
  41. LevelList_next(it);
  42. }
  43. }
  44. LevelList_clear(manager->levels);
  45. // Free all sprites
  46. {
  47. SpriteCacheList_it_t it;
  48. SpriteCacheList_it(it, manager->sprites);
  49. while(!SpriteCacheList_end_p(it)) {
  50. furi_string_free(SpriteCacheList_cref(it)->path);
  51. sprite_free(SpriteCacheList_cref(it)->sprite);
  52. SpriteCacheList_next(it);
  53. }
  54. }
  55. SpriteCacheList_clear(manager->sprites);
  56. free(manager);
  57. }
  58. Level* game_manager_add_level(GameManager* manager, const LevelBehaviour* behaviour) {
  59. UNUSED(manager);
  60. Level* level = level_alloc(behaviour, manager);
  61. LevelList_push_back(manager->levels, level);
  62. level_call_alloc(level);
  63. if(!manager->current_level) {
  64. manager->current_level = level;
  65. level_call_start(level);
  66. }
  67. return level;
  68. }
  69. void game_manager_next_level_set(GameManager* manager, Level* next_level) {
  70. manager->next_level = next_level;
  71. }
  72. void game_manager_game_stop(GameManager* manager) {
  73. GameEngine* engine = game_manager_engine_get(manager);
  74. game_engine_stop(engine);
  75. }
  76. Level* game_manager_current_level_get(GameManager* manager) {
  77. return manager->current_level;
  78. }
  79. void game_manager_update(GameManager* manager) {
  80. if(manager->next_level) {
  81. level_call_stop(manager->current_level);
  82. manager->current_level = manager->next_level;
  83. level_call_start(manager->current_level);
  84. manager->next_level = NULL;
  85. }
  86. level_update(manager->current_level, manager);
  87. }
  88. void game_manager_render(GameManager* manager, Canvas* canvas) {
  89. level_render(manager->current_level, manager, canvas);
  90. }
  91. void game_manager_engine_set(GameManager* manager, GameEngine* engine) {
  92. manager->engine = engine;
  93. }
  94. void game_manager_input_set(GameManager* manager, InputState input) {
  95. manager->input = input;
  96. }
  97. void game_manager_game_context_set(GameManager* manager, void* context) {
  98. manager->game_context = context;
  99. }
  100. GameEngine* game_manager_engine_get(GameManager* manager) {
  101. return manager->engine;
  102. }
  103. InputState game_manager_input_get(GameManager* manager) {
  104. return manager->input;
  105. }
  106. void* game_manager_game_context_get(GameManager* manager) {
  107. return manager->game_context;
  108. }
  109. void game_manager_show_fps_set(GameManager* manager, bool show_fps) {
  110. GameEngine* engine = game_manager_engine_get(manager);
  111. game_engine_show_fps_set(engine, show_fps);
  112. }
  113. Sprite* game_manager_sprite_load(GameManager* manager, const char* path) {
  114. SpriteCacheList_it_t it;
  115. SpriteCacheList_it(it, manager->sprites);
  116. while(!SpriteCacheList_end_p(it)) {
  117. if(furi_string_cmp(SpriteCacheList_cref(it)->path, path) == 0) {
  118. return SpriteCacheList_cref(it)->sprite;
  119. }
  120. SpriteCacheList_next(it);
  121. }
  122. FuriString* path_full = furi_string_alloc_set(APP_ASSETS_PATH("sprites/"));
  123. furi_string_cat(path_full, path);
  124. Sprite* sprite = sprite_alloc(furi_string_get_cstr(path_full));
  125. if(sprite) {
  126. SpriteCache cache = {
  127. .sprite = sprite,
  128. .path = furi_string_alloc_set(path),
  129. };
  130. SpriteCacheList_push_back(manager->sprites, cache);
  131. }
  132. furi_string_free(path_full);
  133. return sprite;
  134. }
  135. Level* game_manager_entity_level_get(GameManager* manager, Entity* entity) {
  136. LevelList_it_t it;
  137. LevelList_it(it, manager->levels);
  138. while(!LevelList_end_p(it)) {
  139. if(level_contains_entity(*LevelList_cref(it), entity)) {
  140. return *LevelList_cref(it);
  141. }
  142. LevelList_next(it);
  143. }
  144. return NULL;
  145. }