Skip to content

Commit 29a8515

Browse files
authored
Merge pull request #3411 from florianessl/fix/CloneDestroyEventFixes
Several fixes for the CloneMapEvent/DestroyMapEvent commands
2 parents f906f27 + 1b865aa commit 29a8515

2 files changed

Lines changed: 47 additions & 5 deletions

File tree

src/game_interpreter.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5762,6 +5762,10 @@ bool Game_Interpreter::CommandEasyRpgDestroyMapEvent(lcf::rpg::EventCommand cons
57625762

57635763
int target_event = ValueOrVariable(com.parameters[0], com.parameters[1]);
57645764

5765+
if (target_event == 0 || target_event == Game_Character::CharThisEvent) {
5766+
target_event = GetThisEventId();
5767+
}
5768+
57655769
_async_op = AsyncOp::MakeDestroyMapEvent(target_event);
57665770

57675771
return true;

src/game_map.cpp

Lines changed: 43 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)