#pragma once #include "json.hpp" #include #include #include #include #include #include namespace utils { nlohmann::json loadJson(const std::string& path); // Recursively loads all .json files under directory // If called multiple times with same directory, returns a cached result. std::vector loadAllJson(const std::string& directory); // looks up directory in settings. Returns element matching name. nlohmann::json loadJson(const std::string& type, const std::string& name); void saveJson(const nlohmann::json& data, const std::string& path); template std::shared_ptr loadDFromJson(const nlohmann::json& data) { try { return std::shared_ptr(new D(loadJson(data["type"], data["name"]), data)); } catch(std::exception& e) { // Covers errors in building the creature or fs traversal. // Fall back on the data passed in. return std::shared_ptr(new D(data, data)); } } template std::string join(Container parts, std::string joiner) { std::stringstream out; bool isFirst = true; for(std::string p : parts) { if(! isFirst) { out << joiner; } isFirst = false; out << p; } return out.str(); } const std::map cpValue { {"cp", 1}, {"sp", 10}, {"ep", 50}, {"gp", 100}, {"pp", 1000} }; // Accepts coins formatted "X Yp" where X is an integer and Y is any of c, s, e, g, p. int coins2copper(const std::string& coins); // Greedily selects highest coin values to minimize total number of coins // Returns a vector of pairs mapping coin type to coint std::vector> copper2coins(int coppers); std::string getCostString(int coppers); std::string toOrdinal(std::size_t number); }