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