From 761714f2f59e75d231989df8a2f217a83d407a4c Mon Sep 17 00:00:00 2001 From: Deukhoofd Date: Sun, 28 Mar 2021 14:57:00 +0200 Subject: [PATCH] Updates to latest PkmnLib. --- CMakeLists.txt | 14 +++--- src/BuildData/BuildItems.cpp | 40 +++++++++++++-- src/BuildData/BuildMoves.cpp | 18 +++---- src/BuildData/BuildNatures.cpp | 2 +- src/BuildData/BuildSpecies.cpp | 46 ++++++++++------- src/BuildData/BuildSpecies.hpp | 1 + src/BuildData/BuildTypes.cpp | 6 +-- src/BuildData/GrowthRatesBuilder.cpp | 2 +- src/BuildData/GrowthRatesBuilder.hpp | 1 + src/LibraryTests/NaturesTests.cpp | 4 +- src/LibraryTests/SpeciesTests.cpp | 17 +++---- src/LibraryTests/TypeTests.cpp | 41 ++++++++------- src/Precompiled.hxx | 6 +++ src/ScriptTests/Macros/MoveMacros.hpp | 20 ++++---- src/ScriptTests/Moves/AMoves/Absorb.cpp | 4 +- src/ScriptTests/Moves/Struggle.cpp | 6 +-- src/main.cpp | 66 +++++++++++++------------ 17 files changed, 173 insertions(+), 121 deletions(-) create mode 100644 src/Precompiled.hxx diff --git a/CMakeLists.txt b/CMakeLists.txt index 617759a..20bbd93 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,7 +5,7 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Werror") project(Gen7Tests) -set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) if (NOT EXISTS ${CMAKE_BINARY_DIR}/conanbuildinfo.cmake) @@ -15,14 +15,14 @@ if (NOT EXISTS ${CMAKE_BINARY_DIR}/conanbuildinfo.cmake) list(GET VERSION_LIST 1 MINOR) if (NOT MINOR MATCHES 0) SET(VERSION ${VERSION}.${MINOR}) - endif() + endif () if (NOT WINDOWS) execute_process(COMMAND conan install ${CMAKE_SOURCE_DIR} --install-folder=${CMAKE_BINARY_DIR} --build missing -s compiler=clang -s compiler.libcxx=libstdc++11 -s compiler.version=${VERSION} -s build_type=Debug) - else() + else () execute_process(COMMAND conan install ${CMAKE_SOURCE_DIR} --install-folder=${CMAKE_BINARY_DIR} --build missing -s compiler=gcc -s compiler.libcxx=libstdc++11 -s compiler.version=${VERSION} -s os=Windows) - endif() + endif () endif () include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake) conan_basic_setup() @@ -30,7 +30,7 @@ conan_basic_setup() message(STATUS "Using Conan Libs:") foreach (_conanLib ${CONAN_LIBS}) message(STATUS "\t ${_conanLib}") -endforeach() +endforeach () SET(FILE_SOURCE "src/*.cpp" @@ -38,8 +38,10 @@ SET(FILE_SOURCE ) file(GLOB_RECURSE CORE_SRC_FILES ${FILE_SOURCE}) add_executable(Gen7Tests ${CORE_SRC_FILES}) +target_precompile_headers(Gen7Tests PUBLIC src/Precompiled.hxx) +add_definitions(-DLEVEL_U8) -SET(_LINKS CreatureLibLibrary CreatureLibBattling pkmnLib) +SET(_LINKS Arbutils CreatureLib pkmnLib) target_link_libraries(Gen7Tests PUBLIC ${_LINKS}) diff --git a/src/BuildData/BuildItems.cpp b/src/BuildData/BuildItems.cpp index ee8a479..a3b0c5d 100644 --- a/src/BuildData/BuildItems.cpp +++ b/src/BuildData/BuildItems.cpp @@ -41,7 +41,10 @@ PkmnLib::Library::ItemLibrary* BuildItems::Build(const std::string& path) { auto lib = new PkmnLib::Library::ItemLibrary(); json j; fileStream >> j; - for (auto i : j.items()) { + for (const auto& i : j.items()) { + if (i.key().starts_with("$")) { + continue; + } auto val = i.value(); GET(val, name, i); GET(val, itemType, i); @@ -55,12 +58,41 @@ PkmnLib::Library::ItemLibrary* BuildItems::Build(const std::string& path) { auto flags = std::unordered_set(); for (auto flagIndex : _flags.items()) { - flags.insert(Arbutils::CaseInsensitiveConstString::GetHash(flagIndex.value().get())); + flags.insert(ArbUt::StringView(flagIndex.value().get().c_str())); } - auto item = new PkmnLib::Library::Item(Arbutils::CaseInsensitiveConstString(_name.get()), itemType, + CreatureLib::Library::SecondaryEffect* effect = nullptr; + auto effectJson = val["effect"]; + if (effectJson != nullptr) { + auto effectName = effectJson["name"]; + auto parametersJson = effectJson["parameters"]; + ArbUt::List parameters; + if (parametersJson != nullptr) { + for (auto& kv : parametersJson.items()) { + auto& p = kv.value(); + auto t = p.type(); + switch (t) { + case json::value_t::boolean: + parameters.Append(new CreatureLib::Library::EffectParameter(p.get())); + break; + case json::value_t::number_integer: + case json::value_t::number_unsigned: + parameters.Append(new CreatureLib::Library::EffectParameter(p.get())); + break; + case json::value_t::number_float: + parameters.Append(new CreatureLib::Library::EffectParameter(p.get())); + break; + default: continue; + } + } + } + effect = new CreatureLib::Library::SecondaryEffect( + 100, ArbUt::StringView(effectName.get().c_str()), parameters); + } + + auto item = new PkmnLib::Library::Item(ArbUt::StringView(_name.get().c_str()), itemType, CreatureLib::Library::BattleItemCategory::None, _price.get(), - flags, _flingPower.get()); + effect, flags, _flingPower.get()); lib->Insert(item->GetName(), item); } return lib; diff --git a/src/BuildData/BuildMoves.cpp b/src/BuildData/BuildMoves.cpp index 7da4ac0..08dd5b4 100644 --- a/src/BuildData/BuildMoves.cpp +++ b/src/BuildData/BuildMoves.cpp @@ -33,7 +33,7 @@ PkmnLib::Library::MoveLibrary* BuildMoves::Build(const std::string& path, auto lib = new PkmnLib::Library::MoveLibrary(); json j; fileStream >> j; - for (auto i : j.items()) { + for (const auto& i : j["data"].items()) { auto val = i.value(); GET(val, name, i); GET(val, type, i); @@ -46,7 +46,7 @@ PkmnLib::Library::MoveLibrary* BuildMoves::Build(const std::string& path, GET(val, flags, i); if (_pp.get() == 0) continue; - auto type = types->GetTypeId(Arbutils::CaseInsensitiveConstString::GetHash(_type.get())); + auto type = types->GetTypeId(ArbUt::StringView(_type.get().c_str())); auto category = ParseCategory(_category.get()); if (static_cast(category) == 255) return nullptr; @@ -58,7 +58,7 @@ PkmnLib::Library::MoveLibrary* BuildMoves::Build(const std::string& path, } auto flags = std::unordered_set(); for (auto flagIndex : _flags.items()) { - flags.insert(Arbutils::CaseInsensitiveConstString::GetHash(flagIndex.value().get())); + flags.insert(ArbUt::StringView(flagIndex.value().get().c_str())); } CreatureLib::Library::SecondaryEffect* effect = nullptr; auto jsonEffect = val["effect"]; @@ -67,7 +67,7 @@ PkmnLib::Library::MoveLibrary* BuildMoves::Build(const std::string& path, auto chanceJson = jsonEffect["chance"]; auto parametersJson = jsonEffect["parameters"]; if (name != nullptr) { - List parameters; + ArbUt::List parameters; auto chance = -1.0f; if (chanceJson != nullptr) { chance = chanceJson.get(); @@ -93,18 +93,18 @@ PkmnLib::Library::MoveLibrary* BuildMoves::Build(const std::string& path, } } effect = new CreatureLib::Library::SecondaryEffect( - chance, Arbutils::CaseInsensitiveConstString(name.get()), parameters); + chance, ArbUt::StringView(name.get().c_str()), parameters); } } if (effect == nullptr) { effect = new CreatureLib::Library::SecondaryEffect(); } - auto move = new PkmnLib::Library::MoveData(Arbutils::CaseInsensitiveConstString(_name.get()), type, - category, _power.get(), _accuracy.get(), - _pp.get(), target, _priority.get(), effect, flags); + auto move = new PkmnLib::Library::MoveData(ArbUt::StringView(_name.get().c_str()), type, category, + _power.get(), _accuracy.get(), _pp.get(), + target, _priority.get(), effect, flags); - lib->Insert(Arbutils::CaseInsensitiveConstString(move->GetName()), move); + lib->Insert(ArbUt::StringView(move->GetName().c_str()), move); } return lib; diff --git a/src/BuildData/BuildNatures.cpp b/src/BuildData/BuildNatures.cpp index 6fc5474..e7c62a7 100644 --- a/src/BuildData/BuildNatures.cpp +++ b/src/BuildData/BuildNatures.cpp @@ -80,7 +80,7 @@ PkmnLib::Library::NatureLibrary* BuildNatures::Build(const std::string& path) { std::cout << "Registered nature with name '" << natureName << "'.\n"; library->LoadNature( - Arbutils::CaseInsensitiveConstString(natureName), + ArbUt::StringView(natureName.c_str()), new PkmnLib::Library::Nature(parsedIncreased, parsedDecreased, increasedModifier, decreasedModifier)); } return library; diff --git a/src/BuildData/BuildSpecies.cpp b/src/BuildData/BuildSpecies.cpp index 19fac0f..7f936d1 100644 --- a/src/BuildData/BuildSpecies.cpp +++ b/src/BuildData/BuildSpecies.cpp @@ -22,6 +22,9 @@ PkmnLib::Library::SpeciesLibrary* BuildSpecies::BuildLibrary(const std::string& fileStream >> j; for (json::iterator it = j.begin(); it != j.end(); ++it) { + if (it.key().starts_with("$")){ + continue; + } auto val = it.value(); GET(val, id, it.key()); GET(val, species, it.key()); @@ -38,14 +41,19 @@ PkmnLib::Library::SpeciesLibrary* BuildSpecies::BuildLibrary(const std::string& PkmnLib::Library::PokemonSpecies* species = nullptr; + ArbUt::List eggGroups; + for (const auto& eg : _eggGroups){ + eggGroups.Append(eg.get().c_str()); + } + auto defaultForme = _formes["default"]; if (!defaultForme.is_null()) { auto forme = BuildForme("default", defaultForme, it.key(), path, types); species = new PkmnLib::Library::PokemonSpecies( - _id.get(), Arbutils::CaseInsensitiveConstString(_species.get()), forme, + _id.get(), ArbUt::StringView(_species.get().c_str()), forme, _genderRatio.get() / static_cast(100), - Arbutils::CaseInsensitiveConstString(_growthRate.get()), _catchRate.get(), - _baseHappiness.get()); + ArbUt::StringView(_growthRate.get().c_str()), _catchRate.get(), + _baseHappiness.get(), eggGroups); } for (json::iterator formeIt = _formes.begin(); formeIt != _formes.end(); ++formeIt) { @@ -57,25 +65,25 @@ PkmnLib::Library::SpeciesLibrary* BuildSpecies::BuildLibrary(const std::string& return nullptr; if (species == nullptr) { species = new PkmnLib::Library::PokemonSpecies( - _id.get(), Arbutils::CaseInsensitiveConstString(_species.get()), forme, + _id.get(), ArbUt::StringView(_species.get().c_str()), forme, static_cast(_genderRatio.get()) / static_cast(100), - Arbutils::CaseInsensitiveConstString(_growthRate.get()), _catchRate.get(), - _baseHappiness.get()); + ArbUt::StringView(_growthRate.get().c_str()), _catchRate.get(), + _baseHappiness.get(), eggGroups); } else { - if (species->HasForme(Arbutils::CaseInsensitiveConstString(formeIt.key()))) { + if (species->HasForme(ArbUt::StringView(formeIt.key().c_str()))) { std::cout << "Species '" << it.key() << "' has duplicate forme '" << formeIt.key() << "'. Skipping.\n"; delete forme; continue; } - species->SetVariant(Arbutils::CaseInsensitiveConstString(formeIt.key()), forme); + species->SetVariant(ArbUt::StringView(formeIt.key().c_str()), forme); } } if (species == nullptr) { std::cout << "Pokemon with key '" << it.key() << "' does not have any formes.\n"; return nullptr; } - lib->Insert(Arbutils::CaseInsensitiveConstString(it.key()), species); + lib->Insert(ArbUt::StringView(it.key().c_str()), species); } return lib; } @@ -100,24 +108,24 @@ const PkmnLib::Library::PokemonForme* BuildSpecies::BuildForme(const std::string GET(forme, moves, baseKeyName << " -> " << name); auto typeStrings = _types.get>(); - auto types = List(typeStrings.size()); - for (auto i = 0; i < typeStrings.size(); i++) { - types[i] = typeLibrary->GetTypeId(Arbutils::CaseInsensitiveConstString::GetHash(typeStrings[i])); + auto types = ArbUt::List(typeStrings.size()); + for (size_t i = 0; i < typeStrings.size(); i++) { + types.Append(typeLibrary->GetTypeId(ArbUt::StringView(typeStrings[i].c_str()))); } auto stats = ParseStatistics(_baseStats); auto abilityStrings = _abilities.get>(); - auto abilities = List(abilityStrings.size()); - for (auto i = 0; i < abilityStrings.size(); i++) { - abilities[i] = Arbutils::CaseInsensitiveConstString(abilityStrings[i]); + auto abilities = ArbUt::List(abilityStrings.size()); + for (size_t i = 0; i < abilityStrings.size(); i++) { + abilities.Append(ArbUt::StringView(abilityStrings[i].c_str())); } auto hiddenAbilityStrings = _abilities.get>(); - auto hiddenAbilities = List(hiddenAbilityStrings.size()); - for (auto i = 0; i < hiddenAbilityStrings.size(); i++) { - hiddenAbilities[i] = Arbutils::CaseInsensitiveConstString(abilityStrings[i]); + auto hiddenAbilities = ArbUt::List(hiddenAbilityStrings.size()); + for (size_t i = 0; i < hiddenAbilityStrings.size(); i++) { + hiddenAbilities.Append(ArbUt::StringView(abilityStrings[i].c_str())); } - return new PkmnLib::Library::PokemonForme(Arbutils::CaseInsensitiveConstString(name), _height.get(), + return new PkmnLib::Library::PokemonForme(ArbUt::StringView(name.c_str()), _height.get(), _weight.get(), _baseExp.get(), types, stats, abilities, hiddenAbilities, nullptr); } diff --git a/src/BuildData/BuildSpecies.hpp b/src/BuildData/BuildSpecies.hpp index 0282c71..6cce334 100644 --- a/src/BuildData/BuildSpecies.hpp +++ b/src/BuildData/BuildSpecies.hpp @@ -1,5 +1,6 @@ #ifndef GEN7TESTS_BUILDSPECIES_HPP #define GEN7TESTS_BUILDSPECIES_HPP +#define LEVEL_U8 1 #include #include #include diff --git a/src/BuildData/BuildTypes.cpp b/src/BuildData/BuildTypes.cpp index 3869bb2..245bc7e 100644 --- a/src/BuildData/BuildTypes.cpp +++ b/src/BuildData/BuildTypes.cpp @@ -27,7 +27,7 @@ CreatureLib::Library::TypeLibrary* BuildTypes::Build(const std::string& path) { lastStart = i + 1; if (hasSkippedFirst) { std::cout << "Registered type: " << substr << "\n"; - auto val = library->RegisterType(Arbutils::CaseInsensitiveConstString::GetHash(substr)); + auto val = library->RegisterType(ArbUt::StringView(substr.c_str())); types.push_back(val); } else { hasSkippedFirst = true; @@ -37,7 +37,7 @@ CreatureLib::Library::TypeLibrary* BuildTypes::Build(const std::string& path) { } auto substr = line.substr(lastStart, line.length() - lastStart); std::cout << "Registered type: " << substr << "\n"; - auto val = library->RegisterType(Arbutils::CaseInsensitiveConstString::GetHash(substr)); + auto val = library->RegisterType(ArbUt::StringView(substr.c_str())); types.push_back(val); while (std::getline(file, line)) { @@ -55,7 +55,7 @@ CreatureLib::Library::TypeLibrary* BuildTypes::Build(const std::string& path) { current++; } else { gotType = true; - attackingType = library->GetTypeId(Arbutils::CaseInsensitiveConstString::GetHash(substr)); + attackingType = library->GetTypeId(ArbUt::StringView(substr.c_str())); } i++; } diff --git a/src/BuildData/GrowthRatesBuilder.cpp b/src/BuildData/GrowthRatesBuilder.cpp index dae98bb..368a1b2 100644 --- a/src/BuildData/GrowthRatesBuilder.cpp +++ b/src/BuildData/GrowthRatesBuilder.cpp @@ -17,7 +17,7 @@ CreatureLib::Library::GrowthRateLibrary* GrowthRatesBuilder::Build(const std::st for (const auto& i : j.items()) { const auto& name = i.key(); auto values = i.value(); - lib->AddGrowthRate(Arbutils::CaseInsensitiveConstString(name), + lib->AddGrowthRate(ArbUt::StringView(name.c_str()), new LookupGrowthRate(values.get>())); } diff --git a/src/BuildData/GrowthRatesBuilder.hpp b/src/BuildData/GrowthRatesBuilder.hpp index 5b53f90..7bf1576 100644 --- a/src/BuildData/GrowthRatesBuilder.hpp +++ b/src/BuildData/GrowthRatesBuilder.hpp @@ -1,6 +1,7 @@ #ifndef GEN7TESTS_GROWTHRATESBUILDER_HPP #define GEN7TESTS_GROWTHRATESBUILDER_HPP +#define LEVEL_U8 1 #include #include #include diff --git a/src/LibraryTests/NaturesTests.cpp b/src/LibraryTests/NaturesTests.cpp index 491b62c..54f44b6 100644 --- a/src/LibraryTests/NaturesTests.cpp +++ b/src/LibraryTests/NaturesTests.cpp @@ -3,14 +3,14 @@ #define CHECK_NATURE_NEUTRAL(name) \ { \ - auto nature = natureLib->GetNatureByName(Arbutils::CaseInsensitiveConstString(#name)); \ + auto nature = natureLib->GetNatureByName(ArbUt::StringView(#name)); \ CHECK(nature->GetIncreaseModifier() == Approx(1.0)); \ CHECK(nature->GetDecreaseModifier() == Approx(1.0)); \ } #define CHECK_NATURE(name, increasedStat, decreasedStat) \ { \ - auto nature = natureLib->GetNatureByName(Arbutils::CaseInsensitiveConstString(#name)); \ + auto nature = natureLib->GetNatureByName(ArbUt::StringView(#name)); \ CHECK(nature->GetIncreasedStat() == PkmnLib::Library::Statistic::increasedStat); \ CHECK(nature->GetDecreasedStat() == PkmnLib::Library::Statistic::decreasedStat); \ CHECK(nature->GetIncreaseModifier() == Approx(1.1)); \ diff --git a/src/LibraryTests/SpeciesTests.cpp b/src/LibraryTests/SpeciesTests.cpp index f37c97c..5724a21 100644 --- a/src/LibraryTests/SpeciesTests.cpp +++ b/src/LibraryTests/SpeciesTests.cpp @@ -1,9 +1,8 @@ #include "../../extern/catch.hpp" #include "../Library.hpp" -#define ENSURE_SPECIES_EXISTS(species) \ - CHECK(library->GetSpeciesLibrary()->Get(Arbutils::CaseInsensitiveConstString(#species))->GetName() == #species); - +#define ENSURE_SPECIES_EXISTS(species) \ + CHECK(library->GetSpeciesLibrary()->Get(ArbUt::StringView(#species))->GetName() == #species); TEST_CASE("Species - Ensure relevant species exist", "[species]") { auto library = Library::GetLibrary(); @@ -18,9 +17,9 @@ TEST_CASE("Species - Ensure species count is valid", "[species]") { TEST_CASE("Species - Ensure each species has a default forme", "[species]") { auto library = Library::GetLibrary(); - auto iterator = library->GetSpeciesLibrary()->GetIterator(); size_t i = 0; - for (const auto& v: iterator){ + auto& lib = library->GetSpeciesLibrary(); + for (const auto& v : *lib) { REQUIRE(v.second->HasVariant("default"_cnc.GetHash())); CHECK(v.second->GetVariant("default"_cnc.GetHash())->GetName() == "default"); i++; @@ -30,11 +29,11 @@ TEST_CASE("Species - Ensure each species has a default forme", "[species]") { TEST_CASE("Species - Ensure each forme has abilities", "[species]") { auto library = Library::GetLibrary(); - auto iterator = library->GetSpeciesLibrary()->GetIterator(); size_t i = 0; - for (const auto& v: iterator){ - for (const auto& forme: v.second->GetVariantsIterator()){ - auto abilities = forme.second->GetTalents(); + auto& lib = library->GetSpeciesLibrary(); + for (const auto& v : *lib) { + for (const auto& forme : v.second->GetVariantsIterator()) { + auto abilities = forme->GetTalents(); CHECK(abilities.Count() != 0); } i++; diff --git a/src/LibraryTests/TypeTests.cpp b/src/LibraryTests/TypeTests.cpp index a19e6c3..bb1f3ec 100644 --- a/src/LibraryTests/TypeTests.cpp +++ b/src/LibraryTests/TypeTests.cpp @@ -2,12 +2,11 @@ #include "../Library.hpp" #define CHECK_EFFECTIVENESS(attack, defense, expected) \ - CHECK(typeLib->GetSingleEffectiveness( \ - typeLib->GetTypeId(Arbutils::CaseInsensitiveConstString::GetHash(#attack)), \ - typeLib->GetTypeId(Arbutils::CaseInsensitiveConstString::GetHash(#defense))) == expected); + CHECK(typeLib->GetSingleEffectiveness(typeLib->GetTypeId(ArbUt::StringView(#attack)), \ + typeLib->GetTypeId(ArbUt::StringView(#defense))) == expected); TEST_CASE("Type Effectiveness - Normal Attacking", "[type]") { - auto typeLib = Library::GetStaticLib()->GetTypeLibrary(); + auto& typeLib = Library::GetStaticLib()->GetTypeLibrary(); CHECK_EFFECTIVENESS(Normal, Normal, 1); CHECK_EFFECTIVENESS(Normal, Fighting, 1); CHECK_EFFECTIVENESS(Normal, Flying, 1); @@ -29,7 +28,7 @@ TEST_CASE("Type Effectiveness - Normal Attacking", "[type]") { } TEST_CASE("Type Effectiveness - Fighting Attacking", "[type]") { - auto typeLib = Library::GetStaticLib()->GetTypeLibrary(); + auto& typeLib = Library::GetStaticLib()->GetTypeLibrary(); CHECK_EFFECTIVENESS(Fighting, Normal, 2); CHECK_EFFECTIVENESS(Fighting, Fighting, 1); CHECK_EFFECTIVENESS(Fighting, Flying, 0.5); @@ -51,7 +50,7 @@ TEST_CASE("Type Effectiveness - Fighting Attacking", "[type]") { } TEST_CASE("Type Effectiveness - Flying Attacking", "[type]") { - auto typeLib = Library::GetStaticLib()->GetTypeLibrary(); + auto& typeLib = Library::GetStaticLib()->GetTypeLibrary(); CHECK_EFFECTIVENESS(Flying, Normal, 1); CHECK_EFFECTIVENESS(Flying, Fighting, 2); CHECK_EFFECTIVENESS(Flying, Flying, 1); @@ -73,7 +72,7 @@ TEST_CASE("Type Effectiveness - Flying Attacking", "[type]") { } TEST_CASE("Type Effectiveness - Poison Attacking", "[type]") { - auto typeLib = Library::GetStaticLib()->GetTypeLibrary(); + auto& typeLib = Library::GetStaticLib()->GetTypeLibrary(); CHECK_EFFECTIVENESS(Poison, Normal, 1); CHECK_EFFECTIVENESS(Poison, Fighting, 1); CHECK_EFFECTIVENESS(Poison, Flying, 1); @@ -95,7 +94,7 @@ TEST_CASE("Type Effectiveness - Poison Attacking", "[type]") { } TEST_CASE("Type Effectiveness - Ground Attacking", "[type]") { - auto typeLib = Library::GetStaticLib()->GetTypeLibrary(); + auto& typeLib = Library::GetStaticLib()->GetTypeLibrary(); CHECK_EFFECTIVENESS(Ground, Normal, 1); CHECK_EFFECTIVENESS(Ground, Fighting, 1); CHECK_EFFECTIVENESS(Ground, Flying, 0); @@ -117,7 +116,7 @@ TEST_CASE("Type Effectiveness - Ground Attacking", "[type]") { } TEST_CASE("Type Effectiveness - Rock Attacking", "[type]") { - auto typeLib = Library::GetStaticLib()->GetTypeLibrary(); + auto& typeLib = Library::GetStaticLib()->GetTypeLibrary(); CHECK_EFFECTIVENESS(Rock, Normal, 1); CHECK_EFFECTIVENESS(Rock, Fighting, 0.5); CHECK_EFFECTIVENESS(Rock, Flying, 2); @@ -139,7 +138,7 @@ TEST_CASE("Type Effectiveness - Rock Attacking", "[type]") { } TEST_CASE("Type Effectiveness - Bug Attacking", "[type]") { - auto typeLib = Library::GetStaticLib()->GetTypeLibrary(); + auto& typeLib = Library::GetStaticLib()->GetTypeLibrary(); CHECK_EFFECTIVENESS(Bug, Normal, 1); CHECK_EFFECTIVENESS(Bug, Fighting, 0.5); CHECK_EFFECTIVENESS(Bug, Flying, 0.5); @@ -161,7 +160,7 @@ TEST_CASE("Type Effectiveness - Bug Attacking", "[type]") { } TEST_CASE("Type Effectiveness - Ghost Attacking", "[type]") { - auto typeLib = Library::GetStaticLib()->GetTypeLibrary(); + auto& typeLib = Library::GetStaticLib()->GetTypeLibrary(); CHECK_EFFECTIVENESS(Ghost, Normal, 0); CHECK_EFFECTIVENESS(Ghost, Fighting, 1); CHECK_EFFECTIVENESS(Ghost, Flying, 1); @@ -183,7 +182,7 @@ TEST_CASE("Type Effectiveness - Ghost Attacking", "[type]") { } TEST_CASE("Type Effectiveness - Steel Attacking", "[type]") { - auto typeLib = Library::GetStaticLib()->GetTypeLibrary(); + auto& typeLib = Library::GetStaticLib()->GetTypeLibrary(); CHECK_EFFECTIVENESS(Steel, Normal, 1); CHECK_EFFECTIVENESS(Steel, Fighting, 1); CHECK_EFFECTIVENESS(Steel, Flying, 1); @@ -205,7 +204,7 @@ TEST_CASE("Type Effectiveness - Steel Attacking", "[type]") { } TEST_CASE("Type Effectiveness - Fire Attacking", "[type]") { - auto typeLib = Library::GetStaticLib()->GetTypeLibrary(); + auto& typeLib = Library::GetStaticLib()->GetTypeLibrary(); CHECK_EFFECTIVENESS(Fire, Normal, 1); CHECK_EFFECTIVENESS(Fire, Fighting, 1); CHECK_EFFECTIVENESS(Fire, Flying, 1); @@ -227,7 +226,7 @@ TEST_CASE("Type Effectiveness - Fire Attacking", "[type]") { } TEST_CASE("Type Effectiveness - Water Attacking", "[type]") { - auto typeLib = Library::GetStaticLib()->GetTypeLibrary(); + auto& typeLib = Library::GetStaticLib()->GetTypeLibrary(); CHECK_EFFECTIVENESS(Water, Normal, 1); CHECK_EFFECTIVENESS(Water, Fighting, 1); CHECK_EFFECTIVENESS(Water, Flying, 1); @@ -249,7 +248,7 @@ TEST_CASE("Type Effectiveness - Water Attacking", "[type]") { } TEST_CASE("Type Effectiveness - Grass Attacking", "[type]") { - auto typeLib = Library::GetStaticLib()->GetTypeLibrary(); + auto& typeLib = Library::GetStaticLib()->GetTypeLibrary(); CHECK_EFFECTIVENESS(Grass, Normal, 1); CHECK_EFFECTIVENESS(Grass, Fighting, 1); CHECK_EFFECTIVENESS(Grass, Flying, 0.5); @@ -271,7 +270,7 @@ TEST_CASE("Type Effectiveness - Grass Attacking", "[type]") { } TEST_CASE("Type Effectiveness - Electric Attacking", "[type]") { - auto typeLib = Library::GetStaticLib()->GetTypeLibrary(); + auto& typeLib = Library::GetStaticLib()->GetTypeLibrary(); CHECK_EFFECTIVENESS(Electric, Normal, 1); CHECK_EFFECTIVENESS(Electric, Fighting, 1); CHECK_EFFECTIVENESS(Electric, Flying, 2); @@ -293,7 +292,7 @@ TEST_CASE("Type Effectiveness - Electric Attacking", "[type]") { } TEST_CASE("Type Effectiveness - Psychic Attacking", "[type]") { - auto typeLib = Library::GetStaticLib()->GetTypeLibrary(); + auto& typeLib = Library::GetStaticLib()->GetTypeLibrary(); CHECK_EFFECTIVENESS(Psychic, Normal, 1); CHECK_EFFECTIVENESS(Psychic, Fighting, 2); CHECK_EFFECTIVENESS(Psychic, Flying, 1); @@ -315,7 +314,7 @@ TEST_CASE("Type Effectiveness - Psychic Attacking", "[type]") { } TEST_CASE("Type Effectiveness - Ice Attacking", "[type]") { - auto typeLib = Library::GetStaticLib()->GetTypeLibrary(); + auto& typeLib = Library::GetStaticLib()->GetTypeLibrary(); CHECK_EFFECTIVENESS(Ice, Normal, 1); CHECK_EFFECTIVENESS(Ice, Fighting, 1); CHECK_EFFECTIVENESS(Ice, Flying, 2); @@ -337,7 +336,7 @@ TEST_CASE("Type Effectiveness - Ice Attacking", "[type]") { } TEST_CASE("Type Effectiveness - Dragon Attacking", "[type]") { - auto typeLib = Library::GetStaticLib()->GetTypeLibrary(); + auto& typeLib = Library::GetStaticLib()->GetTypeLibrary(); CHECK_EFFECTIVENESS(Dragon, Normal, 1); CHECK_EFFECTIVENESS(Dragon, Fighting, 1); CHECK_EFFECTIVENESS(Dragon, Flying, 1); @@ -359,7 +358,7 @@ TEST_CASE("Type Effectiveness - Dragon Attacking", "[type]") { } TEST_CASE("Type Effectiveness - Dark Attacking", "[type]") { - auto typeLib = Library::GetStaticLib()->GetTypeLibrary(); + auto& typeLib = Library::GetStaticLib()->GetTypeLibrary(); CHECK_EFFECTIVENESS(Dark, Normal, 1); CHECK_EFFECTIVENESS(Dark, Fighting, 0.5); CHECK_EFFECTIVENESS(Dark, Flying, 1); @@ -381,7 +380,7 @@ TEST_CASE("Type Effectiveness - Dark Attacking", "[type]") { } TEST_CASE("Type Effectiveness - Fairy Attacking", "[type]") { - auto typeLib = Library::GetStaticLib()->GetTypeLibrary(); + auto& typeLib = Library::GetStaticLib()->GetTypeLibrary(); CHECK_EFFECTIVENESS(Fairy, Normal, 1); CHECK_EFFECTIVENESS(Fairy, Fighting, 2); CHECK_EFFECTIVENESS(Fairy, Flying, 1); diff --git a/src/Precompiled.hxx b/src/Precompiled.hxx new file mode 100644 index 0000000..beb8d29 --- /dev/null +++ b/src/Precompiled.hxx @@ -0,0 +1,6 @@ +#ifndef GEN7TESTS_PRECOMPILED_HXX +#define GEN7TESTS_PRECOMPILED_HXX + +#include + +#endif // GEN7TESTS_PRECOMPILED_HXX diff --git a/src/ScriptTests/Macros/MoveMacros.hpp b/src/ScriptTests/Macros/MoveMacros.hpp index c8d6879..1ee74ed 100644 --- a/src/ScriptTests/Macros/MoveMacros.hpp +++ b/src/ScriptTests/Macros/MoveMacros.hpp @@ -8,10 +8,9 @@ #define SETUP_MOVE_TEST(move) \ auto library = Library::GetLibrary(); \ - auto userMon = \ - PkmnLib::Battling::CreatePokemon(library, "charizard"_cnc, 50) \ - .LearnMove(Arbutils::CaseInsensitiveConstString(#move), CreatureLib::Battling::AttackLearnMethod::Unknown) \ - ->Build(); \ + auto userMon = PkmnLib::Battling::CreatePokemon(library, "charizard"_cnc, 50) \ + .LearnMove(ArbUt::StringView(#move), CreatureLib::Battling::AttackLearnMethod::Unknown) \ + .Build(); \ auto targetMon = PkmnLib::Battling::CreatePokemon(library, "venusaur"_cnc, 50).Build(); \ \ auto userParty = new CreatureLib::Battling::CreatureParty({userMon}); \ @@ -26,15 +25,16 @@ userMon->SetBattleData(battle, battle->GetSides()[0]); \ targetMon->SetBattleData(battle, battle->GetSides()[1]); \ \ - auto moveData = library->GetMoveLibrary()->Get(Arbutils::CaseInsensitiveConstString(#move)); \ + auto moveData = library->GetMoveLibrary()->Get(ArbUt::StringView(#move)); \ REQUIRE(moveData->HasSecondaryEffect()); \ - auto effect = moveData->GetSecondaryEffect(); \ + auto& effect = moveData->GetSecondaryEffect(); \ auto script = library->LoadScript(ScriptCategory::Attack, effect->GetEffectName()); \ REQUIRE(script != nullptr); \ script->OnInitialize(effect->GetParameters()); \ \ - auto executingMove = \ - new CreatureLib::Battling::ExecutingAttack({targetMon}, 1, userMon, userMon->GetMoves()[0], script); + auto executingMove = new CreatureLib::Battling::ExecutingAttack( \ + ArbUt::List>{targetMon}, (uint8_t)1, userMon, \ + userMon->GetMoves()[0], std::unique_ptr(script)); #define CLEANUP_MOVE_TEST \ delete executingMove; \ @@ -67,12 +67,12 @@ #define MOVE_EFFECT_CHANCE(move, chance) \ TEST_CASE(#move " - Effect Chance = " #chance, "[moves]") { \ auto library = Library::GetLibrary(); \ - auto move = library->GetMoveLibrary()->Get(Arbutils::CaseInsensitiveConstString(#move)); \ + auto move = library->GetMoveLibrary()->Get(ArbUt::StringView(#move)); \ REQUIRE(move->HasSecondaryEffect()); \ CHECK(move->GetSecondaryEffect()->GetChance() == chance); \ } -#define CHANCE_BASED_MOVE(moveName, chance, onEffectCheck) \ +#define CHANCE_BASED_MOVE(moveName, chance, onEffectCheck) \ ON_MOVE_EFFECT_TRIGGER(moveName, onEffectCheck) \ MOVE_EFFECT_CHANCE(moveName, chance) diff --git a/src/ScriptTests/Moves/AMoves/Absorb.cpp b/src/ScriptTests/Moves/AMoves/Absorb.cpp index 0e113fe..51e4867 100644 --- a/src/ScriptTests/Moves/AMoves/Absorb.cpp +++ b/src/ScriptTests/Moves/AMoves/Absorb.cpp @@ -8,7 +8,7 @@ TEST_CASE("Absorb - Heals on use", "[moves]") { SETUP_MOVE_TEST(Absorb) userMon->Damage(50, CreatureLib::Battling::DamageSource::AttackDamage); - executingMove->GetAttackDataForTarget(targetMon)->GetHit(0)->SetDamage(50); + executingMove->GetHitData(targetMon, 0).SetDamage(50); script->OnSecondaryEffect(executingMove, targetMon, 0); CHECK(userMon->GetCurrentHealth() == userMon->GetMaxHealth() - 25); @@ -19,7 +19,7 @@ TEST_CASE("Absorb - Heals more with big root", "[moves]") { SETUP_MOVE_TEST(Absorb) userMon->Damage(50, CreatureLib::Battling::DamageSource::AttackDamage); - executingMove->GetAttackDataForTarget(targetMon)->GetHit(0)->SetDamage(50); + executingMove->GetHitData(targetMon, 0).SetDamage(50); userMon->SetHeldItem("big_root"_cnc.GetHash()); script->OnSecondaryEffect(executingMove, targetMon, 0); CHECK(userMon->GetCurrentHealth() == userMon->GetMaxHealth() - 18); diff --git a/src/ScriptTests/Moves/Struggle.cpp b/src/ScriptTests/Moves/Struggle.cpp index b73d4ce..3d08cf2 100644 --- a/src/ScriptTests/Moves/Struggle.cpp +++ b/src/ScriptTests/Moves/Struggle.cpp @@ -21,7 +21,9 @@ TEST_CASE("Struggle - Damages by 1/4th of users max health", "[moves]") { userMon->SetBattleData(battle, battle->GetSides()[0]); targetMon->SetBattleData(battle, battle->GetSides()[1]); - auto script = library->LoadScript(ScriptCategory::Attack, "Struggle"_cnc); + auto& script = ((CreatureLib::Battling::AttackTurnChoice*)library->GetMiscLibrary()->ReplacementAttack( + userMon, CreatureLib::Battling::CreatureIndex(1, 0))) + ->GetAttackScript(); REQUIRE(script != nullptr); auto choice = (CreatureLib::Battling::AttackTurnChoice*)library->GetMiscLibrary()->ReplacementAttack( @@ -31,8 +33,6 @@ TEST_CASE("Struggle - Damages by 1/4th of users max health", "[moves]") { script->OnSecondaryEffect(executingMove, targetMon, 0); CHECK(userMon->GetCurrentHealth() == userMon->GetMaxHealth() - (userMon->GetMaxHealth() / 4)); - delete choice; - delete script; delete executingMove; delete targetParty; delete userParty; diff --git a/src/main.cpp b/src/main.cpp index 4ceffe7..22af9ee 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,5 +1,5 @@ #define CATCH_CONFIG_RUNNER -#include +#include #include #include "../extern/catch.hpp" #include "BuildData/BuildItems.hpp" @@ -12,36 +12,36 @@ static const char* ScriptsPath = nullptr; -//static constexpr const char* GetCategoryPath(CreatureLib::Battling::ScriptResolver::ScriptCategory category){ -// switch (category){ -// case CreatureLib::Battling::ScriptResolver::ScriptCategory::Attack: return "Moves"; -// case CreatureLib::Battling::ScriptResolver::ScriptCategory::Talent: return "Abilities"; -// case CreatureLib::Battling::ScriptResolver::ScriptCategory::Status: return "Status"; -// case CreatureLib::Battling::ScriptResolver::ScriptCategory::Creature: return "Pokemon"; -// case CreatureLib::Battling::ScriptResolver::ScriptCategory::Battle: return "Battle"; -// case CreatureLib::Battling::ScriptResolver::ScriptCategory::Side: return "Side"; -// } -//} +// static constexpr const char* GetCategoryPath(CreatureLib::Battling::ScriptResolver::ScriptCategory category){ +// switch (category){ +// case CreatureLib::Battling::ScriptResolver::ScriptCategory::Attack: return "Moves"; +// case CreatureLib::Battling::ScriptResolver::ScriptCategory::Talent: return "Abilities"; +// case CreatureLib::Battling::ScriptResolver::ScriptCategory::Status: return "Status"; +// case CreatureLib::Battling::ScriptResolver::ScriptCategory::Creature: return "Pokemon"; +// case CreatureLib::Battling::ScriptResolver::ScriptCategory::Battle: return "Battle"; +// case CreatureLib::Battling::ScriptResolver::ScriptCategory::Side: return "Side"; +// } +// } - -//static const char* LoadFunc(CreatureLib::Battling::ScriptResolver::ScriptCategory category, const char* scriptName){ -// auto categoryStr = GetCategoryPath(category); -// char fullPath[strlen(ScriptsPath) + 1 + strlen(categoryStr) + 1 + strlen(scriptName) + 3]; -// strcpy(fullPath, ScriptsPath); -// strcat(fullPath, "/"); -// strcat(fullPath, categoryStr); -// strcat(fullPath, "/"); -// strcat(fullPath, scriptName); -// strcat(fullPath, ".as"); -// std::ifstream in(fullPath); -// std::string contents((std::istreambuf_iterator(in)), std::istreambuf_iterator()); -// char res[contents.size()]; -// return strcpy(res, contents.c_str()); -//} +// static const char* LoadFunc(CreatureLib::Battling::ScriptResolver::ScriptCategory category, const char* scriptName){ +// auto categoryStr = GetCategoryPath(category); +// char fullPath[strlen(ScriptsPath) + 1 + strlen(categoryStr) + 1 + strlen(scriptName) + 3]; +// strcpy(fullPath, ScriptsPath); +// strcat(fullPath, "/"); +// strcat(fullPath, categoryStr); +// strcat(fullPath, "/"); +// strcat(fullPath, scriptName); +// strcat(fullPath, ".as"); +// std::ifstream in(fullPath); +// std::string contents((std::istreambuf_iterator(in)), std::istreambuf_iterator()); +// char res[contents.size()]; +// return strcpy(res, contents.c_str()); +// } int main(int argc, char* argv[]) { Catch::Session session; + std::string workingDirectory = ""; std::string typesFile = "Types.csv"; std::string naturesFile = "Natures.csv"; std::string pokemonFile = "Pokemon.json"; @@ -51,7 +51,8 @@ int main(int argc, char* argv[]) { std::string scriptsPath = "Scripts"; using namespace Catch::clara; - auto cli = session.cli() | Opt(pokemonFile, "Species")["--species"]("Which species file to load.") | + auto cli = session.cli() | Opt(workingDirectory, "Working Directory")["--workdir"]("Which work directory to use.") | + 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.") | @@ -67,6 +68,10 @@ int main(int argc, char* argv[]) { if (session.config().showHelp()) return 0; + if (!workingDirectory.empty()) { + chdir(workingDirectory.c_str()); + } + auto typesLibrary = BuildTypes::Build(typesFile); auto natureLibrary = BuildNatures::Build(naturesFile); auto speciesLibrary = BuildSpecies::BuildLibrary(pokemonFile, typesLibrary); @@ -87,13 +92,13 @@ int main(int argc, char* argv[]) { auto battleLib = new PkmnLib::Battling::BattleLibrary( staticLibrary, new PkmnLib::Battling::StatCalculator(), new PkmnLib::Battling::DamageLibrary(), - new CreatureLib::Battling::ExperienceLibrary(), scriptResolver, new CreatureLib::Battling::MiscLibrary()); + new PkmnLib::Battling::ExperienceLibrary(), scriptResolver, new PkmnLib::Battling::MiscLibrary()); scriptResolver->Initialize(battleLib); - auto asScriptResolver = dynamic_cast(scriptResolver); + auto asScriptResolver = dynamic_cast(scriptResolver); - for (const auto& dirEntry : std::filesystem::recursive_directory_iterator(ScriptsPath)){ + for (const auto& dirEntry : std::filesystem::recursive_directory_iterator(ScriptsPath)) { if (dirEntry.is_directory()) continue; if (dirEntry.path().parent_path().stem() == "Interfaces") @@ -127,7 +132,6 @@ class SaveEffectChance : PkmnScript { } })"); - asScriptResolver->FinalizeModule(); Library::SetStaticLib(staticLibrary);