summaryrefslogtreecommitdiffhomepage
path: root/serialize/world-writer.cpp
diff options
context:
space:
mode:
authorStanislaw Halik <sthalik@misaki.pl>2023-04-08 22:20:20 +0200
committerStanislaw Halik <sthalik@misaki.pl>2023-04-08 22:20:20 +0200
commite301c700764f2eca2498c5e95e5cc44dab2f5b5c (patch)
treec0ae2582392799f294745933cb2858e6121c3bd4 /serialize/world-writer.cpp
parent9cca30206a8de348bde4bddfa8ae10bd35ea8b66 (diff)
serialize/save: add RLE for empty tiles
Diffstat (limited to 'serialize/world-writer.cpp')
-rw-r--r--serialize/world-writer.cpp18
1 files changed, 18 insertions, 0 deletions
diff --git a/serialize/world-writer.cpp b/serialize/world-writer.cpp
index ee955c47..8ffe1883 100644
--- a/serialize/world-writer.cpp
+++ b/serialize/world-writer.cpp
@@ -422,6 +422,24 @@ void writer_state::serialize_chunk(const chunk& c, chunk_coords_ coord)
auto img_n = maybe_intern_atlas(wall_north);
auto img_w = maybe_intern_atlas(wall_west);
+ if (img_g == null_atlas && img_n == null_atlas && img_w == null_atlas)
+ {
+ size_t j, max = std::min(TILE_COUNT, i + 0x80);
+ for (j = i+1; j < max; j++)
+ {
+ auto tile = c[j];
+ if (tile.ground_atlas || tile.wall_north_atlas || tile.wall_west_atlas)
+ break;
+ }
+ j -= i + 1;
+ fm_assert(j == (j & 0x7fuz));
+ i += j;
+ tilemeta flags = meta_rle | (tilemeta)j;
+ s << flags;
+
+ continue;
+ }
+
tilemeta flags = {};
flags |= meta_ground * (img_g != null_atlas);
flags |= meta_wall_n * (img_n != null_atlas);