summaryrefslogtreecommitdiffhomepage
path: root/serialize
diff options
context:
space:
mode:
authorStanislaw Halik <sthalik@misaki.pl>2023-04-08 23:14:23 +0200
committerStanislaw Halik <sthalik@misaki.pl>2023-04-08 23:20:24 +0200
commit4de7c85ce9793e0da6231411fe08bcb8376172fc (patch)
tree7c095cb1a37c0dbc8641bd95821c869c1afcb8ae /serialize
parente301c700764f2eca2498c5e95e5cc44dab2f5b5c (diff)
serialize/save: small cleanups
Diffstat (limited to 'serialize')
-rw-r--r--serialize/world-impl.hpp1
-rw-r--r--serialize/world-reader.cpp2
-rw-r--r--serialize/world-writer.cpp26
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)>;