diff --git a/README.md b/README.md index de8d15c..c54b903 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,7 @@ Godot 4 tactical RPG prototype inspired by classic turn-based Romance of the Thr - 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. -- Story, briefing, dialogue, mission-detail, and result scroll/ribbon/binding/bamboo ornaments use generated seal/panel textures instead of flat color boxes. +- Story, briefing, dialogue, mission-detail, and result scroll/ribbon/binding/bamboo/ink/tassel ornaments use generated seal/panel textures instead of flat color boxes. - Battlefield hover info badges use generated jade panel texture plus terrain, supply, tactic, objective, and threat icons, keeping raw grid coordinates out of visible play text. - Battle, top-toolbar, and pre-battle command buttons now prefer generated high-resolution bronze/parchment icon art under `art/ui/icons` and generated lacquer/jade/cinnabar button surfaces under `art/ui/buttons`, with procedural icon drawing and flat button styles kept only as fallbacks. - Battle maps blend generated terrain texture tiles for plains, forests, hills, wasteland, roads, water, villages, and castles over the high-resolution battlefield backdrop, with generated transparent feature overlays for road connections, water, villages, castles, and wasteland accents. diff --git a/scripts/scenes/battle_scene.gd b/scripts/scenes/battle_scene.gd index a7271bd..91dc961 100644 --- a/scripts/scenes/battle_scene.gd +++ b/scripts/scenes/battle_scene.gd @@ -1913,11 +1913,16 @@ func _make_ink_wash_rule(width: float = 0.0, height: float = 7.0) -> HBoxContain row.mouse_filter = Control.MOUSE_FILTER_IGNORE row.add_theme_constant_override("separation", 2) for index in range(5): - var strip := ColorRect.new() - strip.custom_minimum_size = Vector2(10 if index != 2 else width, height) + var is_center := index == 2 + var strip := _make_generated_ornament_panel( + "GeneratedInkRuleSegment%d" % (index + 1), + Vector2(10 if not is_center else width, height), + "hud_info" if is_center else "command_seal", + false, + true + ) strip.size_flags_horizontal = Control.SIZE_EXPAND_FILL if index == 2 else Control.SIZE_SHRINK_CENTER - strip.color = UI_INK_WASH if index == 2 else Color(UI_SEAL_RED_DARK.r, UI_SEAL_RED_DARK.g, UI_SEAL_RED_DARK.b, 0.96) - strip.mouse_filter = Control.MOUSE_FILTER_IGNORE + strip.modulate = Color(0.58, 0.62, 0.54, 0.88) if is_center else Color(0.70, 0.60, 0.56, 0.96) row.add_child(strip) return row @@ -2328,10 +2333,8 @@ func _make_hanging_tassel(height: float = 262.0) -> VBoxContainer: tassel.mouse_filter = Control.MOUSE_FILTER_IGNORE tassel.add_theme_constant_override("separation", 4) - var top_seal := ColorRect.new() - top_seal.color = UI_SEAL_RED - top_seal.custom_minimum_size = Vector2(18, 18) - top_seal.mouse_filter = Control.MOUSE_FILTER_IGNORE + var top_seal := _make_generated_ornament_panel("GeneratedTasselTopSeal", Vector2(18, 18), "command_seal", false, true) + top_seal.modulate = Color(0.96, 0.86, 0.78, 0.98) tassel.add_child(top_seal) var cords := HBoxContainer.new() @@ -2340,18 +2343,14 @@ func _make_hanging_tassel(height: float = 262.0) -> VBoxContainer: cords.mouse_filter = Control.MOUSE_FILTER_IGNORE cords.add_theme_constant_override("separation", 4) for index in range(2): - var cord := ColorRect.new() - cord.color = UI_TARNISHED_BRONZE if index == 0 else UI_CINNABAR_DARK - cord.custom_minimum_size = Vector2(6, height - 44.0) + var cord := _make_generated_ornament_panel("GeneratedTasselCord%d" % (index + 1), Vector2(6, height - 44.0), "hud_info", false, true) cord.size_flags_vertical = Control.SIZE_EXPAND_FILL - cord.mouse_filter = Control.MOUSE_FILTER_IGNORE + cord.modulate = Color(0.90, 0.80, 0.58, 0.94) if index == 0 else Color(0.70, 0.60, 0.56, 0.96) cords.add_child(cord) tassel.add_child(cords) - var bottom_seal := ColorRect.new() - bottom_seal.color = UI_SEAL_RED_DARK - bottom_seal.custom_minimum_size = Vector2(18, 18) - bottom_seal.mouse_filter = Control.MOUSE_FILTER_IGNORE + var bottom_seal := _make_generated_ornament_panel("GeneratedTasselBottomSeal", Vector2(18, 18), "command_seal", false, true) + bottom_seal.modulate = Color(0.72, 0.64, 0.58, 0.96) tassel.add_child(bottom_seal) return tassel diff --git a/tools/smoke_visual_assets.gd b/tools/smoke_visual_assets.gd index dab80e5..95ea632 100644 --- a/tools/smoke_visual_assets.gd +++ b/tools/smoke_visual_assets.gd @@ -3658,6 +3658,9 @@ func _check_ancient_ui_theme(failures: Array[String]) -> void: var tablet_binding := scene._make_tablet_binding(120, 16) _check_tablet_binding(failures, tablet_binding, "generated tablet binding") tablet_binding.free() + var ink_rule := scene._make_ink_wash_rule(120, 6) + _check_ink_wash_rule(failures, ink_rule, "generated ink wash rule") + ink_rule.free() var seal_ribbon := scene._make_seal_ribbon(120, 18) _check_seal_ribbon(failures, seal_ribbon, "generated seal ribbon") seal_ribbon.free() @@ -3670,6 +3673,17 @@ func _check_ancient_ui_theme(failures: Array[String]) -> void: scene.free() +func _check_ink_wash_rule(failures: Array[String], rule: HBoxContainer, label: String) -> void: + if rule == null: + failures.append("%s missing" % label) + return + if rule.get_child_count() != 5: + failures.append("%s should use five ink-and-seal segments" % label) + return + for index in range(rule.get_child_count()): + _check_panel_uses_generated_ornament_texture(failures, rule.get_child(index) as PanelContainer, "%s segment %d" % [label, index]) + + func _check_scroll_rod(failures: Array[String], scroll_rod: HBoxContainer, label: String) -> void: if scroll_rod == null: failures.append("%s missing" % label) @@ -3772,9 +3786,14 @@ func _check_hanging_tassel(failures: Array[String], tassel: VBoxContainer, label if tassel.get_child_count() != 3: failures.append("%s should use top seal, hanging cords, and bottom seal" % label) return + _check_panel_uses_generated_ornament_texture(failures, tassel.get_child(0) as PanelContainer, "%s top seal" % label) + _check_panel_uses_generated_ornament_texture(failures, tassel.get_child(2) as PanelContainer, "%s bottom seal" % label) var cords := tassel.get_child(1) as HBoxContainer if cords == null or cords.get_child_count() != 2: failures.append("%s should include two hanging cord strips" % label) + return + for index in range(cords.get_child_count()): + _check_panel_uses_generated_ornament_texture(failures, cords.get_child(index) as PanelContainer, "%s cord %d" % [label, index]) func _check_right_side_dialogue_layout(failures: Array[String], scene) -> void: