| 213 | } |
| 214 | |
| 215 | void Game_Map::SetupFromSave( |
| 216 | std::unique_ptr<lcf::rpg::Map> map_in, |
| 217 | lcf::rpg::SaveMapInfo save_map, |
| 218 | lcf::rpg::SaveVehicleLocation save_boat, |
| 219 | lcf::rpg::SaveVehicleLocation save_ship, |
| 220 | lcf::rpg::SaveVehicleLocation save_airship, |
| 221 | lcf::rpg::SaveEventExecState save_fg_exec, |
| 222 | lcf::rpg::SavePanorama save_pan, |
| 223 | std::vector<lcf::rpg::SaveCommonEvent> save_ce) { |
| 224 | |
| 225 | map = std::move(map_in); |
| 226 | map_info = std::move(save_map); |
| 227 | panorama = std::move(save_pan); |
| 228 | |
| 229 | SetupCommon(); |
| 230 | |
| 231 | const bool is_db_save_compat = Main_Data::game_player->IsDatabaseCompatibleWithSave(lcf::Data::system.save_count); |
| 232 | const bool is_map_save_compat = Main_Data::game_player->IsMapCompatibleWithSave(GetMapSaveCount()); |
| 233 | |
| 234 | InitCommonEvents(); |
| 235 | |
| 236 | if (is_db_save_compat && is_map_save_compat) { |
| 237 | for (size_t i = 0; i < std::min(save_ce.size(), common_events.size()); ++i) { |
| 238 | common_events[i].SetSaveData(save_ce[i].parallel_event_execstate); |
| 239 | } |
| 240 | } |
| 241 | |
| 242 | if (is_map_save_compat) { |
| 243 | std::vector<int> destroyed_event_ids; |
| 244 | |
| 245 | for (size_t i = 0, j = 0; i < events.size() && j < map_info.events.size(); ++i) { |
| 246 | auto& ev = events[i]; |
| 247 | auto& save_ev = map_info.events[j]; |
| 248 | if (ev.GetId() == save_ev.ID) { |
| 249 | ev.SetSaveData(save_ev); |
| 250 | ++j; |
| 251 | } else { |
| 252 | if (save_ev.ID > ev.GetId()) { |
| 253 | // assume that the event has been destroyed during gameplay via "DestroyMapEvent" |
| 254 | destroyed_event_ids.emplace_back(ev.GetId()); |
| 255 | } else { |
| 256 | Output::Debug("SetupFromSave: Unexpected ID {}/{}", save_ev.ID, ev.GetId()); |
| 257 | } |
| 258 | } |
| 259 | } |
| 260 | for (size_t i = 0; i < destroyed_event_ids.size(); ++i) { |
| 261 | DestroyMapEvent(destroyed_event_ids[i], true); |
| 262 | } |
| 263 | if (destroyed_event_ids.size() > 0) { |
| 264 | UpdateUnderlyingEventReferences(); |
| 265 | } |
| 266 | } |
| 267 | |
| 268 | // Handle cloned events in a separate loop, regardless of "is_map_save_compat" |
| 269 | if (Player::HasEasyRpgExtensions()) { |
| 270 | for (size_t i = 0; i < map_info.events.size(); ++i) { |
| 271 | auto& save_ev = map_info.events[i]; |
| 272 | bool is_cloned_evt = save_ev.easyrpg_clone_map_id > 0 || save_ev.easyrpg_clone_event_id > 0; |
no test coverage detected