From e6437f7e71353994010f54014f4efcd53d0753a8 Mon Sep 17 00:00:00 2001 From: Anonymus Raccoon Date: Mon, 27 Apr 2020 19:03:13 +0200 Subject: [PATCH] Adding an attack to the player that allow the player to exit the fight --- CMakeLists.txt | 2 +- include/setup.h | 3 +++ include/systems/combat_manager.h | 1 + prefabs/combat.gcprefab | 6 +++--- src/combat/attacks.c | 31 +++++++++++++++++++++++++++++++ src/combat/fireball.c | 13 ------------- src/game_loader.c | 3 +++ src/systems/combat_manager.c | 10 +++++----- src/systems/combat_methods.c | 8 ++++++-- 9 files changed, 53 insertions(+), 24 deletions(-) create mode 100644 src/combat/attacks.c delete mode 100644 src/combat/fireball.c diff --git a/CMakeLists.txt b/CMakeLists.txt index b76e283..3e167f9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -297,7 +297,7 @@ add_executable(my_rpg src/components/attack_component.c include/components/attack_component.h src/systems/combat_methods.c - src/combat/fireball.c + src/combat/attacks.c src/player_utilities.c include/player_utilities.h) add_compile_options(-W -Wall -Wextra -Wshadow) diff --git a/include/setup.h b/include/setup.h index 76d9f31..10e3edb 100644 --- a/include/setup.h +++ b/include/setup.h @@ -54,5 +54,8 @@ enum gc_mousekeys key); gc_data *enemies_dataloader(gc_engine *engine, gc_scene *scene, node *n); void fireball(gc_engine *engine, gc_entity *from, gc_entity *enemy); +void uppercut(gc_engine *engine, gc_entity *from, gc_entity *enemy); +void water_jet(gc_engine *engine, gc_entity *from, gc_entity *enemy); +void shield(gc_engine *engine, gc_entity *from, gc_entity *enemy); void load_attacks(gc_scene *scene); \ No newline at end of file diff --git a/include/systems/combat_manager.h b/include/systems/combat_manager.h index a3ebcee..e90af2b 100644 --- a/include/systems/combat_manager.h +++ b/include/systems/combat_manager.h @@ -36,6 +36,7 @@ extern const struct combat_manager combat_manager; #define ATTACK_TEXT "What attack will you do?" void combat_start(gc_engine *engine, char *enemy_name); +void combat_end(gc_engine *engine, bool has_won); void show_attacks(struct combat_manager *this, struct dialog_holder *dialog, \ gc_scene *scene, gc_engine *engine); void defend(struct combat_manager *this, struct dialog_holder *dialog, \ diff --git a/prefabs/combat.gcprefab b/prefabs/combat.gcprefab index d3f54ff..a1a0e8f 100644 --- a/prefabs/combat.gcprefab +++ b/prefabs/combat.gcprefab @@ -32,10 +32,10 @@ - - + + - + diff --git a/src/combat/attacks.c b/src/combat/attacks.c new file mode 100644 index 0000000..77bae18 --- /dev/null +++ b/src/combat/attacks.c @@ -0,0 +1,31 @@ +/* +** EPITECH PROJECT, 2020 +** my_rpg +** File description: +** fireball.c +*/ + +#include +#include "engine.h" + +void uppercut(gc_engine *engine, gc_entity *from, gc_entity *enemy) +{ + struct health_component *enemy_health = GETCMP(enemy, health_component); + + rem_health(enemy_health, engine, 10); +} + +void water_jet(gc_engine *engine, gc_entity *from, gc_entity *enemy) +{ + printf("water_grenade\n"); +} + +void fireball(gc_engine *engine, gc_entity *from, gc_entity *enemy) +{ + printf("FIREBALL\n"); +} + +void shield(gc_engine *engine, gc_entity *from, gc_entity *enemy) +{ + printf("shield\n"); +} diff --git a/src/combat/fireball.c b/src/combat/fireball.c deleted file mode 100644 index 80a721b..0000000 --- a/src/combat/fireball.c +++ /dev/null @@ -1,13 +0,0 @@ -/* -** 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 47fe9f8..4edd2ab 100644 --- a/src/game_loader.c +++ b/src/game_loader.c @@ -62,7 +62,10 @@ const struct callback map_editor_callbacks[] = { }; const struct gc_data attacks[] = { + {"attack", "Uppercut", &uppercut, NULL}, {"attack", "Fireball", &fireball, NULL}, + {"attack", "Water Jet", &water_jet, NULL}, + {"attack", "Shield", &shield, NULL}, {NULL, NULL, NULL, NULL} }; diff --git a/src/systems/combat_manager.c b/src/systems/combat_manager.c index 3925b24..625e20e 100644 --- a/src/systems/combat_manager.c +++ b/src/systems/combat_manager.c @@ -29,20 +29,22 @@ void entity_moved(gc_engine *engine, va_list args) combat_start(engine, NULL); } -void dialog_ended(gc_engine *engine, va_list args) +void combat_end(gc_engine *engine, bool has_won) { struct combat_manager *this = GETSYS(engine, combat_manager); gc_entity *player = engine->scene->get_entity(engine->scene, 50); gc_entity *player_combat = this->game_scene->get_entity(this->game_scene, 50); + struct dialog_manager *dialog = GETSYS(engine, dialog_manager); - if (!this->current_enemy || !player || ! player_combat) + if (!this->current_enemy || !player || ! player_combat || !dialog) return; set_combat_player(player_combat, player); - engine->trigger_event(engine, "combat_ended", this->current_enemy); this->current_enemy = NULL; engine->change_scene(engine, this->game_scene); + engine->trigger_event(engine, "combat_ended", this->current_enemy, has_won); this->game_scene = NULL; this->state = ATTACK; + dialog->dialog_id = -1; } static void update_entity(gc_engine *engine, void *system, gc_entity *entity, \ @@ -76,7 +78,6 @@ static void ctr(void *system, va_list list) this->game_scene = NULL; this->state = ATTACK; 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) @@ -84,7 +85,6 @@ static void dtr(void *system, gc_engine *engine) 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); } diff --git a/src/systems/combat_methods.c b/src/systems/combat_methods.c index 8adb233..578ec69 100644 --- a/src/systems/combat_methods.c +++ b/src/systems/combat_methods.c @@ -32,6 +32,7 @@ void combat_start(gc_engine *engine, char *enemy_name) my_printf("The combat scene couldn't be found.\n"); return; } + this->state = ATTACK; this->game_scene = engine->scene; set_combat_player(player, player_combat); engine->scene = NULL; @@ -77,8 +78,7 @@ void attack_callback(gc_engine *engine, int index) if (!li || !get_player_and_enemy(scene, &player_entity, &enemy)) return; - player = GETCMP(player_entity, attack_component); - if (!player) + if (!(player = GETCMP(player_entity, attack_component))) return; if (player->attacks[index].run) player->attacks[index].run(engine, player_entity, enemy); @@ -86,6 +86,8 @@ void attack_callback(gc_engine *engine, int index) snprintf(str, 150, "You used %s.", player->attacks[index].name); dialog_add_line(dialog, NULL, str, NULL); this->state = DEFEND; + if (GETCMP(enemy, health_component)->dead) + combat_end(engine, true); } void show_attacks(struct combat_manager *this, struct dialog_holder *dialog, \ @@ -123,6 +125,8 @@ void defend_callback(gc_engine *engine) if (this->next_enemy_attack->run) this->next_enemy_attack->run(engine, enemy, player); this->state = ATTACK; + if (GETCMP(player, health_component)->dead) + combat_end(engine, false); } void defend(struct combat_manager *this, struct dialog_holder *dialog, \