From 1911038d70f558f5c185889863bca2754506c4cb Mon Sep 17 00:00:00 2001 From: Wickedness Date: Fri, 19 Jun 2026 02:08:50 +0900 Subject: [PATCH] Retheme battle HUD command wording --- scripts/scenes/battle_scene.gd | 292 ++++++++++++++------------- tools/smoke_status_effect_summary.gd | 4 +- tools/smoke_visual_assets.gd | 34 ++-- 3 files changed, 169 insertions(+), 161 deletions(-) diff --git a/scripts/scenes/battle_scene.gd b/scripts/scenes/battle_scene.gd index 1b80b61..54e7500 100644 --- a/scripts/scenes/battle_scene.gd +++ b/scripts/scenes/battle_scene.gd @@ -565,33 +565,33 @@ func _create_hud() -> void: side_column.add_child(button_row) wait_button = Button.new() - wait_button.text = "Wait" + wait_button.text = "Hold" wait_button.pressed.connect(_on_wait_pressed) button_row.add_child(wait_button) tactic_button = Button.new() - tactic_button.text = "Tactic" + tactic_button.text = "Stratagem" tactic_button.pressed.connect(_on_tactic_pressed) button_row.add_child(tactic_button) item_button = Button.new() - item_button.text = "Item" + item_button.text = "Supply" item_button.pressed.connect(_on_item_pressed) button_row.add_child(item_button) equip_button = Button.new() - equip_button.text = "Equip" + equip_button.text = "Arms" equip_button.pressed.connect(_on_equip_pressed) button_row.add_child(equip_button) threat_button = Button.new() - threat_button.text = "Threat" + threat_button.text = "Enemy Lines" threat_button.toggle_mode = true threat_button.pressed.connect(_on_threat_pressed) button_row.add_child(threat_button) end_turn_button = Button.new() - end_turn_button.text = "End Turn" + end_turn_button.text = "Pass Command" end_turn_button.pressed.connect(_on_end_turn_pressed) button_row.add_child(end_turn_button) @@ -601,7 +601,7 @@ func _create_hud() -> void: side_column.add_child(tactic_menu) var tactic_title := Label.new() - tactic_title.text = "Tactics" + tactic_title.text = "Stratagems" _apply_label_style(tactic_title, UI_OLD_BRONZE, 14) tactic_menu.add_child(tactic_title) @@ -615,7 +615,7 @@ func _create_hud() -> void: side_column.add_child(item_menu) var item_title := Label.new() - item_title.text = "Items" + item_title.text = "Supplies" _apply_label_style(item_title, UI_OLD_BRONZE, 14) item_menu.add_child(item_title) @@ -629,7 +629,7 @@ func _create_hud() -> void: side_column.add_child(equip_menu) var equip_title := Label.new() - equip_title.text = "Equipment" + equip_title.text = "Arms Ledger" _apply_label_style(equip_title, UI_OLD_BRONZE, 14) equip_menu.add_child(equip_title) @@ -662,26 +662,26 @@ func _create_hud() -> void: post_move_column.add_child(post_move_grid) post_move_attack_button = Button.new() - post_move_attack_button.text = "Attack" + post_move_attack_button.text = "Strike" post_move_attack_button.tooltip_text = "Mark an enemy from this unit's current position." post_move_attack_button.pressed.connect(_on_post_move_attack_pressed) post_move_grid.add_child(post_move_attack_button) post_move_tactic_button = Button.new() - post_move_tactic_button.text = "Tactic" - post_move_tactic_button.tooltip_text = "Open tactics after this move." + post_move_tactic_button.text = "Stratagem" + post_move_tactic_button.tooltip_text = "Open stratagems after this move." post_move_tactic_button.pressed.connect(_on_post_move_tactic_pressed) post_move_grid.add_child(post_move_tactic_button) post_move_item_button = Button.new() - post_move_item_button.text = "Item" - post_move_item_button.tooltip_text = "Open consumable items after this move." + post_move_item_button.text = "Supply" + post_move_item_button.tooltip_text = "Open field supplies after this move." post_move_item_button.pressed.connect(_on_post_move_item_pressed) post_move_grid.add_child(post_move_item_button) post_move_wait_button = Button.new() - post_move_wait_button.text = "Wait" - post_move_wait_button.tooltip_text = "Commit this move and end the unit's action." + post_move_wait_button.text = "Hold" + post_move_wait_button.tooltip_text = "Commit this move and seal the unit's order." post_move_wait_button.pressed.connect(_on_post_move_wait_pressed) post_move_grid.add_child(post_move_wait_button) @@ -737,7 +737,7 @@ func _create_hud() -> void: post_move_picker_cancel_move_button = Button.new() post_move_picker_cancel_move_button.text = "Recall Step" - post_move_picker_cancel_move_button.tooltip_text = "Right-click also returns to the starting cell." + post_move_picker_cancel_move_button.tooltip_text = "Right-click also recalls the banner to its starting ground." post_move_picker_cancel_move_button.pressed.connect(_on_post_move_picker_cancel_move_pressed) picker_button_row.add_child(post_move_picker_cancel_move_button) @@ -777,7 +777,7 @@ func _create_hud() -> void: targeting_hint_cancel_move_button = Button.new() targeting_hint_cancel_move_button.text = "Recall Step" - targeting_hint_cancel_move_button.tooltip_text = "Return to the starting cell." + targeting_hint_cancel_move_button.tooltip_text = "Recall the banner to its starting ground." targeting_hint_cancel_move_button.pressed.connect(_on_targeting_cancel_move_pressed) targeting_button_row.add_child(targeting_hint_cancel_move_button) @@ -2894,7 +2894,7 @@ func _update_hud() -> void: var hovered_unit := _hovered_unit_for_hud_portrait() _update_hud_unit_portrait(hovered_unit) if hovered_unit.is_empty(): - selected_label.text = "No unit selected." + selected_label.text = "No banner marked." else: selected_label.text = _format_unit_focus_text(hovered_unit, "Hover") _update_wait_button({}) @@ -2935,12 +2935,12 @@ func _format_objective_hud_text() -> String: func _format_unit_focus_text(unit: Dictionary, prefix: String) -> String: if unit.is_empty(): - return "No unit selected." + return "No banner marked." var roster_mark := " *" if unit.get("loaded_from_roster", false) else "" var control_label := " Protected" if not bool(unit.get("controllable", true)) else "" var lines := [] lines.append("%s: %s%s%s" % [ - prefix, + _unit_focus_prefix_text(prefix), str(unit.get("name", "Unit")), roster_mark, control_label @@ -2951,14 +2951,14 @@ func _format_unit_focus_text(unit: Dictionary, prefix: String) -> String: str(unit.get("class", "Unit")), _unit_role_text(unit) ]) - lines.append("HP %d/%d MP %d/%d EXP %d" % [ + lines.append("Troops %d/%d Qi %d/%d Merit %d" % [ int(unit.get("hp", 0)), int(unit.get("max_hp", 1)), int(unit.get("mp", 0)), int(unit.get("max_mp", 0)), int(unit.get("exp", 0)) ]) - lines.append("ATK %d DEF %d INT %d AGI %d" % [ + lines.append("Might %d Guard %d Counsel %d Tempo %d" % [ int(unit.get("atk", 0)), int(unit.get("def", 0)), int(unit.get("int", 0)), @@ -2976,25 +2976,33 @@ func _format_unit_focus_text(unit: Dictionary, prefix: String) -> String: lines.append(terrain_text) var status_effects := state.get_status_effect_summary(str(unit.get("id", ""))) if not status_effects.is_empty(): - lines.append("Effects: %s" % status_effects) + lines.append("Conditions: %s" % status_effects) return _join_strings(lines, "\n") +func _unit_focus_prefix_text(prefix: String) -> String: + if prefix == "Selected": + return "Banner" + if prefix == "Hover": + return "Sighted" + return prefix + + func _unit_action_status_text(unit: Dictionary) -> String: var unit_id := str(unit.get("id", "")) if unit_id.is_empty(): - return "Order: Unavailable" + return "Command: Sealed" var team := str(unit.get("team", "")) if team != BattleState.TEAM_PLAYER: - return "Order: Enemy command" + return "Command: Enemy banner" if not bool(unit.get("controllable", true)): - return "Order: Protected escort" + return "Command: Guarded escort" if not bool(unit.get("alive", true)) or not bool(unit.get("deployed", true)): - return "Order: Unavailable" + return "Command: Sealed" if bool(unit.get("acted", false)): - return "Order: Done" + return "Command: Sealed" if not state.can_player_act(): - return "Order: Awaiting turn" + return "Command: Awaiting phase" var actions: Array[String] = [] if not bool(unit.get("moved", false)) and not state.get_movement_range(unit_id).is_empty(): actions.append("March") @@ -3002,14 +3010,14 @@ func _unit_action_status_text(unit: Dictionary) -> String: actions.append("Strike") var skill_id := state.get_first_usable_skill_id(unit_id) if not skill_id.is_empty() and not state.get_skill_cells(unit_id, skill_id).is_empty(): - actions.append("Tactic") + actions.append("Stratagem") if _unit_has_usable_item_target(unit_id): actions.append("Supply") if not bool(unit.get("moved", false)): actions.append("Arms") - actions.append("Wait") + actions.append("Hold") var suffix := " (marched)" if bool(unit.get("moved", false)) else "" - return "Order: %s%s" % [_join_strings(actions, ", "), suffix] + return "Command: %s%s" % [_join_strings(actions, ", "), suffix] func _unit_has_usable_item_target(unit_id: String) -> bool: @@ -3058,13 +3066,13 @@ func _unit_role_text(unit: Dictionary) -> String: if class_id.contains("cavalry"): return "Shock cavalry" if class_id.contains("archer") or class_id.contains("marksman"): - return "Ranged pressure" + return "Bow pressure" if class_id.contains("strategist") or class_id.contains("advisor"): - return "Tactics support" + return "Stratagem counsel" if class_id.contains("hero") or class_id.contains("commander"): - return "Command tactics" + return "Command authority" if class_id.contains("warrior") or class_id.contains("champion") or class_id.contains("bandit"): - return "Assault fighter" + return "Assault vanguard" return "Line infantry" @@ -3160,7 +3168,7 @@ func _update_cell_info() -> void: var unit: Dictionary = summary["unit"] if not unit.is_empty(): var control_label := " Protected" if not bool(unit.get("controllable", true)) else "" - text += "\nTroop: %s%s %s Lv.%d\n%s %s HP %d/%d MP %d/%d\nArms: %s" % [ + text += "\nBanner: %s%s %s Lv.%d\n%s %s Troops %d/%d Qi %d/%d\nArms: %s" % [ unit["name"], control_label, str(unit["team"]).capitalize(), @@ -3182,7 +3190,7 @@ func _update_cell_info() -> void: text += "\nWeapon threat: %s" % _format_physical_threat_preview_text(physical_threats, 3) var skill_threats := state.get_skill_threat_previews(cell, BattleState.TEAM_ENEMY) if not skill_threats.is_empty(): - text += "\nTactic threat: %s" % _format_skill_threat_preview_text(skill_threats, 3) + text += "\nStratagem threat: %s" % _format_skill_threat_preview_text(skill_threats, 3) cell_info_label.text = text @@ -3262,7 +3270,7 @@ func _compact_name_list(names: Array[String], limit: int) -> String: func _update_forecast() -> void: var selected := state.get_selected_unit() if selected.is_empty() or not state.is_inside(hover_cell): - forecast_label.text = "Forecast: -" + forecast_label.text = "War Read: -" return if not selected_skill_id.is_empty(): @@ -3274,16 +3282,16 @@ func _update_forecast() -> void: var target := state.get_unit_at(hover_cell) if target.is_empty() or target.get("team", "") == selected.get("team", ""): - forecast_label.text = "Forecast: -" + forecast_label.text = "War Read: -" return var preview := state.get_damage_preview(selected["id"], target["id"]) if preview.is_empty(): - forecast_label.text = "Forecast: -" + forecast_label.text = "War Read: -" return if bool(preview.get("attack_locked", false)): - forecast_label.text = "Forecast: disarmed.\nCannot use physical attacks." + forecast_label.text = "War Read: disarmed.\nCannot strike with weapons." return var range_text := "ready" if preview["in_range"] else "out of range" @@ -3293,7 +3301,7 @@ func _update_forecast() -> void: if preview["counter_in_range"]: var counter_defeat := " Defeat" if preview["counter_would_defeat"] else "" var counter_effective_text := _format_effective_forecast_text(preview, "counter_effective_bonus", "counter_effective_target_type") - counter_text = "\nCounter %d%s, Hit %d%%, your HP %d/%d.%s" % [ + counter_text = "\nCounter %d%s, Hit %d%%, your Troops %d/%d.%s" % [ preview["counter_damage"], counter_effective_text, preview.get("counter_hit_chance", 0), @@ -3301,7 +3309,7 @@ func _update_forecast() -> void: selected["max_hp"], counter_defeat ] - forecast_label.text = "Forecast: %s\n%d damage%s, Hit %d%%, target HP %d/%d.%s%s" % [ + forecast_label.text = "War Read: %s\n%d damage%s, Hit %d%%, foe Troops %d/%d.%s%s" % [ range_text, preview["damage"], effective_text, @@ -3326,19 +3334,19 @@ func _format_effective_forecast_text(preview: Dictionary, bonus_key: String, typ func _update_skill_forecast(selected: Dictionary) -> void: var preview := state.get_skill_preview(selected["id"], selected_skill_id, hover_cell) if preview.is_empty(): - forecast_label.text = "Forecast: -" + forecast_label.text = "War Read: -" return var range_text := "ready" if preview["in_range"] else "out of range" - var mp_text := "" if preview["has_mp"] else " Not enough MP." + var mp_text := "" if preview["has_mp"] else " Not enough Qi." if bool(preview.get("skill_locked", false)): - forecast_label.text = "%s: sealed, %d MP.\nCannot use tactics." % [ + forecast_label.text = "%s: sealed, %d Qi.\nCannot use stratagems." % [ preview["skill_name"], preview["mp_cost"] ] return if not preview["valid_target"]: - forecast_label.text = "%s: %s, %d MP.%s\nNo valid target." % [ + forecast_label.text = "%s: %s, %d Qi.%s\nNo valid mark." % [ preview["skill_name"], range_text, preview["mp_cost"], @@ -3350,11 +3358,11 @@ func _update_skill_forecast(selected: Dictionary) -> void: var target_max_hp := int(target.get("max_hp", 1)) if not target.is_empty() else 1 var target_count := int(preview.get("target_count", 1)) var has_area := bool(preview.get("has_area", false)) - var area_text := " Area targets: %d." % target_count if has_area else "" + var area_text := " Area marks: %d." % target_count if has_area else "" if preview["kind"] == "heal": var total_heal := int(preview.get("total_heal", preview.get("heal", 0))) if not has_area: - forecast_label.text = "%s: %s, %d MP.%s\nRestore %d HP, target HP %d/%d." % [ + forecast_label.text = "%s: %s, %d Qi.%s\nRestore %d Troops, banner Troops %d/%d." % [ preview["skill_name"], range_text, preview["mp_cost"], @@ -3364,7 +3372,7 @@ func _update_skill_forecast(selected: Dictionary) -> void: target_max_hp ] return - forecast_label.text = "%s: %s, %d MP.%s%s\nRestore %d HP total, focus HP %d/%d." % [ + forecast_label.text = "%s: %s, %d Qi.%s%s\nRestore %d Troops total, focus Troops %d/%d." % [ preview["skill_name"], range_text, preview["mp_cost"], @@ -3376,7 +3384,7 @@ func _update_skill_forecast(selected: Dictionary) -> void: ] elif preview["kind"] == "support": var refresh_text := " Refresh." if bool(preview.get("already_active", false)) else "" - forecast_label.text = "%s: %s, %d MP.%s%s\n%s.%s" % [ + forecast_label.text = "%s: %s, %d Qi.%s%s\n%s.%s" % [ preview["skill_name"], range_text, preview["mp_cost"], @@ -3391,7 +3399,7 @@ func _update_skill_forecast(selected: Dictionary) -> void: var total_damage := int(preview.get("total_damage", preview.get("damage", 0))) if not has_area: var single_defeat_text := " Defeat" if bool(preview.get("would_defeat", false)) else "" - forecast_label.text = "%s: %s, %d MP.%s\n%d damage, target HP %d/%d.%s" % [ + forecast_label.text = "%s: %s, %d Qi.%s\n%d damage, foe Troops %d/%d.%s" % [ preview["skill_name"], range_text, preview["mp_cost"], @@ -3402,7 +3410,7 @@ func _update_skill_forecast(selected: Dictionary) -> void: single_defeat_text ] return - forecast_label.text = "%s: %s, %d MP.%s%s\n%d total damage, focus HP %d/%d.%s" % [ + forecast_label.text = "%s: %s, %d Qi.%s%s\n%d total damage, focus Troops %d/%d.%s" % [ preview["skill_name"], range_text, preview["mp_cost"], @@ -3418,14 +3426,14 @@ func _update_skill_forecast(selected: Dictionary) -> void: func _update_item_forecast(selected: Dictionary) -> void: var preview := state.get_item_preview(selected["id"], selected_item_id, hover_cell) if preview.is_empty(): - forecast_label.text = "Forecast: -" + forecast_label.text = "War Read: -" return var target := state.get_unit_at(hover_cell) var range_text := "ready" if preview["in_range"] else "out of range" var count_text := "x%d" % int(preview.get("count", 0)) if target.is_empty() or not preview["valid_target"]: - forecast_label.text = "%s: %s, %s\nNo valid target." % [ + forecast_label.text = "%s: %s, %s\nNo valid mark." % [ preview["item_name"], range_text, count_text @@ -3436,7 +3444,7 @@ func _update_item_forecast(selected: Dictionary) -> void: var mp_heal := int(preview.get("mp_heal", 0)) var cure_statuses: Array = preview.get("cure_statuses", []) if hp_heal <= 0 and mp_heal <= 0 and cure_statuses.is_empty(): - forecast_label.text = "%s: %s, %s\nNo item effect needed." % [ + forecast_label.text = "%s: %s, %s\nNo supply effect needed." % [ preview["item_name"], range_text, count_text @@ -3445,13 +3453,13 @@ func _update_item_forecast(selected: Dictionary) -> void: var recovery_parts := [] if hp_heal > 0: - recovery_parts.append("Restore %d HP, target HP %d/%d" % [ + recovery_parts.append("Restore %d Troops, banner Troops %d/%d" % [ hp_heal, preview["target_hp_after"], target["max_hp"] ]) if mp_heal > 0: - recovery_parts.append("Restore %d MP, target MP %d/%d" % [ + recovery_parts.append("Restore %d Qi, banner Qi %d/%d" % [ mp_heal, preview["target_mp_after"], target.get("max_mp", 0) @@ -5377,14 +5385,14 @@ func _rebuild_armory_menu() -> void: var equipment_label := Label.new() equipment_label.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART - equipment_label.text = "Equipped: %s" % _format_unit_equipment(selected) + equipment_label.text = "Arms Held: %s" % _format_unit_equipment(selected) _apply_label_style(equipment_label, UI_AGED_INK) armory_list.add_child(equipment_label) var equipped_slots := state.get_equipped_equipment_slots(armory_unit_id) if not equipped_slots.is_empty(): var unequip_title := Label.new() - unequip_title.text = "Unequip" + unequip_title.text = "Remove Arms" _apply_label_style(unequip_title, UI_CINNABAR, 14) armory_list.add_child(unequip_title) var equipment := state.get_equipment_snapshot(armory_unit_id) @@ -6377,25 +6385,25 @@ func _update_post_move_menu() -> void: return _position_post_move_menu() if post_move_title_label != null: - post_move_title_label.text = "%s: choose action" % str(selected.get("name", "Unit")) + post_move_title_label.text = "%s: issue order" % str(selected.get("name", "Unit")) if post_move_attack_button != null: var attack_blocked := not _has_basic_attack_target(pending_move_unit_id) post_move_attack_button.disabled = attack_blocked - post_move_attack_button.tooltip_text = "No enemy is in range after this move." if attack_blocked else "Mark an enemy from this unit's current position." + post_move_attack_button.tooltip_text = "No enemy banner is within reach." if attack_blocked else "Mark an enemy from this banner's current ground." if post_move_tactic_button != null: var skill_blocked := not _unit_has_usable_skill_target(pending_move_unit_id) post_move_tactic_button.disabled = skill_blocked - post_move_tactic_button.tooltip_text = "No tactic has a valid target after this move." if skill_blocked else "Select a tactic writ from this unit's current position." + post_move_tactic_button.tooltip_text = "No stratagem can reach from this ground." if skill_blocked else "Select a stratagem writ from this banner's current ground." if post_move_item_button != null: var item_blocked := not _unit_has_usable_item_target(pending_move_unit_id) post_move_item_button.disabled = item_blocked - post_move_item_button.tooltip_text = "No usable item target is in range." if item_blocked else "Open consumable items after this move." + post_move_item_button.tooltip_text = "No supply can reach from this ground." if item_blocked else "Open field supplies after this move." if post_move_wait_button != null: post_move_wait_button.disabled = false - post_move_wait_button.tooltip_text = "Commit this move and end the unit's action." + post_move_wait_button.tooltip_text = "Commit this march and seal the banner's order." if post_move_cancel_button != null: post_move_cancel_button.disabled = false - post_move_cancel_button.tooltip_text = "Right-click also returns to the starting cell." + post_move_cancel_button.tooltip_text = "Right-click also recalls the banner to its starting ground." func _local_command_panel_position_for_cell(cell: Vector2i, panel_size: Vector2) -> Vector2: @@ -6520,17 +6528,17 @@ func _position_post_move_picker() -> void: func _post_move_picker_title_text(selected: Dictionary) -> String: var unit_name := str(selected.get("name", "Unit")) if post_move_picker_mode == "tactic": - return "%s: choose tactic" % unit_name + return "%s: choose stratagem" % unit_name if post_move_picker_mode == "item": - return "%s: choose item" % unit_name - return "%s: choose" % unit_name + return "%s: choose supply" % unit_name + return "%s: choose writ" % unit_name func _post_move_picker_detail_text() -> String: if post_move_picker_mode == "tactic": - return "Pick a tactic, then click a highlighted target." + return "Select a stratagem, then mark highlighted ground." if post_move_picker_mode == "item": - return "Pick an item, then click a highlighted ally." + return "Select a supply, then mark a highlighted ally." return "Select a writ." @@ -6538,7 +6546,7 @@ func _rebuild_post_move_tactic_picker(selected: Dictionary) -> void: var skill_ids := state.get_skill_ids(selected["id"]) if skill_ids.is_empty(): var empty_label := Label.new() - empty_label.text = "No tactics" + empty_label.text = "No stratagems" _apply_label_style(empty_label, UI_PARCHMENT_TEXT) post_move_picker_list.add_child(empty_label) return @@ -6559,7 +6567,7 @@ func _rebuild_post_move_item_picker(selected: Dictionary) -> void: var item_ids := state.get_usable_item_ids() if item_ids.is_empty(): var empty_label := Label.new() - empty_label.text = "No items" + empty_label.text = "No supplies" _apply_label_style(empty_label, UI_PARCHMENT_TEXT) post_move_picker_list.add_child(empty_label) return @@ -6589,10 +6597,10 @@ func _format_post_move_tactic_button_text(skill_id: String, skill: Dictionary, s if state.is_unit_skill_sealed(selected["id"]): disabled_text = " - Sealed" elif int(selected.get("mp", 0)) < mp_cost: - disabled_text = " - MP" + disabled_text = " - Qi" elif not _skill_has_valid_target(str(selected.get("id", "")), skill_id): - disabled_text = " - No target" - return "%s%s %dMP %s R%s%s" % [marker, skill_name, mp_cost, kind, range_text, disabled_text] + disabled_text = " - No mark" + return "%s%s %d Qi %s Reach %s%s" % [marker, skill_name, mp_cost, kind, range_text, disabled_text] func _format_post_move_item_button_text(item_id: String, item: Dictionary, count: int) -> String: @@ -6608,9 +6616,9 @@ func _format_post_move_item_effect_text(item: Dictionary) -> String: continue var effect_type := str(effect.get("type", "")) if effect_type == "heal_hp": - return "HP +%d" % int(effect.get("amount", 0)) + return "Troops +%d" % int(effect.get("amount", 0)) if effect_type == "heal_mp": - return "MP +%d" % int(effect.get("amount", 0)) + return "Qi +%d" % int(effect.get("amount", 0)) if effect_type == "cure_status" or effect_type == "cleanse_debuffs": has_cure = true if has_cure: @@ -6620,15 +6628,15 @@ func _format_post_move_item_effect_text(item: Dictionary) -> String: func _post_move_tactic_disabled_reason(selected: Dictionary, skill_id: String, skill: Dictionary) -> String: if skill.is_empty(): - return "Unknown tactic." + return "Unknown stratagem." if state.is_unit_skill_sealed(selected["id"]): - return "This unit is sealed." + return "This banner is sealed." if bool(selected.get("acted", false)): - return "This unit has already acted." + return "This banner has already acted." if int(selected.get("mp", 0)) < int(skill.get("mp_cost", 0)): - return "Not enough MP." + return "Not enough Qi." if not _skill_has_valid_target(str(selected.get("id", "")), skill_id): - return "No valid target from this tile." + return "No valid mark from this ground." return "" @@ -6636,7 +6644,7 @@ func _post_move_item_disabled_reason(selected: Dictionary, item_id: String, coun if count <= 0: return "No stock remains." if not _item_has_valid_target(str(selected.get("id", "")), item_id): - return "No valid target from this tile." + return "No valid mark from this ground." return "" @@ -6772,7 +6780,7 @@ func _update_targeting_hint_panel() -> void: if targeting_hint_cancel_move_button != null: targeting_hint_cancel_move_button.visible = _has_pending_move() targeting_hint_cancel_move_button.disabled = not _has_pending_move() - targeting_hint_cancel_move_button.tooltip_text = "Right-click also returns to the starting cell." + targeting_hint_cancel_move_button.tooltip_text = "Right-click also recalls the banner to its starting ground." targeting_hint_panel.visible = true @@ -6801,18 +6809,18 @@ func _targeting_hint_detail_text() -> String: if basic_attack_targeting: var markers := _attack_target_marker_entries() if markers.is_empty(): - return "No enemy is in range." - return "%d enemy target%s. Click a marked enemy." % [markers.size(), "" if markers.size() == 1 else "s"] + return "No enemy banner is within reach." + return "%d enemy mark%s. Strike a marked foe." % [markers.size(), "" if markers.size() == 1 else "s"] if not selected_skill_id.is_empty(): var markers := _skill_target_marker_entries() if markers.is_empty(): - return "No valid tactic target." - return "%d tactic target%s. Click a marked cell." % [markers.size(), "" if markers.size() == 1 else "s"] + return "No valid stratagem mark." + return "%d stratagem mark%s. Choose marked ground." % [markers.size(), "" if markers.size() == 1 else "s"] if not selected_item_id.is_empty(): var markers := _item_target_marker_entries() if markers.is_empty(): - return "No valid item target." - return "%d item target%s. Click a marked unit." % [markers.size(), "" if markers.size() == 1 else "s"] + return "No valid supply mark." + return "%d supply mark%s. Choose a marked banner." % [markers.size(), "" if markers.size() == 1 else "s"] return "Mark a highlighted target." @@ -6851,27 +6859,27 @@ func _set_action_button_blocked(button: Button, base_label: String, reason_label func _action_phase_block_reason() -> Dictionary: if campaign_complete_screen: return { - "label": "Campaign Done", + "label": "Chronicle Sealed", "tooltip": "The campaign is complete." } if not battle_started: return { - "label": "Start Battle", + "label": "Enter Field", "tooltip": "Begin the battle before using combat actions." } if state.battle_status != BattleState.STATUS_ACTIVE: return { - "label": "Battle Over", + "label": "Field Settled", "tooltip": "Combat actions are unavailable after the battle ends." } if state.current_team != BattleState.TEAM_PLAYER: return { - "label": "Enemy Turn", - "tooltip": "Wait for the player phase." + "label": "Enemy Phase", + "tooltip": "Await the player command phase." } if _is_input_locked(): return { - "label": "Busy", + "label": "Resolving", "tooltip": "Finish the current dialogue, result, or animation first." } return {} @@ -6881,16 +6889,16 @@ func _update_wait_button(selected: Dictionary) -> void: if wait_button == null: return if selected.is_empty(): - _set_action_button_blocked(wait_button, "Wait", "Select Unit", "Select a controllable player unit before waiting.") + _set_action_button_blocked(wait_button, "Hold", "Mark Banner", "Mark a controllable banner before holding.") return if bool(selected.get("acted", false)): - _set_action_button_blocked(wait_button, "Wait", "Done", "This unit has already acted.") + _set_action_button_blocked(wait_button, "Hold", "Sealed", "This banner has already acted.") return var phase_block := _action_phase_block_reason() if not phase_block.is_empty(): - _set_action_button_blocked(wait_button, "Wait", str(phase_block.get("label", "Busy")), str(phase_block.get("tooltip", ""))) + _set_action_button_blocked(wait_button, "Hold", str(phase_block.get("label", "Resolving")), str(phase_block.get("tooltip", ""))) return - _set_action_button_state(wait_button, "Wait", false, "End this unit's action for the current turn.") + _set_action_button_state(wait_button, "Hold", false, "Seal this banner's order for the current phase.") func _update_end_turn_button() -> void: @@ -6898,9 +6906,9 @@ func _update_end_turn_button() -> void: return var phase_block := _action_phase_block_reason() if not phase_block.is_empty(): - _set_action_button_blocked(end_turn_button, "End Turn", str(phase_block.get("label", "Busy")), str(phase_block.get("tooltip", ""))) + _set_action_button_blocked(end_turn_button, "Pass Command", str(phase_block.get("label", "Resolving")), str(phase_block.get("tooltip", ""))) return - _set_action_button_state(end_turn_button, "End Turn", false, "End the player phase and let enemies act.") + _set_action_button_state(end_turn_button, "Pass Command", false, "End the player phase and let enemy banners act.") func _update_threat_button() -> void: @@ -6908,46 +6916,46 @@ func _update_threat_button() -> void: return threat_button.button_pressed = show_threat_overlay if campaign_complete_screen: - _set_action_button_blocked(threat_button, "Threat", "Campaign Done", "The campaign is complete.") + _set_action_button_blocked(threat_button, "Enemy Lines", "Chronicle Sealed", "The campaign is complete.") return if not battle_started: - _set_action_button_blocked(threat_button, "Threat", "Start Battle", "Begin the battle before showing enemy threat range.") + _set_action_button_blocked(threat_button, "Enemy Lines", "Enter Field", "Begin the battle before reading enemy lines.") return if state.battle_status != BattleState.STATUS_ACTIVE: - _set_action_button_blocked(threat_button, "Threat", "Battle Over", "Threat range is only available during active battles.") + _set_action_button_blocked(threat_button, "Enemy Lines", "Field Settled", "Enemy lines are only available during active battles.") return - _set_action_button_state(threat_button, "Threat", false, "Toggle enemy attack and hostile tactic reach.") + _set_action_button_state(threat_button, "Enemy Lines", false, "Toggle enemy weapon and hostile stratagem reach.") func _update_tactic_button(selected: Dictionary) -> void: if tactic_button == null: return if selected.is_empty(): - _set_action_button_blocked(tactic_button, "Tactic", "Select Unit", "Select a controllable player unit before using tactics.") + _set_action_button_blocked(tactic_button, "Stratagem", "Mark Banner", "Mark a controllable banner before using stratagems.") return var skill_ids := state.get_skill_ids(selected["id"]) if skill_ids.is_empty(): - _set_action_button_blocked(tactic_button, "Tactic", "None", "This unit has no tactics.") + _set_action_button_blocked(tactic_button, "Stratagem", "None", "This banner has no stratagems.") return if state.is_unit_skill_sealed(selected["id"]): - _set_action_button_blocked(tactic_button, "Tactic", "Sealed", "This unit is sealed and cannot use tactics.") + _set_action_button_blocked(tactic_button, "Stratagem", "Sealed", "This banner is sealed and cannot use stratagems.") return if bool(selected.get("acted", false)): - _set_action_button_blocked(tactic_button, "Tactic", "Done", "This unit has already acted.") + _set_action_button_blocked(tactic_button, "Stratagem", "Sealed", "This banner has already acted.") return var phase_block := _action_phase_block_reason() if not phase_block.is_empty(): - _set_action_button_blocked(tactic_button, "Tactic", str(phase_block.get("label", "Busy")), str(phase_block.get("tooltip", ""))) + _set_action_button_blocked(tactic_button, "Stratagem", str(phase_block.get("label", "Resolving")), str(phase_block.get("tooltip", ""))) return if not selected_skill_id.is_empty(): var skill := state.get_skill_def(selected_skill_id) - _set_action_button_state(tactic_button, "Tactic: %s" % str(skill.get("name", selected_skill_id)), false, "Target this tactic on the map.") + _set_action_button_state(tactic_button, "Stratagem: %s" % str(skill.get("name", selected_skill_id)), false, "Mark this stratagem on the field.") elif tactic_menu != null and tactic_menu.visible: - _set_action_button_state(tactic_button, "Close Tactic", false, "Close the tactics menu.") + _set_action_button_state(tactic_button, "Close Stratagems", false, "Close the stratagem menu.") else: - _set_action_button_state(tactic_button, "Tactic", false, "Open tactics. %d known." % skill_ids.size()) + _set_action_button_state(tactic_button, "Stratagem", false, "Open stratagems. %d known." % skill_ids.size()) func _show_tactic_menu(selected: Dictionary) -> void: @@ -6972,14 +6980,14 @@ func _rebuild_tactic_menu(selected: Dictionary) -> void: var skill_ids := state.get_skill_ids(selected["id"]) if skill_ids.is_empty(): var empty_label := Label.new() - empty_label.text = "No tactics" + empty_label.text = "No stratagems" _apply_label_style(empty_label, UI_PARCHMENT_TEXT) tactic_list.add_child(empty_label) return var skill_sealed := state.is_unit_skill_sealed(selected["id"]) if skill_sealed: var sealed_label := Label.new() - sealed_label.text = "Tactics sealed" + sealed_label.text = "Stratagems sealed" _apply_label_style(sealed_label, UI_PARCHMENT_TEXT) tactic_list.add_child(sealed_label) @@ -6993,7 +7001,7 @@ func _rebuild_tactic_menu(selected: Dictionary) -> void: tactic_list.add_child(skill_button) var cancel_button := Button.new() - cancel_button.text = "Cancel" + cancel_button.text = "Return" _apply_button_style(cancel_button) cancel_button.pressed.connect(_on_tactic_cancel_pressed) tactic_list.add_child(cancel_button) @@ -7016,8 +7024,8 @@ func _format_tactic_button_text(skill_id: String, skill: Dictionary, selected: D if state.is_unit_skill_sealed(selected["id"]): disabled_text = " - Sealed" elif int(selected.get("mp", 0)) < mp_cost: - disabled_text = " - MP" - return "%s%s %dMP %s R%s %s%s" % [marker, skill_name, mp_cost, kind, range_text, effect_text, disabled_text] + disabled_text = " - Qi" + return "%s%s %d Qi %s Reach %s %s%s" % [marker, skill_name, mp_cost, kind, range_text, effect_text, disabled_text] func _format_tactic_effect_text(skill: Dictionary) -> String: @@ -7110,28 +7118,28 @@ func _update_item_button(selected: Dictionary) -> void: if item_button == null: return if selected.is_empty(): - _set_action_button_blocked(item_button, "Item", "Select Unit", "Select a controllable player unit before using items.") + _set_action_button_blocked(item_button, "Supply", "Mark Banner", "Mark a controllable banner before using supplies.") return if bool(selected.get("acted", false)): - _set_action_button_blocked(item_button, "Item", "Done", "This unit has already acted.") + _set_action_button_blocked(item_button, "Supply", "Sealed", "This banner has already acted.") return var phase_block := _action_phase_block_reason() if not phase_block.is_empty(): - _set_action_button_blocked(item_button, "Item", str(phase_block.get("label", "Busy")), str(phase_block.get("tooltip", ""))) + _set_action_button_blocked(item_button, "Supply", str(phase_block.get("label", "Resolving")), str(phase_block.get("tooltip", ""))) return var item_ids := state.get_usable_item_ids() if item_ids.is_empty(): - _set_action_button_blocked(item_button, "Item", "None", "No consumable items are available.") + _set_action_button_blocked(item_button, "Supply", "Empty", "No field supplies are available.") return if not selected_item_id.is_empty(): var item := state.get_item_def(selected_item_id) - _set_action_button_state(item_button, "Item: %s" % str(item.get("name", selected_item_id)), false, "Target this item on the map.") + _set_action_button_state(item_button, "Supply: %s" % str(item.get("name", selected_item_id)), false, "Mark this supply on the field.") elif item_menu != null and item_menu.visible: - _set_action_button_state(item_button, "Close Item", false, "Close the item menu.") + _set_action_button_state(item_button, "Close Supplies", false, "Close the supply menu.") else: - _set_action_button_state(item_button, "Item", false, "Open items. %d consumable types available." % item_ids.size()) + _set_action_button_state(item_button, "Supply", false, "Open field supplies. %d types available." % item_ids.size()) func _show_item_menu(selected: Dictionary) -> void: @@ -7156,7 +7164,7 @@ func _rebuild_item_menu(selected: Dictionary) -> void: var item_ids := state.get_usable_item_ids() if item_ids.is_empty(): var empty_label := Label.new() - empty_label.text = "No items" + empty_label.text = "No supplies" _apply_label_style(empty_label, UI_PARCHMENT_TEXT) item_list.add_child(empty_label) return @@ -7175,7 +7183,7 @@ func _rebuild_item_menu(selected: Dictionary) -> void: item_list.add_child(use_button) var cancel_button := Button.new() - cancel_button.text = "Cancel" + cancel_button.text = "Return" _apply_button_style(cancel_button) cancel_button.pressed.connect(_on_item_cancel_pressed) item_list.add_child(cancel_button) @@ -7201,7 +7209,7 @@ func _format_item_effect_text(item: Dictionary) -> String: if str(effect.get("type", "")) == "heal_hp": parts.append("Heal %d" % int(effect.get("amount", 0))) elif str(effect.get("type", "")) == "heal_mp": - parts.append("MP %d" % int(effect.get("amount", 0))) + parts.append("Qi %d" % int(effect.get("amount", 0))) elif str(effect.get("type", "")) == "cure_status": parts.append("Cure %s" % str(effect.get("status", "status")).replace("_", " ").capitalize()) elif str(effect.get("type", "")) == "cleanse_debuffs": @@ -7241,23 +7249,23 @@ func _update_equip_button(selected: Dictionary) -> void: if equip_button == null: return if selected.is_empty(): - _set_action_button_blocked(equip_button, "Equip", "Select Unit", "Select a controllable player unit before changing equipment.") + _set_action_button_blocked(equip_button, "Arms", "Mark Banner", "Mark a controllable banner before changing arms.") return if bool(selected.get("acted", false)): - _set_action_button_blocked(equip_button, "Equip", "Done", "This unit has already acted.") + _set_action_button_blocked(equip_button, "Arms", "Sealed", "This banner has already acted.") return if bool(selected.get("moved", false)): - _set_action_button_blocked(equip_button, "Equip", "Moved", "Equipment can only be changed before this unit moves.") + _set_action_button_blocked(equip_button, "Arms", "Marched", "Arms can only be changed before this banner marches.") return var phase_block := _action_phase_block_reason() if not phase_block.is_empty(): - _set_action_button_blocked(equip_button, "Equip", str(phase_block.get("label", "Busy")), str(phase_block.get("tooltip", ""))) + _set_action_button_blocked(equip_button, "Arms", str(phase_block.get("label", "Resolving")), str(phase_block.get("tooltip", ""))) return if equip_menu != null and equip_menu.visible: - _set_action_button_state(equip_button, "Close Equip", false, "Close the equipment menu.") + _set_action_button_state(equip_button, "Close Arms", false, "Close the arms ledger.") else: - _set_action_button_state(equip_button, "Equip", false, "Change weapons, armor, or accessories before moving.") + _set_action_button_state(equip_button, "Arms", false, "Change weapons, armor, or accessories before marching.") func _show_equip_menu(selected: Dictionary) -> void: @@ -7281,14 +7289,14 @@ func _rebuild_equip_menu(selected: Dictionary) -> void: _clear_equip_list() var equipment_label := Label.new() equipment_label.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART - equipment_label.text = "Equipped: %s" % _format_unit_equipment(selected) + equipment_label.text = "Arms Held: %s" % _format_unit_equipment(selected) _apply_label_style(equipment_label, UI_PARCHMENT_TEXT) equip_list.add_child(equipment_label) var equipped_slots := state.get_equipped_equipment_slots(str(selected["id"])) if not equipped_slots.is_empty(): var unequip_title := Label.new() - unequip_title.text = "Unequip" + unequip_title.text = "Remove Arms" _apply_label_style(unequip_title, UI_OLD_BRONZE, 14) equip_list.add_child(unequip_title) var equipment := state.get_equipment_snapshot(str(selected["id"])) @@ -7307,7 +7315,7 @@ func _rebuild_equip_menu(selected: Dictionary) -> void: var item_ids := state.get_equippable_item_ids(selected["id"]) if item_ids.is_empty(): var empty_label := Label.new() - empty_label.text = "No compatible equipment" + empty_label.text = "No compatible arms" _apply_label_style(empty_label, UI_PARCHMENT_TEXT) equip_list.add_child(empty_label) else: @@ -7329,7 +7337,7 @@ func _rebuild_equip_menu(selected: Dictionary) -> void: equip_list.add_child(equip_item_button) var cancel_button := Button.new() - cancel_button.text = "Cancel" + cancel_button.text = "Return" _apply_button_style(cancel_button) cancel_button.pressed.connect(_on_equip_cancel_pressed) equip_list.add_child(cancel_button) diff --git a/tools/smoke_status_effect_summary.gd b/tools/smoke_status_effect_summary.gd index e87ce76..413859b 100644 --- a/tools/smoke_status_effect_summary.gd +++ b/tools/smoke_status_effect_summary.gd @@ -66,8 +66,8 @@ func _check_hud_reuses_status_summary(failures: Array[String]) -> void: scene.state.selected_unit_id = "cao_cao" scene.hover_cell = Vector2i(1, 3) scene._update_hud() - _check_contains(failures, "selected HUD status", scene.selected_label.text, "Effects: DEF -2 (2 phases)") - _check_contains(failures, "hover tile status", scene.cell_info_label.text, "Effects: DEF -2 (2 phases)") + _check_contains(failures, "selected HUD status", scene.selected_label.text, "Conditions: DEF -2 (2 phases)") + _check_contains(failures, "hover tile status", scene.cell_info_label.text, "Conditions: DEF -2 (2 phases)") scene.free() diff --git a/tools/smoke_visual_assets.gd b/tools/smoke_visual_assets.gd index 94bfaeb..bc7c4b2 100644 --- a/tools/smoke_visual_assets.gd +++ b/tools/smoke_visual_assets.gd @@ -1241,11 +1241,11 @@ func _check_hud_focus_text(failures: Array[String]) -> void: return var cao_cao: Dictionary = scene.state.get_unit("cao_cao") var cao_text := scene._format_unit_focus_text(cao_cao, "Selected") - if not cao_text.contains("Command tactics"): + if not cao_text.contains("Command authority"): failures.append("Cao Cao HUD focus should describe command role: %s" % cao_text) if not cao_text.contains("March 4 (Foot)") or not cao_text.contains("Strike reach 1-1"): failures.append("Cao Cao HUD focus should clarify move/attack affordance: %s" % cao_text) - if not cao_text.contains("Order:") or not cao_text.contains("March") or not cao_text.contains("Strike") or not cao_text.contains("Tactic") or not cao_text.contains("Arms") or not cao_text.contains("Wait"): + if not cao_text.contains("Command:") or not cao_text.contains("March") or not cao_text.contains("Strike") or not cao_text.contains("Stratagem") or not cao_text.contains("Arms") or not cao_text.contains("Hold"): failures.append("Cao Cao HUD focus should summarize available actions: %s" % cao_text) if not cao_text.contains("Ground 2,4"): failures.append("Cao Cao HUD focus should include current tile: %s" % cao_text) @@ -1260,11 +1260,11 @@ func _check_hud_focus_text(failures: Array[String]) -> void: failures.append("Cavalry movement should use mounted move_type cost on forest: %s" % forest_text) var archer: Dictionary = scene.state.get_unit("yellow_turban_3") var archer_text := scene._format_unit_focus_text(archer, "Hover") - if not archer_text.contains("Ranged pressure"): + if not archer_text.contains("Bow pressure"): failures.append("Archer HUD focus should describe ranged role: %s" % archer_text) if not archer_text.contains("March 4 (Archer)") or not archer_text.contains("Strike reach 2-2"): failures.append("Archer HUD focus should clarify ranged attack affordance: %s" % archer_text) - if not archer_text.contains("Order: Enemy command"): + if not archer_text.contains("Command: Enemy banner"): failures.append("Enemy archer HUD focus should describe enemy control: %s" % archer_text) if not scene._unit_current_terrain_text(archer).contains("Plain"): failures.append("Archer terrain text should reflect its current plain tile") @@ -1379,7 +1379,7 @@ func _check_action_button_disabled_reasons(failures: Array[String]) -> void: "remaining_phases": 2 }] scene._update_tactic_button(cao_cao) - if scene.tactic_button.text != "Tactic - Sealed" or not scene.tactic_button.tooltip_text.to_lower().contains("sealed"): + if scene.tactic_button.text != "Stratagem - Sealed" or not scene.tactic_button.tooltip_text.to_lower().contains("sealed"): failures.append("sealed unit should explain disabled tactic button: %s | %s" % [scene.tactic_button.text, scene.tactic_button.tooltip_text]) cao_cao["status_effects"] = [] @@ -1388,36 +1388,36 @@ func _check_action_button_disabled_reasons(failures: Array[String]) -> void: scene._update_tactic_button(cao_cao) scene._update_item_button(cao_cao) scene._update_equip_button(cao_cao) - if not scene.wait_button.text.contains("Done"): - failures.append("acted unit wait button should show Done: %s" % scene.wait_button.text) - if not scene.tactic_button.text.contains("Done"): - failures.append("acted unit tactic button should show Done: %s" % scene.tactic_button.text) - if not scene.item_button.text.contains("Done"): - failures.append("acted unit item button should show Done: %s" % scene.item_button.text) - if not scene.equip_button.text.contains("Done"): - failures.append("acted unit equip button should show Done: %s" % scene.equip_button.text) + if not scene.wait_button.text.contains("Sealed"): + failures.append("acted unit hold button should show Sealed: %s" % scene.wait_button.text) + if not scene.tactic_button.text.contains("Sealed"): + failures.append("acted unit stratagem button should show Sealed: %s" % scene.tactic_button.text) + if not scene.item_button.text.contains("Sealed"): + failures.append("acted unit supply button should show Sealed: %s" % scene.item_button.text) + if not scene.equip_button.text.contains("Sealed"): + failures.append("acted unit arms button should show Sealed: %s" % scene.equip_button.text) cao_cao["acted"] = false cao_cao["moved"] = true scene._update_equip_button(cao_cao) - if scene.equip_button.text != "Equip - Moved" or not scene.equip_button.tooltip_text.to_lower().contains("before"): + if scene.equip_button.text != "Arms - Marched" or not scene.equip_button.tooltip_text.to_lower().contains("before"): failures.append("moved unit should explain disabled equip button: %s | %s" % [scene.equip_button.text, scene.equip_button.tooltip_text]) cao_cao["moved"] = false scene.state.set_inventory_snapshot({}) scene._update_item_button(cao_cao) - if scene.item_button.text != "Item - None" or not scene.item_button.tooltip_text.to_lower().contains("no consumable"): + if scene.item_button.text != "Supply - Empty" or not scene.item_button.tooltip_text.to_lower().contains("no field supplies"): failures.append("empty inventory should explain disabled item button: %s | %s" % [scene.item_button.text, scene.item_button.tooltip_text]) scene.state.current_team = BattleState.TEAM_ENEMY scene._update_end_turn_button() - if scene.end_turn_button.text != "End Turn - Enemy Turn" or not scene.end_turn_button.tooltip_text.to_lower().contains("player phase"): + if scene.end_turn_button.text != "Pass Command - Enemy Phase" or not scene.end_turn_button.tooltip_text.to_lower().contains("player command phase"): failures.append("enemy phase should explain disabled end turn button: %s | %s" % [scene.end_turn_button.text, scene.end_turn_button.tooltip_text]) scene.state.current_team = BattleState.TEAM_PLAYER scene.battle_started = false scene._update_threat_button() - if scene.threat_button.text != "Threat - Start Battle" or not scene.threat_button.tooltip_text.to_lower().contains("begin"): + if scene.threat_button.text != "Enemy Lines - Enter Field" or not scene.threat_button.tooltip_text.to_lower().contains("begin"): failures.append("inactive battle should explain disabled threat button: %s | %s" % [scene.threat_button.text, scene.threat_button.tooltip_text]) _free_action_button_test_scene(scene)