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;