From dfa7e79ab2db26bf295f87d46ee0ca4691b6a506 Mon Sep 17 00:00:00 2001 From: Deukhoofd Date: Thu, 13 Feb 2020 11:50:01 +0100 Subject: [PATCH] Build Item library. --- conanfile.py | 2 +- src/BuildData/BuildItems.cpp | 56 ++++++++++++++++++++++++++++++++++ src/BuildData/BuildItems.hpp | 10 ++++++ src/BuildData/BuildMoves.cpp | 2 ++ src/BuildData/BuildSpecies.cpp | 2 ++ src/main.cpp | 13 +++++--- 6 files changed, 80 insertions(+), 5 deletions(-) create mode 100644 src/BuildData/BuildItems.cpp create mode 100644 src/BuildData/BuildItems.hpp diff --git a/conanfile.py b/conanfile.py index 4316c2e..a6e08b2 100644 --- a/conanfile.py +++ b/conanfile.py @@ -26,4 +26,4 @@ class PkmnLibConan(ConanFile): self.copy("*.dll", "bin", "bin") def requirements(self): - self.requires("PkmnLib/c91b1b09061f8e063aa37afe9ac2465479683f8e@pkmnlib/master") + self.requires("PkmnLib/eeedbdac030b9dc72b5e70b215f4fe7173a42f46@pkmnlib/master") diff --git a/src/BuildData/BuildItems.cpp b/src/BuildData/BuildItems.cpp new file mode 100644 index 0000000..fefa62d --- /dev/null +++ b/src/BuildData/BuildItems.cpp @@ -0,0 +1,56 @@ +#include "BuildItems.hpp" +#include +#include +#include "../../extern/json.hpp" +using json = nlohmann::json; + +#define GET(o, objectKey, key) \ + auto _##objectKey = o[#objectKey]; \ + if (_##objectKey.is_null()) { \ + std::cout << "Failed to retrieve key '" << #objectKey << "' for object with value '" << key << "' in file '" \ + << path << "'\n"; \ + return nullptr; \ + } + +static CreatureLib::Library::ItemCategory ParseItemCategory(std::string& in){ + std::transform(in.begin(),in.end(),in.end(), tolower); + if (in == "item") return CreatureLib::Library::ItemCategory::MiscItem; + if (in == "medicine") return CreatureLib::Library::ItemCategory::Medicine; + if (in == "berry") return CreatureLib::Library::ItemCategory::Berry; + if (in == "mail") return CreatureLib::Library::ItemCategory::Mail; + if (in == "key") return CreatureLib::Library::ItemCategory::KeyItem; + if (in == "pokeball") return CreatureLib::Library::ItemCategory::CaptureDevice; + if (in == "tm") return CreatureLib::Library::ItemCategory::MoveLearner; + std::cout << "Unknown Item Type: '" << in <<"'\n"; + return static_cast(255); +} + +PkmnLib::Library::ItemLibrary* BuildItems::Build(const std::string& path) { + std::ifstream fileStream(path.c_str()); + if (fileStream.fail()) { + std::cout << "Failed to load Move data file at '" << path << "'\n"; + return nullptr; + } + auto lib = new PkmnLib::Library::ItemLibrary(); + json j; + fileStream >> j; + for (auto i : j.items()) { + auto val = i.value(); + GET(val, name, i); + GET(val, itemType, i); + GET(val, flags, i); + GET(val, price, i); + GET(val, flingPower, i); + auto itemTypeStr = _itemType.get(); + CreatureLib::Library::ItemCategory itemType = ParseItemCategory(itemTypeStr); + if (static_cast(itemType) == 255) return nullptr; + + auto item = new PkmnLib::Library::Item( + _name.get(), itemType, CreatureLib::Library::BattleItemCategory::None, _price.get(), + _flags.get>(), _flingPower.get()); + lib->LoadItem(item->GetName(), item); + } + return lib; +} + +#undef GET \ No newline at end of file diff --git a/src/BuildData/BuildItems.hpp b/src/BuildData/BuildItems.hpp new file mode 100644 index 0000000..82b18e2 --- /dev/null +++ b/src/BuildData/BuildItems.hpp @@ -0,0 +1,10 @@ +#ifndef GEN7TESTS_BUILDITEMS_HPP +#define GEN7TESTS_BUILDITEMS_HPP + +#include +class BuildItems { +public: + static PkmnLib::Library::ItemLibrary* Build(const std::string& path); +}; + +#endif // GEN7TESTS_BUILDITEMS_HPP diff --git a/src/BuildData/BuildMoves.cpp b/src/BuildData/BuildMoves.cpp index e049382..b517a73 100644 --- a/src/BuildData/BuildMoves.cpp +++ b/src/BuildData/BuildMoves.cpp @@ -67,3 +67,5 @@ PkmnLib::Library::MoveLibrary* BuildMoves::Build(const std::string& path, return lib; } + +#undef GET \ No newline at end of file diff --git a/src/BuildData/BuildSpecies.cpp b/src/BuildData/BuildSpecies.cpp index 0e84d30..6d37e39 100644 --- a/src/BuildData/BuildSpecies.cpp +++ b/src/BuildData/BuildSpecies.cpp @@ -102,3 +102,5 @@ const PkmnLib::Library::PokemonForme* BuildSpecies::BuildForme(const std::string name, _height.get(), _weight.get(), _baseExp.get(), types, stats, _abilities.get>(), _hiddenAbilities.get>(), nullptr); } + +#undef GET \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 758a6ea..bc82fe3 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,5 +1,6 @@ #define CATCH_CONFIG_RUNNER #include "../extern/catch.hpp" +#include "BuildData/BuildItems.hpp" #include "BuildData/BuildMoves.hpp" #include "BuildData/BuildNatures.hpp" #include "BuildData/BuildSpecies.hpp" @@ -13,12 +14,14 @@ int main(int argc, char* argv[]) { std::string naturesFile = "Natures.csv"; std::string pokemonFile = "Pokemon.json"; std::string moveFile = "Moves.json"; + std::string itemsFile = "Items.json"; using namespace Catch::clara; auto cli = session.cli() | Opt(pokemonFile, "Species")["--species"]("Which species file to load.") | Opt(typesFile, "Types")["--types"]("Which Types file to load.") | - Opt(naturesFile, "Natures")["--natures"]("Which Natures file to load."); - Opt(moveFile, "Moves")["--moves"]("Which Moves file to load."); + Opt(naturesFile, "Natures")["--natures"]("Which Natures file to load.") | + Opt(moveFile, "Moves")["--moves"]("Which Moves file to load.") | + Opt(itemsFile, "Items")["--items"]("Which Items file to load."); session.cli(cli); @@ -30,12 +33,14 @@ int main(int argc, char* argv[]) { auto natureLibrary = BuildNatures::Build(naturesFile); auto speciesLibrary = BuildSpecies::BuildLibrary(pokemonFile, typesLibrary); auto movesLibrary = BuildMoves::Build(moveFile, typesLibrary); + auto itemsLibrary = BuildItems::Build(itemsFile); - if (typesLibrary == nullptr || speciesLibrary == nullptr || natureLibrary == nullptr || movesLibrary == nullptr) + if (typesLibrary == nullptr || speciesLibrary == nullptr || natureLibrary == nullptr || movesLibrary == nullptr || + itemsLibrary == nullptr) return 1; auto settings = new PkmnLib::Library::LibrarySettings(100, 4, 4096); - auto library = new PkmnLib::Library::PokemonLibrary(settings, speciesLibrary, movesLibrary, nullptr, nullptr, + auto library = new PkmnLib::Library::PokemonLibrary(settings, speciesLibrary, movesLibrary, itemsLibrary, nullptr, typesLibrary, natureLibrary); Library::SetStaticLib(library);