diff --git a/src/jasper/modules/world/src/studio/worldobjectseteditor/commands/rmpalette.cpp b/src/jasper/modules/world/src/studio/worldobjectseteditor/commands/rmpalette.cpp index 812628d..657beeb 100644 --- a/src/jasper/modules/world/src/studio/worldobjectseteditor/commands/rmpalette.cpp +++ b/src/jasper/modules/world/src/studio/worldobjectseteditor/commands/rmpalette.cpp @@ -9,14 +9,30 @@ namespace jasper::world { -RmPalette::RmPalette(WorldObjectSet &doc, size_t rmIdx) noexcept: +RmPalette::RmPalette(WorldObjectSet &doc, size_t const rmIdx) noexcept: m_doc(doc), m_rmIdx(rmIdx) { + m_objUpdates.reserve(m_doc.objects.size()); + for (size_t i = 0; auto const&obj : m_doc.objects) { + if (obj.palBank >= m_rmIdx) { + auto const newPalBank = static_cast(obj.palBank == m_rmIdx ? + 0 : obj.palBank - 1); + m_objUpdates.emplace_back(ObjUpdate{ + .idx = i, + .oldPalBank = obj.palBank, + .newPalBank = newPalBank, + }); + } + ++i; + } } ox::Error RmPalette::redo() noexcept { m_pal = std::move(m_doc.palettes[m_rmIdx]); std::ignore = m_doc.palettes.erase(m_rmIdx); + for (auto const&u : m_objUpdates) { + m_doc.objects[u.idx].palBank = u.newPalBank; + } return {}; } @@ -26,6 +42,9 @@ ox::Error RmPalette::undo() noexcept { [](ox::FileAddress const&a, ox::FileAddress const&b) { return a.getPath().or_value("") < b.getPath().or_value(""); }); + for (auto const&u : m_objUpdates) { + m_doc.objects[u.idx].palBank = u.oldPalBank; + } return {}; } diff --git a/src/jasper/modules/world/src/studio/worldobjectseteditor/commands/rmpalette.hpp b/src/jasper/modules/world/src/studio/worldobjectseteditor/commands/rmpalette.hpp index 2ef1c34..4b9c5b9 100644 --- a/src/jasper/modules/world/src/studio/worldobjectseteditor/commands/rmpalette.hpp +++ b/src/jasper/modules/world/src/studio/worldobjectseteditor/commands/rmpalette.hpp @@ -17,6 +17,12 @@ class RmPalette: public studio::UndoCommand { WorldObjectSet &m_doc; ox::FileAddress m_pal; size_t const m_rmIdx = 0; + struct ObjUpdate { + size_t idx{}; + uint16_t oldPalBank{}; + uint16_t newPalBank{}; + }; + ox::Vector m_objUpdates; public: RmPalette(WorldObjectSet &doc, size_t rmIdx) noexcept; ox::Error redo() noexcept override;