From aceb0a84b4abaa4e631d317c6cd0d02b0aa0bdbd Mon Sep 17 00:00:00 2001 From: Stanislaw Halik Date: Thu, 8 Feb 2024 22:48:19 +0100 Subject: style issues --- loader/scenery.cpp | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 loader/scenery.cpp (limited to 'loader/scenery.cpp') diff --git a/loader/scenery.cpp b/loader/scenery.cpp new file mode 100644 index 00000000..d374571c --- /dev/null +++ b/loader/scenery.cpp @@ -0,0 +1,71 @@ +#include "impl.hpp" +#include "compat/assert.hpp" +#include "compat/exception.hpp" +#include "src/ground-atlas.hpp" +#include "serialize/json-helper.hpp" +#include "serialize/anim.hpp" +#include "serialize/scenery.hpp" +#include "loader/scenery.hpp" +#include "loader/anim-cell.hpp" +#include +#include + +namespace floormat { + +anim_def loader_::deserialize_anim_def(StringView filename) noexcept(false) +{ + return json_helper::from_json(filename); +} + +} // namespace floormat + +namespace floormat::loader_detail { + +void loader_impl::get_scenery_list() +{ + sceneries_array.clear(); + sceneries_array = json_helper::from_json>(Path::join(SCENERY_PATH, "scenery.json")); + + if constexpr(true) // todo! + { + auto proto = scenery_proto{}; + proto.atlas = make_invalid_anim_atlas().atlas; + proto.bbox_size = Vector2ub{20}; + proto.subtype = generic_scenery_proto{false, true}; + sceneries_array.push_back({ .name = INVALID, .proto = proto }); + } + + sceneries_map.clear(); + sceneries_map.reserve(sceneries_array.size() * 2); + + for (const serialized_scenery& s : sceneries_array) + { + if (sceneries_map.contains(s.name)) + fm_abort("duplicate scenery name '%s'", s.name.data()); + sceneries_map[s.name] = &s; + } + + fm_assert(!sceneries_map.empty()); +} + +ArrayView loader_impl::sceneries() +{ + if (sceneries_array.empty()) [[likely]] + get_scenery_list(); + fm_assert(!sceneries_array.empty()); + return sceneries_array; +} + +const scenery_proto& loader_impl::scenery(StringView name) noexcept(false) +{ + fm_soft_assert(check_atlas_name(name)); + if (sceneries_array.empty()) + get_scenery_list(); + fm_assert(!sceneries_array.empty()); + auto it = sceneries_map.find(name); + if (it == sceneries_map.end()) + fm_throw("no such scenery: '{}'"_cf, name); + return it->second->proto; +} + +} // namespace floormat::loader_detail -- cgit v1.2.3