summaryrefslogtreecommitdiffhomepage
path: root/serialize
diff options
context:
space:
mode:
authorStanislaw Halik <sthalik@misaki.pl>2024-01-22 19:46:08 +0100
committerStanislaw Halik <sthalik@misaki.pl>2024-01-22 19:46:44 +0100
commit99300bd3efa2faa7cc6140bf41db6469d858a279 (patch)
tree75a9fae2c65997f15be8d4d8fb1ca920623ccc35 /serialize
parent9c1a08bc9b6ca03f7fad7a4ddf80ca356a67a181 (diff)
w
Diffstat (limited to 'serialize')
-rw-r--r--serialize/savegame.cpp31
1 files changed, 25 insertions, 6 deletions
diff --git a/serialize/savegame.cpp b/serialize/savegame.cpp
index ffeb5f9f..5b77b3f1 100644
--- a/serialize/savegame.cpp
+++ b/serialize/savegame.cpp
@@ -198,14 +198,33 @@ struct visitor_
{
auto sc_type = obj.sc_type;
do_visit(sc_type, f);
+ obj.sc_type = sc_type;
+
+ constexpr struct {
+ uint8_t bits;
+ bool(*getter)(const scenery&);
+ void(*setter)(scenery&, bool);
+ } pairs[] = {
+ { 1 << 0,
+ [](const scenery& sc) { return !!sc.active; },
+ [](scenery& sc, bool value) { sc.active = value; }
+ },
+ { 1 << 1,
+ [](const scenery& sc) { return !!sc.closing; },
+ [](scenery& sc, bool value) { sc.closing = value; }
+ },
+ { 1 << 2,
+ [](const scenery& sc) { return !!sc.interactive; },
+ [](scenery& sc, bool value) { sc.interactive = value; }
+ },
+ };
+
uint8_t flags = 0;
- flags |= obj.active * (1 << 0);
- flags |= obj.closing * (1 << 1);
- flags |= obj.interactive * (1 << 2);
+ for (auto [bits, getter, setter] : pairs)
+ flags |= bits * getter(obj);
do_visit(flags, f);
- obj.active = flags & (1 << 0);
- obj.closing = flags & (1 << 1);
- obj.interactive = flags & (1 << 2);
+ for (auto [bits, getter, setter] : pairs)
+ setter(obj, flags & bits);
}
template<typename F> void visit(light& obj, F&& f)