diff --git a/CMakeLists.txt b/CMakeLists.txt
index 5229971..f12f879 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -252,7 +252,15 @@ add_executable(my_rpg
src/systems/map_movement_system.c
lib/gamacon/src/components/renderers/anim_utils.c
lib/gamacon/src/isometry/map_utilities.c
- lib/gamacon/src/sfml_renderer/sfml_utilities.c lib/gamacon/src/components/map_linker.c lib/gamacon/include/components/map_linker.h lib/gamacon/src/systems/map_linker_system.c lib/gamacon/include/tile.h src/components/dialog_holder.c include/components/dialog_holder.h)
+ lib/gamacon/src/sfml_renderer/sfml_utilities.c
+ lib/gamacon/src/components/map_linker.c
+ lib/gamacon/include/components/map_linker.h
+ lib/gamacon/src/systems/map_linker_system.c
+ lib/gamacon/include/tile.h
+ src/components/dialog_holder.c
+ include/components/dialog_holder.h
+ src/systems/dialog_manager.c
+)
add_compile_options(-W -Wall -Wextra -Wshadow)
diff --git a/Makefile b/Makefile
index 2d87c3d..26dc2ab 100644
--- a/Makefile
+++ b/Makefile
@@ -17,6 +17,7 @@ SRC = src/main.c \
src/components/controllers/keyboard_controller.c \
src/components/dialog_holder.c \
src/systems/map_movement_system.c \
+ src/systems/dialog_manager.c \
src/systems/controllers/keyboard_controller_system.c
OBJ = $(SRC:%.c=%.o)
diff --git a/include/components/dialog_holder.h b/include/components/dialog_holder.h
index d466522..e23077a 100644
--- a/include/components/dialog_holder.h
+++ b/include/components/dialog_holder.h
@@ -22,4 +22,11 @@ struct dialog_holder {
const struct dialog_holder dialog_holder;
+struct dialog_manager {
+ gc_system base;
+ bool is_dialog_open;
+};
+
+const struct dialog_manager dialog_manager;
+
#endif //MY_RPG_DIALOG_HOLDER_H
diff --git a/lib/gamacon b/lib/gamacon
index ce1fd3f..3f2e56d 160000
--- a/lib/gamacon
+++ b/lib/gamacon
@@ -1 +1 @@
-Subproject commit ce1fd3fb582daef8fae9d7d34ee280a58356a804
+Subproject commit 3f2e56dd884f558f05ff321c3f39ce4906dc4c2c
diff --git a/prefabs/dialog.gcprefab b/prefabs/dialog.gcprefab
new file mode 100644
index 0000000..aaa260d
--- /dev/null
+++ b/prefabs/dialog.gcprefab
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/src/game_loader.c b/src/game_loader.c
index 69187b6..e3b91c7 100644
--- a/src/game_loader.c
+++ b/src/game_loader.c
@@ -8,6 +8,7 @@
#include "engine.h"
#include "setup.h"
#include
+#include
#include "systems/map_movement_system.h"
#include "systems/game_manager_system.h"
#include "systems/controllers/keyboard_controller_system.h"
@@ -16,7 +17,6 @@
#include "components/controllable_component.h"
#include "callbacks.h"
#include "components/game_manager.h"
-#include "systems/game_manager_system.h"
#include "my.h"
const struct callback callbacks[] = {
@@ -41,6 +41,8 @@ int register_customcmps(gc_engine *engine)
engine->add_component(engine, &keyboard_controller);
engine->add_component(engine, &map_movement);
engine->add_system(engine, &map_movement_system);
+ engine->add_component(engine, &dialog_holder);
+ engine->add_system(engine, new_system(&dialog_manager, engine));
engine->add_system(engine, new_system(&keyboard_controller_system, engine));
engine->add_component(engine, &game_manager);
engine->add_system(engine, new_system(&game_manager_system, engine));
diff --git a/src/systems/dialog_manager.c b/src/systems/dialog_manager.c
new file mode 100644
index 0000000..dfdc2ac
--- /dev/null
+++ b/src/systems/dialog_manager.c
@@ -0,0 +1,66 @@
+/*
+** EPITECH PROJECT, 2020
+** my_rpg
+** File description:
+** dialog_manager.c
+*/
+
+#include "my.h"
+#include "components/dialog_holder.h"
+#include "components/tag_component.h"
+#include "prefab.h"
+#include "engine.h"
+
+static void check_for_dialog(gc_engine *engine, va_list args)
+{
+ struct dialog_manager *dima = GETSYS(engine, dialog_manager);
+ gc_keybindings key = va_arg(args, gc_keybindings);
+ gc_scene *scene = engine->scene;
+ gc_list *list;
+
+ if (key != SPACE)
+ return;
+
+ dima->is_dialog_open = !dima->is_dialog_open;
+ if (dima->is_dialog_open) {
+ prefab_load(engine, "prefabs/dialog.gcprefab");
+ return;
+ }
+ list = scene->get_entity_by_cmp(scene, "tag_component");
+ for (gc_list *li = list; li; li = li->next) {
+ if (!my_strcmp(GETCMP(li->data, tag_component)->tag, "dialog"))
+ ((gc_entity *)li->data)->destroy(li->data, scene);
+ }
+}
+
+static void update_entity(gc_engine *engine, void *system, gc_entity *entity, \
+float dtime)
+{
+}
+
+static void ctr(void *system, va_list list)
+{
+ gc_engine *engine = va_arg(list, gc_engine *);
+ struct dialog_manager *dima = (struct dialog_manager *)system;
+
+ engine->add_event_listener(engine, "key_pressed", &check_for_dialog);
+ dima->is_dialog_open = false;
+}
+
+static void dtr(void *system, gc_engine *engine)
+{
+ engine->remove_event_listener(engine, "key_pressed", &check_for_dialog);
+}
+
+const struct dialog_manager dialog_manager = {
+ base: {
+ name: "dialog_manager",
+ component_name: "dialog_holder",
+ size: sizeof(gc_system),
+ ctr: &ctr,
+ dtr: &dtr,
+ check_dependencies: &system_check_dependencies,
+ update_entity: &update_entity,
+ destroy: &system_destroy
+ },
+};
\ No newline at end of file
diff --git a/src/systems/game_manager_system.c b/src/systems/game_manager_system.c
index d4a0dfc..79328e2 100644
--- a/src/systems/game_manager_system.c
+++ b/src/systems/game_manager_system.c
@@ -51,12 +51,17 @@ static void ctr(void *system, va_list list)
engine->add_event_listener(engine, "key_pressed", &key_pressed);
}
+static void dtr(void *system, gc_engine *engine)
+{
+ engine->remove_event_listener(engine, "key_pressed", &key_pressed);
+}
+
const gc_system game_manager_system = {
name: "game_cycle",
component_name: "game_manager",
size: sizeof(gc_system),
- ctr: ctr,
- dtr: NULL,
+ ctr: &ctr,
+ dtr: &dtr,
check_dependencies: &system_check_dependencies,
update_entity: &update_entity,
destroy: &system_destroy
diff --git a/src/systems/map_movement_system.c b/src/systems/map_movement_system.c
index ce6ddd2..c9d81f1 100644
--- a/src/systems/map_movement_system.c
+++ b/src/systems/map_movement_system.c
@@ -43,7 +43,8 @@ float dtime)
return;
map = GETCMP(maps->data, vertex_component);
new_tile = get_tile_at(map, map_pos);
- if (new_tile && !new_tile->solid && ctl->move_callback <= 0) {
+ if (new_tile && !new_tile->solid && ctl->move_callback <= 0 \
+&& new_tile != link->tile) {
link->tile->entity = NULL;
new_tile->entity = entity;
engine->trigger_event(engine, "entity_moved", entity, link->tile);
@@ -56,7 +57,7 @@ static void ctr(void *system, va_list list)
{
}
-static void destroy(void *system)
+static void destroy(void *system, gc_engine *engine)
{
}