|
@@ -2,17 +2,26 @@
|
|
|
#include "level_i.h"
|
|
#include "level_i.h"
|
|
|
#include <furi.h>
|
|
#include <furi.h>
|
|
|
#include <m-list.h>
|
|
#include <m-list.h>
|
|
|
|
|
+#include <storage/storage.h>
|
|
|
|
|
+
|
|
|
|
|
+typedef struct {
|
|
|
|
|
+ Sprite* sprite;
|
|
|
|
|
+ FuriString* path;
|
|
|
|
|
+} SpriteCache;
|
|
|
|
|
|
|
|
LIST_DEF(LevelList, Level*, M_POD_OPLIST);
|
|
LIST_DEF(LevelList, Level*, M_POD_OPLIST);
|
|
|
|
|
+LIST_DEF(SpriteCacheList, SpriteCache, M_POD_OPLIST);
|
|
|
|
|
|
|
|
struct GameManager {
|
|
struct GameManager {
|
|
|
LevelList_t levels;
|
|
LevelList_t levels;
|
|
|
Level* current_level;
|
|
Level* current_level;
|
|
|
Level* next_level;
|
|
Level* next_level;
|
|
|
|
|
|
|
|
- RunningGameEngine* engine;
|
|
|
|
|
|
|
+ GameEngine* engine;
|
|
|
InputState input;
|
|
InputState input;
|
|
|
void* game_context;
|
|
void* game_context;
|
|
|
|
|
+
|
|
|
|
|
+ SpriteCacheList_t sprites;
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
GameManager* game_manager_alloc() {
|
|
GameManager* game_manager_alloc() {
|
|
@@ -23,27 +32,43 @@ GameManager* game_manager_alloc() {
|
|
|
manager->engine = NULL;
|
|
manager->engine = NULL;
|
|
|
manager->game_context = NULL;
|
|
manager->game_context = NULL;
|
|
|
memset(&manager->input, 0, sizeof(InputState));
|
|
memset(&manager->input, 0, sizeof(InputState));
|
|
|
|
|
+ SpriteCacheList_init(manager->sprites);
|
|
|
return manager;
|
|
return manager;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void game_manager_free(GameManager* manager) {
|
|
void game_manager_free(GameManager* manager) {
|
|
|
level_call_stop(manager->current_level);
|
|
level_call_stop(manager->current_level);
|
|
|
|
|
|
|
|
- LevelList_it_t it;
|
|
|
|
|
- LevelList_it(it, manager->levels);
|
|
|
|
|
- while(!LevelList_end_p(it)) {
|
|
|
|
|
- level_call_free(*LevelList_cref(it));
|
|
|
|
|
- level_free(*LevelList_cref(it));
|
|
|
|
|
- LevelList_next(it);
|
|
|
|
|
|
|
+ // Free all levels
|
|
|
|
|
+ {
|
|
|
|
|
+ LevelList_it_t it;
|
|
|
|
|
+ LevelList_it(it, manager->levels);
|
|
|
|
|
+ while(!LevelList_end_p(it)) {
|
|
|
|
|
+ level_call_free(*LevelList_cref(it));
|
|
|
|
|
+ level_free(*LevelList_cref(it));
|
|
|
|
|
+ LevelList_next(it);
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
LevelList_clear(manager->levels);
|
|
LevelList_clear(manager->levels);
|
|
|
|
|
+
|
|
|
|
|
+ // Free all sprites
|
|
|
|
|
+ {
|
|
|
|
|
+ SpriteCacheList_it_t it;
|
|
|
|
|
+ SpriteCacheList_it(it, manager->sprites);
|
|
|
|
|
+ while(!SpriteCacheList_end_p(it)) {
|
|
|
|
|
+ furi_string_free(SpriteCacheList_cref(it)->path);
|
|
|
|
|
+ sprite_free(SpriteCacheList_cref(it)->sprite);
|
|
|
|
|
+ SpriteCacheList_next(it);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ SpriteCacheList_clear(manager->sprites);
|
|
|
free(manager);
|
|
free(manager);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
Level* game_manager_add_level(GameManager* manager, const LevelBehaviour* behaviour) {
|
|
Level* game_manager_add_level(GameManager* manager, const LevelBehaviour* behaviour) {
|
|
|
UNUSED(manager);
|
|
UNUSED(manager);
|
|
|
- Level* level = level_alloc(behaviour);
|
|
|
|
|
|
|
+ Level* level = level_alloc(behaviour, manager);
|
|
|
LevelList_push_back(manager->levels, level);
|
|
LevelList_push_back(manager->levels, level);
|
|
|
level_call_alloc(level);
|
|
level_call_alloc(level);
|
|
|
if(!manager->current_level) {
|
|
if(!manager->current_level) {
|
|
@@ -57,6 +82,11 @@ void game_manager_next_level_set(GameManager* manager, Level* next_level) {
|
|
|
manager->next_level = next_level;
|
|
manager->next_level = next_level;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+void game_manager_game_stop(GameManager* manager) {
|
|
|
|
|
+ GameEngine* engine = game_manager_engine_get(manager);
|
|
|
|
|
+ game_engine_stop(engine);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
Level* game_manager_current_level_get(GameManager* manager) {
|
|
Level* game_manager_current_level_get(GameManager* manager) {
|
|
|
return manager->current_level;
|
|
return manager->current_level;
|
|
|
}
|
|
}
|
|
@@ -76,7 +106,7 @@ void game_manager_render(GameManager* manager, Canvas* canvas) {
|
|
|
level_render(manager->current_level, manager, canvas);
|
|
level_render(manager->current_level, manager, canvas);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-void game_manager_engine_set(GameManager* manager, RunningGameEngine* engine) {
|
|
|
|
|
|
|
+void game_manager_engine_set(GameManager* manager, GameEngine* engine) {
|
|
|
manager->engine = engine;
|
|
manager->engine = engine;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -88,7 +118,7 @@ void game_manager_game_context_set(GameManager* manager, void* context) {
|
|
|
manager->game_context = context;
|
|
manager->game_context = context;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-RunningGameEngine* game_manager_engine_get(GameManager* manager) {
|
|
|
|
|
|
|
+GameEngine* game_manager_engine_get(GameManager* manager) {
|
|
|
return manager->engine;
|
|
return manager->engine;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -98,4 +128,35 @@ InputState game_manager_input_get(GameManager* manager) {
|
|
|
|
|
|
|
|
void* game_manager_game_context_get(GameManager* manager) {
|
|
void* game_manager_game_context_get(GameManager* manager) {
|
|
|
return manager->game_context;
|
|
return manager->game_context;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+void game_manager_show_fps_set(GameManager* manager, bool show_fps) {
|
|
|
|
|
+ GameEngine* engine = game_manager_engine_get(manager);
|
|
|
|
|
+ game_engine_show_fps_set(engine, show_fps);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+Sprite* game_manager_sprite_load(GameManager* manager, const char* path) {
|
|
|
|
|
+ SpriteCacheList_it_t it;
|
|
|
|
|
+ SpriteCacheList_it(it, manager->sprites);
|
|
|
|
|
+ while(!SpriteCacheList_end_p(it)) {
|
|
|
|
|
+ if(furi_string_cmp(SpriteCacheList_cref(it)->path, path) == 0) {
|
|
|
|
|
+ return SpriteCacheList_cref(it)->sprite;
|
|
|
|
|
+ }
|
|
|
|
|
+ SpriteCacheList_next(it);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ FuriString* path_full = furi_string_alloc_set(APP_ASSETS_PATH("sprites/"));
|
|
|
|
|
+ furi_string_cat(path_full, path);
|
|
|
|
|
+
|
|
|
|
|
+ Sprite* sprite = sprite_alloc(furi_string_get_cstr(path_full));
|
|
|
|
|
+ if(sprite) {
|
|
|
|
|
+ SpriteCache cache = {
|
|
|
|
|
+ .sprite = sprite,
|
|
|
|
|
+ .path = furi_string_alloc_set(path),
|
|
|
|
|
+ };
|
|
|
|
|
+ SpriteCacheList_push_back(manager->sprites, cache);
|
|
|
|
|
+ }
|
|
|
|
|
+ furi_string_free(path_full);
|
|
|
|
|
+
|
|
|
|
|
+ return sprite;
|
|
|
}
|
|
}
|