game_manager.c 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. #include "game_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 GameManager {
  7. LevelList_t levels;
  8. Level* current_level;
  9. Level* next_level;
  10. RunningGameEngine* engine;
  11. InputState input;
  12. void* game_context;
  13. };
  14. GameManager* game_manager_alloc() {
  15. GameManager* manager = malloc(sizeof(GameManager));
  16. LevelList_init(manager->levels);
  17. manager->current_level = NULL;
  18. manager->next_level = NULL;
  19. manager->engine = NULL;
  20. manager->game_context = NULL;
  21. memset(&manager->input, 0, sizeof(InputState));
  22. return manager;
  23. }
  24. void game_manager_free(GameManager* manager) {
  25. level_call_stop(manager->current_level);
  26. LevelList_it_t it;
  27. LevelList_it(it, manager->levels);
  28. while(!LevelList_end_p(it)) {
  29. level_call_free(*LevelList_cref(it));
  30. level_free(*LevelList_cref(it));
  31. LevelList_next(it);
  32. }
  33. LevelList_clear(manager->levels);
  34. free(manager);
  35. }
  36. Level* game_manager_add_level(GameManager* manager, const LevelBehaviour* behaviour) {
  37. UNUSED(manager);
  38. Level* level = level_alloc(behaviour);
  39. LevelList_push_back(manager->levels, level);
  40. level_call_alloc(level);
  41. if(!manager->current_level) {
  42. manager->current_level = level;
  43. level_call_start(level);
  44. }
  45. return level;
  46. }
  47. void game_manager_next_level_set(GameManager* manager, Level* next_level) {
  48. manager->next_level = next_level;
  49. }
  50. Level* game_manager_current_level_get(GameManager* manager) {
  51. return manager->current_level;
  52. }
  53. void game_manager_update(GameManager* manager) {
  54. if(manager->next_level) {
  55. level_call_stop(manager->current_level);
  56. manager->current_level = manager->next_level;
  57. level_call_start(manager->current_level);
  58. manager->next_level = NULL;
  59. }
  60. level_update(manager->current_level, manager);
  61. }
  62. void game_manager_render(GameManager* manager, Canvas* canvas) {
  63. level_render(manager->current_level, manager, canvas);
  64. }
  65. void game_manager_engine_set(GameManager* manager, RunningGameEngine* engine) {
  66. manager->engine = engine;
  67. }
  68. void game_manager_input_set(GameManager* manager, InputState input) {
  69. manager->input = input;
  70. }
  71. void game_manager_game_context_set(GameManager* manager, void* context) {
  72. manager->game_context = context;
  73. }
  74. RunningGameEngine* game_manager_engine_get(GameManager* manager) {
  75. return manager->engine;
  76. }
  77. InputState game_manager_input_get(GameManager* manager) {
  78. return manager->input;
  79. }
  80. void* game_manager_game_context_get(GameManager* manager) {
  81. return manager->game_context;
  82. }