summaryrefslogtreecommitdiffhomepage
path: root/serialize
diff options
context:
space:
mode:
Diffstat (limited to 'serialize')
-rw-r--r--serialize/world-impl.hpp3
-rw-r--r--serialize/world-reader.cpp8
-rw-r--r--serialize/world-writer.cpp10
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();