level_manager.c 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. #include "level_manager.h"
  2. #include "level_i.h"
  3. #include <furi.h>
  4. #include <m-list.h>
  5. LIST_DEF(LevelList, Level*, M_POD_OPLIST);
  6. struct LevelManager {
  7. LevelList_t levels;
  8. Level* current_level;
  9. Level* next_level;
  10. };
  11. LevelManager* level_manager_alloc() {
  12. LevelManager* lm = malloc(sizeof(LevelManager));
  13. lm->current_level = NULL;
  14. lm->next_level = NULL;
  15. LevelList_init(lm->levels);
  16. return lm;
  17. }
  18. void level_manager_free(LevelManager* lm) {
  19. LevelList_it_t it;
  20. LevelList_it(it, lm->levels);
  21. while(!LevelList_end_p(it)) {
  22. level_free(*LevelList_cref(it));
  23. LevelList_next(it);
  24. }
  25. LevelList_clear(lm->levels);
  26. free(lm);
  27. }
  28. Level* level_manager_add_level(LevelManager* manager) {
  29. UNUSED(manager);
  30. Level* level = level_alloc();
  31. LevelList_push_back(manager->levels, level);
  32. if(!manager->current_level) {
  33. manager->current_level = level;
  34. }
  35. return level;
  36. }
  37. void level_manager_next_level_set(LevelManager* lm, Level* next_level) {
  38. lm->next_level = next_level;
  39. }
  40. Level* level_manager_current_level_get(LevelManager* lm) {
  41. return lm->current_level;
  42. }
  43. void level_manager_update(LevelManager* lm, Director* director) {
  44. if(lm->next_level) {
  45. lm->current_level = lm->next_level;
  46. lm->next_level = NULL;
  47. }
  48. level_update(lm->current_level, director);
  49. }
  50. void level_manager_render(LevelManager* lm, Director* director, Canvas* canvas) {
  51. level_render(lm->current_level, director, canvas);
  52. }