From 694b069876aaa8ac2d8af67a6a71b88e4cdcda4d Mon Sep 17 00:00:00 2001 From: Stanislaw Halik Date: Fri, 22 Dec 2023 17:08:59 +0100 Subject: a --- serialize/world-reader.cpp | 38 ++++++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 16 deletions(-) (limited to 'serialize/world-reader.cpp') 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{}.cbegin())>; - const std::shared_ptr& 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 strings; std::vector sceneries; - std::vector> atlases; + std::vector 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(); - 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& 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 = [&]() -> image_proto_ { atlasid id; if (PROTO < 8) [[unlikely]] id = flags & meta_short_atlasid_ ? atlasid{s.read()} : s.read(); @@ -215,21 +213,29 @@ void reader_state::read_chunks(reader_t& s) v = flags & meta_short_variant_ ? s.read() : uint8_t(s.read()); - 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) + { + auto atlas = loader.tile_atlas(name); + fm_soft_assert(v < atlas->num_tiles()); + return { atlas, v }; + } + else if (std::is_same_v) + { + 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()(); if (flags & meta_wall_n) - t.wall_north() = make_atlas(); + t.wall_north() = make_atlas.operator()(); if (flags & meta_wall_w) - t.wall_west() = make_atlas(); -#endif + t.wall_west() = make_atlas.operator()(); if (PROTO >= 3 && PROTO < 8) [[unlikely]] if (flags & meta_scenery_) read_old_scenery(s, ch, i); -- cgit v1.2.3