diff --git a/scripts/scenes/battle_scene.gd b/scripts/scenes/battle_scene.gd index be7e2d0..958a289 100644 --- a/scripts/scenes/battle_scene.gd +++ b/scripts/scenes/battle_scene.gd @@ -1847,7 +1847,10 @@ func _target_preview_badge() -> Dictionary: return _skill_target_preview_badge(selected, target) if not selected_item_id.is_empty(): return _item_target_preview_badge(selected, target) - return _attack_target_preview_badge(selected, target) + var attack_badge := _attack_target_preview_badge(selected, target) + if not attack_badge.is_empty(): + return attack_badge + return _hover_intent_preview_badge(selected, target) func _attack_target_preview_badge(selected: Dictionary, target: Dictionary) -> Dictionary: @@ -1936,6 +1939,22 @@ func _item_target_preview_badge(selected: Dictionary, target: Dictionary) -> Dic return _make_target_preview_badge("+%d MP" % mp_heal, "mp") +func _hover_intent_preview_badge(selected: Dictionary, target: Dictionary) -> Dictionary: + if selected.is_empty(): + return {} + if not state.can_player_act(): + return {} + if not bool(selected.get("controllable", true)) or bool(selected.get("acted", false)): + return {} + if not target.is_empty(): + if target.get("team", "") == selected.get("team", "") and _can_select(target): + return _make_target_preview_badge("SELECT", "select") + return {} + if move_cells.has(hover_cell): + return _make_target_preview_badge("MOVE", "move") + return {} + + func _make_target_preview_badge(text: String, kind: String) -> Dictionary: if text.is_empty(): return {} @@ -1968,6 +1987,10 @@ func _compact_support_preview_text(effect_text: String) -> String: func _target_preview_badge_color(kind: String) -> Color: if kind == "damage": return Color(1.0, 0.38, 0.26) + if kind == "move": + return Color(0.38, 0.70, 1.0) + if kind == "select": + return Color(1.0, 0.86, 0.34) if kind == "heal": return Color(0.44, 1.0, 0.52) if kind == "mp": diff --git a/tools/smoke_visual_assets.gd b/tools/smoke_visual_assets.gd index 3c91dec..bcd97b4 100644 --- a/tools/smoke_visual_assets.gd +++ b/tools/smoke_visual_assets.gd @@ -43,6 +43,7 @@ func _init() -> void: _check_battle_visual_data(failures) _check_scene_texture_loading(failures) _check_hud_focus_text(failures) + _check_hover_intent_badges(failures) _check_terrain_and_unit_presentation(failures) _check_attack_motion_profiles(failures) _check_attack_motion_signal(failures) @@ -236,6 +237,47 @@ func _check_hud_focus_text(failures: Array[String]) -> void: scene.free() +func _check_hover_intent_badges(failures: Array[String]) -> void: + var scene = BattleSceneScript.new() + if not scene.state.load_battle("res://data/scenarios/001_yellow_turbans.json"): + failures.append("could not load battle scene state for hover intent badges") + scene.free() + return + scene.battle_started = true + scene.state.select_unit("cao_cao") + scene._refresh_ranges() + + scene.hover_cell = Vector2i(2, 3) + var move_badge := scene._target_preview_badge() + if str(move_badge.get("text", "")) != "MOVE" or str(move_badge.get("kind", "")) != "move": + failures.append("reachable empty tile should show MOVE badge: %s" % str(move_badge)) + + scene.hover_cell = Vector2i(1, 4) + var select_badge := scene._target_preview_badge() + if str(select_badge.get("text", "")) != "SELECT" or str(select_badge.get("kind", "")) != "select": + failures.append("friendly selectable unit should show SELECT badge: %s" % str(select_badge)) + + scene.hover_cell = Vector2i(7, 2) + var attack_badge := scene._target_preview_badge() + if attack_badge.is_empty() or str(attack_badge.get("kind", "")) == "move" or str(attack_badge.get("text", "")) == "MOVE": + failures.append("enemy hover should keep attack badge priority: %s" % str(attack_badge)) + + var cao_cao: Dictionary = scene.state.get_unit("cao_cao") + cao_cao["moved"] = true + scene._refresh_ranges() + scene.hover_cell = Vector2i(2, 3) + var moved_badge := scene._target_preview_badge() + if str(moved_badge.get("kind", "")) == "move" or str(moved_badge.get("text", "")) == "MOVE": + failures.append("moved unit should not show MOVE badge: %s" % str(moved_badge)) + + var default_color := scene._target_preview_badge_color("") + if scene._target_preview_badge_color("move") == default_color: + failures.append("MOVE badge should use a distinct color") + if scene._target_preview_badge_color("select") == default_color: + failures.append("SELECT badge should use a distinct color") + scene.free() + + func _check_terrain_and_unit_presentation(failures: Array[String]) -> void: var scene = BattleSceneScript.new() if not scene.state.load_battle("res://data/scenarios/001_yellow_turbans.json"):