diff --git a/CMakeLists.txt b/CMakeLists.txt
index 1b4d7f8..cc82a7c 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -289,7 +289,7 @@ add_executable(my_rpg
include/systems/combat_manager.h
src/components/player_component.c
include/components/player_component.h
-)
+ src/enemy_dataloader.c include/enemy.h)
add_compile_options(-W -Wall -Wextra -Wshadow)
diff --git a/assets/sprites/bee.png b/assets/sprites/bee.png
new file mode 100644
index 0000000..1971387
Binary files /dev/null and b/assets/sprites/bee.png differ
diff --git a/assets/ui/enemy.png b/assets/ui/enemy.png
new file mode 100644
index 0000000..baad6e4
Binary files /dev/null and b/assets/ui/enemy.png differ
diff --git a/assets/ui/player.png b/assets/ui/player.png
new file mode 100644
index 0000000..aeed34a
Binary files /dev/null and b/assets/ui/player.png differ
diff --git a/include/enemy.h b/include/enemy.h
new file mode 100644
index 0000000..50b8d4c
--- /dev/null
+++ b/include/enemy.h
@@ -0,0 +1,18 @@
+/*
+** EPITECH PROJECT, 2020
+** my_rpg
+** File description:
+** enemy.h
+*/
+
+
+#ifndef MY_RPG_ENEMY_H
+#define MY_RPG_ENEMY_H
+
+struct enemy {
+ char *name;
+ char *prefab_src;
+ int spawn_rate;
+};
+
+#endif //MY_RPG_ENEMY_H
diff --git a/include/setup.h b/include/setup.h
index c13d581..3fac625 100644
--- a/include/setup.h
+++ b/include/setup.h
@@ -50,3 +50,5 @@ bool dialog_input2(gc_engine *engine, gc_entity *entity, gc_vector2 pos, \
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
diff --git a/lib/gamacon b/lib/gamacon
index 077ce25..88fe62a 160000
--- a/lib/gamacon
+++ b/lib/gamacon
@@ -1 +1 @@
-Subproject commit 077ce25971e4fd7101f24bd5d5fe535bff2c43b1
+Subproject commit 88fe62af36bd665427f61d8c2ea24e45e472e88b
diff --git a/prefabs/combat.gcprefab b/prefabs/combat.gcprefab
index 81e5dfe..378e4ad 100644
--- a/prefabs/combat.gcprefab
+++ b/prefabs/combat.gcprefab
@@ -3,6 +3,10 @@
+
+
+
+
@@ -32,5 +36,8 @@
+
+
+
\ No newline at end of file
diff --git a/prefabs/enemies/bee.gcprefab b/prefabs/enemies/bee.gcprefab
new file mode 100644
index 0000000..568bfcc
--- /dev/null
+++ b/prefabs/enemies/bee.gcprefab
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/prefabs/game.gcprefab b/prefabs/game.gcprefab
index ef11cd1..9b80bf9 100644
--- a/prefabs/game.gcprefab
+++ b/prefabs/game.gcprefab
@@ -122,6 +122,10 @@
+
+
+
+
diff --git a/src/enemy_dataloader.c b/src/enemy_dataloader.c
new file mode 100644
index 0000000..d40e2e1
--- /dev/null
+++ b/src/enemy_dataloader.c
@@ -0,0 +1,51 @@
+/*
+** EPITECH PROJECT, 2020
+** my_rpg
+** File description:
+** enemies_dataloader.c
+*/
+
+#include "engine.h"
+#include
+#include
+#include "enemy.h"
+
+static void free_enemy(gc_list *list)
+{
+ struct enemy *data;
+
+ if (!list)
+ return;
+ free_enemy(list->next);
+ data = (struct enemy *)list->data;
+ free(data->name);
+ free(data->prefab_src);
+}
+
+static void free_enemies(gc_data *data)
+{
+ free_enemy(data->custom);
+}
+
+gc_data *enemies_dataloader(gc_engine *engine, gc_scene *scene, node *n)
+{
+ gc_data *data = malloc(sizeof(*data));
+ struct enemy *enemy;
+
+ if (!data)
+ return (NULL);
+ data->type = my_strdup("enemies");
+ data->name = NULL;
+ data->destroy = &free_enemies;
+ data->custom = NULL;
+ for (n = n->child; n; n = n->next) {
+ enemy = malloc(sizeof(*enemy));
+ if (!enemy)
+ return (NULL);
+ enemy->name = xml_getproperty(n, "name");
+ enemy->prefab_src = xml_getproperty(n, "src");
+ enemy->spawn_rate = xml_getintprop(n, "spawn_rate");
+ LISTADD(data->custom, enemy);
+ }
+ return (data);
+}
\ No newline at end of file
diff --git a/src/game_loader.c b/src/game_loader.c
index 117afbb..8639bb1 100644
--- a/src/game_loader.c
+++ b/src/game_loader.c
@@ -77,6 +77,8 @@ int register_customcmps(gc_engine *engine, bool map_editor)
engine->add_component(engine, &player_component);
engine->add_system(engine, new_system(&combat_manager, engine));
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_manager.c b/src/systems/combat_manager.c
index f5793db..09dd8ce 100644
--- a/src/systems/combat_manager.c
+++ b/src/systems/combat_manager.c
@@ -9,22 +9,35 @@
#include
#include
#include
+#include
#include "engine.h"
#include "my.h"
#include "components/dialog_holder.h"
+#include "enemy.h"
-void combat_start(gc_engine *engine)
+void combat_start(gc_engine *engine, char *enemy_name)
{
struct combat_manager *this = GETSYS(engine, combat_manager);
+ gc_list *li = engine->scene->get_data(engine->scene, "enemies", NULL);
gc_scene *scene = scene_create(engine, "prefabs/combat.gcprefab");
+ struct enemy *enemy = NULL;
if (!scene) {
my_printf("The combat scene couldn't be found.\n");
return;
}
this->game_scene = engine->scene;
+ engine->scene = NULL;
engine->change_scene(engine, scene);
dialog_next(engine);
+ for (; li; li = li->next) {
+ enemy = li->data;
+ if ((!enemy_name && random() % 100 < enemy->spawn_rate)
+ || (enemy_name && !my_strcmp(enemy_name, enemy->name)))
+ break;
+ }
+ if (enemy)
+ prefab_load(engine, enemy->prefab_src);
}
void entity_moved(gc_engine *engine, va_list args)
@@ -36,9 +49,9 @@ void entity_moved(gc_engine *engine, va_list args)
if (!cmp)
return;
if (tile->type && my_strcmp(tile->type, "combat"))
- combat_start(engine);
+ combat_start(engine, NULL);
if (random() % 100 < cmp->fight_rate)
- combat_start(engine);
+ combat_start(engine, NULL);
}
@@ -58,6 +71,9 @@ static void ctr(void *system, va_list list)
static void dtr(void *system, gc_engine *engine)
{
+ struct combat_manager *sys = system;
+ if (sys->game_scene)
+ scene_destroy(sys->game_scene);
}
const struct combat_manager combat_manager = {