@@ -240,10 +240,46 @@ void Game_Map::SetupFromSave(
240240 }
241241
242242 if (is_map_save_compat) {
243- for (size_t i = 0 ; i < std::min (map->events .size (), map_info.events .size ()); ++i) {
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) {
244246 auto & ev = events[i];
245- ev.SetSaveData (map_info.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 ;
273+ if (is_cloned_evt && CloneMapEvent (
274+ save_ev.easyrpg_clone_map_id , save_ev.easyrpg_clone_event_id ,
275+ save_ev.position_x , save_ev.position_y ,
276+ save_ev.ID , " " )) { // FIXME: Customized event names for saved events aren't part of liblcf/SaveMapEvent at the moment & thus cannot be restored
277+ if (auto new_event = GetEvent (save_ev.ID ); new_event != nullptr ) {
278+ new_event->SetSaveData (save_ev);
279+ }
280+ }
246281 }
282+ UpdateUnderlyingEventReferences ();
247283 }
248284 map_info.events .clear ();
249285 interpreter->Clear ();
@@ -446,7 +482,7 @@ bool Game_Map::CloneMapEvent(int src_map_id, int src_event_id, int target_x, int
446482 }), new_event);
447483
448484 auto game_event = Game_Event (GetMapId (), &*insert_it);
449- game_event.data ()->easyrpg_clone_event_id = source_event-> ID ;
485+ game_event.data ()->easyrpg_clone_event_id = src_event_id ;
450486 game_event.data ()->easyrpg_clone_map_id = src_map_id;
451487
452488 events.insert (
@@ -459,8 +495,10 @@ bool Game_Map::CloneMapEvent(int src_map_id, int src_event_id, int target_x, int
459495 AddEventToCache (new_event);
460496
461497 Scene_Map* scene = (Scene_Map*)Scene::Find (Scene::Map).get ();
462- scene->spriteset ->Refresh ();
463- SetNeedRefresh (true );
498+ if (scene) {
499+ scene->spriteset ->Refresh ();
500+ SetNeedRefresh (true );
501+ }
464502
465503 return true ;
466504}
0 commit comments