From 3ee22167a3c6dd55c93875faddae89e470e46388 Mon Sep 17 00:00:00 2001 From: Wickedness Date: Sat, 20 Jun 2026 15:56:30 +0900 Subject: [PATCH] Add compact marker summaries to map hovers --- README.md | 2 +- scripts/scenes/battle_scene.gd | 22 ++++++++++++++++++---- tools/smoke_chapter_one_polish.gd | 11 ++++++++++- 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index b110c2a..b4320ab 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ Godot 4 tactical RPG prototype inspired by classic turn-based Romance of the Thr - Pre-battle shop rows emphasize item artwork, compact price/status badges, and hover details instead of dense inline text. - Pre-battle Talk can list scenario camp conversations by officer or topic with portrait rows, compact topic/supply badges, hover dialogue previews, saved-branch filtering, one-time pre-battle supplies, and merchant flavor lines before a battle. - The opening battle's camp and battle-opening dialogue now include a villager route report that frames the castle, village recovery point, lure line, and northern supply cache before combat starts. -- The opening battle's lure line, village supply, northern cache, and castle objective markers now carry tactical Korean hint text through battlefield hover badges, minimap hover badges, and cell-detail tooltips. +- The opening battle's lure line, village supply, northern cache, and castle objective markers now carry compact tactical summaries plus Korean hint text through battlefield hover badges, minimap hover badges, and cell-detail tooltips. - The opening battle now uses a dedicated high-resolution Yingchuan battlefield backdrop, clearer generated terrain-cell texture overlays, image-first recovery/supply/tactic tile markers, no text class boxes on units, quieter objective progress text, and a pulled-back enemy line so the player can lure and form up before the first clash. - The opening victory dialogue now explicitly shows Cao Ren and Xiahou Yuan joining Cao Cao's camp before bridging into the Sishui Gate march against Hua Xiong. - Sishui Gate now opens with camp dialogue that turns the coalition briefing into a spoken march order. diff --git a/scripts/scenes/battle_scene.gd b/scripts/scenes/battle_scene.gd index 0c9640a..21ca45d 100644 --- a/scripts/scenes/battle_scene.gd +++ b/scripts/scenes/battle_scene.gd @@ -8483,6 +8483,7 @@ func _hover_info_badge_lines(cell: Vector2i) -> Array[String]: var objective_hint := state.get_objective_cell_hint(cell) var event_label := state.get_event_marker_label(cell) var event_hint := state.get_event_marker_hint(cell) + var event_summary := _briefing_marker_summary_from_hint(event_hint) var objective_used_as_title := false var event_used_as_title := false if not unit.is_empty(): @@ -8510,7 +8511,10 @@ func _hover_info_badge_lines(cell: Vector2i) -> Array[String]: lines.append(_short_preview_text(objective_hint, 34)) objective_used_as_title = true elif not event_label.is_empty(): - lines.append("표식 %s" % event_label) + var event_title := "표식 %s" % event_label + if not event_summary.is_empty(): + event_title = "%s · %s" % [event_title, event_summary] + lines.append(event_title) if not event_hint.is_empty(): lines.append(_short_preview_text(event_hint, 34)) event_used_as_title = true @@ -8529,7 +8533,10 @@ func _hover_info_badge_lines(cell: Vector2i) -> Array[String]: if not objective_label.is_empty() and not objective_used_as_title: markers.append("목표 %s" % objective_label) if not event_label.is_empty() and not event_used_as_title: - markers.append("표식 %s" % event_label) + var marker_text := "표식 %s" % event_label + if not event_summary.is_empty(): + marker_text = "%s · %s" % [marker_text, event_summary] + markers.append(marker_text) if show_threat_overlay: var threat_names := state.get_threatening_unit_names(cell, BattleState.TEAM_ENEMY) if not threat_names.is_empty(): @@ -9304,6 +9311,7 @@ func _minimap_hover_badge_lines(cell: Vector2i) -> Array[String]: var objective_hint := state.get_objective_cell_hint(cell) var event_label := state.get_event_marker_label(cell) var event_hint := state.get_event_marker_hint(cell) + var event_summary := _briefing_marker_summary_from_hint(event_hint) var objective_used_as_title := false var event_used_as_title := false if not unit.is_empty(): @@ -9316,7 +9324,10 @@ func _minimap_hover_badge_lines(cell: Vector2i) -> Array[String]: lines.append(_short_preview_text(objective_hint, 32)) objective_used_as_title = true elif not event_label.is_empty(): - lines.append("표식 %s" % event_label) + var event_title := "표식 %s" % event_label + if not event_summary.is_empty(): + event_title = "%s · %s" % [event_title, event_summary] + lines.append(event_title) if not event_hint.is_empty(): lines.append(_short_preview_text(event_hint, 32)) event_used_as_title = true @@ -9326,7 +9337,10 @@ func _minimap_hover_badge_lines(cell: Vector2i) -> Array[String]: if not objective_label.is_empty() and not objective_used_as_title: markers.append("목표 %s" % objective_label) if not event_label.is_empty() and not event_used_as_title: - markers.append("표식 %s" % event_label) + var marker_text := "표식 %s" % event_label + if not event_summary.is_empty(): + marker_text = "%s · %s" % [marker_text, event_summary] + markers.append(marker_text) if show_threat_overlay: var threat_names := state.get_threatening_unit_names(cell, BattleState.TEAM_ENEMY) if not threat_names.is_empty(): diff --git a/tools/smoke_chapter_one_polish.gd b/tools/smoke_chapter_one_polish.gd index 0344c85..6beea30 100644 --- a/tools/smoke_chapter_one_polish.gd +++ b/tools/smoke_chapter_one_polish.gd @@ -871,17 +871,26 @@ func _check_opening_battle_marker_hints(failures: Array[String]) -> void: if not lure_hint.contains("유인선") or not lure_hint.contains("끌어낼"): failures.append("lure line should explain the tactical trigger: %s" % lure_hint) var lure_hover_text := "\n".join(scene._hover_info_badge_lines(lure_cell)) - if not lure_hover_text.contains("표식 유인선") or not lure_hover_text.contains("끌어낼"): + if not lure_hover_text.contains("표식 유인선") or not lure_hover_text.contains("앞줄 유인") or not lure_hover_text.contains("끌어낼"): failures.append("lure hover should expose tactical marker hint: %s" % lure_hover_text) + var lure_minimap_text := "\n".join(scene._minimap_hover_badge_lines(lure_cell)) + if not lure_minimap_text.contains("표식 유인선") or not lure_minimap_text.contains("앞줄 유인"): + failures.append("lure minimap hover should expose compact lure hint: %s" % lure_minimap_text) var woods_cell := Vector2i(4, 2) var woods_hint: String = scene.state.get_event_marker_hint(woods_cell) if not woods_hint.contains("콩") or not woods_hint.contains("보급"): failures.append("northern cache should explain its supply value: %s" % woods_hint) + var woods_minimap_text := "\n".join(scene._minimap_hover_badge_lines(woods_cell)) + if not woods_minimap_text.contains("북숲 보급고") or not woods_minimap_text.contains("숨은 콩") or not woods_minimap_text.contains("콩 보급"): + failures.append("northern cache minimap hover should expose compact supply hint: %s" % woods_minimap_text) var village_cell := Vector2i(6, 5) var village_hint: String = scene.state.get_event_marker_hint(village_cell) if not village_hint.contains("치료소") or not village_hint.contains("회복"): failures.append("village supply should explain recovery and supply value: %s" % village_hint) + var village_minimap_text := "\n".join(scene._minimap_hover_badge_lines(village_cell)) + if not village_minimap_text.contains("마을 보급") or not village_minimap_text.contains("회복 보급") or not village_minimap_text.contains("치료소"): + failures.append("village minimap hover should expose compact recovery hint: %s" % village_minimap_text) var village_detail := scene._format_cell_info_detail_text(village_cell) if not village_detail.contains("마을 치료소") or not village_detail.contains("회복 거점"): failures.append("village cell info should explain the recovery/supply marker: %s" % village_detail)