Improve opening battle layout and scouting brief

This commit is contained in:
2026-06-19 13:01:03 +09:00
parent 97e661ba8f
commit 8ba83cc985
3 changed files with 120 additions and 3 deletions

View File

@@ -2029,6 +2029,34 @@ func get_terrain_key(cell: Vector2i) -> String:
return row.substr(cell.x, 1)
func get_map_size() -> Vector2i:
return map_size
func get_recovery_terrain_summaries() -> Array[Dictionary]:
var summaries: Array[Dictionary] = []
var seen := {}
for y in range(map_size.y):
for x in range(map_size.x):
var cell := Vector2i(x, y)
var heal := get_terrain_heal(cell)
if heal <= 0:
continue
var key := get_terrain_key(cell)
if seen.has(key):
seen[key]["count"] = int(seen[key].get("count", 0)) + 1
continue
var summary := {
"key": key,
"name": get_terrain_name(cell),
"heal": heal,
"count": 1
}
seen[key] = summary
summaries.append(summary)
return summaries
func get_map_background_path() -> String:
return map_background

View File

@@ -4,8 +4,10 @@ const BattleStateScript := preload("res://scripts/core/battle_state.gd")
const CampaignStateScript := preload("res://scripts/core/campaign_state.gd")
const CAMPAIGN_PATH := "res://data/campaign/campaign.json"
const TILE_SIZE := 64
const TILE_SIZE := 54
const BOARD_OFFSET := Vector2(48, 104)
const SIDE_PANEL_POSITION := Vector2(824, 104)
const SIDE_PANEL_SIZE := Vector2(424, 610)
const DEFAULT_BATTLE_BACKGROUND_PATH := "res://art/backgrounds/battlefield_frontier.png"
const PLAYER_COLOR := Color(0.17, 0.38, 0.29)
const ENEMY_COLOR := Color(0.64, 0.085, 0.045)
@@ -1105,8 +1107,8 @@ func _create_hud() -> void:
objective_notice_column.add_child(_make_scroll_rod(548, 3))
var side_panel := PanelContainer.new()
side_panel.position = Vector2(760, 104)
side_panel.size = Vector2(480, 610)
side_panel.position = SIDE_PANEL_POSITION
side_panel.size = SIDE_PANEL_SIZE
_apply_panel_style(side_panel, "compact")
root.add_child(side_panel)
@@ -5419,6 +5421,9 @@ func _format_briefing_camp_overview_text(briefing: Dictionary, prep_locked: bool
var location := str(briefing.get("location", "")).strip_edges()
if not location.is_empty():
lines.append("위치: %s" % location)
var battlefield_text := _format_briefing_battlefield_overview_text()
if not battlefield_text.is_empty():
lines.append("전장: %s" % battlefield_text)
var camp_parts := ["군자금 %d" % campaign_state.gold]
var talk_text := _format_briefing_talk_overview_text()
if not talk_text.is_empty():
@@ -5444,6 +5449,57 @@ func _format_briefing_camp_overview_text(briefing: Dictionary, prep_locked: bool
return _join_strings(lines, "\n")
func _format_briefing_battlefield_overview_text() -> String:
var parts := []
var battle_map_size := state.get_map_size()
if battle_map_size.x > 0 and battle_map_size.y > 0:
parts.append("%d칸 x %d" % [battle_map_size.x, battle_map_size.y])
var enemy_text := _format_briefing_enemy_force_text()
if not enemy_text.is_empty():
parts.append(enemy_text)
var recovery_text := _format_briefing_recovery_terrain_text()
if not recovery_text.is_empty():
parts.append(recovery_text)
return _join_strings(parts, " · ")
func _format_briefing_enemy_force_text() -> String:
var enemies := state.get_living_units(BattleState.TEAM_ENEMY)
if enemies.is_empty():
return ""
var class_order: Array[String] = []
var class_counts := {}
for enemy in enemies:
var class_label := _unit_class_display_name(enemy)
if class_label.is_empty():
class_label = "부대"
if not class_counts.has(class_label):
class_order.append(class_label)
class_counts[class_label] = 0
class_counts[class_label] = int(class_counts[class_label]) + 1
var class_parts := []
for class_label in class_order:
class_parts.append("%s %d" % [class_label, int(class_counts.get(class_label, 0))])
return "적세 %d명 (%s)" % [enemies.size(), _join_strings(class_parts, ", ")]
func _format_briefing_recovery_terrain_text() -> String:
var recovery_summaries := state.get_recovery_terrain_summaries()
if recovery_summaries.is_empty():
return ""
var parts := []
for summary in recovery_summaries:
var name := _terrain_display_name(str(summary.get("name", "지형")))
var count := int(summary.get("count", 0))
var heal := int(summary.get("heal", 0))
if count <= 0 or heal <= 0:
continue
parts.append("%s %d칸 +%d" % [name, count, heal])
if parts.is_empty():
return ""
return "회복지 %s" % _join_strings(parts, ", ")
func _format_briefing_talk_overview_text() -> String:
var conversations := _camp_conversation_entries()
if conversations.is_empty():