summaryrefslogtreecommitdiffhomepage
path: root/anim
diff options
context:
space:
mode:
authorStanislaw Halik <sthalik@misaki.pl>2022-06-11 11:45:40 +0200
committerStanislaw Halik <sthalik@misaki.pl>2022-06-11 11:45:40 +0200
commita7187fa1a4d3f816c8ad2fc865a19b26a41d05f1 (patch)
tree5d76bcde66922ebd7baa7d777a013b13a682fe58 /anim
parenta22ae93a02226027ef3fa3dccb689e789fa59e90 (diff)
a
Diffstat (limited to 'anim')
-rw-r--r--anim/serialize.cpp67
-rw-r--r--anim/serialize.hpp18
2 files changed, 20 insertions, 65 deletions
diff --git a/anim/serialize.cpp b/anim/serialize.cpp
index 2a0b5a45..3aca6201 100644
--- a/anim/serialize.cpp
+++ b/anim/serialize.cpp
@@ -10,47 +10,9 @@
using Corrade::Utility::Debug;
using Corrade::Utility::Error;
-static constexpr
-std::pair<anim_direction, const char*> anim_direction_map[] = {
- { anim_direction::N, "n" },
- { anim_direction::NE, "ne" },
- { anim_direction::E, "e" },
- { anim_direction::SE, "se" },
- { anim_direction::S, "s" },
- { anim_direction::SW, "sw" },
- { anim_direction::W, "w" },
- { anim_direction::NW, "nw" },
-};
-
-const char* anim_group::direction_to_string(anim_direction group)
-{
- auto it = std::find_if(std::cbegin(anim_direction_map), std::cend(anim_direction_map),
- [=](const auto& pair) { return group == pair.first; });
- if (it != std::cend(anim_direction_map))
- return it->second;
- else
- return "(unknown)";
-}
-
-anim_direction anim_group::string_to_direction(const std::string& str)
-{
- auto it = std::find_if(std::cbegin(anim_direction_map), std::cend(anim_direction_map),
- [&](const auto& pair) { return str == pair.second; });
- if (it != std::cend(anim_direction_map))
- return it->first;
- else
- return (anim_direction)0;
-}
-
namespace nlohmann {
template<>
-struct adl_serializer<anim_direction> final {
- static void to_json(json& j, anim_direction x);
- static void from_json(const json& j, anim_direction& x);
-};
-
-template<>
struct adl_serializer<Magnum::Vector2i> final {
static void to_json(json& j, const Magnum::Vector2i& x);
static void from_json(const json& j, Magnum::Vector2i& x);
@@ -68,25 +30,13 @@ void adl_serializer<Magnum::Vector2i>::from_json(const json& j, Magnum::Vector2i
j.at("y").get_to(x[1]);
}
-#if 0
-void adl_serializer<anim_direction>::to_json(json& j, anim_direction x)
-{
- j = anim_group::direction_to_string(x);
-}
-
-void adl_serializer<anim_direction>::from_json(const json& j, anim_direction& x)
-{
- x = anim_group::string_to_direction(j);
-}
-#endif
-
} // namespace nlohmann
NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(anim_frame, ground, offset, size);
NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(anim_group, name, frames, ground);
NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(anim, name, nframes, actionframe, fps, groups);
-std::optional<anim> anim::from_json(const std::filesystem::path& pathname)
+std::tuple<anim, bool> anim::from_json(const std::filesystem::path& pathname)
{
using namespace nlohmann;
std::ifstream s;
@@ -95,7 +45,7 @@ std::optional<anim> anim::from_json(const std::filesystem::path& pathname)
s.open(pathname, std::ios_base::in);
} catch (const std::ios::failure& e) {
Error{} << "failed to open" << pathname << ':' << e.what();
- return std::nullopt;
+ return { {}, false };
}
anim ret;
try {
@@ -105,9 +55,9 @@ std::optional<anim> anim::from_json(const std::filesystem::path& pathname)
from_json(j, ret);
} catch (const std::exception& e) {
Error{} << "failed to parse" << pathname << ':' << e.what();
- return std::nullopt;
+ return { {}, false };
}
- return std::make_optional(std::move(ret));
+ return { std::move(ret), true };
}
bool anim::to_json(const std::filesystem::path& pathname)
@@ -122,8 +72,13 @@ bool anim::to_json(const std::filesystem::path& pathname)
Error{} << "failed to open" << pathname << "for writing:" << e.what();
return false;
}
- s << j.dump(4);
- s.flush();
+ try {
+ s << j.dump(4);
+ s.flush();
+ } catch (const std::exception& e) {
+ Error{} << "failed writing" << pathname << ':' << e.what();
+ return false;
+ }
return true;
}
diff --git a/anim/serialize.hpp b/anim/serialize.hpp
index 10fd9e18..8c049978 100644
--- a/anim/serialize.hpp
+++ b/anim/serialize.hpp
@@ -1,12 +1,15 @@
#pragma once
-#include "../defs.hpp"
+#include "defs.hpp"
+
#include <string>
#include <array>
#include <vector>
-#include <optional>
-#include <filesystem>
-#include <Magnum/Trade/ImageData.h>
+
+#include <Magnum/Magnum.h>
+#include <Magnum/Math/Vector2.h>
+
+namespace std::filesystem { class path; }
struct anim_frame final
{
@@ -24,15 +27,12 @@ struct anim_group final
std::string name;
std::vector<anim_frame> frames;
Magnum::Vector2i ground;
-
- static const char* direction_to_string(anim_direction group);
- static anim_direction string_to_direction(const std::string& str);
};
struct anim final
{
- static std::optional<anim> from_json(const std::filesystem::path& pathname);
- bool to_json(const std::filesystem::path& pathname);
+ static std::tuple<anim, bool> from_json(const std::filesystem::path& pathname);
+ [[nodiscard]] bool to_json(const std::filesystem::path& pathname);
static constexpr int default_fps = 24;
std::string name;