From 2659400a9753591b560a07ae7e368aa14655c481 Mon Sep 17 00:00:00 2001 From: Kp Date: Sat, 15 Jan 2022 20:39:10 +0000 Subject: [PATCH] Use sidenum_t for trigger::side --- common/main/switch.h | 5 ++-- similar/main/switch.cpp | 56 ++++++++++++++++++++++++++++++++++++++--- 2 files changed, 55 insertions(+), 6 deletions(-) diff --git a/common/main/switch.h b/common/main/switch.h index 54535c723..cc174a681 100644 --- a/common/main/switch.h +++ b/common/main/switch.h @@ -179,15 +179,14 @@ struct trigger : public prohibit_void_ptr { #if defined(DXX_BUILD_DESCENT_I) uint16_t flags; - uint16_t num_links; #elif defined(DXX_BUILD_DESCENT_II) trigger_action type; //what this trigger does trigger_behavior_flags flags; - uint8_t num_links; //how many doors, etc. linked to this #endif + uint8_t num_links; //how many doors, etc. linked to this fix value; std::array seg; - std::array side; + std::array side; }; } diff --git a/similar/main/switch.cpp b/similar/main/switch.cpp index b46e615e6..f7fcf010b 100644 --- a/similar/main/switch.cpp +++ b/similar/main/switch.cpp @@ -52,6 +52,7 @@ COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED. #include "physfs-serial.h" #include "d_levelstate.h" #include "d_underlying_value.h" +#include "d_zip.h" #include "compiler-range_for.h" #include "partial_range.h" @@ -689,7 +690,11 @@ static void v30_trigger_to_v31_trigger(trigger &t, const v30_trigger &trig) t.num_links = trig.num_links; t.value = trig.value; t.seg = trig.seg; - t.side = trig.side; + for (auto &&[w, r] : zip(t.side, trig.side)) + { + auto s = build_sidenum_from_untrusted(r); + w = s.value_or(sidenum_t::WLEFT); + } } static void v29_trigger_read_as_v30(PHYSFS_File *fp, v30_trigger &trig) @@ -722,11 +727,56 @@ void v30_trigger_read_as_v31(PHYSFS_File *fp, trigger &t) } #endif +namespace { + +template +struct serialize_wide_trigger_side_numbers +{ + array_type &side; + serialize_wide_trigger_side_numbers(array_type &t) : + side(t) + { + } +}; + +template +serial::message::value>> udt_to_message(const serialize_wide_trigger_side_numbers &); + +template +void process_udt(Accessor &accessor, serialize_wide_trigger_side_numbers wrapper) +{ + static_assert(std::is_const::value != std::is_const::value); + std::array a; + if constexpr (std::is_const::value) + { + /* The array is constant, so it is already initialized and + * should be written out. + */ + for (auto &&[w, r] : zip(a, wrapper.side)) + w = underlying_value(r); + process_buffer(accessor, a); + } + else + { + /* The array is non-constant, so it is initially undefined and + * should be read in. + */ + process_buffer(accessor, a); + for (auto &&[w, r] : zip(wrapper.side, a)) + { + auto s = build_sidenum_from_untrusted(r); + w = s.value_or(sidenum_t::WLEFT); + } + } +} + +} + #if defined(DXX_BUILD_DESCENT_I) -DEFINE_SERIAL_UDT_TO_MESSAGE(trigger, t, (serial::pad<1>(), t.flags, t.value, serial::pad<5>(), t.num_links, t.seg, t.side)); +DEFINE_SERIAL_UDT_TO_MESSAGE(trigger, t, (serial::pad<1>(), t.flags, t.value, serial::pad<5>(), t.num_links, serial::pad<1, 0>(), t.seg, serialize_wide_trigger_side_numbers{t.side})); ASSERT_SERIAL_UDT_MESSAGE_SIZE(trigger, 54); #elif defined(DXX_BUILD_DESCENT_II) -DEFINE_SERIAL_UDT_TO_MESSAGE(trigger, t, (t.type, t.flags, t.num_links, serial::pad<1>(), t.value, serial::pad<4>(), t.seg, t.side)); +DEFINE_SERIAL_UDT_TO_MESSAGE(trigger, t, (t.type, t.flags, t.num_links, serial::pad<1>(), t.value, serial::pad<4>(), t.seg, serialize_wide_trigger_side_numbers{t.side})); ASSERT_SERIAL_UDT_MESSAGE_SIZE(trigger, 52); #endif