diff options
author | Stanislaw Halik <sthalik@misaki.pl> | 2024-01-23 15:11:26 +0100 |
---|---|---|
committer | Stanislaw Halik <sthalik@misaki.pl> | 2024-01-23 15:11:26 +0100 |
commit | c554cdbc0cf894ccc6c330e0743649a4bdb34658 (patch) | |
tree | 80b5fa2e64136eb2740d9c9524daf92b8a447b3d /serialize/savegame.cpp | |
parent | 573f8f2bcbfd86119e00a13fedc5abf2bf7deafb (diff) |
a
Diffstat (limited to 'serialize/savegame.cpp')
-rw-r--r-- | serialize/savegame.cpp | 67 |
1 files changed, 48 insertions, 19 deletions
diff --git a/serialize/savegame.cpp b/serialize/savegame.cpp index e7d24195..a71118e8 100644 --- a/serialize/savegame.cpp +++ b/serialize/savegame.cpp @@ -148,7 +148,6 @@ struct visitor_ break; case object_type::scenery: case object_type::critter: - case object_type::door_new: static_cast<Derived&>(*this).visit(non_const(obj.atlas), atlas_type::anim, f); break; case object_type::none: @@ -172,11 +171,9 @@ struct visitor_ switch (type) { - case object_type::door_new: fm_assert(false && "todo"); case object_type::critter: do_visit(static_cast<critter&>(obj), f); return; case object_type::scenery: do_visit(static_cast<scenery&>(obj), f); return; case object_type::light: do_visit(static_cast<light&>(obj), f); return; - //case object_type::door: do_visit(static_cast<door&>(obj), f); return; case object_type::COUNT: case object_type::none: break; @@ -224,37 +221,71 @@ struct visitor_ setter(obj, flags & bits); } - template<typename F> void visit(scenery& obj, F&& f) + template<typename F> void visit(generic_scenery& s, F&& f) { - auto sc_type = obj.sc_type; - do_visit(sc_type, f); - obj.sc_type = sc_type; + constexpr struct { + uint8_t bits; + bool(*getter)(const generic_scenery&); + void(*setter)(generic_scenery&, bool); + } pairs[] = { + { 1 << 0, + [](const auto& sc) { return !!sc.active; }, + [](auto& sc, bool value) { sc.active = value; } + }, + { 1 << 2, + [](const auto& sc) { return !!sc.interactive; }, + [](auto& sc, bool value) { sc.interactive = value; } + }, + }; + uint8_t flags = 0; + for (auto [bits, getter, setter] : pairs) + flags |= bits * getter(s); + do_visit(flags, f); + for (auto [bits, getter, setter] : pairs) + setter(s, flags & bits); + } + + template<typename F> void visit(door_scenery& s, F&& f) + { constexpr struct { uint8_t bits; - bool(*getter)(const scenery&); - void(*setter)(scenery&, bool); + bool(*getter)(const door_scenery&); + void(*setter)(door_scenery&, bool); } pairs[] = { { 1 << 0, - [](const scenery& sc) { return !!sc.active; }, - [](scenery& sc, bool value) { sc.active = value; } + [](const auto& sc) { return !!sc.active; }, + [](auto& sc, bool value) { sc.active = value; } }, { 1 << 1, - [](const scenery& sc) { return !!sc.closing; }, - [](scenery& sc, bool value) { sc.closing = value; } + [](const auto& sc) { return !!sc.closing; }, + [](auto& sc, bool value) { sc.closing = value; } }, { 1 << 2, - [](const scenery& sc) { return !!sc.interactive; }, - [](scenery& sc, bool value) { sc.interactive = value; } + [](const auto& sc) { return !!sc.interactive; }, + [](auto& sc, bool value) { sc.interactive = value; } }, }; uint8_t flags = 0; for (auto [bits, getter, setter] : pairs) - flags |= bits * getter(obj); + flags |= bits * getter(s); do_visit(flags, f); for (auto [bits, getter, setter] : pairs) - setter(obj, flags & bits); + setter(s, flags & bits); + } + + template<typename F> void visit(scenery& obj, F&& f) + { + auto sc_type = obj.scenery_type(); + do_visit(sc_type, f); + if (sc_type != obj.scenery_type()) + obj.subtype = scenery::subtype_from_scenery_type(obj.id, *obj.c, sc_type); + + std::visit( + [&]<typename T>(T& x) { return do_visit(x, f); }, + obj.subtype + ); } template<typename F> void visit(light& obj, F&& f) @@ -738,8 +769,6 @@ struct reader final : visitor_<reader> case object_type::none: case object_type::COUNT: break; - case object_type::door_new: - fm_assert(false && "todo"); case object_type::light: obj = w.make_unconnected_object<light>(); goto ok; case object_type::critter: |