From 355668c0c6d9d92973d8e51bb97fdbefe28d3382 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20Qui=C3=B1ones?= Date: Fri, 16 Oct 2026 11:59:10 -0300 Subject: [PATCH] Improve player_name variable in dialogues The dialogue template in project.setttings references {{ player_name }}. Change the setter of `temporary_game_states` in balloon to ensure that a fallback is used when no state provides `player_name`. For that, move the default `player_name` in Player to a constant. Also revert using the locals variable to store the player_name, use a dedicated variable instead. Also, change the way to obtain `player_name` from state. Instead of checking if the state is Player, do as other parts of the project: assume that any Node2D is in group `player` is the player. --- .../characters/player/components/player.gd | 3 ++- scenes/ui_elements/dialogue/components/balloon.gd | 15 +++++++++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/scenes/game_elements/characters/player/components/player.gd b/scenes/game_elements/characters/player/components/player.gd index f91e41080..489d5d15d 100644 --- a/scenes/game_elements/characters/player/components/player.gd +++ b/scenes/game_elements/characters/player/components/player.gd @@ -34,10 +34,11 @@ const OPTIONAL_ANIMATION_FRAMES: Dictionary[StringName, int] = { } const DEFAULT_SPRITE_FRAME: SpriteFrames = preload("uid://vwf8e1v8brdp") +const DEFAULT_PLAYER_NAME := "Player Name" ## The character's name. This is used to highlight when the player's character ## is speaking during dialogue. -@export var player_name: String = "Player Name" +@export var player_name: String = DEFAULT_PLAYER_NAME ## The current player state. @export var mode: Mode = Mode.USER_CONTROLLED: diff --git a/scenes/ui_elements/dialogue/components/balloon.gd b/scenes/ui_elements/dialogue/components/balloon.gd index eca9c4e45..7ccc10719 100644 --- a/scenes/ui_elements/dialogue/components/balloon.gd +++ b/scenes/ui_elements/dialogue/components/balloon.gd @@ -31,10 +31,16 @@ const NPC_RIBBON_TYPE_VARIATION := &"NPCRibbon" ## Temporary game states var temporary_game_states: Array = []: set(new_value): + var player := get_tree().get_first_node_in_group("player") as Node2D + if player: + if "player_name" in player: + _player_name = player.player_name + new_value.append(player) + else: + # This ensures that the player_name variable is available in any dialogue. + # With this the dialogue file template can have {{ player_name }}. + new_value.append({"player_name": _player_name}) temporary_game_states = new_value - for state: Variant in new_value: - if state is Player: - locals["player_name"] = (state as Player).player_name ## See if we are waiting for the player var is_waiting_for_input: bool = false @@ -61,6 +67,7 @@ var dialogue_line: DialogueLine: var mutation_cooldown: Timer = Timer.new() var _locale: String = TranslationServer.get_locale() +var _player_name: String = Player.DEFAULT_PLAYER_NAME ## A sound player for voice lines (if they exist). @onready var audio_stream_player: AudioStreamPlayer = %AudioStreamPlayer @@ -163,7 +170,7 @@ func apply_dialogue_line() -> void: character_panel.visible = not dialogue_line.character.is_empty() character_panel.theme_type_variation = ( PLAYER_RIBBON_TYPE_VARIATION - if locals.get("player_name") == dialogue_line.character + if _player_name == dialogue_line.character else NPC_RIBBON_TYPE_VARIATION ) character_label.text = tr(dialogue_line.character, "dialogue")