From 77d72128017fb25875c13b2a235eb3c8cac3a4f8 Mon Sep 17 00:00:00 2001 From: Nat Quayle Nelson Date: Thu, 19 Jun 2025 18:33:16 -0500 Subject: [PATCH] undo/redo for town wandering monsters --- src/scenedit/scen.townout.cpp | 9 +++++++++ src/scenedit/scen.undo.cpp | 12 ++++++++++++ src/scenedit/scen.undo.hpp | 15 +++++++++++++++ 3 files changed, 36 insertions(+) diff --git a/src/scenedit/scen.townout.cpp b/src/scenedit/scen.townout.cpp index 43c9469e..f316c06c 100644 --- a/src/scenedit/scen.townout.cpp +++ b/src/scenedit/scen.townout.cpp @@ -1034,13 +1034,22 @@ void edit_advanced_town() { static bool save_town_wand(cDialog& me, std::string, eKeyMod) { if(!me.toast(true)) return true; + auto old_wandering = town->wandering; + auto old_wandering_locs = town->wandering_locs; + bool changed = false; for(int i = 0; i < town->wandering.size(); i++) { std::string base_id = "group" + std::to_string(i + 1) + "-monst"; for(int j = 0; j < 4; j++) { std::string id = base_id + std::to_string(j + 1); town->wandering[i].monst[j] = me[id].getTextAsNum(); + if(town->wandering[i].monst[j] != old_wandering[i].monst[j]) changed = true; } town->wandering_locs[i] = boost::lexical_cast(me["group" + std::to_string(i+1) + "-loc"].getText()); + if(town->wandering_locs[i] != old_wandering_locs[i]) changed = true; + } + if(changed){ + undo_list.add(action_ptr(new aEditTownWandering(cur_town, old_wandering, old_wandering_locs, town->wandering, town->wandering_locs))); + update_edit_menu(); } return true; } diff --git a/src/scenedit/scen.undo.cpp b/src/scenedit/scen.undo.cpp index a1db6a46..0cfbebc8 100644 --- a/src/scenedit/scen.undo.cpp +++ b/src/scenedit/scen.undo.cpp @@ -938,4 +938,16 @@ bool aEditTownDetails::undo_me() { bool aEditTownDetails::redo_me() { town_set_details(*scenario.towns[which], new_details); return true; +} + +bool aEditTownWandering::undo_me() { + scenario.towns[which]->wandering = old_wandering; + scenario.towns[which]->wandering_locs = old_wandering_locs; + return true; +} + +bool aEditTownWandering::redo_me() { + scenario.towns[which]->wandering = new_wandering; + scenario.towns[which]->wandering_locs = new_wandering_locs; + return true; } \ No newline at end of file diff --git a/src/scenedit/scen.undo.hpp b/src/scenedit/scen.undo.hpp index 0395daa9..77611fb3 100644 --- a/src/scenedit/scen.undo.hpp +++ b/src/scenedit/scen.undo.hpp @@ -594,4 +594,19 @@ public: cAction("Edit Town Details"), which(which), old_details(old_details), new_details(new_details) {} }; +class aEditTownWandering : public cAction { + size_t which; + std::array old_wandering; + std::array old_wandering_locs; + std::array new_wandering; + std::array new_wandering_locs; + bool undo_me() override; + bool redo_me() override; +public: + aEditTownWandering(size_t which, std::array old_wandering, std::array old_wandering_locs, + std::array new_wandering, std::array new_wandering_locs) : + cAction("Edit Town Wandering Monsters"), which(which), old_wandering(old_wandering), old_wandering_locs(old_wandering_locs), + new_wandering(new_wandering), new_wandering_locs(new_wandering_locs) {} +}; + #endif \ No newline at end of file