From 3e40a31d62caff888886b2f7085f545b7c079410 Mon Sep 17 00:00:00 2001 From: Wickedness Date: Sat, 20 Jun 2026 15:47:15 +0900 Subject: [PATCH] Surface briefing marker hints --- README.md | 2 +- scripts/scenes/battle_scene.gd | 28 +++++++++++++++++++++++++--- tools/smoke_visual_assets.gd | 20 ++++++++++++++++++++ 3 files changed, 46 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index e1b4a81..cfc7593 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ Godot 4 tactical RPG prototype inspired by classic turn-based Romance of the Thr - Pre-battle Armory equipment changes, including unequipping gear back into stock, save immediately and sync roster equipment plus inventory stock, with portrait and item-icon rows plus hover change details. - Pre-battle Roster can move optional officers between sortie and reserve within scenario limits, using portrait rows, compact status badges, and hover details. - Pre-battle Formation lets deployed officers swap starting positions inside scenario-defined cells, with portrait rows, readable zone badges, and hover placement instructions. -- Pre-battle briefing shows the campaign chapter, chapter battle number, location, victory/defeat summary, first-clear reward preview, generated battlefield thumbnail, allied portrait/enemy unit force markers, and image-first tactical marker cards for lure lines and supply points. +- Pre-battle briefing shows the campaign chapter, chapter battle number, location, victory/defeat summary, first-clear reward preview, generated battlefield thumbnail, allied portrait/enemy unit force markers, and image-first tactical marker cards for lure lines and supply points with compact tactical summaries plus full hover hints. - Pre-battle prep commands use compact icon buttons with active selection state and Korean hover labels for chapters, shop, talks, armory, roster, formation, and save records. - Post-move tactic and item pickers use generated command/item icons, compact two-line option rows, and hover details instead of dense single-line text. - Target preview badges, minimap hover badges, and battlefield target markers include generated jade panel surfaces plus action icons for move, attack, threat, support, objective, terrain, and item outcomes. diff --git a/scripts/scenes/battle_scene.gd b/scripts/scenes/battle_scene.gd index fcefef0..a49f39c 100644 --- a/scripts/scenes/battle_scene.gd +++ b/scripts/scenes/battle_scene.gd @@ -12611,6 +12611,7 @@ func _briefing_tactical_marker_entries() -> Array[Dictionary]: for marker in state.get_event_markers(): var label := str(marker.get("label", "")).strip_edges() var kind := str(marker.get("kind", "event")).strip_edges().to_lower() + var hint := str(marker.get("hint", "")).strip_edges() if label.is_empty(): label = "전장 표식" var key := "%s/%s" % [label, kind] @@ -12628,7 +12629,8 @@ func _briefing_tactical_marker_entries() -> Array[Dictionary]: "kind": kind, "badge": badge_kind, "tile": _event_marker_tile_marker_key(label, kind), - "summary": _briefing_tactical_marker_summary(label, badge_kind, cell_count) + "summary": _briefing_tactical_marker_summary(label, badge_kind, cell_count, hint), + "hint": hint }) if result.size() >= BRIEFING_TACTICAL_MARKER_MAX_COUNT: break @@ -12638,7 +12640,9 @@ func _briefing_tactical_marker_entries() -> Array[Dictionary]: func _make_briefing_tactical_marker_chip(entry: Dictionary) -> PanelContainer: var label_text := str(entry.get("label", "전장 표식")) var summary_text := str(entry.get("summary", "전장 표식")) - var tooltip := "%s\n%s" % [label_text, summary_text] + var hint_text := str(entry.get("hint", "")).strip_edges() + var tooltip_detail := hint_text if not hint_text.is_empty() else summary_text + var tooltip := "%s\n%s" % [label_text, tooltip_detail] var chip := PanelContainer.new() chip.custom_minimum_size = BRIEFING_TACTICAL_MARKER_CHIP_SIZE _apply_panel_style(chip, "caption") @@ -12709,7 +12713,10 @@ func _make_briefing_tactical_marker_icon(entry: Dictionary, tooltip: String) -> return icon_stack -func _briefing_tactical_marker_summary(label: String, badge_kind: String, cell_count: int) -> String: +func _briefing_tactical_marker_summary(label: String, badge_kind: String, cell_count: int, hint: String = "") -> String: + var hint_summary := _briefing_marker_summary_from_hint(hint) + if not hint_summary.is_empty(): + return hint_summary if label.contains("유인"): return "적을 끌어냄" if label.contains("마을"): @@ -12727,6 +12734,21 @@ func _briefing_tactical_marker_summary(label: String, badge_kind: String, cell_c return "전장 표식" +func _briefing_marker_summary_from_hint(hint: String) -> String: + var normalized := hint.strip_edges() + if normalized.is_empty(): + return "" + if normalized.contains("유인") or normalized.contains("끌어낼"): + return "앞줄 유인" + if normalized.contains("치료소") or normalized.contains("회복"): + return "회복 보급" + if normalized.contains("콩") or normalized.contains("북쪽 숲"): + return "숨은 콩" + if normalized.contains("군자금"): + return "군자금" + return "" + + func _format_briefing_camp_overview_text(briefing: Dictionary, prep_locked: bool) -> String: var lines := [] var location := str(briefing.get("location", "")).strip_edges() diff --git a/tools/smoke_visual_assets.gd b/tools/smoke_visual_assets.gd index ccc2ef3..7abbe7c 100644 --- a/tools/smoke_visual_assets.gd +++ b/tools/smoke_visual_assets.gd @@ -3141,8 +3141,12 @@ func _check_scene_texture_loading(failures: Array[String]) -> void: if briefing_marker_entries.size() < 3: failures.append("briefing should expose image-first tactical marker entries") var briefing_marker_labels := [] + var briefing_marker_hints := [] + var briefing_marker_summaries := [] for marker_entry in briefing_marker_entries: briefing_marker_labels.append(str(marker_entry.get("label", ""))) + briefing_marker_hints.append(str(marker_entry.get("hint", ""))) + briefing_marker_summaries.append(str(marker_entry.get("summary", ""))) if scene._load_map_badge_texture(str(marker_entry.get("badge", ""))) == null: failures.append("briefing tactical marker should resolve generated badge art: %s" % str(marker_entry)) if scene._load_tile_marker_texture(str(marker_entry.get("tile", ""))) == null: @@ -3150,6 +3154,13 @@ func _check_scene_texture_loading(failures: Array[String]) -> void: for expected_marker in ["유인선", "북숲 보급고", "마을 보급"]: if not briefing_marker_labels.has(expected_marker): failures.append("briefing tactical markers should include %s: %s" % [expected_marker, str(briefing_marker_labels)]) + var joined_marker_hints := "\n".join(briefing_marker_hints) + for expected_hint in ["끌어낼", "콩 보급", "치료소"]: + if not joined_marker_hints.contains(expected_hint): + failures.append("briefing tactical marker hints should include %s: %s" % [expected_hint, joined_marker_hints]) + for expected_summary in ["앞줄 유인", "숨은 콩", "회복 보급"]: + if not briefing_marker_summaries.has(expected_summary): + failures.append("briefing tactical marker summaries should surface %s: %s" % [expected_summary, str(briefing_marker_summaries)]) var briefing_allies := scene._briefing_force_preview_allies() if briefing_allies.size() < 2: failures.append("briefing force preview should expose Cao Cao and Xiahou Dun") @@ -3903,6 +3914,15 @@ func _check_ancient_ui_theme(failures: Array[String]) -> void: failures.append("briefing tactical marker card list should expose three image-first markers") elif not _has_descendant_texture(scene.briefing_tactical_marker_list): failures.append("briefing tactical marker cards should render generated badge/tile textures") + else: + var marker_tooltips := _collect_child_tooltips(scene.briefing_tactical_marker_list) + for expected_hint in ["끌어낼", "콩 보급", "치료소"]: + if not marker_tooltips.contains(expected_hint): + failures.append("briefing tactical marker card tooltips should preserve %s: %s" % [expected_hint, marker_tooltips]) + var marker_visible_text := _collect_child_text(scene.briefing_tactical_marker_list) + for expected_summary in ["앞줄 유인", "숨은 콩", "회복 보급"]: + if not marker_visible_text.contains(expected_summary): + failures.append("briefing tactical marker cards should show compact hint %s: %s" % [expected_summary, marker_visible_text]) scene._apply_panel_style(scene.result_panel, "result_victory_tablet") _check_panel_style_fill(failures, scene.result_panel, "victory result panel", Color(0.27, 0.34, 0.28, 0.997)) _check_panel_uses_generated_texture(failures, scene.result_panel, "victory result generated frame")