summaryrefslogtreecommitdiffhomepage
path: root/serialize/world-reader.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'serialize/world-reader.cpp')
-rw-r--r--serialize/world-reader.cpp38
1 files changed, 22 insertions, 16 deletions
diff --git a/serialize/world-reader.cpp b/serialize/world-reader.cpp
index d3954b09..f90acbd6 100644
--- a/serialize/world-reader.cpp
+++ b/serialize/world-reader.cpp
@@ -27,7 +27,7 @@ struct reader_state final {
private:
using reader_t = binary_reader<decltype(ArrayView<const char>{}.cbegin())>;
- const std::shared_ptr<tile_atlas>& lookup_atlas(atlasid id);
+ StringView lookup_atlas(atlasid id);
const scenery_proto& lookup_scenery(atlasid id);
StringView lookup_string(uint32_t idx);
void read_atlases(reader_t& reader);
@@ -38,7 +38,7 @@ private:
std::vector<String> strings;
std::vector<scenery_proto> sceneries;
- std::vector<std::shared_ptr<tile_atlas>> atlases;
+ std::vector<String> atlases;
world* _world;
uint16_t PROTO = proto_version;
@@ -59,9 +59,7 @@ void reader_state::read_atlases(reader_t& s)
size[0] << s;
size[1] << s;
const auto& [buf, len] = s.read_asciiz_string<atlas_name_max>();
- auto atlas = loader.tile_atlas({buf, len});
- fm_soft_assert(size <= atlas->num_tiles2());
- atlases.push_back(std::move(atlas));
+ atlases.push_back({buf, len});
}
}
@@ -136,7 +134,7 @@ void reader_state::read_strings(reader_t& s)
}
}
-const std::shared_ptr<tile_atlas>& reader_state::lookup_atlas(atlasid id)
+StringView reader_state::lookup_atlas(atlasid id)
{
if (id < atlases.size())
return atlases[id];
@@ -202,7 +200,7 @@ void reader_state::read_chunks(reader_t& s)
tile_ref t = c[i];
using uchar = uint8_t;
- const auto make_atlas = [&]() -> tile_image_proto {
+ const auto make_atlas = [&]<typename T>() -> image_proto_<T> {
atlasid id;
if (PROTO < 8) [[unlikely]]
id = flags & meta_short_atlasid_ ? atlasid{s.read<uchar>()} : s.read<atlasid>();
@@ -215,21 +213,29 @@ void reader_state::read_chunks(reader_t& s)
v = flags & meta_short_variant_
? s.read<uint8_t>()
: uint8_t(s.read<uint16_t>());
- auto atlas = lookup_atlas(id);
- fm_soft_assert(v < atlas->num_tiles());
- return { atlas, v };
+ auto name = lookup_atlas(id);
+ if constexpr(std::is_same_v<tile_atlas, T>)
+ {
+ auto atlas = loader.tile_atlas(name);
+ fm_soft_assert(v < atlas->num_tiles());
+ return { atlas, v };
+ }
+ else if (std::is_same_v<wall_atlas, T>)
+ {
+ auto atlas = loader.wall_atlas(name, true);
+ return { atlas, v };
+ }
+ else
+ std::unreachable();
};
SET_CHUNK_SIZE();
//t.passability() = pass_mode(flags & pass_mask);
if (flags & meta_ground)
- t.ground() = make_atlas();
- // todo!
-#if 0
+ t.ground() = make_atlas.operator()<tile_atlas>();
if (flags & meta_wall_n)
- t.wall_north() = make_atlas();
+ t.wall_north() = make_atlas.operator()<wall_atlas>();
if (flags & meta_wall_w)
- t.wall_west() = make_atlas();
-#endif
+ t.wall_west() = make_atlas.operator()<wall_atlas>();
if (PROTO >= 3 && PROTO < 8) [[unlikely]]
if (flags & meta_scenery_)
read_old_scenery(s, ch, i);