Add chapter battle replay entries

This commit is contained in:
2026-06-18 04:12:31 +09:00
parent 4c3621bc85
commit 87aed5a449
7 changed files with 102 additions and 30 deletions

View File

@@ -204,6 +204,25 @@ func apply_battle_result(battle_state) -> Dictionary:
var already_completed := completed_scenarios.has(battle_state.battle_id)
var rewards := battle_state.get_rewards()
var post_battle_choices := battle_state.get_post_battle_choices()
if already_completed:
var return_scenario_id := current_scenario_id if not is_campaign_complete() else ""
return {
"saved": true,
"rewards_applied": false,
"already_completed": true,
"gold": 0,
"items": [],
"joined_officers": [],
"left_officers": [],
"progression_events": [],
"next_scenario_id": return_scenario_id,
"next_scenario_title": get_scenario_title(return_scenario_id),
"scenario_id": battle_state.battle_id,
"campaign_complete": return_scenario_id.is_empty(),
"post_battle_choices": [],
"choice_applied": true,
"choice_label": ""
}
var previous_completed := completed_scenarios.duplicate()
var previous_gold := gold
var previous_inventory := inventory.duplicate(true)
@@ -217,22 +236,20 @@ func apply_battle_result(battle_state) -> Dictionary:
var reward_gold := 0
var next_scenario_id := get_next_scenario_id(battle_state.battle_id)
if not already_completed:
roster = battle_state.get_player_roster_snapshot()
inventory = battle_state.get_inventory_snapshot()
roster = battle_state.get_player_roster_snapshot()
inventory = battle_state.get_inventory_snapshot()
if not already_completed:
completed_scenarios.append(battle_state.battle_id)
reward_gold = int(rewards.get("gold", 0))
gold += reward_gold
completed_scenarios.append(battle_state.battle_id)
reward_gold = int(rewards.get("gold", 0))
gold += reward_gold
for item_id in rewards.get("items", []):
var key := str(item_id)
inventory[key] = int(inventory.get(key, 0)) + 1
rewarded_items.append(key)
joined_reward_officers = _apply_join_officers(rewards.get("join_officers", []))
left_reward_officers = _apply_leave_officers(rewards.get("leave_officers", []))
pending_post_battle_choice_scenario_id = battle_state.battle_id if not post_battle_choices.is_empty() else ""
for item_id in rewards.get("items", []):
var key := str(item_id)
inventory[key] = int(inventory.get(key, 0)) + 1
rewarded_items.append(key)
joined_reward_officers = _apply_join_officers(rewards.get("join_officers", []))
left_reward_officers = _apply_leave_officers(rewards.get("leave_officers", []))
pending_post_battle_choice_scenario_id = battle_state.battle_id if not post_battle_choices.is_empty() else ""
if not next_scenario_id.is_empty():
current_scenario_id = next_scenario_id
@@ -259,19 +276,19 @@ func apply_battle_result(battle_state) -> Dictionary:
return {
"saved": saved,
"rewards_applied": not already_completed and saved,
"already_completed": already_completed,
"rewards_applied": saved,
"already_completed": false,
"gold": reward_gold,
"items": rewarded_items,
"joined_officers": joined_reward_officers,
"left_officers": left_reward_officers,
"progression_events": battle_state.get_progression_events() if saved and not already_completed else [],
"progression_events": battle_state.get_progression_events() if saved else [],
"next_scenario_id": next_scenario_id,
"next_scenario_title": get_scenario_title(next_scenario_id),
"scenario_id": battle_state.battle_id,
"campaign_complete": next_scenario_id.is_empty(),
"post_battle_choices": post_battle_choices if saved and not already_completed else [],
"choice_applied": not saved or already_completed or post_battle_choices.is_empty(),
"post_battle_choices": post_battle_choices if saved else [],
"choice_applied": not saved or post_battle_choices.is_empty(),
"choice_label": ""
}
@@ -658,12 +675,24 @@ func get_chapter_progress_entries() -> Array:
var completed_count := 0
var current_in_chapter := false
var current_scenario_title := ""
var scenarios := []
for scenario_id in scenario_ids:
var completed := completed_scenarios.has(scenario_id)
var current := scenario_id == current_scenario_id
if completed_scenarios.has(scenario_id):
completed_count += 1
if scenario_id == current_scenario_id:
if current:
current_in_chapter = true
current_scenario_title = get_scenario_title(scenario_id)
scenarios.append({
"id": scenario_id,
"title": get_scenario_title(scenario_id),
"position": get_scenario_position_in_chapter(scenario_id),
"total": scenario_ids.size(),
"completed": completed,
"current": current,
"available": completed or current
})
entries.append({
"id": chapter_id,
"title": str(chapter_titles.get(chapter_id, chapter_id)),
@@ -672,7 +701,8 @@ func get_chapter_progress_entries() -> Array:
"completed": completed_count,
"total": scenario_ids.size(),
"current": current_in_chapter,
"current_scenario_title": current_scenario_title
"current_scenario_title": current_scenario_title,
"scenarios": scenarios
})
return entries

View File

@@ -2045,6 +2045,48 @@ func _rebuild_chapter_menu() -> void:
chapter_label.custom_minimum_size = Vector2(560, 0)
chapter_label.text = line
chapter_list.add_child(chapter_label)
for scenario in entry.get("scenarios", []):
_add_chapter_scenario_entry(scenario)
func _add_chapter_scenario_entry(scenario: Dictionary) -> void:
var scenario_id := str(scenario.get("id", ""))
var title := str(scenario.get("title", scenario_id))
var position := int(scenario.get("position", 0))
var total := int(scenario.get("total", 0))
var completed := bool(scenario.get("completed", false))
var current := bool(scenario.get("current", false))
var available := bool(scenario.get("available", false))
var status := "Current" if current else ("Replay" if completed else "Upcoming")
var text := " %02d/%02d %s [%s]" % [position, total, title, status]
if available:
var scenario_button := Button.new()
scenario_button.custom_minimum_size = Vector2(560, 0)
scenario_button.text = text
scenario_button.pressed.connect(_on_chapter_scenario_pressed.bind(scenario_id))
chapter_list.add_child(scenario_button)
else:
var scenario_label := Label.new()
scenario_label.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART
scenario_label.custom_minimum_size = Vector2(560, 0)
scenario_label.text = text
chapter_list.add_child(scenario_label)
func _on_chapter_scenario_pressed(scenario_id: String) -> void:
if battle_started or briefing_panel == null or not briefing_panel.visible:
return
if scenario_id.is_empty():
return
if not campaign_state.is_scenario_completed(scenario_id) and scenario_id != campaign_state.current_scenario_id:
_play_ui_cancel()
return
_play_ui_confirm()
if log_box != null:
log_box.clear()
_load_scenario(scenario_id)
_show_briefing()
_update_hud()
func _on_shop_pressed() -> void:
@@ -2691,7 +2733,7 @@ func _format_battle_result_summary() -> String:
pending_text += "\nNext: %s" % pending_next
return pending_text
if battle_result_summary.get("already_completed", false):
var already_saved := "Campaign saved." if battle_result_summary.get("saved", false) else "Campaign save failed."
var already_saved := "Campaign unchanged." if battle_result_summary.get("saved", false) else "Campaign replay failed."
var already_next := str(battle_result_summary.get("next_scenario_title", ""))
if already_next.is_empty():
return "Rewards already claimed.\n%s" % already_saved