From beb2bdf537de30c5a1f7188a08174f72884ee484 Mon Sep 17 00:00:00 2001 From: Wickedness Date: Sat, 20 Jun 2026 15:19:39 +0900 Subject: [PATCH] Use generated gold reward chip --- README.md | 2 +- scripts/scenes/battle_scene.gd | 35 +++++++++++++++++++++++++++++++++- tools/smoke_result_summary.gd | 24 +++++++++++++++++++++++ 3 files changed, 59 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 43f0ab9..5299ad2 100644 --- a/README.md +++ b/README.md @@ -46,7 +46,7 @@ Godot 4 tactical RPG prototype inspired by classic turn-based Romance of the Thr - Pre-battle Chapters overview shows story-arc progress with map thumbnail rows, compact status badges, hover details, and can open completed or current battles. - Pre-battle Save menu can write and load one manual campaign checkpoint separate from the automatic save, using compact seal-style slot rows and hover checkpoint details. - The title screen exposes Start, Load, and Settings, and Load now lets the player choose between the automatic record and the manual checkpoint. -- Victory results show compact reward icons for gold, items, and officer roster changes, with joined-officer portraits, class crests, Korean join/leave badges, and hover details for the full reward text. +- Victory results show compact generated image chips for gold, items, and officer roster changes, with joined-officer portraits, class crests, Korean join/leave badges, and hover details for the full reward text. - Escort scenarios can include required, non-controllable protected units. - Campaign saves joined officers, future deployments can require prior recruitment, and choices can make officers leave. - Completed saves reconcile officer join/leave rewards on load without replaying gold or items. diff --git a/scripts/scenes/battle_scene.gd b/scripts/scenes/battle_scene.gd index 609755c..6fb4009 100644 --- a/scripts/scenes/battle_scene.gd +++ b/scripts/scenes/battle_scene.gd @@ -10917,7 +10917,7 @@ func _rebuild_result_reward_strip() -> void: elif bool(battle_result_summary.get("rewards_applied", false)): var gold_reward := int(battle_result_summary.get("gold", 0)) if gold_reward > 0: - result_reward_strip.add_child(_make_result_reward_text_chip("냥", "군자금 +%d냥" % gold_reward)) + result_reward_strip.add_child(_make_result_reward_gold_chip(gold_reward)) var item_counts := _result_item_counts(battle_result_summary.get("items", [])) var item_ids := item_counts.keys() item_ids.sort() @@ -10962,6 +10962,39 @@ func _make_result_reward_text_chip(label_text: String, tooltip_text: String) -> return panel +func _make_result_reward_gold_chip(amount: int) -> PanelContainer: + var tooltip := "군자금 +%d냥" % amount + var panel := _make_result_reward_chip_shell(tooltip) + panel.name = "ResultRewardGoldChip" + var stack := Control.new() + stack.set_anchors_preset(Control.PRESET_FULL_RECT) + stack.tooltip_text = tooltip + panel.add_child(stack) + + var icon_rect := TextureRect.new() + icon_rect.name = "ResultRewardGoldIcon" + icon_rect.set_anchors_preset(Control.PRESET_FULL_RECT) + icon_rect.expand_mode = TextureRect.EXPAND_IGNORE_SIZE + icon_rect.stretch_mode = TextureRect.STRETCH_KEEP_ASPECT_CENTERED + icon_rect.texture = _load_map_badge_texture("gold") + icon_rect.visible = icon_rect.texture != null + icon_rect.tooltip_text = tooltip + stack.add_child(icon_rect) + + var fallback_label := Label.new() + fallback_label.set_anchors_preset(Control.PRESET_FULL_RECT) + fallback_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER + fallback_label.vertical_alignment = VERTICAL_ALIGNMENT_CENTER + fallback_label.text = "냥" + fallback_label.visible = icon_rect.texture == null + fallback_label.tooltip_text = tooltip + _apply_label_style(fallback_label, UI_PARCHMENT_TEXT, 16) + stack.add_child(fallback_label) + + stack.add_child(_make_result_reward_corner_badge("+", tooltip)) + return panel + + func _make_result_reward_item_chip(item_id: String, count: int) -> PanelContainer: var item := state.get_item_def(item_id) var display_name := _item_inventory_display_name(item_id) diff --git a/tools/smoke_result_summary.gd b/tools/smoke_result_summary.gd index 936cd63..827af47 100644 --- a/tools/smoke_result_summary.gd +++ b/tools/smoke_result_summary.gd @@ -60,6 +60,11 @@ func _init() -> void: _check_contains(failures, "reward strip Cao Ren tooltip", reward_tooltips, "합류: 조인") _check_contains(failures, "reward strip archer class tooltip", reward_tooltips, "병과: 궁병") _check_contains(failures, "reward strip infantry class tooltip", reward_tooltips, "병과: 보병") + var gold_chip := _find_named_node(scene.result_reward_strip, "ResultRewardGoldChip") + if gold_chip == null: + failures.append("reward icon strip should show gold as a generated image chip") + elif not _has_named_texture_rect(gold_chip, "ResultRewardGoldIcon"): + failures.append("gold reward chip should use the generated gold badge art") if _count_named_nodes(scene.result_reward_strip, "ResultRewardClassBadge") < 2: failures.append("joined officer reward chips should show compact class crests") if not _has_texture_rect(scene.result_reward_strip): @@ -168,6 +173,25 @@ func _has_texture_rect(root: Node) -> bool: return false +func _has_named_texture_rect(root: Node, node_name: String) -> bool: + if root.name == node_name and root is TextureRect and (root as TextureRect).texture != null: + return true + for child in root.get_children(): + if _has_named_texture_rect(child, node_name): + return true + return false + + +func _find_named_node(root: Node, node_name: String) -> Node: + if root.name == node_name: + return root + for child in root.get_children(): + var found := _find_named_node(child, node_name) + if found != null: + return found + return null + + func _count_named_nodes(root: Node, node_name: String) -> int: var count := 1 if root.name == node_name else 0 for child in root.get_children():