diff --git a/scripts/scenes/battle_scene.gd b/scripts/scenes/battle_scene.gd index 605a94b..ab0ac60 100644 --- a/scripts/scenes/battle_scene.gd +++ b/scripts/scenes/battle_scene.gd @@ -53,11 +53,11 @@ const UNIT_ARROW_ATTACK_DURATION := 0.36 const UNIT_COMMAND_ATTACK_DURATION := 0.38 const UNIT_HEAVY_ATTACK_DURATION := 0.34 const UNIT_TACTIC_CAST_DURATION := 0.42 -const DIALOGUE_PANEL_POSITION := Vector2(96, 424) -const DIALOGUE_PANEL_SIZE := Vector2(1040, 236) -const DIALOGUE_PORTRAIT_SIZE := Vector2(164, 208) -const DIALOGUE_COLUMN_SIZE := Vector2(820, 208) -const DIALOGUE_TEXT_SIZE := Vector2(800, 104) +const DIALOGUE_PANEL_POSITION := Vector2(72, 396) +const DIALOGUE_PANEL_SIZE := Vector2(1100, 260) +const DIALOGUE_PORTRAIT_SIZE := Vector2(184, 224) +const DIALOGUE_COLUMN_SIZE := Vector2(850, 226) +const DIALOGUE_TEXT_SIZE := Vector2(830, 112) const BRIEFING_CAMP_THUMBNAIL_SIZE := Vector2(138, 72) const CAMP_TALK_PORTRAIT_SIZE := Vector2(58, 58) const SHOP_MERCHANT_BADGE_SIZE := Vector2(50, 50) @@ -69,8 +69,8 @@ const POST_MOVE_PICKER_PANEL_SIZE := Vector2(320, 210) const TARGETING_HINT_PANEL_SIZE := Vector2(240, 94) const LOCAL_COMMAND_PANEL_GAP := 8.0 const LOCAL_COMMAND_PANEL_BOARD_PADDING := 4.0 -const UI_RICE_PAPER := Color(0.66, 0.55, 0.36, 0.97) -const UI_RICE_PAPER_LIGHT := Color(0.76, 0.64, 0.43, 0.98) +const UI_RICE_PAPER := Color(0.61, 0.49, 0.30, 0.98) +const UI_RICE_PAPER_LIGHT := Color(0.74, 0.60, 0.36, 0.99) const UI_RICE_PAPER_DARK := Color(0.34, 0.22, 0.11, 0.98) const UI_AGED_INK := Color(0.09, 0.055, 0.032, 1.0) const UI_DARK_LACQUER := Color(0.12, 0.045, 0.025, 0.98) @@ -78,6 +78,7 @@ const UI_LACQUER_EDGE := Color(0.055, 0.025, 0.016, 1.0) const UI_CINNABAR := Color(0.52, 0.045, 0.025, 1.0) const UI_CINNABAR_DARK := Color(0.32, 0.025, 0.016, 1.0) const UI_OLD_BRONZE := Color(0.78, 0.58, 0.27, 1.0) +const UI_TARNISHED_BRONZE := Color(0.50, 0.36, 0.16, 1.0) const UI_BAMBOO := Color(0.43, 0.27, 0.10, 1.0) const UI_BAMBOO_DARK := Color(0.20, 0.11, 0.045, 1.0) const UI_MUTED_JADE := Color(0.16, 0.30, 0.23, 1.0) @@ -85,6 +86,7 @@ const UI_PARCHMENT_TEXT := Color(0.95, 0.82, 0.55, 1.0) const UI_DISABLED_TEXT := Color(0.48, 0.40, 0.29, 1.0) const UI_SILK_WASH := Color(0.80, 0.64, 0.37, 1.0) const UI_SILK_FIBER := Color(0.18, 0.10, 0.045, 1.0) +const UI_SOOT_EDGE := Color(0.035, 0.018, 0.012, 1.0) const MAP_SCROLL_FRAME_PADDING := 12.0 var state: BattleState = BattleStateScript.new() @@ -303,13 +305,35 @@ func _make_panel_style(fill: Color, border: Color, border_width: int, radius: in style.content_margin_right = margin style.content_margin_top = margin style.content_margin_bottom = margin + style.anti_aliasing = false if shadow_size > 0: - style.shadow_color = Color(0.0, 0.0, 0.0, 0.38) - style.shadow_offset = Vector2(2, 3) + style.shadow_color = Color(0.0, 0.0, 0.0, 0.48) + style.shadow_offset = Vector2(3, 4) style.shadow_size = shadow_size return style +func _age_panel_style(style: StyleBoxFlat, variant: String, border_width: int) -> void: + if style == null: + return + match variant: + "paper", "dialogue", "result_tablet": + style.set_border_width(SIDE_TOP, border_width + 4) + style.set_border_width(SIDE_BOTTOM, border_width + 4) + style.set_border_width(SIDE_LEFT, border_width + 1) + style.set_border_width(SIDE_RIGHT, border_width + 1) + style.content_margin_top += 2 + style.content_margin_bottom += 2 + "edict", "speech_scroll", "bamboo_slips": + style.set_border_width(SIDE_TOP, border_width + 2) + style.set_border_width(SIDE_BOTTOM, border_width + 2) + "seal", "speaker_seal", "caption": + style.set_border_width(SIDE_LEFT, border_width + 2) + style.set_border_width(SIDE_RIGHT, border_width + 2) + _: + pass + + func _apply_panel_style(panel: PanelContainer, variant: String) -> void: if panel == null: return @@ -321,79 +345,102 @@ func _apply_panel_style(panel: PanelContainer, variant: String) -> void: var shadow_size := 6 match variant: "paper": - fill = Color(0.58, 0.47, 0.29, 0.985) - border = UI_AGED_INK - border_width = 4 - margin = 16 - shadow_size = 10 + fill = Color(0.49, 0.37, 0.21, 0.992) + border = UI_SOOT_EDGE + border_width = 5 + margin = 18 + shadow_size = 12 "edict": - fill = Color(0.73, 0.60, 0.38, 0.99) - border = UI_CINNABAR_DARK - border_width = 3 - margin = 12 - shadow_size = 5 - "seal": - fill = UI_CINNABAR - border = UI_OLD_BRONZE - border_width = 2 - margin = 8 - "speaker_seal": - fill = UI_CINNABAR_DARK - border = UI_OLD_BRONZE - border_width = 2 - margin = 8 - "portrait": - fill = UI_LACQUER_EDGE - border = UI_OLD_BRONZE - border_width = 3 - margin = 3 - "dialogue": - fill = Color(0.075, 0.028, 0.017, 0.99) - border = UI_OLD_BRONZE + fill = Color(0.67, 0.53, 0.31, 0.995) + border = UI_SOOT_EDGE border_width = 4 margin = 14 - shadow_size = 12 + shadow_size = 6 + "seal": + fill = Color(0.42, 0.035, 0.020, 1.0) + border = UI_OLD_BRONZE + border_width = 3 + margin = 9 + "speaker_seal": + fill = Color(0.36, 0.030, 0.018, 1.0) + border = UI_OLD_BRONZE + border_width = 3 + margin = 9 + "portrait": + fill = UI_LACQUER_EDGE + border = UI_TARNISHED_BRONZE + border_width = 4 + margin = 3 + "dialogue": + fill = Color(0.052, 0.022, 0.014, 0.995) + border = UI_TARNISHED_BRONZE + border_width = 5 + margin = 16 + shadow_size = 14 "speech_scroll": - fill = Color(0.70, 0.58, 0.36, 0.99) - border = UI_AGED_INK - border_width = 3 - margin = 12 - shadow_size = 2 + fill = Color(0.69, 0.55, 0.32, 0.995) + border = UI_SOOT_EDGE + border_width = 4 + margin = 14 + shadow_size = 3 "notice": - fill = Color(0.18, 0.065, 0.032, 0.97) + fill = Color(0.23, 0.048, 0.024, 0.98) border = UI_CINNABAR - border_width = 2 - margin = 8 - "map": - fill = Color(0.12, 0.16, 0.11, 1.0) - border = UI_BAMBOO border_width = 3 + margin = 9 + "map": + fill = Color(0.105, 0.12, 0.075, 1.0) + border = UI_BAMBOO_DARK + border_width = 4 margin = 3 "compact": - fill = Color(0.13, 0.065, 0.035, 0.97) - border = UI_OLD_BRONZE - border_width = 2 - margin = 7 + fill = Color(0.105, 0.046, 0.026, 0.982) + border = UI_TARNISHED_BRONZE + border_width = 3 + margin = 8 shadow_size = 4 + "bamboo_slips": + fill = Color(0.54, 0.40, 0.20, 0.985) + border = UI_BAMBOO_DARK + border_width = 3 + margin = 10 + shadow_size = 3 + "caption": + fill = Color(0.21, 0.095, 0.040, 0.98) + border = UI_TARNISHED_BRONZE + border_width = 2 + margin = 5 + shadow_size = 2 + "result_tablet": + fill = Color(0.45, 0.34, 0.20, 0.992) + border = UI_SOOT_EDGE + border_width = 5 + margin = 18 + shadow_size = 12 _: pass - panel.add_theme_stylebox_override("panel", _make_panel_style(fill, border, border_width, radius, margin, shadow_size)) + var style := _make_panel_style(fill, border, border_width, radius, margin, shadow_size) + _age_panel_style(style, variant, border_width) + panel.add_theme_stylebox_override("panel", style) func _make_button_style(fill: Color, border: Color, border_width: int) -> StyleBoxFlat: - return _make_panel_style(fill, border, border_width, 0, 8, 0) + var style := _make_panel_style(fill, border, border_width, 0, 8, 0) + style.set_border_width(SIDE_TOP, border_width + 1) + style.set_border_width(SIDE_BOTTOM, border_width + 1) + return style func _apply_button_style(button: Button, important: bool = false) -> void: if button == null: return - var normal_fill := UI_CINNABAR if important else Color(0.21, 0.075, 0.04, 0.98) - var hover_fill := Color(0.58, 0.12, 0.055, 1.0) if important else Color(0.32, 0.12, 0.055, 1.0) - var pressed_fill := Color(0.36, 0.045, 0.03, 1.0) - button.add_theme_stylebox_override("normal", _make_button_style(normal_fill, UI_OLD_BRONZE, 1)) - button.add_theme_stylebox_override("hover", _make_button_style(hover_fill, UI_OLD_BRONZE, 1)) - button.add_theme_stylebox_override("pressed", _make_button_style(pressed_fill, UI_OLD_BRONZE, 1)) - button.add_theme_stylebox_override("focus", _make_button_style(Color(0.20, 0.36, 0.28, 0.95), UI_OLD_BRONZE, 2)) + var normal_fill := UI_CINNABAR_DARK if important else Color(0.17, 0.068, 0.033, 0.985) + var hover_fill := Color(0.50, 0.090, 0.040, 1.0) if important else Color(0.28, 0.10, 0.045, 1.0) + var pressed_fill := Color(0.27, 0.034, 0.020, 1.0) + button.add_theme_stylebox_override("normal", _make_button_style(normal_fill, UI_TARNISHED_BRONZE, 2)) + button.add_theme_stylebox_override("hover", _make_button_style(hover_fill, UI_OLD_BRONZE, 2)) + button.add_theme_stylebox_override("pressed", _make_button_style(pressed_fill, UI_OLD_BRONZE, 2)) + button.add_theme_stylebox_override("focus", _make_button_style(Color(0.12, 0.25, 0.18, 0.96), UI_OLD_BRONZE, 2)) button.add_theme_stylebox_override("disabled", _make_button_style(Color(0.13, 0.09, 0.065, 0.88), UI_RICE_PAPER_DARK, 1)) button.add_theme_color_override("font_color", UI_PARCHMENT_TEXT) button.add_theme_color_override("font_hover_color", UI_PARCHMENT_TEXT) @@ -455,14 +502,33 @@ func _make_scroll_rod(width: float = 0.0, height: float = 4.0) -> HBoxContainer: return row -func _make_section_caption(text: String, width: float = 0.0) -> Label: +func _make_section_caption(text: String, width: float = 0.0) -> Control: + var panel := PanelContainer.new() + panel.custom_minimum_size = Vector2(width, 24) + panel.size_flags_horizontal = Control.SIZE_EXPAND_FILL + _apply_panel_style(panel, "caption") + var row := HBoxContainer.new() + row.add_theme_constant_override("separation", 8) + panel.add_child(row) + row.add_child(_make_seal_tick()) var label := Label.new() label.text = text - label.custom_minimum_size = Vector2(width, 20) + label.custom_minimum_size = Vector2(maxf(0.0, width - 68.0), 18) + label.size_flags_horizontal = Control.SIZE_EXPAND_FILL label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER label.vertical_alignment = VERTICAL_ALIGNMENT_CENTER - _apply_label_style(label, UI_AGED_INK, 13) - return label + _apply_label_style(label, UI_PARCHMENT_TEXT, 13) + row.add_child(label) + row.add_child(_make_seal_tick()) + return panel + + +func _make_seal_tick() -> ColorRect: + var tick := ColorRect.new() + tick.color = UI_CINNABAR + tick.custom_minimum_size = Vector2(18, 18) + tick.mouse_filter = Control.MOUSE_FILTER_IGNORE + return tick func _make_ornament_bar(width: float = 4.0, height: float = 0.0) -> ColorRect: @@ -582,16 +648,29 @@ func _create_hud() -> void: selected_row.add_child(selected_label) mission_title_label = Label.new() - mission_title_label.text = "Imperial Mandate" + mission_title_label.text = "Bronze Mandate Tablet" mission_title_label.add_theme_font_size_override("font_size", 14) _apply_label_style(mission_title_label, UI_OLD_BRONZE) side_column.add_child(mission_title_label) + var mission_detail_panel := PanelContainer.new() + mission_detail_panel.custom_minimum_size = Vector2(420, 134) + mission_detail_panel.size_flags_horizontal = Control.SIZE_EXPAND_FILL + _apply_panel_style(mission_detail_panel, "bamboo_slips") + side_column.add_child(mission_detail_panel) + + var mission_detail_row := HBoxContainer.new() + mission_detail_row.add_theme_constant_override("separation", 8) + mission_detail_panel.add_child(mission_detail_row) + + mission_detail_row.add_child(_make_ornament_bar(5, 112)) + mission_detail_label = Label.new() mission_detail_label.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART - mission_detail_label.custom_minimum_size = Vector2(420, 126) + mission_detail_label.custom_minimum_size = Vector2(384, 112) + mission_detail_label.size_flags_horizontal = Control.SIZE_EXPAND_FILL _apply_label_style(mission_detail_label, UI_PARCHMENT_TEXT) - side_column.add_child(mission_detail_label) + mission_detail_row.add_child(mission_detail_label) cell_info_label = Label.new() cell_info_label.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART @@ -841,8 +920,8 @@ func _create_hud() -> void: briefing_panel = PanelContainer.new() briefing_panel.visible = false - briefing_panel.position = Vector2(280, 72) - briefing_panel.size = Vector2(720, 628) + briefing_panel.position = Vector2(248, 52) + briefing_panel.size = Vector2(784, 660) _apply_panel_style(briefing_panel, "paper") root.add_child(briefing_panel) @@ -1245,9 +1324,9 @@ func _create_hud() -> void: result_panel = PanelContainer.new() result_panel.visible = false - result_panel.position = Vector2(280, 156) - result_panel.size = Vector2(560, 420) - _apply_panel_style(result_panel, "paper") + result_panel.position = Vector2(260, 132) + result_panel.size = Vector2(600, 452) + _apply_panel_style(result_panel, "result_tablet") root.add_child(result_panel) var result_column := VBoxContainer.new() @@ -3041,10 +3120,16 @@ func _update_hud() -> void: func _format_objective_hud_text() -> String: - var text := String(state.objectives.get("victory", "Defeat all enemies.")) - if text.is_empty(): - return "Imperial Mandate" - return "Imperial Mandate: %s" % text + var lines := [] + var victory := String(state.objectives.get("victory", "Defeat all enemies.")) + if not victory.is_empty(): + lines.append("Bronze Edict: %s" % victory) + var defeat := String(state.objectives.get("defeat", "")) + if not defeat.is_empty(): + lines.append("Black Omen: %s" % defeat) + if lines.is_empty(): + return "Bronze Edict" + return _join_strings(lines, "\n") func _format_unit_focus_text(unit: Dictionary, prefix: String) -> String: @@ -3214,7 +3299,12 @@ func _format_mission_panel_text() -> String: var lines := [] var victory := str(state.objectives.get("victory", "")) if not victory.is_empty(): - lines.append("Imperial Edict: %s" % victory) + lines.append("Bronze Edict:") + lines.append(" %s" % victory) + var defeat := str(state.objectives.get("defeat", "")) + if not defeat.is_empty(): + lines.append("Black Omen:") + lines.append(" %s" % defeat) var progress_lines := state.get_objective_progress_lines(false, false) if not progress_lines.is_empty(): lines.append("Bamboo Register:") @@ -3680,9 +3770,9 @@ func _format_log_entry_text(message: String) -> String: func _on_objective_updated(victory: String, defeat: String) -> void: var notice_lines := ["New Sealed Edict"] if not victory.is_empty(): - notice_lines.append("Imperial Mandate: %s" % victory) + notice_lines.append("Bronze Edict: %s" % victory) if not defeat.is_empty(): - notice_lines.append("Defeat Omen: %s" % defeat) + notice_lines.append("Black Omen: %s" % defeat) if objective_notice_label != null: objective_notice_label.text = "\n".join(notice_lines) if objective_notice_panel != null: @@ -4026,7 +4116,7 @@ func _render_dialogue_line() -> void: func _update_dialogue_controls() -> void: if dialogue_progress_label != null: - dialogue_progress_label.text = "Slip %d / %d" % [active_dialogue_index + 1, active_dialogue_lines.size()] + dialogue_progress_label.text = "Bamboo slip %d / %d" % [active_dialogue_index + 1, active_dialogue_lines.size()] if dialogue_previous_button != null: dialogue_previous_button.disabled = active_dialogue_index <= 0 dialogue_continue_button.text = "Seal Scroll" if active_dialogue_index >= active_dialogue_lines.size() - 1 else "Next Slip" diff --git a/tools/smoke_objective_progress.gd b/tools/smoke_objective_progress.gd index 8496109..b8a981f 100644 --- a/tools/smoke_objective_progress.gd +++ b/tools/smoke_objective_progress.gd @@ -211,12 +211,12 @@ func _check_objective_notice(failures: Array[String]) -> void: scene._on_objective_updated("Defeat the new vanguard.", "") if scene.objective_notice_panel == null or not scene.objective_notice_panel.visible: failures.append("objective notice panel should be visible after objective update") - elif not scene.objective_notice_label.text.contains("New Sealed Edict") or not scene.objective_notice_label.text.contains("Imperial Mandate: Defeat the new vanguard."): + elif not scene.objective_notice_label.text.contains("New Sealed Edict") or not scene.objective_notice_label.text.contains("Bronze Edict: Defeat the new vanguard."): failures.append("objective notice label should use sealed edict wording: %s" % scene.objective_notice_label.text) scene._on_objective_updated("", "Supply train is lost.") if scene.objective_notice_panel == null or not scene.objective_notice_panel.visible: failures.append("objective notice panel should be visible after defeat update") - elif not scene.objective_notice_label.text.contains("New Sealed Edict") or not scene.objective_notice_label.text.contains("Defeat Omen: Supply train is lost."): + elif not scene.objective_notice_label.text.contains("New Sealed Edict") or not scene.objective_notice_label.text.contains("Black Omen: Supply train is lost."): failures.append("objective notice label should use omen wording: %s" % scene.objective_notice_label.text) if scene._format_log_entry_text("Objective updated: Defeat the new vanguard.") != "Edict amended: Defeat the new vanguard.": failures.append("objective log display should use edict wording") diff --git a/tools/smoke_visual_assets.gd b/tools/smoke_visual_assets.gd index c34e066..da43b68 100644 --- a/tools/smoke_visual_assets.gd +++ b/tools/smoke_visual_assets.gd @@ -1795,27 +1795,27 @@ func _check_ancient_ui_theme(failures: Array[String]) -> void: if not briefing_text.contains(expected): failures.append("briefing objective parchment should use ancient heading `%s`: %s" % [expected, briefing_text]) var hud_objective := scene._format_objective_hud_text() - if not hud_objective.begins_with("Imperial Mandate:"): - failures.append("HUD objective should read as an imperial mandate: %s" % hud_objective) + if not hud_objective.contains("Bronze Edict:") or not hud_objective.contains("Black Omen:"): + failures.append("HUD objective should read as paired edict and omen text: %s" % hud_objective) var mission_text := scene._format_mission_panel_text() - for expected in ["Imperial Edict:", "Bamboo Register:", "Ominous Signs:"]: + for expected in ["Bronze Edict:", "Black Omen:", "Bamboo Register:", "Ominous Signs:"]: if not mission_text.contains(expected): failures.append("mission panel should use old campaign wording `%s`: %s" % [expected, mission_text]) - _check_panel_style_fill(failures, scene.briefing_panel, "briefing panel", Color(0.58, 0.47, 0.29, 0.985)) - _check_panel_style_frame(failures, scene.briefing_panel, "briefing panel", Color(0.09, 0.055, 0.032, 1.0), 4) - _check_panel_style_fill(failures, scene.briefing_objective_panel, "briefing objective edict panel", Color(0.73, 0.60, 0.38, 0.99)) - _check_panel_style_frame(failures, scene.briefing_objective_panel, "briefing objective edict panel", Color(0.32, 0.025, 0.016, 1.0), 3) - _check_panel_style_fill(failures, scene.dialogue_panel, "dialogue panel", Color(0.075, 0.028, 0.017, 0.99)) - _check_panel_style_frame(failures, scene.dialogue_panel, "dialogue panel", Color(0.78, 0.58, 0.27, 1.0), 4) + _check_panel_style_fill(failures, scene.briefing_panel, "briefing panel", Color(0.49, 0.37, 0.21, 0.992)) + _check_panel_style_frame(failures, scene.briefing_panel, "briefing panel", Color(0.035, 0.018, 0.012, 1.0), 6) + _check_panel_style_fill(failures, scene.briefing_objective_panel, "briefing objective edict panel", Color(0.67, 0.53, 0.31, 0.995)) + _check_panel_style_frame(failures, scene.briefing_objective_panel, "briefing objective edict panel", Color(0.035, 0.018, 0.012, 1.0), 4) + _check_panel_style_fill(failures, scene.dialogue_panel, "dialogue panel", Color(0.052, 0.022, 0.014, 0.995)) + _check_panel_style_frame(failures, scene.dialogue_panel, "dialogue panel", Color(0.50, 0.36, 0.16, 1.0), 6) _check_panel_style_fill(failures, scene.dialogue_portrait_panel, "dialogue portrait panel", Color(0.055, 0.025, 0.016, 1.0)) - _check_panel_style_fill(failures, scene.dialogue_speaker_panel, "dialogue speaker seal panel", Color(0.32, 0.025, 0.016, 1.0)) - _check_panel_style_fill(failures, scene.dialogue_text_panel, "dialogue text scroll panel", Color(0.70, 0.58, 0.36, 0.99)) + _check_panel_style_fill(failures, scene.dialogue_speaker_panel, "dialogue speaker seal panel", Color(0.36, 0.030, 0.018, 1.0)) + _check_panel_style_fill(failures, scene.dialogue_text_panel, "dialogue text scroll panel", Color(0.69, 0.55, 0.32, 0.995)) if scene.dialogue_continue_button == null or scene.dialogue_continue_button.text != "Next Slip": failures.append("dialogue continue button should use ancient slip text") if scene.dialogue_previous_button == null or scene.dialogue_previous_button.text != "Earlier Slip": failures.append("dialogue previous button should use ancient slip text") - if scene.mission_title_label == null or scene.mission_title_label.text != "Imperial Mandate": - failures.append("mission panel title should use imperial mandate wording") + if scene.mission_title_label == null or scene.mission_title_label.text != "Bronze Mandate Tablet": + failures.append("mission panel title should use bronze tablet wording") if scene.shop_button == null or scene.shop_button.text != "Sutler": failures.append("briefing shop button should use sutler wording") if scene.talk_button == null or scene.talk_button.text != "War Council": @@ -1835,7 +1835,7 @@ func _check_ancient_ui_theme(failures: Array[String]) -> void: scene._update_briefing_camp_overview(scene.state.get_briefing(), false) if scene.briefing_camp_overview_fallback_label == null or scene.briefing_camp_overview_fallback_label.text != "Silk War Map": failures.append("briefing map fallback should read as an old campaign map") - _check_panel_style_fill(failures, scene.result_panel, "result panel", Color(0.58, 0.47, 0.29, 0.985)) + _check_panel_style_fill(failures, scene.result_panel, "result panel", Color(0.45, 0.34, 0.20, 0.992)) if not scene._format_victory_result_text().contains("Bronze Victory Proclamation"): failures.append("victory result should read like a bronze proclamation") if not scene._format_defeat_result_text().contains("Defeat Memorial Tablet"):