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 @@ - - + + 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)