level_manager.c 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  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. level_call_stop(lm->current_level);
  20. LevelList_it_t it;
  21. LevelList_it(it, lm->levels);
  22. while(!LevelList_end_p(it)) {
  23. level_call_free(*LevelList_cref(it));
  24. level_free(*LevelList_cref(it));
  25. LevelList_next(it);
  26. }
  27. LevelList_clear(lm->levels);
  28. free(lm);
  29. }
  30. Level* level_manager_add_level(LevelManager* lm, const LevelBehaviour* behaviour) {
  31. UNUSED(lm);
  32. Level* level = level_alloc(behaviour);
  33. LevelList_push_back(lm->levels, level);
  34. level_call_alloc(level);
  35. if(!lm->current_level) {
  36. lm->current_level = level;
  37. level_call_start(level);
  38. }
  39. return level;
  40. }
  41. void level_manager_next_level_set(LevelManager* lm, Level* next_level) {
  42. lm->next_level = next_level;
  43. }
  44. Level* level_manager_current_level_get(LevelManager* lm) {
  45. return lm->current_level;
  46. }
  47. void level_manager_update(LevelManager* lm, Director* director) {
  48. if(lm->next_level) {
  49. level_call_stop(lm->current_level);
  50. lm->current_level = lm->next_level;
  51. level_call_start(lm->current_level);
  52. lm->next_level = NULL;
  53. }
  54. level_update(lm->current_level, director);
  55. }
  56. void level_manager_render(LevelManager* lm, Director* director, Canvas* canvas) {
  57. level_render(lm->current_level, director, canvas);
  58. }