From 9e044619864a16b713286bd069867edfb53445b1 Mon Sep 17 00:00:00 2001
From: Anonymus Raccoon
Date: Wed, 22 Apr 2020 11:49:09 +0200
Subject: [PATCH] Fights can now ends
---
include/systems/combat_manager.h | 1 +
src/systems/combat_manager.c | 23 +++++++++++++++++++----
src/systems/dialog_methods.c | 1 +
3 files changed, 21 insertions(+), 4 deletions(-)
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");
}