diff options
Diffstat (limited to 'serialize')
-rw-r--r-- | serialize/world-impl.hpp | 3 | ||||
-rw-r--r-- | serialize/world-reader.cpp | 8 | ||||
-rw-r--r-- | serialize/world-writer.cpp | 10 |
3 files changed, 13 insertions, 8 deletions
diff --git a/serialize/world-impl.hpp b/serialize/world-impl.hpp index b44ec6b4..a869e022 100644 --- a/serialize/world-impl.hpp +++ b/serialize/world-impl.hpp @@ -22,6 +22,7 @@ * 7) Serialize scenery bbox_size offset. * 8) Entity subtypes. * 9) Interned strings. + * 10) Chunk Z level. */ namespace floormat { @@ -48,7 +49,7 @@ constexpr inline auto null_atlas = (atlasid)-1LL; constexpr inline size_t character_name_max = 128; constexpr inline size_t string_max = 512; -constexpr inline proto_t proto_version = 9; +constexpr inline proto_t proto_version = 10; constexpr inline proto_t min_proto_version = 1; constexpr inline auto chunk_magic = (uint16_t)~0xc0d3; constexpr inline auto scenery_magic = (uint16_t)~0xb00b; diff --git a/serialize/world-reader.cpp b/serialize/world-reader.cpp index 83a1d3f2..05add388 100644 --- a/serialize/world-reader.cpp +++ b/serialize/world-reader.cpp @@ -31,7 +31,7 @@ private: void read_sceneries(reader_t& reader); void read_strings(reader_t& reader); void read_chunks(reader_t& reader); - void read_old_scenery(reader_t& s, chunk_coords ch, size_t i); + void read_old_scenery(reader_t& s, chunk_coords_ ch, size_t i); std::vector<String> strings; std::vector<scenery_proto> sceneries; @@ -173,9 +173,11 @@ void reader_state::read_chunks(reader_t& s) magic << s; if (magic != chunk_magic) fm_throw("bad chunk magic"_cf); - chunk_coords ch; + chunk_coords_ ch; ch.x << s; ch.y << s; + if (PROTO >= 10) [[likely]] + ch.z << s; auto& c = (*_world)[ch]; c.mark_modified(); for (auto i = 0uz; i < TILE_COUNT; i++) @@ -311,7 +313,7 @@ void reader_state::read_chunks(reader_t& s) } } -void reader_state::read_old_scenery(reader_t& s, chunk_coords ch, size_t i) +void reader_state::read_old_scenery(reader_t& s, chunk_coords_ ch, size_t i) { atlasid id; id << s; const bool exact = id & meta_short_scenery_bit; diff --git a/serialize/world-writer.cpp b/serialize/world-writer.cpp index 5fe835bf..13751fc4 100644 --- a/serialize/world-writer.cpp +++ b/serialize/world-writer.cpp @@ -56,7 +56,7 @@ private: uint32_t intern_string(StringView name); void serialize_new_scenery(const chunk& c, writer_t& s); - void serialize_chunk(const chunk& c, chunk_coords coord); + void serialize_chunk(const chunk& c, chunk_coords_ coord); void serialize_atlases(); void serialize_scenery(); void serialize_strings(); @@ -74,7 +74,7 @@ private: }; constexpr auto tile_size = sizeof(tilemeta) + (sizeof(atlasid) + sizeof(variant_t)) * 3 + sizeof(scenery); -constexpr auto chunkbuf_size = sizeof(chunk_magic) + sizeof(chunk_coords) + tile_size * TILE_COUNT; +constexpr auto chunkbuf_size = sizeof(chunk_magic) + sizeof(chunk_coords_) + tile_size * TILE_COUNT; constexpr auto entity_size = std::max(sizeof(character), sizeof(scenery)) + character_name_max; writer_state::writer_state(const world& world) : _world{&world} @@ -398,7 +398,7 @@ void writer_state::serialize_new_scenery(const chunk& c, writer_t& s) } } -void writer_state::serialize_chunk(const chunk& c, chunk_coords coord) +void writer_state::serialize_chunk(const chunk& c, chunk_coords_ coord) { fm_assert(chunk_buf.empty()); const auto es_size = sizeof(uint32_t) + entity_size*c.entities().size(); @@ -407,6 +407,8 @@ void writer_state::serialize_chunk(const chunk& c, chunk_coords coord) auto s = binary_writer{chunk_buf.begin()}; s << chunk_magic << coord.x << coord.y; + fm_assert(coord.z >= -8 && coord.z < 8); + s << coord.z; for (auto i = 0uz; i < TILE_COUNT; i++) { @@ -496,7 +498,7 @@ ArrayView<const char> writer_state::serialize_world() if (c.empty(true)) fm_warn("chunk %hd:%hd is empty", pos.x, pos.y); #endif - serialize_chunk(c, pos); + serialize_chunk(c, pos); // todo } serialize_atlases(); serialize_scenery(); |