diff options
author | Stanislaw Halik <sthalik@misaki.pl> | 2023-04-08 23:14:23 +0200 |
---|---|---|
committer | Stanislaw Halik <sthalik@misaki.pl> | 2023-04-08 23:20:24 +0200 |
commit | 4de7c85ce9793e0da6231411fe08bcb8376172fc (patch) | |
tree | 7c095cb1a37c0dbc8641bd95821c869c1afcb8ae /serialize | |
parent | e301c700764f2eca2498c5e95e5cc44dab2f5b5c (diff) |
serialize/save: small cleanups
Diffstat (limited to 'serialize')
-rw-r--r-- | serialize/world-impl.hpp | 1 | ||||
-rw-r--r-- | serialize/world-reader.cpp | 2 | ||||
-rw-r--r-- | serialize/world-writer.cpp | 26 |
3 files changed, 15 insertions, 14 deletions
diff --git a/serialize/world-impl.hpp b/serialize/world-impl.hpp index ea7e8792..840cc6b3 100644 --- a/serialize/world-impl.hpp +++ b/serialize/world-impl.hpp @@ -24,6 +24,7 @@ * 9) Interned strings. * 10) Chunk Z level. * 11) RLE empty tiles. + * 12) Don't write entity name twice. */ namespace floormat { diff --git a/serialize/world-reader.cpp b/serialize/world-reader.cpp index 90b040f3..c481a7e6 100644 --- a/serialize/world-reader.cpp +++ b/serialize/world-reader.cpp @@ -37,7 +37,7 @@ private: std::vector<scenery_proto> sceneries; std::vector<std::shared_ptr<tile_atlas>> atlases; world* _world; - uint16_t PROTO = 0; + uint16_t PROTO = proto_version; }; reader_state::reader_state(world& world) noexcept : _world{&world} {} diff --git a/serialize/world-writer.cpp b/serialize/world-writer.cpp index 8ffe1883..3fa0bf2e 100644 --- a/serialize/world-writer.cpp +++ b/serialize/world-writer.cpp @@ -55,10 +55,10 @@ private: scenery_pair intern_scenery(const scenery& sc, bool create); uint32_t intern_string(StringView name); - void serialize_new_scenery(const chunk& c, writer_t& s); + void serialize_scenery(const chunk& c, writer_t& s); void serialize_chunk(const chunk& c, chunk_coords_ coord); void serialize_atlases(); - void serialize_scenery(); + void serialize_scenery_names(); void serialize_strings(); void load_scenery_1(const serialized_scenery& s); @@ -73,9 +73,9 @@ private: atlasid scenery_map_size = 0; }; -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 entity_size = std::max(sizeof(character), sizeof(scenery)) + character_name_max; +constexpr auto tile_size = sizeof(tilemeta) + (sizeof(atlasid) + sizeof(variant_t)) * 3; +constexpr auto chunkbuf_size = sizeof(chunk_magic) + sizeof(chunk_coords_) + tile_size * TILE_COUNT + sizeof(uint32_t); +constexpr auto entity_size = std::max(sizeof(character), sizeof(scenery)); writer_state::writer_state(const world& world) : _world{&world} { @@ -240,7 +240,7 @@ void writer_state::serialize_atlases() constexpr auto atlasbuf_size0 = sizeof(atlasid) + sizeof(scenery); constexpr auto atlasbuf_size1 = sizeof(uint8_t) + atlasbuf_size0*int_max<uint8_t> + atlas_name_max; -void writer_state::serialize_scenery() +void writer_state::serialize_scenery_names() { fm_assert(scenery_map_size < scenery_id_max); const size_t sz = scenery_map_size; @@ -316,7 +316,7 @@ void writer_state::serialize_strings() const auto def_char_bbox_size = character_proto{}.bbox_size; const auto def_char_pass = character_proto{}.pass; -void writer_state::serialize_new_scenery(const chunk& c, writer_t& s) +void writer_state::serialize_scenery(const chunk& c, writer_t& s) { const auto entity_count = (uint32_t)c.entities().size(); s << entity_count; @@ -324,6 +324,7 @@ void writer_state::serialize_new_scenery(const chunk& c, writer_t& s) for (const auto& e_ : c.entities()) { const auto& e = *e_; + fm_assert(s.bytes_written() + entity_size <= chunk_buf.size()); object_id oid = e.id; fm_assert((oid & ((object_id)1 << 60)-1) == oid); static_assert(entity_type_BITS == 3); @@ -402,7 +403,7 @@ 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(); - chunk_buf.resize(chunkbuf_size + es_size); + chunk_buf.resize(std::max(chunk_buf.size(), chunkbuf_size + es_size)); auto s = binary_writer{chunk_buf.begin()}; @@ -470,13 +471,12 @@ void writer_state::serialize_chunk(const chunk& c, chunk_coords_ coord) } } - serialize_new_scenery(c, s); + serialize_scenery(c, s); const auto nbytes = s.bytes_written(); fm_assert(nbytes <= chunkbuf_size); - chunk_buf.resize(nbytes); - chunk_bufs.push_back(std::move(chunk_buf)); + chunk_bufs.emplace_back(chunk_buf.cbegin(), chunk_buf.cbegin() + ptrdiff_t(nbytes)); chunk_buf.clear(); } @@ -516,10 +516,10 @@ 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); // todo + serialize_chunk(c, pos); } serialize_atlases(); - serialize_scenery(); + serialize_scenery_names(); serialize_strings(); using proto_t = std::decay_t<decltype(proto_version)>; |