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, \