From 99300bd3efa2faa7cc6140bf41db6469d858a279 Mon Sep 17 00:00:00 2001 From: Stanislaw Halik Date: Mon, 22 Jan 2024 19:46:08 +0100 Subject: w --- serialize/savegame.cpp | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) (limited to 'serialize') 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 void visit(light& obj, F&& f) -- cgit v1.2.3