From 125db3bc5cd5064b7fa6c4f4a7be418fabbb51a8 Mon Sep 17 00:00:00 2001 From: Deukhoofd Date: Sat, 20 Nov 2021 09:55:09 +0100 Subject: [PATCH] Update for pkmnlib reworks --- BuildAbilities.cpp | 61 ++++++++++++++++++++++++++++++++++++++++++++++ BuildAbilities.hpp | 11 +++++++++ BuildLibrary.cpp | 14 ++++++++--- BuildSpecies.cpp | 20 ++++++++++----- BuildSpecies.hpp | 2 ++ 5 files changed, 98 insertions(+), 10 deletions(-) create mode 100644 BuildAbilities.cpp create mode 100644 BuildAbilities.hpp diff --git a/BuildAbilities.cpp b/BuildAbilities.cpp new file mode 100644 index 0000000..865b5fc --- /dev/null +++ b/BuildAbilities.cpp @@ -0,0 +1,61 @@ +#include "BuildAbilities.hpp" +#include "../../extern/json.hpp" +using json = nlohmann::json; + +#define GET(o, objectKey, key) \ + auto& _##objectKey = o[#objectKey]; \ + if (_##objectKey.is_null()) { \ + auto errorKeyFunc = [=]() { return key; }; \ + std::cout << "Failed to retrieve key '" << #objectKey << "' for object with key '" << errorKeyFunc() << path \ + << "'\n"; \ + return nullptr; \ + } + +CreatureLib::Library::TalentLibrary* BuildAbilities::Build(const std::string& path) { + std::ifstream fileStream(path.c_str()); + if (fileStream.fail()) { + std::cout << "Failed to load Abilities data file at '" << path << "'\n"; + return nullptr; + } + + auto lib = new CreatureLib::Library::TalentLibrary(); + json j; + fileStream >> j; + for (const auto& i : j.items()) { + if (i.key().starts_with("$")) { + continue; + } + auto& val = i.value(); + auto _effect = val["effect"]; + auto _parameters = val["parameters"]; + + ArbUt::StringView effectName = ""_cnc; + if (!_effect.empty()) { + effectName = ArbUt::StringView(_effect.get().c_str(), _effect.get().length()); + } + ArbUt::List realParameters; + if (!_parameters.empty()) { + for (auto& kv : _parameters.items()) { + auto& p = kv.value(); + auto t = p.type(); + switch (t) { + case json::value_t::boolean: + realParameters.Append(new CreatureLib::Library::EffectParameter(p.get())); + break; + case json::value_t::number_integer: + case json::value_t::number_unsigned: + realParameters.Append(new CreatureLib::Library::EffectParameter(p.get())); + break; + case json::value_t::number_float: + realParameters.Append(new CreatureLib::Library::EffectParameter(p.get())); + break; + default: continue; + } + } + } + + auto key = ArbUt::StringView(i.key().c_str(), i.key().length()); + lib->Insert(key, new CreatureLib::Library::Talent(key, effectName, realParameters)); + } + return lib; +} diff --git a/BuildAbilities.hpp b/BuildAbilities.hpp new file mode 100644 index 0000000..5778bb8 --- /dev/null +++ b/BuildAbilities.hpp @@ -0,0 +1,11 @@ +#ifndef PKMNLIB_AI_BUILDABILITIES_HPP +#define PKMNLIB_AI_BUILDABILITIES_HPP + +#include + +class BuildAbilities { +public: + static CreatureLib::Library::TalentLibrary* Build(const std::string& path); +}; + +#endif // PKMNLIB_AI_BUILDABILITIES_HPP diff --git a/BuildLibrary.cpp b/BuildLibrary.cpp index 2e1641f..31ed2f7 100644 --- a/BuildLibrary.cpp +++ b/BuildLibrary.cpp @@ -1,11 +1,13 @@ #include "BuildLibrary.hpp" #include +#include "BuildAbilities.hpp" using namespace PkmnLib::Battling; size_t TypeTimeMs; size_t NaturesTimeMs; size_t MovesTimeMs; +size_t AbilitiesTimeMs; size_t SpeciesTimeMs; size_t ItemsTimeMs; size_t GrowthRateTimeMs; @@ -40,9 +42,12 @@ BattleLibrary* BuildLibrary::Build(const std::string& pathString, MovesTimeMs = std::chrono::duration_cast(std::chrono::steady_clock::now() - begin).count(); begin = std::chrono::steady_clock::now(); + auto* talentsLibraries = BuildAbilities::Build((path / "Abilities.json").generic_string()); + AbilitiesTimeMs = + std::chrono::duration_cast(std::chrono::steady_clock::now() - begin).count(); - auto* speciesLibrary = - BuildSpecies::BuildLibrary((path / "Pokemon.json").generic_string(), typesLibrary, movesLibrary); + auto* speciesLibrary = BuildSpecies::BuildLibrary((path / "Pokemon.json").generic_string(), typesLibrary, + talentsLibraries, movesLibrary); SpeciesTimeMs = std::chrono::duration_cast(std::chrono::steady_clock::now() - begin).count(); begin = std::chrono::steady_clock::now(); @@ -64,8 +69,9 @@ BattleLibrary* BuildLibrary::Build(const std::string& pathString, } auto settings = new PkmnLib::Library::LibrarySettings(100, 4, 4096); - auto staticLibrary = new PkmnLib::Library::PokemonLibrary(settings, speciesLibrary, movesLibrary, itemsLibrary, - growthRates, typesLibrary, natureLibrary); + auto staticLibrary = + new PkmnLib::Library::PokemonLibrary(settings, speciesLibrary, movesLibrary, itemsLibrary, growthRates, + typesLibrary, talentsLibraries, natureLibrary); begin = std::chrono::steady_clock::now(); auto scriptResolver = BattleLibrary::CreateScriptResolver(); diff --git a/BuildSpecies.cpp b/BuildSpecies.cpp index cd2ad9f..1f0e815 100644 --- a/BuildSpecies.cpp +++ b/BuildSpecies.cpp @@ -13,6 +13,7 @@ PkmnLib::Library::SpeciesLibrary* BuildSpecies::BuildLibrary(const std::string& path, const CreatureLib::Library::TypeLibrary* types, + const CreatureLib::Library::TalentLibrary* talentLibrary, const PkmnLib::Library::MoveLibrary* moveLibrary) { std::ifstream fileStream(path.c_str()); if (fileStream.fail()) { @@ -50,7 +51,7 @@ PkmnLib::Library::SpeciesLibrary* BuildSpecies::BuildLibrary(const std::string& auto& defaultForme = _formes["default"]; if (!defaultForme.is_null()) { - auto forme = BuildForme("default", defaultForme, it.key(), path, types, moveLibrary); + auto forme = BuildForme("default", defaultForme, it.key(), path, types, talentLibrary, moveLibrary); species = new PkmnLib::Library::PokemonSpecies( _id.get(), ArbUt::StringView(_species.get().c_str()), forme, _genderRatio.get() / static_cast(100), @@ -62,7 +63,7 @@ PkmnLib::Library::SpeciesLibrary* BuildSpecies::BuildLibrary(const std::string& if (formeIt.key() == "default") { continue; } - auto forme = BuildForme(formeIt.key(), formeIt.value(), it.key(), path, types, moveLibrary); + auto forme = BuildForme(formeIt.key(), formeIt.value(), it.key(), path, types, talentLibrary, moveLibrary); if (forme == nullptr) return nullptr; if (species == nullptr) { @@ -110,6 +111,7 @@ inline void BuildLevelMove(const json& levelMoveObj, const PkmnLib::Library::Mov const PkmnLib::Library::PokemonForme* BuildSpecies::BuildForme(const std::string& name, const json& forme, const std::string& baseKeyName, const std::string& path, const CreatureLib::Library::TypeLibrary* typeLibrary, + const CreatureLib::Library::TalentLibrary* talentLibrary, const PkmnLib::Library::MoveLibrary* moveLibrary) { GET(forme, abilities, baseKeyName + " -> " + name); GET(forme, hiddenAbilities, baseKeyName + " -> " + name); @@ -128,16 +130,22 @@ const PkmnLib::Library::PokemonForme* BuildSpecies::BuildForme(const std::string } auto stats = ParseStatistics(_baseStats); - auto abilities = ArbUt::List(_abilities.size()); + auto abilities = ArbUt::List>(_abilities.size()); for (const auto& ab : _abilities.items()) { auto s = ab.value().get(); - abilities.Append(ArbUt::StringView(s.c_str(), s.length())); + auto tryAbility = talentLibrary->TryGet(ArbUt::StringView(s.c_str(), s.length())); + if (!tryAbility.has_value()) + THROW("Unknown ability " << s); + abilities.Append(tryAbility.value()); } - auto hiddenAbilities = ArbUt::List(_hiddenAbilities.size()); + auto hiddenAbilities = ArbUt::List>(_hiddenAbilities.size()); for (const auto& ab : _hiddenAbilities.items()) { auto s = ab.value().get(); - hiddenAbilities.Append(ArbUt::StringView(s.c_str(), s.length())); + auto tryAbility = talentLibrary->TryGet(ArbUt::StringView(s.c_str(), s.length())); + if (!tryAbility.has_value()) + THROW("Unknown ability " << s); + hiddenAbilities.Append(tryAbility.value()); } auto moves = new PkmnLib::Library::LearnableMoves(100); diff --git a/BuildSpecies.hpp b/BuildSpecies.hpp index 92b25ca..fbfa50b 100644 --- a/BuildSpecies.hpp +++ b/BuildSpecies.hpp @@ -11,11 +11,13 @@ class BuildSpecies { static const PkmnLib::Library::PokemonForme* BuildForme(const std::string& name, const json& forme, const std::string& baseKeyName, const std::string& path, const CreatureLib::Library::TypeLibrary* typeLibrary, + const CreatureLib::Library::TalentLibrary* talentLibrary, const PkmnLib::Library::MoveLibrary* moveLibrary); public: static PkmnLib::Library::SpeciesLibrary* BuildLibrary(const std::string& path, const CreatureLib::Library::TypeLibrary* types, + const CreatureLib::Library::TalentLibrary* talentLibrary, const PkmnLib::Library::MoveLibrary* moveLibrary); };