summaryrefslogtreecommitdiffhomepage
path: root/loader/json.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'loader/json.cpp')
-rw-r--r--loader/json.cpp33
1 files changed, 28 insertions, 5 deletions
diff --git a/loader/json.cpp b/loader/json.cpp
index 1a698a38..710792f8 100644
--- a/loader/json.cpp
+++ b/loader/json.cpp
@@ -1,8 +1,10 @@
#include "impl.hpp"
+#include "compat/assert.hpp"
#include "serialize/json-helper.hpp"
#include "serialize/anim.hpp"
#include "serialize/tile-atlas.hpp"
#include "serialize/scenery.hpp"
+#include "loader/scenery.hpp"
#include <Corrade/Utility/Path.h>
namespace floormat::loader_detail {
@@ -12,6 +14,32 @@ anim_def loader_impl::deserialize_anim(StringView filename)
return json_helper::from_json<anim_def>(filename);
}
+const std::vector<serialized_scenery>& loader_impl::sceneries()
+{
+ if (!sceneries_array.empty())
+ return sceneries_array;
+
+ sceneries_array = json_helper::from_json<std::vector<serialized_scenery>>(Path::join(SCENERY_PATH, "scenery.json"));
+ 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;
+ }
+ return sceneries_array;
+}
+
+const scenery_proto& loader_impl::scenery(StringView name)
+{
+ if (sceneries_array.empty())
+ (void)sceneries();
+ auto it = sceneries_map.find(name);
+ if (it == sceneries_map.end())
+ fm_abort("no such scenery: '%s'", name.data());
+ return it->second->proto;
+}
+
} // namespace floormat::loader_detail
namespace floormat {
@@ -21,9 +49,4 @@ std::vector<std::shared_ptr<struct tile_atlas>> loader_::tile_atlases(StringView
return json_helper::from_json<std::vector<std::shared_ptr<struct tile_atlas>>>(Path::join(loader_::IMAGE_PATH, filename));
}
-std::vector<Serialize::serialized_scenery> loader_::sceneries()
-{
- return json_helper::from_json<std::vector<Serialize::serialized_scenery>>(Path::join(SCENERY_PATH, "scenery.json"));
-}
-
} // namespace floormat