diff options
author | Stanislaw Halik <sthalik@misaki.pl> | 2024-01-12 01:35:13 +0100 |
---|---|---|
committer | Stanislaw Halik <sthalik@misaki.pl> | 2024-01-12 01:35:13 +0100 |
commit | a9ffceeffb98f0f5628d3ad347a4e3dbc93b66f3 (patch) | |
tree | 9230f569162473b4196e4ef1d848e87c993743e4 | |
parent | 692edd513bce851a988b0f04209adc480e48fe1f (diff) |
a
-rw-r--r-- | serialize/world-impl.hpp | 6 | ||||
-rw-r--r-- | serialize/world-reader.cpp | 20 | ||||
-rw-r--r-- | serialize/world-writer.cpp | 6 | ||||
-rw-r--r-- | src/object-type.hpp | 3 | ||||
-rw-r--r-- | src/scenery.hpp | 3 |
5 files changed, 22 insertions, 16 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]; diff --git a/src/object-type.hpp b/src/object-type.hpp index 3a6a92e9..8c84c31a 100644 --- a/src/object-type.hpp +++ b/src/object-type.hpp @@ -3,8 +3,7 @@ namespace floormat { enum class object_type : unsigned char { - none, critter, scenery, light, + none, critter, scenery, light, COUNT, }; -constexpr inline size_t object_type_BITS = 3; } // namespace floormat diff --git a/src/scenery.hpp b/src/scenery.hpp index 05b0683a..bd51db8c 100644 --- a/src/scenery.hpp +++ b/src/scenery.hpp @@ -17,11 +17,10 @@ enum class scenery_type : unsigned char { none, generic, door, // todo remove it }; -constexpr inline size_t scenery_type_BITS = 3; struct scenery_proto : object_proto { - scenery_type sc_type : scenery_type_BITS = scenery_type::none; + scenery_type sc_type = scenery_type::none; unsigned char active : 1 = false; unsigned char closing : 1 = false; unsigned char interactive : 1 = false; |