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) { }