diff --git a/scripts/scenes/battle_scene.gd b/scripts/scenes/battle_scene.gd index 8314c38..a14c532 100644 --- a/scripts/scenes/battle_scene.gd +++ b/scripts/scenes/battle_scene.gd @@ -11878,9 +11878,9 @@ func _format_briefing_camp_overview_text(briefing: Dictionary, prep_locked: bool 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 scale_text := _format_battlefield_scale_text(state.get_map_size()) + if not scale_text.is_empty(): + parts.append(scale_text) var enemy_text := _format_briefing_enemy_force_text() if not enemy_text.is_empty(): parts.append(enemy_text) @@ -11890,6 +11890,25 @@ func _format_briefing_battlefield_overview_text() -> String: return _join_strings(parts, " · ") +func _format_battlefield_scale_text(map_size: Vector2i) -> String: + if map_size.x <= 0 or map_size.y <= 0: + return "" + var area := map_size.x * map_size.y + var scale := "압축" + if area >= 240: + scale = "넓은" + elif area >= 150: + scale = "중형" + var shape := "" + if map_size.x - map_size.y >= 5: + shape = "동서" + elif map_size.y - map_size.x >= 4: + shape = "남북" + if shape.is_empty(): + return "%s 전장" % scale + return "%s %s 전장" % [scale, shape] + + func _format_briefing_enemy_force_text() -> String: var enemies := state.get_living_units(BattleState.TEAM_ENEMY) if enemies.is_empty(): diff --git a/tools/smoke_objective_progress.gd b/tools/smoke_objective_progress.gd index 01f1992..dc8be3a 100644 --- a/tools/smoke_objective_progress.gd +++ b/tools/smoke_objective_progress.gd @@ -446,6 +446,13 @@ func _check_log_contains(failures: Array[String], logs: Array, expected: String) failures.append("expected log `%s` in `%s`" % [expected, logs]) +func _check_briefing_overview_hides_raw_map_size(failures: Array[String], context: String, overview: String) -> void: + if overview.contains("칸 x") or overview.contains("칸 ×") or overview.contains("칸x"): + failures.append("%s should describe battlefield scale without raw grid dimensions: %s" % [context, overview]) + if not overview.contains("전장"): + failures.append("%s should keep a readable battlefield scale label: %s" % [context, overview]) + + func _check_terrain_recovery(failures: Array[String]) -> void: var state = BattleStateScript.new() if not state.load_battle("res://data/scenarios/001_yellow_turbans.json"): @@ -471,7 +478,7 @@ func _check_briefing_battlefield_overview(failures: Array[String]) -> void: scene.free() return var overview := scene._format_briefing_battlefield_overview_text() - _check_contains(failures, "001 briefing map size", overview, "22칸 x 14칸") + _check_briefing_overview_hides_raw_map_size(failures, "001 briefing battlefield overview", overview) _check_contains(failures, "001 briefing enemy count", overview, "적세 16명") _check_contains(failures, "001 briefing enemy classes", overview, "보병") _check_contains(failures, "001 briefing village recovery", overview, "마을 8칸 +6") @@ -558,7 +565,7 @@ func _check_sishui_gate_extended_pressure(failures: Array[String]) -> void: scene.free() return var overview := scene._format_briefing_battlefield_overview_text() - _check_contains(failures, "002 briefing map size", overview, "12칸 x 9칸") + _check_briefing_overview_hides_raw_map_size(failures, "002 briefing battlefield overview", overview) _check_contains(failures, "002 briefing enemy count", overview, "적세 8명") _check_contains(failures, "002 briefing village recovery", overview, "마을 4칸 +6") _check_contains(failures, "002 briefing castle recovery", overview, "성채 6칸 +8") @@ -621,7 +628,7 @@ func _check_xingyang_ambush_extended_pressure(failures: Array[String]) -> void: scene.free() return var overview := scene._format_briefing_battlefield_overview_text() - _check_contains(failures, "003 briefing map size", overview, "12칸 x 9칸") + _check_briefing_overview_hides_raw_map_size(failures, "003 briefing battlefield overview", overview) _check_contains(failures, "003 briefing enemy count", overview, "적세 6명") _check_contains(failures, "003 briefing village recovery", overview, "마을 4칸 +6") scene.free() @@ -674,7 +681,7 @@ func _check_qingzhou_campaign_extended_pressure(failures: Array[String]) -> void scene.free() return var overview := scene._format_briefing_battlefield_overview_text() - _check_contains(failures, "004 briefing map size", overview, "14칸 x 10칸") + _check_briefing_overview_hides_raw_map_size(failures, "004 briefing battlefield overview", overview) _check_contains(failures, "004 briefing enemy count", overview, "적세 8명") _check_contains(failures, "004 briefing village recovery", overview, "마을 4칸 +6") scene.free() @@ -732,7 +739,7 @@ func _check_puyang_raid_extended_pressure(failures: Array[String]) -> void: scene.free() return var overview := scene._format_briefing_battlefield_overview_text() - _check_contains(failures, "005 briefing map size", overview, "14칸 x 10칸") + _check_briefing_overview_hides_raw_map_size(failures, "005 briefing battlefield overview", overview) _check_contains(failures, "005 briefing enemy count", overview, "적세 8명") _check_contains(failures, "005 briefing village recovery", overview, "마을 4칸 +6") _check_contains(failures, "005 briefing camp recovery", overview, "성채 4칸 +8") @@ -813,7 +820,7 @@ func _check_dingtao_counterattack_extended_pressure(failures: Array[String]) -> scene.free() return var overview := scene._format_briefing_battlefield_overview_text() - _check_contains(failures, "006 briefing map size", overview, "14칸 x 10칸") + _check_briefing_overview_hides_raw_map_size(failures, "006 briefing battlefield overview", overview) _check_contains(failures, "006 briefing enemy count", overview, "적세 8명") _check_contains(failures, "006 briefing village recovery", overview, "마을 4칸 +6") _check_contains(failures, "006 briefing center recovery", overview, "성채 4칸 +8") @@ -890,7 +897,7 @@ func _check_xian_emperor_escort_extended_pressure(failures: Array[String]) -> vo scene.free() return var overview := scene._format_briefing_battlefield_overview_text() - _check_contains(failures, "007 briefing map size", overview, "15칸 x 10칸") + _check_briefing_overview_hides_raw_map_size(failures, "007 briefing battlefield overview", overview) _check_contains(failures, "007 briefing enemy count", overview, "적세 8명") _check_contains(failures, "007 briefing village recovery", overview, "마을 4칸 +6") _check_contains(failures, "007 briefing road recovery", overview, "성채 4칸 +8") @@ -1016,7 +1023,7 @@ func _check_wan_castle_escape_extended_pressure(failures: Array[String]) -> void scene.free() return var overview := scene._format_briefing_battlefield_overview_text() - _check_contains(failures, "008 briefing map size", overview, "15칸 x 10칸") + _check_briefing_overview_hides_raw_map_size(failures, "008 briefing battlefield overview", overview) _check_contains(failures, "008 briefing enemy count", overview, "적세 9명") _check_contains(failures, "008 briefing village recovery", overview, "마을 4칸 +6") _check_contains(failures, "008 briefing gate recovery", overview, "성채 4칸 +8") @@ -1123,7 +1130,7 @@ func _check_xiapi_siege_extended_pressure(failures: Array[String]) -> void: scene.free() return var overview := scene._format_briefing_battlefield_overview_text() - _check_contains(failures, "009 briefing map size", overview, "15칸 x 10칸") + _check_briefing_overview_hides_raw_map_size(failures, "009 briefing battlefield overview", overview) _check_contains(failures, "009 briefing enemy count", overview, "적세 10명") _check_contains(failures, "009 briefing village recovery", overview, "마을 4칸 +6") _check_contains(failures, "009 briefing gate recovery", overview, "성채 4칸 +8") @@ -1228,7 +1235,7 @@ func _check_white_horse_relief_extended_pressure(failures: Array[String]) -> voi scene.free() return var overview := scene._format_briefing_battlefield_overview_text() - _check_contains(failures, "010 briefing map size", overview, "15칸 x 10칸") + _check_briefing_overview_hides_raw_map_size(failures, "010 briefing battlefield overview", overview) _check_contains(failures, "010 briefing enemy count", overview, "적세 9명") _check_contains(failures, "010 briefing village recovery", overview, "마을 4칸 +6") _check_contains(failures, "010 briefing ferry recovery", overview, "성채 4칸 +8") diff --git a/tools/smoke_visual_assets.gd b/tools/smoke_visual_assets.gd index 0d9a378..9688298 100644 --- a/tools/smoke_visual_assets.gd +++ b/tools/smoke_visual_assets.gd @@ -3094,6 +3094,10 @@ func _check_scene_texture_loading(failures: Array[String]) -> void: for expected in ["위치: 영천, 중평 원년", "군막:", "준비:", "군자금 0냥", "군막 회의 · 4건", "보급 대기 1건", "군상 물품 · 2종", "출진 명부 2명 중 2명", "진형 배치 6칸", "비축 물자"]: if not camp_overview.contains(expected): failures.append("camp overview should include %s: %s" % [expected, camp_overview]) + if not camp_overview.contains("전장:") or not camp_overview.contains("전장"): + failures.append("camp overview should include a readable battlefield scale label: %s" % camp_overview) + if camp_overview.contains("칸 x") or camp_overview.contains("칸 ×") or camp_overview.contains("칸x"): + failures.append("camp overview should not expose raw map dimensions: %s" % camp_overview) var briefing_marker_entries := scene._briefing_tactical_marker_entries() if briefing_marker_entries.size() < 3: failures.append("briefing should expose image-first tactical marker entries")