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