|
1 | 1 | use bevy::prelude::*; |
2 | 2 | use bevy_persistent::prelude::*; |
3 | | -use std::collections::{HashMap, VecDeque}; |
4 | 3 |
|
5 | 4 | use crate::game_engine::commander::CommandZoneManager; |
6 | | -use crate::game_engine::save::data::*; |
7 | | -use crate::game_engine::save::events::*; |
| 5 | +use crate::game_engine::save::data::GameSaveData; |
| 6 | +use crate::game_engine::save::events::LoadGameEvent; |
8 | 7 | use crate::game_engine::save::resources::*; |
9 | 8 | use crate::game_engine::state::GameState; |
10 | 9 | use crate::game_engine::zones::ZoneManager; |
@@ -44,115 +43,17 @@ pub fn handle_load_game( |
44 | 43 |
|
45 | 44 | match persistent_save { |
46 | 45 | Ok(save) => { |
47 | | - // Get the loaded data |
48 | 46 | let save_data = save.clone(); |
49 | 47 |
|
50 | | - // Rebuild entity mapping |
51 | | - let mut index_to_entity = Vec::new(); |
52 | | - let mut existing_player_entities = HashMap::new(); |
53 | | - |
54 | | - // Map existing players if possible |
55 | | - for (entity, player) in query_players.iter() { |
56 | | - for saved_player in &save_data.players { |
57 | | - if player.name == saved_player.name { |
58 | | - existing_player_entities.insert(saved_player.id, entity); |
59 | | - break; |
60 | | - } |
61 | | - } |
62 | | - } |
63 | | - |
64 | | - // Recreate player entities |
65 | | - for player_data in &save_data.players { |
66 | | - if let Some(&entity) = existing_player_entities.get(&player_data.id) { |
67 | | - index_to_entity.push(entity); |
68 | | - |
69 | | - // Update existing player data |
70 | | - if let Ok((_, mut player)) = query_players.get_mut(entity) { |
71 | | - player.life = player_data.life; |
72 | | - player.mana_pool = player_data.mana_pool.clone(); |
73 | | - } |
74 | | - } else { |
75 | | - // Create new player entity |
76 | | - let player_entity = commands |
77 | | - .spawn((Player { |
78 | | - name: player_data.name.clone(), |
79 | | - life: player_data.life, |
80 | | - mana_pool: player_data.mana_pool.clone(), |
81 | | - ..Default::default() |
82 | | - },)) |
83 | | - .id(); |
84 | | - |
85 | | - index_to_entity.push(player_entity); |
86 | | - } |
87 | | - } |
88 | | - |
89 | | - // Handle empty player list case gracefully |
90 | | - if save_data.players.is_empty() { |
91 | | - debug!("Loading a save with no players"); |
92 | | - // Add a placeholder to index_to_entity for GameState to reference safely |
93 | | - if index_to_entity.is_empty() { |
94 | | - index_to_entity.push(Entity::PLACEHOLDER); |
95 | | - } |
96 | | - } |
97 | | - |
98 | | - // Restore game state - always attempt to restore basic properties even with empty players |
99 | | - if let Some(game_state) = &mut game_state { |
100 | | - // If there's a corrupted mapping, fall back to basic properties |
101 | | - if index_to_entity.is_empty() || index_to_entity.contains(&Entity::PLACEHOLDER) |
102 | | - { |
103 | | - // Always restore turn number first |
104 | | - game_state.turn_number = save_data.game_state.turn_number; |
105 | | - |
106 | | - // Handle empty turn order case |
107 | | - if save_data.game_state.turn_order_indices.is_empty() { |
108 | | - debug!("Empty turn order detected, keeping turn order unchanged"); |
109 | | - // Keep the existing turn order |
110 | | - } else { |
111 | | - // Create a fallback turn order based on indices |
112 | | - let mut turn_order = VecDeque::new(); |
113 | | - for &idx in &save_data.game_state.turn_order_indices { |
114 | | - turn_order.push_back(Entity::from_raw(idx as u32)); |
115 | | - } |
116 | | - game_state.turn_order = turn_order; |
117 | | - } |
118 | | - } else { |
119 | | - // Full restore with valid player entities |
120 | | - **game_state = save_data.to_game_state(&index_to_entity); |
121 | | - } |
122 | | - } else { |
123 | | - if !index_to_entity.is_empty() { |
124 | | - commands.insert_resource(save_data.to_game_state(&index_to_entity)); |
125 | | - } else { |
126 | | - // Even with empty index, we should still restore basic properties |
127 | | - let mut default_state = GameState::default(); |
128 | | - |
129 | | - // Only update turn number if turn order is not empty |
130 | | - if !save_data.game_state.turn_order_indices.is_empty() { |
131 | | - default_state.turn_number = save_data.game_state.turn_number; |
132 | | - } else { |
133 | | - debug!( |
134 | | - "Empty turn order detected when creating default state, keeping turn number unchanged" |
135 | | - ); |
136 | | - } |
137 | | - |
138 | | - commands.insert_resource(default_state); |
139 | | - warn!( |
140 | | - "No player entities found when loading game, using modified default state" |
141 | | - ); |
142 | | - } |
143 | | - } |
144 | | - |
145 | | - // Restore zone contents |
146 | | - if let Some(zone_manager) = &mut zones { |
147 | | - // Use the GameSaveData method to restore ZoneManager |
148 | | - **zone_manager = save_data.to_zone_manager(&index_to_entity); |
149 | | - } |
150 | | - |
151 | | - // Restore commander zone contents |
152 | | - if let Some(commander_manager) = &mut commanders { |
153 | | - // Use the GameSaveData method to restore CommandZoneManager |
154 | | - **commander_manager = save_data.to_commander_manager(&index_to_entity); |
155 | | - } |
| 48 | + // Apply the loaded state using the fully qualified path |
| 49 | + crate::game_engine::save::systems::utils::apply_game_state( |
| 50 | + &save_data, |
| 51 | + &mut game_state, |
| 52 | + &mut commands, |
| 53 | + &mut query_players, |
| 54 | + &mut zones, |
| 55 | + &mut commanders, |
| 56 | + ); |
156 | 57 |
|
157 | 58 | info!("Game loaded successfully from slot {}", event.slot_name); |
158 | 59 | } |
|
0 commit comments