From c11962b462fa56f07df663f18b2c987275278c77 Mon Sep 17 00:00:00 2001
From: Anonymus Raccoon
Date: Wed, 15 Apr 2020 15:13:36 +0200
Subject: [PATCH] Adding names of the person who talks on the dialog
---
include/components/dialog_holder.h | 9 +++-
prefabs/dialog.gcprefab | 4 +-
prefabs/game.gcprefab | 4 +-
prefabs/player.gcprefab | 78 +++++++++++++++---------------
src/components/dialog_holder.c | 9 ++--
src/systems/dialog_manager.c | 21 +++++---
6 files changed, 70 insertions(+), 55 deletions(-)
diff --git a/include/components/dialog_holder.h b/include/components/dialog_holder.h
index cfac244..56bb0b2 100644
--- a/include/components/dialog_holder.h
+++ b/include/components/dialog_holder.h
@@ -10,9 +10,14 @@
#include "component.h"
+struct dialog_line {
+ char *name;
+ char *text;
+};
+
struct dialog_holder {
gc_component base;
- char **text;
+ struct dialog_line **text;
bool single_usage;
bool has_seen;
struct tile *tile;
@@ -24,7 +29,7 @@ struct dialog_manager {
gc_system base;
int dialog_id;
int current_line;
- char *current_text;
+ struct dialog_line *current_text;
struct dialog_holder *current_dialog;
};
diff --git a/prefabs/dialog.gcprefab b/prefabs/dialog.gcprefab
index 5ce541f..cd4a590 100644
--- a/prefabs/dialog.gcprefab
+++ b/prefabs/dialog.gcprefab
@@ -1,5 +1,5 @@
-
-
+
+
\ No newline at end of file
diff --git a/prefabs/game.gcprefab b/prefabs/game.gcprefab
index b69e071..831b844 100644
--- a/prefabs/game.gcprefab
+++ b/prefabs/game.gcprefab
@@ -149,8 +149,8 @@
-
-
+ ?? line="Hello dirt block,\nI am the mighty cobble block." />
+
diff --git a/prefabs/player.gcprefab b/prefabs/player.gcprefab
index ddd6f0c..dbd417b 100644
--- a/prefabs/player.gcprefab
+++ b/prefabs/player.gcprefab
@@ -1,41 +1,41 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/dialog_holder.c b/src/components/dialog_holder.c
index 410a2a4..56c665a 100644
--- a/src/components/dialog_holder.c
+++ b/src/components/dialog_holder.c
@@ -64,12 +64,15 @@ static void fdctr(gc_entity *entity, gc_scene *scene, void *component, node *n)
char *texture = xml_gettmpstring(n, "tile_texture", NULL);
cmp->single_usage = xml_getbool(n, "single_usage", false);
- cmp->text = malloc(sizeof(char *) * (count + 1));
+ cmp->text = malloc(sizeof(struct dialog_line *) * (count + 1));
if (!cmp->text)
return;
n = n->child;
- for (int i = 0; n; n = n->next, i++)
- cmp->text[i] = xml_getproperty(n, "line");
+ for (int i = 0; n; n = n->next, i++) {
+ cmp->text[i] = malloc(sizeof(struct dialog_line));
+ cmp->text[i]->name = my_strdup(n->name);
+ cmp->text[i]->text = xml_getproperty(n, "line");
+ }
cmp->text[count] = NULL;
setup_tile_interactions(cmp, scene, (gc_vector2i){x, y}, texture);
}
diff --git a/src/systems/dialog_manager.c b/src/systems/dialog_manager.c
index e335051..b685117 100644
--- a/src/systems/dialog_manager.c
+++ b/src/systems/dialog_manager.c
@@ -41,20 +41,25 @@ my_strcmp(link->tile->type, "dialog"))
}
bool update_dialog(struct dialog_manager *this, gc_entity *text, \
-gc_scene *scene)
+gc_entity *name, gc_scene *scene)
{
struct renderer *rend;
- if (!text)
+ if (!text || !name)
return (true);
+ this->current_text = this->current_dialog->text[this->current_line];
+ rend = GETCMP(name, renderer);
+ if (!rend || rend->type != GC_TXTREND || !rend->data)
+ return (true);
+ if (this->current_text)
+ ((gc_text *)rend->data)->text = this->current_text->name;
+ else
+ ((gc_text *)rend->data)->text = NULL;
rend = GETCMP(text, renderer);
if (!rend || rend->type != GC_TXTREND || !rend->data)
return (true);
- if (((gc_text *)rend->data)->text)
- free(((gc_text *)rend->data)->text);
- this->current_text = this->current_dialog->text[this->current_line];
if (this->current_text)
- ((gc_text *)rend->data)->text = my_strdup(this->current_text);
+ ((gc_text *)rend->data)->text = this->current_text->text;
else
((gc_text *)rend->data)->text = NULL;
this->current_line++;
@@ -67,13 +72,15 @@ static void check_for_dialog(gc_engine *engine, va_list args)
gc_keybindings key = va_arg(args, gc_keybindings);
gc_scene *scene = engine->scene;
gc_entity *entity = scene->get_entity(scene, 50);
+ gc_entity *holder_name;
if (key != SPACE || !entity)
return;
if (this->dialog_id == -1)
load_dialog(this, engine, entity);
+ holder_name = scene->get_entity(scene, 1336);
entity = scene->get_entity(scene, 1337);
- if (!update_dialog(this, entity, scene))
+ if (!update_dialog(this, entity, holder_name, scene))
return;
for (gc_list *li = scene->entities; li; li = li->next) {
if (((gc_entity *) li->data)->prefab_id == this->dialog_id)