From f7df7144e7c8b51ad312b7e3e0b4440e8e0310f0 Mon Sep 17 00:00:00 2001 From: Anonymus Raccoon Date: Fri, 24 Apr 2020 13:57:44 +0200 Subject: [PATCH] Finishing a basic combat loop --- include/components/attack_component.h | 2 +- include/components/combat_holder.h | 9 ---- include/components/dialog_holder.h | 1 + include/systems/combat_manager.h | 16 ++++++- prefabs/enemies/bee.gcprefab | 1 + src/components/combat_holder.c | 1 - src/components/dialog_methods.c | 3 +- src/systems/combat_manager.c | 15 +++--- src/systems/combat_methods.c | 69 +++++++++++++++++++++++++-- src/systems/dialog_methods.c | 4 +- 10 files changed, 94 insertions(+), 27 deletions(-) diff --git a/include/components/attack_component.h b/include/components/attack_component.h index 674477d..c44bb9a 100644 --- a/include/components/attack_component.h +++ b/include/components/attack_component.h @@ -11,7 +11,7 @@ #include "component.h" -typedef void (*attack)(gc_entity *from, gc_entity *enemy); +typedef void (*attack)(gc_engine *engine, gc_entity *from, gc_entity *enemy); typedef struct attack_holder { char *name; diff --git a/include/components/combat_holder.h b/include/components/combat_holder.h index 9ecbd00..4c50978 100644 --- a/include/components/combat_holder.h +++ b/include/components/combat_holder.h @@ -11,18 +11,9 @@ #include "component.h" -enum combat_state -{ - ATTACK, - ATTACKING, - DEFENDING, - IDLE -}; - struct combat_holder { gc_component base; - enum combat_state state; char *name; }; diff --git a/include/components/dialog_holder.h b/include/components/dialog_holder.h index e37bf8a..ab8e9ef 100644 --- a/include/components/dialog_holder.h +++ b/include/components/dialog_holder.h @@ -48,5 +48,6 @@ const struct dialog_manager dialog_manager; void dialog_next(gc_engine *engine); void dialog_add_line(struct dialog_holder *this, char *name, char *text, \ struct dialog_input *inputs); +void show_dialog_if_hidden(gc_engine *engine); #endif //MY_RPG_DIALOG_HOLDER_H diff --git a/include/systems/combat_manager.h b/include/systems/combat_manager.h index 84a1575..de45f46 100644 --- a/include/systems/combat_manager.h +++ b/include/systems/combat_manager.h @@ -13,10 +13,20 @@ #include "components/combat_holder.h" #include "components/dialog_holder.h" +enum combat_state +{ + ATTACK, + DEFEND, + ATTACKING, + DEFENDING, + IDLE +}; + struct combat_manager { gc_system base; gc_scene *game_scene; struct enemy *current_enemy; + enum combat_state state; }; extern const struct combat_manager combat_manager; @@ -24,7 +34,9 @@ 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 show_attacks(struct combat_holder *cmp, struct dialog_holder *dialog, \ -gc_scene *scene); +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, \ +gc_scene *scene, gc_engine *engine); #endif //MY_RPG_COMBAT_MANAGER_H diff --git a/prefabs/enemies/bee.gcprefab b/prefabs/enemies/bee.gcprefab index 9c464a0..8bcedf2 100644 --- a/prefabs/enemies/bee.gcprefab +++ b/prefabs/enemies/bee.gcprefab @@ -10,6 +10,7 @@ + \ No newline at end of file diff --git a/src/components/combat_holder.c b/src/components/combat_holder.c index 0f3e85d..70aecd6 100644 --- a/src/components/combat_holder.c +++ b/src/components/combat_holder.c @@ -12,7 +12,6 @@ static void ctr(void *component, va_list args) { struct combat_holder *cmp = component; - cmp->state = ATTACK; cmp->name = va_arg(args, char *); } diff --git a/src/components/dialog_methods.c b/src/components/dialog_methods.c index 2587141..c681d33 100644 --- a/src/components/dialog_methods.c +++ b/src/components/dialog_methods.c @@ -24,7 +24,8 @@ struct dialog_input *inputs) line->input_count = count; line->inputs = inputs; for (count = 0; this->text[count]; count++); - this->text = my_realloc(this->text, (count + 1) * sizeof(void *), (count + 2) * sizeof(void *)); + this->text = my_realloc(this->text, (count + 1) * sizeof(void *), \ +(count + 2) * sizeof(void *)); if (!this->text) return; this->text[count] = line; diff --git a/src/systems/combat_manager.c b/src/systems/combat_manager.c index 550b2d4..1ac3ec4 100644 --- a/src/systems/combat_manager.c +++ b/src/systems/combat_manager.c @@ -9,12 +9,9 @@ #include #include #include -#include -#include #include "engine.h" #include "my.h" #include "components/dialog_holder.h" -#include "components/combat_holder.h" #include "enemy.h" void entity_moved(gc_engine *engine, va_list args) @@ -41,12 +38,13 @@ void dialog_ended(gc_engine *engine, va_list args) this->current_enemy = NULL; engine->change_scene(engine, this->game_scene); this->game_scene = NULL; + this->state = ATTACK; } static void update_entity(gc_engine *engine, void *system, gc_entity *entity, \ float dtime) { - struct combat_holder *cmp = GETCMP(entity, combat_holder); + struct combat_manager *this = system; gc_scene *scene = engine->scene; gc_list *li = scene->get_entity_by_cmp(scene, "dialog_holder"); struct dialog_holder *dialog; @@ -54,9 +52,13 @@ float dtime) if (!li) return; dialog = GETCMP(li->data, dialog_holder); - switch (cmp->state) { + switch (this->state) { case ATTACK: - return (show_attacks(cmp, dialog, scene)); + return (show_attacks(this, dialog, scene, engine)); + case DEFEND: + return (defend(this, dialog, scene, engine)); + case ATTACKING: + case DEFENDING: case IDLE: break; } @@ -68,6 +70,7 @@ static void ctr(void *system, va_list list) struct combat_manager *this = (struct combat_manager *)system; 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); } diff --git a/src/systems/combat_methods.c b/src/systems/combat_methods.c index 005506c..8be7632 100644 --- a/src/systems/combat_methods.c +++ b/src/systems/combat_methods.c @@ -6,15 +6,14 @@ */ #include +#include #include "systems/combat_manager.h" #include "tile.h" -#include "components/player_component.h" #include "prefab.h" #include "components/attack_component.h" #include "engine.h" #include "my.h" #include "components/dialog_holder.h" -#include "components/combat_holder.h" #include "enemy.h" void combat_start(gc_engine *engine, char *enemy_name) @@ -44,11 +43,28 @@ void combat_start(gc_engine *engine, char *enemy_name) void attack_callback(gc_engine *engine, int index) { + gc_scene *scene = engine->scene; + gc_list *li = scene->get_entity_by_cmp(scene, "dialog_holder"); + 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); + struct attack_component *player; + + if (!li || !player_entity) + return; + player = GETCMP(player_entity, attack_component); + if (!player) + return; + 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; } -void show_attacks(struct combat_holder *cmp, struct dialog_holder *dialog, \ -gc_scene *scene) +void show_attacks(struct combat_manager *this, struct dialog_holder *dialog, \ +gc_scene *scene, gc_engine *engine) { gc_entity *player_entity = scene->get_entity(scene, 50); struct attack_component *player; @@ -68,5 +84,48 @@ gc_scene *scene) } inputs[i].text = NULL; dialog_add_line(dialog, NULL, ATTACK_TEXT, inputs); - cmp->state = ATTACKING; + 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) +{ + gc_entity *player = NULL; + gc_entity *enemy = NULL; + struct attack_component *enemy_attack; + static char str[150]; + struct attack_holder *attack = NULL; + int count; + + if (!get_player_and_enemy(scene, &player, &enemy)) + return; + if (!(enemy_attack = GETCMP(enemy, attack_component))) + return; + for (count = 0; enemy_attack->attacks[count].name; count++); + if (count == 0) { + my_printf("No attack found for the enemy.\n"); + return; + } + attack = &enemy_attack->attacks[random() % count]; + snprintf(str, 150, "%s uses attack %s.", "The bee", attack->name); + if (attack->run) + attack->run(engine, enemy, player); + dialog_add_line(dialog, NULL, str, NULL); + this->state = DEFENDING; } \ No newline at end of file diff --git a/src/systems/dialog_methods.c b/src/systems/dialog_methods.c index d5b68ec..be3164a 100644 --- a/src/systems/dialog_methods.c +++ b/src/systems/dialog_methods.c @@ -116,8 +116,8 @@ void dialog_next(gc_engine *engine) controllable_set_can_move(scene, false); holder_name = scene->get_entity(scene, 1336); entity = scene->get_entity(scene, 1337); - if (!entity || !holder_name - ||!update_dialog(this, entity, holder_name) && handle_input(engine, this)) + if (!entity || !holder_name || + (!update_dialog(this, entity, holder_name) && handle_input(engine, this))) return; prefab_destroy(scene, this->dialog_id); this->dialog_id = -1;