summaryrefslogtreecommitdiffhomepage
path: root/serialize
diff options
context:
space:
mode:
authorStanislaw Halik <sthalik@misaki.pl>2024-01-12 01:35:13 +0100
committerStanislaw Halik <sthalik@misaki.pl>2024-01-12 01:35:13 +0100
commita9ffceeffb98f0f5628d3ad347a4e3dbc93b66f3 (patch)
tree9230f569162473b4196e4ef1d848e87c993743e4 /serialize
parent692edd513bce851a988b0f04209adc480e48fe1f (diff)
a
Diffstat (limited to 'serialize')
-rw-r--r--serialize/world-impl.hpp6
-rw-r--r--serialize/world-reader.cpp20
-rw-r--r--serialize/world-writer.cpp6
3 files changed, 20 insertions, 12 deletions
diff --git a/serialize/world-impl.hpp b/serialize/world-impl.hpp
index df0657ce..0ec1dee4 100644
--- a/serialize/world-impl.hpp
+++ b/serialize/world-impl.hpp
@@ -50,7 +50,7 @@ template<typename T> constexpr inline T int_max = std::numeric_limits<T>::max();
#define file_magic ".floormat.save"
-constexpr inline proto_t proto_version = 17;
+constexpr inline proto_t proto_version = 18;
constexpr inline size_t atlas_name_max = 128;
constexpr inline auto null_atlas = (atlasid)-1LL;
@@ -62,9 +62,7 @@ constexpr inline proto_t min_proto_version = 1;
constexpr inline auto chunk_magic = (uint16_t)~0xc0d3;
constexpr inline auto scenery_magic = (uint16_t)~0xb00b;
-using pass_mode_i = std::underlying_type_t<pass_mode>;
-constexpr inline pass_mode_i pass_mask = (1 << pass_mode_BITS)-1;
-using object_type_i = std::underlying_type_t<object_type>;
+constexpr inline auto pass_mask = (1 << pass_mode_BITS)-1;
template<typename T, size_t N, size_t off>
constexpr inline auto highbits = (T(1) << N)-1 << sizeof(T)*8-N-off;
diff --git a/serialize/world-reader.cpp b/serialize/world-reader.cpp
index 74023092..71d55cb7 100644
--- a/serialize/world-reader.cpp
+++ b/serialize/world-reader.cpp
@@ -250,10 +250,22 @@ void reader_state::read_chunks(reader_t& s)
for (auto i = 0uz; i < object_count; i++)
{
- object_id _id; _id << s;
- const auto oid = _id & lowbits<60, object_id>;
- fm_soft_assert(oid != 0);
- const auto type = object_type(_id >> 61);
+ object_id oid;
+ object_type type;
+ if (PROTO >= 18) [[likely]]
+ {
+ oid << s;
+ fm_soft_assert((oid & lowbits<collision_data_BITS, object_id>) == oid);
+ type = object_type(s.read<std::underlying_type_t<object_type>>());
+ fm_soft_assert(type < object_type::COUNT);
+ }
+ else
+ {
+ object_id _id; _id << s;
+ oid = _id & lowbits<60, object_id>;
+ fm_soft_assert(oid != 0);
+ type = object_type(_id >> 61);
+ }
const auto local = local_coords{s.read<uint8_t>()};
Vector2b offset;
diff --git a/serialize/world-writer.cpp b/serialize/world-writer.cpp
index 6dad7f07..6de452c2 100644
--- a/serialize/world-writer.cpp
+++ b/serialize/world-writer.cpp
@@ -185,7 +185,7 @@ template<typename T, object_subtype U>
void write_object_flags(binary_writer<T>& s, const U& e)
{
uint8_t flags = 0;
- auto pass = (pass_mode_i)e.pass;
+ auto pass = std::to_underlying(e.pass);
fm_assert((pass & pass_mask) == pass);
flags |= pass;
constexpr auto tag = object_type_<U>::value;
@@ -335,10 +335,8 @@ void writer_state::serialize_scenery(const chunk& c, writer_t& s)
object_id oid = e.id;
fm_assert((oid & lowbits<collision_data_BITS, object_id>) == e.id);
const auto type = e.type();
- const auto type_ = (object_type_i)type;
- fm_assert(type_ == (type_ & lowbits<object_type_BITS, object_type_i>));
- oid |= (object_id)type << 64 - object_type_BITS;
s << oid;
+ s << std::to_underlying(type);
const auto local = e.coord.local();
s << local.to_index();
s << e.offset[0];