From a6e5dc301286dfff0ae8bb9a14323e4dadd562e8 Mon Sep 17 00:00:00 2001 From: Anonymus Raccoon Date: Fri, 24 Apr 2020 15:06:33 +0200 Subject: [PATCH] Adding an easy way to load attacks --- CMakeLists.txt | 4 +++- Makefile | 3 ++- include/setup.h | 6 +++++- src/combat/fireball.c | 13 +++++++++++ src/game_loader.c | 36 ++++++++++++++++++++++++------- src/systems/combat_methods.c | 42 ++++++++++++++++++++---------------- 6 files changed, 74 insertions(+), 30 deletions(-) create mode 100644 src/combat/fireball.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 285bf81..a10dd7d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -296,7 +296,9 @@ add_executable(my_rpg src/components/dialog_methods.c src/components/attack_component.c include/components/attack_component.h - src/systems/combat_methods.c) + src/systems/combat_methods.c + src/combat/fireball.c +) add_compile_options(-W -Wall -Wextra -Wshadow) diff --git a/Makefile b/Makefile index 3dfa5c9..c70d12e 100644 --- a/Makefile +++ b/Makefile @@ -37,7 +37,8 @@ SRC = src/main.c \ src/components/attack_component.c \ src/systems/combat_methods.c \ src/components/combat_holder.c \ - src/enemy_dataloader.c + src/enemy_dataloader.c \ + src/combat/fireball.c OBJ = $(SRC:%.c=%.o) diff --git a/include/setup.h b/include/setup.h index 3fac625..76d9f31 100644 --- a/include/setup.h +++ b/include/setup.h @@ -51,4 +51,8 @@ enum gc_mousekeys key); bool dialog_input3(gc_engine *engine, gc_entity *entity, gc_vector2 pos, \ enum gc_mousekeys key); -gc_data *enemies_dataloader(gc_engine *engine, gc_scene *scene, node *n); \ No newline at end of file +gc_data *enemies_dataloader(gc_engine *engine, gc_scene *scene, node *n); + +void fireball(gc_engine *engine, gc_entity *from, gc_entity *enemy); + +void load_attacks(gc_scene *scene); \ No newline at end of file diff --git a/src/combat/fireball.c b/src/combat/fireball.c new file mode 100644 index 0000000..80a721b --- /dev/null +++ b/src/combat/fireball.c @@ -0,0 +1,13 @@ +/* +** EPITECH PROJECT, 2020 +** my_rpg +** File description: +** fireball.c +*/ + +#include "engine.h" + +void fireball(gc_engine *engine, gc_entity *from, gc_entity *enemy) +{ + printf("FIREBALL\n"); +} \ No newline at end of file diff --git a/src/game_loader.c b/src/game_loader.c index 6540654..53dfd54 100644 --- a/src/game_loader.c +++ b/src/game_loader.c @@ -8,12 +8,12 @@ #include "engine.h" #include "setup.h" #include -#include -#include -#include -#include -#include -#include +#include "components/dialog_holder.h" +#include "components/health_component.h" +#include "components/player_component.h" +#include "systems/combat_manager.h" +#include "components/combat_holder.h" +#include "components/attack_component.h" #include "systems/map_movement_system.h" #include "systems/game_manager_system.h" #include "systems/controllers/keyboard_controller_system.h" @@ -26,7 +26,7 @@ #include "my.h" #include "map_editor.h" #include "components/xp_component.h" -#include "components/health_component.h" +#include const struct callback callbacks[] = { {"start_button", &start_button}, @@ -61,6 +61,27 @@ const struct callback map_editor_callbacks[] = { {NULL, NULL} }; +const struct gc_data attacks[] = { + {"attack", "Fireball", &fireball, NULL}, + {NULL, NULL, NULL, NULL} +}; + +void load_attacks(gc_scene *scene) +{ + gc_data *data; + + for (int i = 0; attacks[i].name; i++) { + data = malloc(sizeof(*data)); + if (!data) + return; + data->name = my_strdup(attacks[i].name); + data->type = my_strdup(attacks[i].type); + data->custom = attacks[i].custom; + data->destroy = attacks[i].destroy; + LISTADD(scene->data, data); + } +} + int register_customcmps(gc_engine *engine, bool map_editor) { engine->add_component(engine, &controllable_component); @@ -84,7 +105,6 @@ int register_customcmps(gc_engine *engine, bool map_editor) engine->add_component(engine, &health_component); engine->finish_physics(engine); engine->add_dataloader(engine, "enemies", &enemies_dataloader); - for (int i = 0; callbacks[i].func; i++) engine->add_callback(engine, my_strdup(callbacks[i].name), \ callbacks[i].func); diff --git a/src/systems/combat_methods.c b/src/systems/combat_methods.c index 48c2cd0..14ef5b3 100644 --- a/src/systems/combat_methods.c +++ b/src/systems/combat_methods.c @@ -15,6 +15,7 @@ #include "my.h" #include "components/dialog_holder.h" #include "enemy.h" +#include "setup.h" void combat_start(gc_engine *engine, char *enemy_name) { @@ -30,6 +31,7 @@ void combat_start(gc_engine *engine, char *enemy_name) this->game_scene = engine->scene; engine->scene = NULL; engine->change_scene(engine, scene); + load_attacks(scene); dialog_next(engine); for (; li; li = li->next) { enemy = li->data; @@ -41,6 +43,22 @@ void combat_start(gc_engine *engine, char *enemy_name) prefab_load(engine, enemy->prefab_src); } +bool get_player_and_enemy(gc_scene *sce, gc_entity **player, gc_entity **enemy) +{ + gc_list *enemies = sce->get_entity_by_cmp(sce, "attack_component"); + + if (enemies && enemies->next && ((gc_entity *)enemies->data)->id == 50) { + *player = enemies->data; + *enemy = enemies->next->data; + } else if (enemies && enemies->next) { + *enemy = enemies->data; + *player = enemies->next->data; + } + if (!enemy || !player) + return (false); + return (true); +} + void attack_callback(gc_engine *engine, int index) { gc_scene *scene = engine->scene; @@ -48,16 +66,18 @@ void attack_callback(gc_engine *engine, int index) struct combat_manager *this = GETSYS(engine, combat_manager); struct dialog_holder *dialog; static char str[150]; - gc_entity *player_entity = scene->get_entity(scene, 50); + gc_entity *player_entity = NULL; + gc_entity *enemy = NULL; struct attack_component *player; - if (!li || !player_entity) + if (!li || !get_player_and_enemy(scene, &player_entity, &enemy)) return; player = GETCMP(player_entity, attack_component); if (!player) return; + if (player->attacks[index].run) + player->attacks[index].run(engine, player_entity, enemy); dialog = GETCMP(li->data, dialog_holder); - printf("Launching attack %d\n", index); snprintf(str, 150, "You used %s.", player->attacks[index].name); dialog_add_line(dialog, NULL, str, NULL); this->state = DEFEND; @@ -87,22 +107,6 @@ gc_scene *scene, gc_engine *engine) this->state = ATTACKING; } -bool get_player_and_enemy(gc_scene *sce, gc_entity **player, gc_entity **enemy) -{ - gc_list *enemies = sce->get_entity_by_cmp(sce, "attack_component"); - - if (enemies && enemies->next && ((gc_entity *)enemies->data)->id == 50) { - *player = enemies->data; - *enemy = enemies->next->data; - } else if (enemies && enemies->next) { - *enemy = enemies->data; - *player = enemies->next->data; - } - if (!enemy || !player) - return (false); - return (true); -} - void defend(struct combat_manager *this, struct dialog_holder *dialog, \ gc_scene *scene, gc_engine *engine) {