summaryrefslogtreecommitdiffhomepage
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
parent692edd513bce851a988b0f04209adc480e48fe1f (diff)
a
-rw-r--r--serialize/world-impl.hpp6
-rw-r--r--serialize/world-reader.cpp20
-rw-r--r--serialize/world-writer.cpp6
-rw-r--r--src/object-type.hpp3
-rw-r--r--src/scenery.hpp3
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;