Add dialogue portrait side placement

This commit is contained in:
2026-06-18 03:55:46 +09:00
parent b280632852
commit b8378d9144
8 changed files with 54 additions and 17 deletions

View File

@@ -86,10 +86,12 @@ var formation_menu: VBoxContainer
var formation_list: VBoxContainer
var formation_status_label: Label
var formation_unit_id := ""
var dialogue_row: HBoxContainer
var dialogue_panel: PanelContainer
var dialogue_portrait_panel: PanelContainer
var dialogue_portrait_texture: TextureRect
var dialogue_portrait_label: Label
var dialogue_column: VBoxContainer
var dialogue_speaker_label: Label
var dialogue_text_label: Label
var dialogue_continue_button: Button
@@ -473,7 +475,7 @@ func _create_hud() -> void:
dialogue_panel.size = Vector2(760, 140)
root.add_child(dialogue_panel)
var dialogue_row := HBoxContainer.new()
dialogue_row = HBoxContainer.new()
dialogue_row.add_theme_constant_override("separation", 14)
dialogue_panel.add_child(dialogue_row)
@@ -497,7 +499,7 @@ func _create_hud() -> void:
dialogue_portrait_label.add_theme_font_size_override("font_size", 22)
dialogue_portrait_stack.add_child(dialogue_portrait_label)
var dialogue_column := VBoxContainer.new()
dialogue_column = VBoxContainer.new()
dialogue_column.custom_minimum_size = Vector2(620, 112)
dialogue_column.add_theme_constant_override("separation", 8)
dialogue_row.add_child(dialogue_column)
@@ -1538,16 +1540,24 @@ func _normalized_dialogue_lines(lines: Array) -> Array:
result.append({
"speaker": str(line.get("speaker", "")),
"text": text,
"portrait": str(line.get("portrait", ""))
"portrait": str(line.get("portrait", "")),
"side": _normalized_dialogue_side(line.get("side", "left"))
})
elif typeof(line) == TYPE_STRING:
var text := str(line)
if text.is_empty():
continue
result.append({"speaker": "", "text": text, "portrait": ""})
result.append({"speaker": "", "text": text, "portrait": "", "side": "left"})
return result
func _normalized_dialogue_side(value) -> String:
var side := str(value).strip_edges().to_lower()
if side == "right":
return "right"
return "left"
func _can_show_dialogue_now() -> bool:
if not battle_started or campaign_complete_screen:
return false
@@ -1582,6 +1592,8 @@ func _render_dialogue_line() -> void:
return
var line: Dictionary = active_dialogue_lines[active_dialogue_index]
var speaker := str(line.get("speaker", ""))
var side := _normalized_dialogue_side(line.get("side", "left"))
_apply_dialogue_side(side)
dialogue_speaker_label.text = speaker
dialogue_speaker_label.visible = not speaker.is_empty()
dialogue_text_label.text = str(line.get("text", ""))
@@ -1592,6 +1604,15 @@ func _render_dialogue_line() -> void:
queue_redraw()
func _apply_dialogue_side(side: String) -> void:
if dialogue_row == null or dialogue_portrait_panel == null or dialogue_column == null:
return
var portrait_index := 1 if side == "right" else 0
dialogue_row.move_child(dialogue_portrait_panel, portrait_index)
dialogue_speaker_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_RIGHT if side == "right" else HORIZONTAL_ALIGNMENT_LEFT
dialogue_text_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_RIGHT if side == "right" else HORIZONTAL_ALIGNMENT_LEFT
func _update_dialogue_portrait(speaker: String, portrait_path: String) -> void:
if dialogue_portrait_panel == null:
return