From 270a1ddbb91995c501fcd407045bf1fc4324ea15 Mon Sep 17 00:00:00 2001 From: Stanislaw Halik Date: Wed, 6 Mar 2024 16:04:38 +0100 Subject: src/object: switch delta to 32-bit --- serialize/old-savegame.cpp | 34 ++++++++++++++++++++++++++++------ serialize/savegame.cpp | 12 ++++++++++-- src/critter.cpp | 2 +- src/object.hpp | 5 +++-- test/save/quicksave - Copy (0039).dat | Bin 0 -> 8415 bytes 5 files changed, 42 insertions(+), 11 deletions(-) create mode 100644 test/save/quicksave - Copy (0039).dat diff --git a/serialize/old-savegame.cpp b/serialize/old-savegame.cpp index bee5662d..8159419b 100644 --- a/serialize/old-savegame.cpp +++ b/serialize/old-savegame.cpp @@ -471,12 +471,18 @@ void reader_state::read_chunks(reader_t& s) if (const auto* val = std::get_if(&sc.subtype)) { if (val->active) - sc.delta << s; + { + uint16_t delta_; delta_ << s; + sc.delta = uint32_t(sc.delta) * 65536u; + } } else if (const auto* val = std::get_if(&sc.subtype)) { if (val->active) - sc.delta << s; + { + uint16_t delta_; delta_ << s; + sc.delta = uint32_t(sc.delta) * 65536u; + } } } auto e = _world->make_object(oid, {ch, local}, sc); @@ -581,9 +587,17 @@ void reader_state::read_old_scenery(reader_t& s, chunk_coords_ ch, size_t i) if (val->active) { if (PROTO >= 4) [[likely]] - sc.delta << s; + { + uint16_t delta_; + delta_ << s; + sc.delta = uint32_t(delta_) * 65536u; + } else - sc.delta = (uint16_t)Math::clamp(int(s.read() * 65535), 0, 65535); + { + auto x = (double)s.read(); + fm_soft_assert(x >= 0 && x <= 1); + sc.delta = (uint32_t)(x * (uint32_t)-1); + } } } else if (auto* val = std::get_if(&sc.subtype)) @@ -591,9 +605,17 @@ void reader_state::read_old_scenery(reader_t& s, chunk_coords_ ch, size_t i) if (val->active) { if (PROTO >= 4) [[likely]] - sc.delta << s; + { + uint16_t delta_; + delta_ << s; + sc.delta = uint32_t(delta_) * 65536u; + } else - sc.delta = (uint16_t)Math::clamp(int(s.read() * 65535), 0, 65535); + { + auto x = (double)s.read(); + fm_soft_assert(x >= 0 && x <= 1); + sc.delta = (uint32_t)(x * (uint32_t)-1); + } } } } diff --git a/serialize/savegame.cpp b/serialize/savegame.cpp index 0fb3c4b1..6442ba6f 100644 --- a/serialize/savegame.cpp +++ b/serialize/savegame.cpp @@ -109,8 +109,9 @@ struct visitor_ // 20: complete rewrite // 21: oops, forgot the object counter // 22: add object::speed + // 23: switch object::delta to 32-bit - static constexpr inline proto_t proto_version = 22; + static constexpr inline proto_t proto_version = 23; const proto_t& PROTO; visitor_(const proto_t& proto) : PROTO{proto} {} @@ -176,7 +177,14 @@ struct visitor_ do_visit_nonconst(obj.offset, f); do_visit_nonconst(obj.bbox_offset, f); do_visit_nonconst(obj.bbox_size, f); - do_visit_nonconst(obj.delta, f); + if (PROTO >= 23) [[likely]] + do_visit_nonconst(obj.delta, f); + else + { + auto delta_ = uint16_t(obj.delta >> 16); + do_visit(delta_, f); + obj.delta = delta_ * 65536u; + } do_visit_nonconst(obj.frame, f); do_visit_nonconst(obj.r, f); do_visit_nonconst(obj.pass, f); diff --git a/src/critter.cpp b/src/critter.cpp index abb80865..72c06133 100644 --- a/src/critter.cpp +++ b/src/critter.cpp @@ -157,7 +157,7 @@ void critter::update_movement(size_t i, Ns dt, rotation new_r) fm_assert(is_dynamic()); const auto hz = atlas->info().fps; - const auto nframes = alloc_frame_time(dt, delta, hz, speed); + const auto nframes = alloc_frame_time(dt, delta, hz, speed); if (nframes == 0) return; diff --git a/src/object.hpp b/src/object.hpp index b77b0f42..4ada39d4 100644 --- a/src/object.hpp +++ b/src/object.hpp @@ -21,7 +21,8 @@ struct object_proto std::shared_ptr atlas; Vector2b offset, bbox_offset; Vector2ub bbox_size = Vector2ub(tile_size_xy); - uint16_t delta = 0, frame = 0; + uint32_t delta = 0; + uint16_t frame = 0; object_type type : 3 = object_type::none; rotation r : rotation_BITS = rotation::N; pass_mode pass : pass_mode_BITS = pass_mode::see_through; // todo move to struct scenery, add inherit bit @@ -47,7 +48,7 @@ struct object const global_coords coord; const Vector2b offset, bbox_offset; const Vector2ub bbox_size; - uint16_t delta = 0; // todo! switch to Vector2ui due to `allocate_frame_time' + uint32_t delta = 0; uint16_t frame = 0; const rotation r = rotation::N; // todo remove bitfield? const pass_mode pass = pass_mode::see_through; diff --git a/test/save/quicksave - Copy (0039).dat b/test/save/quicksave - Copy (0039).dat new file mode 100644 index 00000000..fa2f9e99 Binary files /dev/null and b/test/save/quicksave - Copy (0039).dat differ -- cgit v1.2.3