diff --git a/include/systems/combat_manager.h b/include/systems/combat_manager.h index 37c5db6..852b8bc 100644 --- a/include/systems/combat_manager.h +++ b/include/systems/combat_manager.h @@ -14,6 +14,7 @@ struct combat_manager { gc_system base; gc_scene *game_scene; + struct enemy *current_enemy; }; extern const struct combat_manager combat_manager; diff --git a/src/systems/combat_manager.c b/src/systems/combat_manager.c index 1668528..5a6ee6a 100644 --- a/src/systems/combat_manager.c +++ b/src/systems/combat_manager.c @@ -37,7 +37,7 @@ void combat_start(gc_engine *engine, char *enemy_name) || (enemy_name && !my_strcmp(enemy_name, enemy->name))) break; } - if (enemy) + if ((this->current_enemy = enemy)) prefab_load(engine, enemy->prefab_src); } @@ -55,6 +55,17 @@ void entity_moved(gc_engine *engine, va_list args) combat_start(engine, NULL); } +void dialog_ended(gc_engine *engine, va_list args) +{ + struct combat_manager *this = GETSYS(engine, combat_manager); + + if (!this->current_enemy) + return; + engine->trigger_event(engine, "combat_ended", this->current_enemy); + this->current_enemy = NULL; + engine->change_scene(engine, this->game_scene); + this->game_scene = NULL; +} static void update_entity(gc_engine *engine, void *system, gc_entity *entity, \ float dtime) @@ -84,13 +95,17 @@ static void ctr(void *system, va_list list) this->game_scene = NULL; engine->add_event_listener(engine, "entity_moved", &entity_moved); + engine->add_event_listener(engine, "dialog_ended", &dialog_ended); } static void dtr(void *system, gc_engine *engine) { - struct combat_manager *sys = system; - if (sys->game_scene) - scene_destroy(sys->game_scene); + struct combat_manager *this = system; + + engine->remove_event_listener(engine, "entity_moved", &entity_moved); + engine->remove_event_listener(engine, "dialog_ended", &dialog_ended); + if (this->game_scene) + scene_destroy(this->game_scene); } const struct combat_manager combat_manager = { diff --git a/src/systems/dialog_methods.c b/src/systems/dialog_methods.c index f75b575..997e5aa 100644 --- a/src/systems/dialog_methods.c +++ b/src/systems/dialog_methods.c @@ -121,4 +121,5 @@ void dialog_next(gc_engine *engine) prefab_destroy(scene, this->dialog_id); this->dialog_id = -1; controllable_set_can_move(scene, true); + engine->trigger_event(engine, "dialog_ended"); }