Retheme ancient briefing UI and add pursuit camp

This commit is contained in:
2026-06-19 01:57:32 +09:00
parent 539053c032
commit 50692fa05d
7 changed files with 489 additions and 80 deletions

View File

@@ -531,7 +531,7 @@ func _create_hud() -> void:
selected_row.add_child(selected_label)
mission_title_label = Label.new()
mission_title_label.text = "War Order"
mission_title_label.text = "Battle Mandate"
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)
@@ -650,7 +650,7 @@ func _create_hud() -> void:
post_move_menu.add_child(post_move_column)
post_move_title_label = Label.new()
post_move_title_label.text = "Choose Action"
post_move_title_label.text = "Issue Order"
post_move_title_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
_apply_label_style(post_move_title_label, UI_OLD_BRONZE, 14)
post_move_column.add_child(post_move_title_label)
@@ -663,7 +663,7 @@ func _create_hud() -> void:
post_move_attack_button = Button.new()
post_move_attack_button.text = "Attack"
post_move_attack_button.tooltip_text = "Choose an enemy target from this unit's current position."
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)
@@ -686,7 +686,7 @@ func _create_hud() -> void:
post_move_grid.add_child(post_move_wait_button)
post_move_cancel_button = Button.new()
post_move_cancel_button.text = "Cancel Move"
post_move_cancel_button.text = "Recall Step"
post_move_cancel_button.tooltip_text = "Return to the starting cell."
post_move_cancel_button.pressed.connect(_on_post_move_cancel_pressed)
post_move_column.add_child(post_move_cancel_button)
@@ -704,7 +704,7 @@ func _create_hud() -> void:
post_move_picker_panel.add_child(picker_column)
post_move_picker_title_label = Label.new()
post_move_picker_title_label.text = "Choose"
post_move_picker_title_label.text = "Select Writ"
post_move_picker_title_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
_apply_label_style(post_move_picker_title_label, UI_OLD_BRONZE, 14)
picker_column.add_child(post_move_picker_title_label)
@@ -730,13 +730,13 @@ func _create_hud() -> void:
picker_column.add_child(picker_button_row)
post_move_picker_back_button = Button.new()
post_move_picker_back_button.text = "Back"
post_move_picker_back_button.tooltip_text = "Return to the action menu."
post_move_picker_back_button.text = "Return"
post_move_picker_back_button.tooltip_text = "Return to the order menu."
post_move_picker_back_button.pressed.connect(_on_post_move_picker_back_pressed)
picker_button_row.add_child(post_move_picker_back_button)
post_move_picker_cancel_move_button = Button.new()
post_move_picker_cancel_move_button.text = "Cancel Move"
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.pressed.connect(_on_post_move_picker_cancel_move_pressed)
picker_button_row.add_child(post_move_picker_cancel_move_button)
@@ -754,7 +754,7 @@ func _create_hud() -> void:
targeting_hint_panel.add_child(targeting_column)
targeting_hint_title_label = Label.new()
targeting_hint_title_label.text = "Choose Target"
targeting_hint_title_label.text = "Mark Foe"
targeting_hint_title_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
_apply_label_style(targeting_hint_title_label, UI_OLD_BRONZE, 14)
targeting_column.add_child(targeting_hint_title_label)
@@ -770,13 +770,13 @@ func _create_hud() -> void:
targeting_column.add_child(targeting_button_row)
targeting_hint_back_button = Button.new()
targeting_hint_back_button.text = "Back"
targeting_hint_back_button.tooltip_text = "Return to the action menu."
targeting_hint_back_button.text = "Return"
targeting_hint_back_button.tooltip_text = "Return to the order menu."
targeting_hint_back_button.pressed.connect(_on_targeting_back_pressed)
targeting_button_row.add_child(targeting_hint_back_button)
targeting_hint_cancel_move_button = Button.new()
targeting_hint_cancel_move_button.text = "Cancel Move"
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.pressed.connect(_on_targeting_cancel_move_pressed)
targeting_button_row.add_child(targeting_hint_cancel_move_button)
@@ -896,12 +896,12 @@ func _create_hud() -> void:
prep_button_row.add_child(chapter_button)
shop_button = Button.new()
shop_button.text = "Market"
shop_button.text = "Sutler"
shop_button.pressed.connect(_on_shop_pressed)
prep_button_row.add_child(shop_button)
talk_button = Button.new()
talk_button.text = "Council"
talk_button.text = "War Council"
talk_button.pressed.connect(_on_talk_pressed)
prep_button_row.add_child(talk_button)
@@ -916,12 +916,12 @@ func _create_hud() -> void:
prep_button_row.add_child(roster_button)
formation_button = Button.new()
formation_button.text = "Array"
formation_button.text = "Battle Array"
formation_button.pressed.connect(_on_formation_pressed)
prep_button_row.add_child(formation_button)
save_button = Button.new()
save_button.text = "Record"
save_button.text = "War Record"
save_button.pressed.connect(_on_save_pressed)
prep_button_row.add_child(save_button)
@@ -1085,7 +1085,7 @@ func _create_hud() -> void:
save_action_row.add_child(manual_load_button)
var begin_button := Button.new()
begin_button.text = "Take Field"
begin_button.text = "Enter Field"
begin_button.pressed.connect(_on_begin_battle_pressed)
briefing_column.add_child(begin_button)
@@ -1172,14 +1172,14 @@ func _create_hud() -> void:
dialogue_control_row.add_child(dialogue_progress_label)
dialogue_previous_button = Button.new()
dialogue_previous_button.text = "Recall"
dialogue_previous_button.text = "Earlier Slip"
dialogue_previous_button.disabled = true
dialogue_previous_button.custom_minimum_size = Vector2(88, 32)
dialogue_previous_button.pressed.connect(_retreat_dialogue)
dialogue_control_row.add_child(dialogue_previous_button)
dialogue_continue_button = Button.new()
dialogue_continue_button.text = "Advance"
dialogue_continue_button.text = "Next Slip"
dialogue_continue_button.custom_minimum_size = Vector2(120, 32)
dialogue_continue_button.pressed.connect(_advance_dialogue)
dialogue_control_row.add_child(dialogue_continue_button)
@@ -2929,8 +2929,8 @@ 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 "War Order"
return "War Order: %s" % text
return "Battle Mandate"
return "Battle Mandate: %s" % text
func _format_unit_focus_text(unit: Dictionary, prefix: String) -> String:
@@ -3095,16 +3095,16 @@ func _format_mission_panel_text() -> String:
lines.append("Edict: %s" % victory)
var progress_lines := state.get_objective_progress_lines(false, false)
if not progress_lines.is_empty():
lines.append("War Report:")
lines.append("Battle Register:")
for progress_line in progress_lines:
lines.append(" %s" % progress_line)
var risk_lines := state.get_defeat_progress_lines()
if not risk_lines.is_empty():
lines.append("Ill Omen:")
lines.append("Dire Portents:")
for risk_line in risk_lines:
lines.append(" %s" % risk_line)
if lines.is_empty():
return "No war order."
return "No battle mandate."
return _join_strings(lines, "\n")
@@ -3479,7 +3479,7 @@ func _update_result_panel() -> void:
result_restart_button.visible = false
if next_battle_button != null:
next_battle_button.visible = false
result_label.text = "%s Chronicle Complete\nAll current scrolls cleared.\nTreasury %dG\nBegin a new chronicle to replay." % [
result_label.text = "%s Chronicle Complete\nAll current scrolls cleared.\nWar Chest %dG\nBegin a new chronicle to replay." % [
campaign_state.campaign_title,
campaign_state.gold
]
@@ -3535,16 +3535,24 @@ func _on_log_added(message: String) -> void:
_play_log_sfx(message)
if log_box == null:
return
log_box.append_text(message + "\n")
log_box.append_text(_format_log_entry_text(message) + "\n")
log_box.scroll_to_line(max(0, log_box.get_line_count() - 1))
func _format_log_entry_text(message: String) -> String:
if message.begins_with("Objective updated:"):
return "Mandate revised:%s" % message.substr("Objective updated:".length())
if message.begins_with("Defeat condition updated:"):
return "Omen revised:%s" % message.substr("Defeat condition updated:".length())
return message
func _on_objective_updated(victory: String, defeat: String) -> void:
var notice_lines := ["New War Order"]
var notice_lines := ["New Battle Mandate"]
if not victory.is_empty():
notice_lines.append(victory)
notice_lines.append("Mandate: %s" % victory)
if not defeat.is_empty():
notice_lines.append(defeat)
notice_lines.append("Omen: %s" % defeat)
if objective_notice_label != null:
objective_notice_label.text = "\n".join(notice_lines)
if objective_notice_panel != null:
@@ -3891,7 +3899,7 @@ func _update_dialogue_controls() -> void:
dialogue_progress_label.text = "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" if active_dialogue_index >= active_dialogue_lines.size() - 1 else "Advance"
dialogue_continue_button.text = "Seal Scroll" if active_dialogue_index >= active_dialogue_lines.size() - 1 else "Next Slip"
func _apply_dialogue_side(side: String) -> void:
@@ -4266,27 +4274,27 @@ func _format_briefing_objectives() -> String:
var text := ""
var victory := str(state.objectives.get("victory", ""))
if not victory.is_empty():
text = "War Edict: %s" % victory
text = "Mandate of Victory: %s" % victory
var defeat := str(state.objectives.get("defeat", ""))
if not defeat.is_empty():
if not text.is_empty():
text += "\n"
text += "Ruin If: %s" % defeat
text += "Omen of Ruin: %s" % defeat
var progress_lines := state.get_objective_progress_lines(false, false)
if not progress_lines.is_empty():
if not text.is_empty():
text += "\n"
text += "War Report: %s" % _join_strings(progress_lines, ", ")
text += "Battle Register: %s" % _join_strings(progress_lines, ", ")
var risk_lines := state.get_defeat_progress_lines()
if not risk_lines.is_empty():
if not text.is_empty():
text += "\n"
text += "Ill Omen: %s" % _join_strings(risk_lines, ", ")
text += "Dire Portents: %s" % _join_strings(risk_lines, ", ")
var rewards_text := _format_briefing_rewards()
if not rewards_text.is_empty():
if not text.is_empty():
text += "\n"
text += "Spoils: %s" % rewards_text
text += "Spoils Ledger: %s" % rewards_text
return text
@@ -4325,7 +4333,7 @@ func _update_briefing_camp_overview(briefing: Dictionary, prep_locked: bool) ->
briefing_camp_overview_texture.texture = texture
briefing_camp_overview_texture.visible = has_texture
if briefing_camp_overview_fallback_label != null:
briefing_camp_overview_fallback_label.text = "War Map"
briefing_camp_overview_fallback_label.text = "Silk War Map"
briefing_camp_overview_fallback_label.visible = not has_texture
@@ -4334,7 +4342,7 @@ func _format_briefing_camp_overview_text(briefing: Dictionary, prep_locked: bool
var location := str(briefing.get("location", "")).strip_edges()
if not location.is_empty():
parts.append(location)
parts.append("Treasury %dG" % campaign_state.gold)
parts.append("War Chest %dG" % campaign_state.gold)
var talk_text := _format_briefing_talk_overview_text()
if not talk_text.is_empty():
parts.append(talk_text)
@@ -4348,9 +4356,9 @@ func _format_briefing_camp_overview_text(briefing: Dictionary, prep_locked: bool
if not formation_text.is_empty():
parts.append(formation_text)
if not state.get_controllable_player_units().is_empty():
parts.append("Arsenal ready")
parts.append("Armory stocked")
if prep_locked:
parts.append("Replay camp sealed")
parts.append("Replay scroll sealed")
return _join_strings(parts, " - ")
@@ -4361,7 +4369,7 @@ func _format_briefing_talk_overview_text() -> String:
var supply_counts := _camp_conversation_supply_counts(conversations)
var ready := int(supply_counts.get("ready", 0))
var claimed := int(supply_counts.get("claimed", 0))
var parts := ["Council %d" % conversations.size()]
var parts := ["War Council %d" % conversations.size()]
if ready > 0:
parts.append("%d supply" % ready)
if claimed > 0:
@@ -4375,8 +4383,8 @@ func _format_briefing_shop_overview_text() -> String:
if buy_count <= 0 and sell_count <= 0:
return ""
if sell_count > 0:
return "Market %d goods, %d sale" % [buy_count, sell_count]
return "Market %d goods" % buy_count
return "Sutler %d goods, %d sale" % [buy_count, sell_count]
return "Sutler %d goods" % buy_count
func _format_briefing_roster_overview_text() -> String:
@@ -4385,15 +4393,15 @@ func _format_briefing_roster_overview_text() -> String:
var deployed_count := state.get_deployed_player_count()
var max_units := state.get_deployment_max_units()
if max_units > 0:
return "Muster %d/%d" % [deployed_count, max_units]
return "Muster %d" % deployed_count
return "Muster Roll %d/%d" % [deployed_count, max_units]
return "Muster Roll %d" % deployed_count
func _format_briefing_formation_overview_text() -> String:
var formation_count := state.get_formation_cells().size()
if formation_count <= 0:
return ""
return "Array %d tiles" % formation_count
return "Battle Array %d tiles" % formation_count
func _camp_conversation_supply_counts(conversations: Array) -> Dictionary:
@@ -5085,7 +5093,7 @@ func _format_current_checkpoint_text() -> String:
var title := campaign_state.get_scenario_title(campaign_state.current_scenario_id)
if title.is_empty():
title = campaign_state.get_scenario_title(campaign_state.get_start_scenario_id())
return "Current Seal: %s - %d/%d sealed - Treasury %dG" % [
return "Current Seal: %s - %d/%d sealed - War Chest %dG" % [
title,
campaign_state.completed_scenarios.size(),
campaign_state.get_scenario_count(),
@@ -5101,7 +5109,7 @@ func _format_manual_checkpoint_text() -> String:
if title.is_empty():
title = str(summary.get("current_scenario_id", "Unknown"))
var pending_suffix := " - council pending" if bool(summary.get("pending_choice", false)) else ""
return "Manual Seal: %s - %d/%d sealed - Treasury %dG%s" % [
return "Manual Seal: %s - %d/%d sealed - War Chest %dG%s" % [
title,
int(summary.get("completed_count", 0)),
int(summary.get("total_count", 0)),
@@ -5488,7 +5496,7 @@ func _rebuild_shop_menu() -> void:
_clear_shop_list()
if shop_status_label != null:
var mode_text := "Offer" if shop_sell_mode else "Acquire"
shop_status_label.text = "%s - Treasury %dG - %s" % [
shop_status_label.text = "%s - War Chest %dG - %s" % [
mode_text,
campaign_state.gold,
_format_inventory_status_text()
@@ -6058,7 +6066,7 @@ func _format_battle_result_summary() -> String:
var next_title := str(battle_result_summary.get("next_scenario_title", ""))
if not next_title.is_empty():
next_text = "Next March: %s" % next_title
sections.append("Chronicle\n Treasury: %dG\n %s\n %s" % [
sections.append("Chronicle\n War Chest: %dG\n %s\n %s" % [
campaign_state.gold,
saved_text,
next_text
@@ -6106,18 +6114,18 @@ func _format_next_camp_preview_text(next_scenario_id: String) -> String:
parts.append(location)
var talk_count := _briefing_camp_conversation_count(briefing)
if talk_count > 0:
parts.append("Council %d" % talk_count)
parts.append("War Council %d" % talk_count)
var shop_count := preview_state.get_shop_item_ids().size()
if shop_count > 0:
parts.append("Market %d goods" % shop_count)
parts.append("Sutler %d goods" % shop_count)
if preview_state.has_deployment_roster():
parts.append("Muster %d/%d" % [
parts.append("Muster Roll %d/%d" % [
preview_state.get_deployed_player_count(),
preview_state.get_deployment_max_units()
])
var formation_count := preview_state.get_formation_cells().size()
if formation_count > 0:
parts.append("Array %d tiles" % formation_count)
parts.append("Battle Array %d tiles" % formation_count)
return _join_strings(parts, " - ")
@@ -6373,11 +6381,11 @@ func _update_post_move_menu() -> void:
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 "Choose an enemy target from this unit's current position."
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."
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 "Choose a tactic from this unit's current position."
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."
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
@@ -6523,7 +6531,7 @@ func _post_move_picker_detail_text() -> String:
return "Pick a tactic, then click a highlighted target."
if post_move_picker_mode == "item":
return "Pick an item, then click a highlighted ally."
return "Choose an option."
return "Select a writ."
func _rebuild_post_move_tactic_picker(selected: Dictionary) -> void:
@@ -6541,7 +6549,7 @@ func _rebuild_post_move_tactic_picker(selected: Dictionary) -> void:
skill_button.text = _format_post_move_tactic_button_text(skill_id, skill, selected)
var disabled_reason := _post_move_tactic_disabled_reason(selected, skill_id, skill)
skill_button.disabled = not disabled_reason.is_empty()
skill_button.tooltip_text = disabled_reason if not disabled_reason.is_empty() else "Choose this tactic."
skill_button.tooltip_text = disabled_reason if not disabled_reason.is_empty() else "Select this tactic writ."
_apply_button_style(skill_button)
skill_button.pressed.connect(_on_post_move_tactic_option_pressed.bind(skill_id))
post_move_picker_list.add_child(skill_button)
@@ -6565,7 +6573,7 @@ func _rebuild_post_move_item_picker(selected: Dictionary) -> void:
_apply_item_button_icon(item_button, item)
var disabled_reason := _post_move_item_disabled_reason(selected, item_id, count)
item_button.disabled = not disabled_reason.is_empty()
item_button.tooltip_text = disabled_reason if not disabled_reason.is_empty() else "Choose this item."
item_button.tooltip_text = disabled_reason if not disabled_reason.is_empty() else "Select this supply."
_apply_button_style(item_button)
item_button.pressed.connect(_on_post_move_item_option_pressed.bind(item_id))
post_move_picker_list.add_child(item_button)
@@ -6759,8 +6767,8 @@ func _update_targeting_hint_panel() -> void:
if targeting_hint_detail_label != null:
targeting_hint_detail_label.text = _targeting_hint_detail_text()
if targeting_hint_back_button != null:
targeting_hint_back_button.text = "Back"
targeting_hint_back_button.tooltip_text = "Return to the action menu." if _has_pending_move() else "Clear target selection."
targeting_hint_back_button.text = "Return"
targeting_hint_back_button.tooltip_text = "Return to the order menu." if _has_pending_move() else "Clear target selection."
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()
@@ -6779,14 +6787,14 @@ func _position_targeting_hint_panel(selected: Dictionary) -> void:
func _targeting_hint_title_text() -> String:
if basic_attack_targeting:
return "Select Attack Target"
return "Mark Foe"
if not selected_skill_id.is_empty():
var skill := state.get_skill_def(selected_skill_id)
return "Target: %s" % str(skill.get("name", selected_skill_id))
return "Mark: %s" % str(skill.get("name", selected_skill_id))
if not selected_item_id.is_empty():
var item := state.get_item_def(selected_item_id)
return "Target: %s" % str(item.get("name", selected_item_id))
return "Choose Target"
return "Mark: %s" % str(item.get("name", selected_item_id))
return "Mark Target"
func _targeting_hint_detail_text() -> String:
@@ -6805,7 +6813,7 @@ func _targeting_hint_detail_text() -> String:
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 "Choose a highlighted target."
return "Mark a highlighted target."
func _on_targeting_back_pressed() -> void: