Initial commit; Load Species and Types, test all type effectivenesses.
This commit is contained in:
		
							
								
								
									
										121
									
								
								.clang-format
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										121
									
								
								.clang-format
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,121 @@ | |||||||
|  | # ClangFormatConfigureSource: 'LLVM' | ||||||
|  | --- | ||||||
|  | Language:        Cpp | ||||||
|  | # BasedOnStyle:  LLVM | ||||||
|  | AccessModifierOffset: -4 | ||||||
|  | AlignAfterOpenBracket: Align | ||||||
|  | AlignConsecutiveAssignments: false | ||||||
|  | AlignConsecutiveDeclarations: false | ||||||
|  | AlignEscapedNewlines: Right | ||||||
|  | AlignOperands:   true | ||||||
|  | AlignTrailingComments: true | ||||||
|  | AllowAllParametersOfDeclarationOnNextLine: true | ||||||
|  | AllowShortBlocksOnASingleLine: false | ||||||
|  | AllowShortCaseLabelsOnASingleLine: true | ||||||
|  | AllowShortFunctionsOnASingleLine: All | ||||||
|  | AllowShortIfStatementsOnASingleLine: Never | ||||||
|  | AllowShortLoopsOnASingleLine: false | ||||||
|  | AlwaysBreakAfterDefinitionReturnType: None | ||||||
|  | AlwaysBreakAfterReturnType: None | ||||||
|  | AlwaysBreakBeforeMultilineStrings: false | ||||||
|  | AlwaysBreakTemplateDeclarations: MultiLine | ||||||
|  | BinPackArguments: true | ||||||
|  | BinPackParameters: true | ||||||
|  | BraceWrapping: | ||||||
|  |   AfterClass:      false | ||||||
|  |   AfterControlStatement: false | ||||||
|  |   AfterEnum:       false | ||||||
|  |   AfterFunction:   false | ||||||
|  |   AfterNamespace:  false | ||||||
|  |   AfterObjCDeclaration: false | ||||||
|  |   AfterStruct:     false | ||||||
|  |   AfterUnion:      false | ||||||
|  |   AfterExternBlock: false | ||||||
|  |   BeforeCatch:     false | ||||||
|  |   BeforeElse:      false | ||||||
|  |   IndentBraces:    false | ||||||
|  |   SplitEmptyFunction: true | ||||||
|  |   SplitEmptyRecord: true | ||||||
|  |   SplitEmptyNamespace: true | ||||||
|  | BreakBeforeBinaryOperators: None | ||||||
|  | BreakBeforeBraces: Attach | ||||||
|  | BreakBeforeInheritanceComma: false | ||||||
|  | BreakInheritanceList: BeforeColon | ||||||
|  | BreakBeforeTernaryOperators: true | ||||||
|  | BreakConstructorInitializersBeforeComma: false | ||||||
|  | BreakConstructorInitializers: BeforeColon | ||||||
|  | BreakAfterJavaFieldAnnotations: false | ||||||
|  | BreakStringLiterals: true | ||||||
|  | ColumnLimit:     120 | ||||||
|  | CommentPragmas:  '^ IWYU pragma:' | ||||||
|  | CompactNamespaces: false | ||||||
|  | ConstructorInitializerAllOnOneLineOrOnePerLine: false | ||||||
|  | ConstructorInitializerIndentWidth: 4 | ||||||
|  | ContinuationIndentWidth: 4 | ||||||
|  | Cpp11BracedListStyle: true | ||||||
|  | DerivePointerAlignment: false | ||||||
|  | DisableFormat:   false | ||||||
|  | ExperimentalAutoDetectBinPacking: false | ||||||
|  | FixNamespaceComments: false | ||||||
|  | ForEachMacros: | ||||||
|  |   - foreach | ||||||
|  |   - Q_FOREACH | ||||||
|  |   - BOOST_FOREACH | ||||||
|  | IncludeBlocks:   Merge | ||||||
|  | IncludeCategories: | ||||||
|  |   - Regex:           '^"(llvm|llvm-c|clang|clang-c)/' | ||||||
|  |     Priority:        2 | ||||||
|  |   - Regex:           '^(<|"(gtest|gmock|isl|json)/)' | ||||||
|  |     Priority:        1 | ||||||
|  |   - Regex:           '.*' | ||||||
|  |     Priority:        3 | ||||||
|  | IncludeIsMainRegex: '(Test)?$' | ||||||
|  | IndentCaseLabels: true | ||||||
|  | IndentPPDirectives: None | ||||||
|  | IndentWidth:     4 | ||||||
|  | IndentWrappedFunctionNames: false | ||||||
|  | JavaScriptQuotes: Leave | ||||||
|  | JavaScriptWrapImports: true | ||||||
|  | KeepEmptyLinesAtTheStartOfBlocks: true | ||||||
|  | MacroBlockBegin: '' | ||||||
|  | MacroBlockEnd:   '' | ||||||
|  | MaxEmptyLinesToKeep: 1 | ||||||
|  | NamespaceIndentation: All | ||||||
|  | ObjCBinPackProtocolList: Auto | ||||||
|  | ObjCBlockIndentWidth: 2 | ||||||
|  | ObjCSpaceAfterProperty: false | ||||||
|  | ObjCSpaceBeforeProtocolList: true | ||||||
|  | PenaltyBreakAssignment: 2 | ||||||
|  | PenaltyBreakBeforeFirstCallParameter: 19 | ||||||
|  | PenaltyBreakComment: 300 | ||||||
|  | PenaltyBreakFirstLessLess: 120 | ||||||
|  | PenaltyBreakString: 1000 | ||||||
|  | PenaltyBreakTemplateDeclaration: 10 | ||||||
|  | PenaltyExcessCharacter: 1000000 | ||||||
|  | PenaltyReturnTypeOnItsOwnLine: 60 | ||||||
|  | PointerAlignment: Left | ||||||
|  | ReflowComments:  true | ||||||
|  | SortIncludes:    true | ||||||
|  | SortUsingDeclarations: true | ||||||
|  | SpaceAfterCStyleCast: false | ||||||
|  | SpaceAfterTemplateKeyword: true | ||||||
|  | SpaceBeforeAssignmentOperators: true | ||||||
|  | SpaceBeforeCpp11BracedList: false | ||||||
|  | SpaceBeforeCtorInitializerColon: true | ||||||
|  | SpaceBeforeInheritanceColon: true | ||||||
|  | SpaceBeforeParens: ControlStatements | ||||||
|  | SpaceBeforeRangeBasedForLoopColon: true | ||||||
|  | SpaceInEmptyParentheses: false | ||||||
|  | SpacesBeforeTrailingComments: 1 | ||||||
|  | SpacesInAngles:  false | ||||||
|  | SpacesInContainerLiterals: true | ||||||
|  | SpacesInCStyleCastParentheses: false | ||||||
|  | SpacesInParentheses: false | ||||||
|  | SpacesInSquareBrackets: false | ||||||
|  | Standard:        Cpp11 | ||||||
|  | StatementMacros: | ||||||
|  |   - Q_UNUSED | ||||||
|  |   - QT_REQUIRE_VERSION | ||||||
|  | TabWidth:        8 | ||||||
|  | UseTab:          Never | ||||||
|  | ... | ||||||
							
								
								
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | |||||||
|  | /cmake-build-debug/ | ||||||
|  | /cmake-build-release/ | ||||||
|  | /.idea/ | ||||||
							
								
								
									
										45
									
								
								CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,45 @@ | |||||||
|  | cmake_minimum_required(VERSION 3.13) | ||||||
|  |  | ||||||
|  | # Make warnings trigger errors. | ||||||
|  | set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Werror") | ||||||
|  |  | ||||||
|  | project(Gen7Tests) | ||||||
|  |  | ||||||
|  | set(CMAKE_CXX_STANDARD 17) | ||||||
|  | set(CMAKE_CXX_STANDARD_REQUIRED ON) | ||||||
|  |  | ||||||
|  | if (NOT EXISTS ${CMAKE_BINARY_DIR}/conanbuildinfo.cmake) | ||||||
|  |     message(WARNING "The file conanbuildinfo.cmake doesn't exist, running conan install.") | ||||||
|  |     string(REPLACE "." ";" VERSION_LIST "${CMAKE_C_COMPILER_VERSION}") | ||||||
|  |     list(GET VERSION_LIST 0 VERSION) | ||||||
|  |     list(GET VERSION_LIST 1 MINOR) | ||||||
|  |     if (NOT MINOR MATCHES 0) | ||||||
|  |         SET(VERSION ${VERSION}.${MINOR}) | ||||||
|  |     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() | ||||||
|  |         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 () | ||||||
|  | include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake) | ||||||
|  | conan_basic_setup() | ||||||
|  |  | ||||||
|  | message(STATUS "Using Conan Libs:") | ||||||
|  | foreach (_conanLib ${CONAN_LIBS}) | ||||||
|  |     message(STATUS "\t ${_conanLib}") | ||||||
|  | endforeach() | ||||||
|  |  | ||||||
|  | SET(FILE_SOURCE | ||||||
|  |         "src/*.cpp" | ||||||
|  |         "src/*.hpp" | ||||||
|  |         ) | ||||||
|  | file(GLOB_RECURSE CORE_SRC_FILES ${FILE_SOURCE}) | ||||||
|  | add_executable(Gen7Tests ${CORE_SRC_FILES}) | ||||||
|  |  | ||||||
|  | SET(_LINKS CreatureLibCore CreatureLibLibrary CreatureLibBattling pkmnLib) | ||||||
|  |  | ||||||
|  | target_link_libraries(Gen7Tests PUBLIC ${_LINKS}) | ||||||
|  |  | ||||||
							
								
								
									
										6
									
								
								angelscript.supp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								angelscript.supp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | |||||||
|  | { | ||||||
|  |    SkipAngelScriptMemCheck | ||||||
|  |    Memcheck:Cond | ||||||
|  |    fun:_ZN10asCContext11ExecuteNextEv | ||||||
|  |    fun:_ZN10asCContext7ExecuteEv | ||||||
|  | } | ||||||
							
								
								
									
										29
									
								
								conanfile.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								conanfile.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,29 @@ | |||||||
|  | from conans import ConanFile, CMake | ||||||
|  | from conans.errors import ConanInvalidConfiguration | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class PkmnLibConan(ConanFile): | ||||||
|  |     name = "PkmnLib-Gen7" | ||||||
|  |     license = "TODO" | ||||||
|  |     url = "https://git.p-epsilon.com/Deukhoofd/PkmnLib" | ||||||
|  |     description = "An implementation of CreatureLib to handle Pokemon battling." | ||||||
|  |     settings = "os", "compiler", "build_type" | ||||||
|  |     generators = "cmake" | ||||||
|  |     exports_sources = "*" | ||||||
|  |     compiler = "clang" | ||||||
|  |  | ||||||
|  |     def build(self): | ||||||
|  |         cmake = CMake(self) | ||||||
|  |         self.output.info("Target OS: %s." % self.settings.os) | ||||||
|  |         if self.settings.os == "Windows": | ||||||
|  |             self.output.warn("Noticed Windows target, setting Cmake WINDOWS=On.") | ||||||
|  |             cmake.definitions["WINDOWS"] = "On" | ||||||
|  |         cmake.configure() | ||||||
|  |         cmake.build() | ||||||
|  |  | ||||||
|  |     def imports(self): | ||||||
|  |         if self.settings.os == "Windows": | ||||||
|  |             self.copy("*.dll", "bin", "bin") | ||||||
|  |  | ||||||
|  |     def requirements(self): | ||||||
|  |         self.requires("PkmnLib/4ee5a14b4c58b97fa511aad4be7cc0cb039bc634@pkmnlib/master") | ||||||
							
								
								
									
										17615
									
								
								extern/catch.hpp
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										17615
									
								
								extern/catch.hpp
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										22875
									
								
								extern/json.hpp
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										22875
									
								
								extern/json.hpp
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										104
									
								
								src/BuildData/BuildSpecies.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										104
									
								
								src/BuildData/BuildSpecies.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,104 @@ | |||||||
|  | #include "BuildSpecies.hpp" | ||||||
|  | #include <fstream> | ||||||
|  | #include <iostream> | ||||||
|  |  | ||||||
|  | #define GET(o, objectKey, key)                                                                                         \ | ||||||
|  |     auto _##objectKey = o[#objectKey];                                                                                 \ | ||||||
|  |     if (_##objectKey.is_null()) {                                                                                      \ | ||||||
|  |         std::cout << "Failed to retrieve key '" << #objectKey << "' for object with key '" << key << "' in file '"     \ | ||||||
|  |                   << path << "'\n";                                                                                    \ | ||||||
|  |         return nullptr;                                                                                                \ | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | PkmnLib::Library::SpeciesLibrary* BuildSpecies::BuildLibrary(const std::string& path, | ||||||
|  |                                                              const CreatureLib::Library::TypeLibrary* types) { | ||||||
|  |     std::ifstream fileStream(path.c_str()); | ||||||
|  |     if (fileStream.fail()) { | ||||||
|  |         std::cout << "Failed to load Pokemon data file at '" << path << "'\n"; | ||||||
|  |         return nullptr; | ||||||
|  |     } | ||||||
|  |     auto lib = new PkmnLib::Library::SpeciesLibrary(); | ||||||
|  |     json j; | ||||||
|  |     fileStream >> j; | ||||||
|  |  | ||||||
|  |     for (json::iterator it = j.begin(); it != j.end(); ++it) { | ||||||
|  |         auto val = it.value(); | ||||||
|  |         GET(val, id, it.key()); | ||||||
|  |         GET(val, species, it.key()); | ||||||
|  |         GET(val, genderRatio, it.key()); | ||||||
|  |         GET(val, growthRate, it.key()); | ||||||
|  |         GET(val, baseHappiness, it.key()); | ||||||
|  |         GET(val, catchRate, it.key()); | ||||||
|  |         GET(val, color, it.key()); | ||||||
|  |         GET(val, genderDifference, it.key()); | ||||||
|  |         GET(val, eggGroups, it.key()); | ||||||
|  |         GET(val, eggCycles, it.key()); | ||||||
|  |         GET(val, tags, it.key()); | ||||||
|  |         GET(val, formes, it.key()); | ||||||
|  |  | ||||||
|  |         PkmnLib::Library::PokemonSpecies* species = nullptr; | ||||||
|  |  | ||||||
|  |         auto defaultForme = _formes["default"]; | ||||||
|  |         if (!defaultForme.is_null()) { | ||||||
|  |             auto forme = BuildForme("default", defaultForme, it.key(), path, types); | ||||||
|  |             species = new PkmnLib::Library::PokemonSpecies(_id.get<uint16_t>(), _species.get<std::string>(), forme, | ||||||
|  |                                                            _genderRatio.get<int8_t>() / static_cast<float>(100), | ||||||
|  |                                                            _growthRate.get<std::string>(), _catchRate.get<uint8_t>(), | ||||||
|  |                                                            _baseHappiness.get<uint8_t>()); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         for (json::iterator formeIt = _formes.begin(); formeIt != _formes.end(); ++formeIt) { | ||||||
|  |             if (formeIt.key() == "default") { | ||||||
|  |                 continue; | ||||||
|  |             } | ||||||
|  |             auto forme = BuildForme(formeIt.key(), formeIt.value(), it.key(), path, types); | ||||||
|  |             if (forme == nullptr) | ||||||
|  |                 return nullptr; | ||||||
|  |             if (species == nullptr) { | ||||||
|  |                 species = new PkmnLib::Library::PokemonSpecies( | ||||||
|  |                     _id.get<uint16_t>(), _species.get<std::string>(), forme, | ||||||
|  |                     static_cast<float>(_genderRatio.get<int8_t>()) / static_cast<float>(100), | ||||||
|  |                     _growthRate.get<std::string>(), _catchRate.get<uint8_t>(), _baseHappiness.get<uint8_t>()); | ||||||
|  |             } else { | ||||||
|  |                 species->SetVariant(formeIt.key(), forme); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         if (species == nullptr) { | ||||||
|  |             std::cout << "Pokemon with key '" << it.key() << "' does not have any formes.\n"; | ||||||
|  |             return nullptr; | ||||||
|  |         } | ||||||
|  |         lib->LoadSpecies(it.key(), species); | ||||||
|  |     } | ||||||
|  |     return lib; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static CreatureLib::Core::StatisticSet<uint16_t> ParseStatistics(json& json) { | ||||||
|  |     return CreatureLib::Core::StatisticSet<uint16_t>( | ||||||
|  |         json["hp"].get<uint16_t>(), json["attack"].get<uint16_t>(), json["defense"].get<uint16_t>(), | ||||||
|  |         json["specialAttack"].get<uint16_t>(), json["specialDefense"].get<uint16_t>(), json["speed"].get<uint16_t>()); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | const PkmnLib::Library::PokemonForme* BuildSpecies::BuildForme(const std::string& name, json& forme, | ||||||
|  |                                                                const std::string& baseKeyName, const std::string& path, | ||||||
|  |                                                                const CreatureLib::Library::TypeLibrary* typeLibrary) { | ||||||
|  |     GET(forme, abilities, baseKeyName << " -> " << name); | ||||||
|  |     GET(forme, hiddenAbilities, baseKeyName << " -> " << name); | ||||||
|  |     GET(forme, baseStats, baseKeyName << " -> " << name); | ||||||
|  |     GET(forme, evReward, baseKeyName << " -> " << name); | ||||||
|  |     GET(forme, types, baseKeyName << " -> " << name); | ||||||
|  |     GET(forme, height, baseKeyName << " -> " << name); | ||||||
|  |     GET(forme, weight, baseKeyName << " -> " << name); | ||||||
|  |     GET(forme, baseExp, baseKeyName << " -> " << name); | ||||||
|  |     GET(forme, moves, baseKeyName << " -> " << name); | ||||||
|  |  | ||||||
|  |     auto typeStrings = _types.get<std::vector<std::string>>(); | ||||||
|  |     auto types = std::vector<uint8_t>(typeStrings.size()); | ||||||
|  |     for (auto i = 0; i < typeStrings.size(); i++) { | ||||||
|  |         types[i] = typeLibrary->GetTypeId(typeStrings[i]); | ||||||
|  |     } | ||||||
|  |     auto stats = ParseStatistics(_baseStats); | ||||||
|  |  | ||||||
|  |     return new PkmnLib::Library::PokemonForme( | ||||||
|  |         name, _height.get<float>(), _weight.get<float>(), _baseExp.get<uint32_t>(), types, stats, | ||||||
|  |         _abilities.get<std::vector<std::string>>(), _hiddenAbilities.get<std::vector<std::string>>(), nullptr); | ||||||
|  | } | ||||||
							
								
								
									
										19
									
								
								src/BuildData/BuildSpecies.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								src/BuildData/BuildSpecies.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,19 @@ | |||||||
|  | #ifndef GEN7TESTS_BUILDSPECIES_HPP | ||||||
|  | #define GEN7TESTS_BUILDSPECIES_HPP | ||||||
|  | #include <PkmnLib/Library/PokemonLibrary.hpp> | ||||||
|  | #include <CreatureLib/Library/TypeLibrary.hpp> | ||||||
|  | #include <string> | ||||||
|  | #include "../../extern/json.hpp" | ||||||
|  | using json = nlohmann::json; | ||||||
|  |  | ||||||
|  | class BuildSpecies { | ||||||
|  |     static const PkmnLib::Library::PokemonForme* BuildForme(const std::string& name, json& forme, | ||||||
|  |                                                             const std::string& baseKeyName, const std::string& path, | ||||||
|  |                                                             const CreatureLib::Library::TypeLibrary* typeLibrary); | ||||||
|  |  | ||||||
|  | public: | ||||||
|  |     static PkmnLib::Library::SpeciesLibrary* BuildLibrary(const std::string& path, | ||||||
|  |                                                                 const CreatureLib::Library::TypeLibrary* types); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | #endif // GEN7TESTS_BUILDSPECIES_HPP | ||||||
							
								
								
									
										1
									
								
								src/BuildData/BuildTypes.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								src/BuildData/BuildTypes.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | |||||||
|  | #include "BuildTypes.hpp" | ||||||
							
								
								
									
										81
									
								
								src/BuildData/BuildTypes.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								src/BuildData/BuildTypes.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,81 @@ | |||||||
|  | #ifndef GEN7TESTS_BUILDTYPES_HPP | ||||||
|  | #define GEN7TESTS_BUILDTYPES_HPP | ||||||
|  | #include <CreatureLib/Library/TypeLibrary.hpp> | ||||||
|  | #include <cstring> | ||||||
|  | #include <fstream> | ||||||
|  | #include <iostream> | ||||||
|  |  | ||||||
|  | class BuildTypes { | ||||||
|  | public: | ||||||
|  |     static CreatureLib::Library::TypeLibrary* Build(const std::string& path) { | ||||||
|  |         std::ifstream file(path); | ||||||
|  |         if (file.fail()) { | ||||||
|  |             std::cout << "Failed to load Types data file at '" << path << "'\n"; | ||||||
|  |             return nullptr; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         std::string line; | ||||||
|  |         if (!std::getline(file, line)) { | ||||||
|  |             std::cout << "Failed to read Types data file at '" << path << "'\n"; | ||||||
|  |             return nullptr; | ||||||
|  |         } | ||||||
|  |         auto divider = ','; | ||||||
|  |         if (strncmp(line.c_str(), "sep=", 4) == 0) { | ||||||
|  |             divider = line[4]; | ||||||
|  |             std::getline(file, line); | ||||||
|  |         } | ||||||
|  |         auto library = new CreatureLib::Library::TypeLibrary(); | ||||||
|  |  | ||||||
|  |         bool hasSkippedFirst = false; | ||||||
|  |         size_t lastStart = 0; | ||||||
|  |         std::vector<uint8_t > types; | ||||||
|  |         for (size_t i = 0; i < line.length(); i++) { | ||||||
|  |             if (line[i] == divider) { | ||||||
|  |                 auto substr = line.substr(lastStart, i - lastStart); | ||||||
|  |                 lastStart = i + 1; | ||||||
|  |                 if (hasSkippedFirst) { | ||||||
|  |                     std::cout << "Registered type: " << substr << "\n"; | ||||||
|  |                     auto val = library->RegisterType(substr); | ||||||
|  |                     types.push_back(val); | ||||||
|  |                 } else { | ||||||
|  |                     hasSkippedFirst = true; | ||||||
|  |                 } | ||||||
|  |                 i++; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         auto substr = line.substr(lastStart, line.length() - lastStart); | ||||||
|  |         std::cout << "Registered type: " << substr << "\n"; | ||||||
|  |         auto val = library->RegisterType(substr); | ||||||
|  |         types.push_back(val); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         while (std::getline(file, line)) { | ||||||
|  |             uint8_t attackingType = 0; | ||||||
|  |             bool gotType = false; | ||||||
|  |             lastStart = 0; | ||||||
|  |             int current = 0; | ||||||
|  |             for (size_t i = 0; i < line.length(); i++) { | ||||||
|  |                 if (line[i] == divider) { | ||||||
|  |                     substr = line.substr(lastStart, i - lastStart); | ||||||
|  |                     lastStart = i + 1; | ||||||
|  |                     if (gotType) { | ||||||
|  |                         auto eff = std::atof(substr.c_str()); | ||||||
|  |                         library->SetEffectiveness(attackingType, types[current], eff); | ||||||
|  |                         current++; | ||||||
|  |                     } else { | ||||||
|  |                         gotType = true; | ||||||
|  |                         attackingType = library->GetTypeId(substr); | ||||||
|  |                     } | ||||||
|  |                     i++; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             substr = line.substr(lastStart, line.length() - lastStart); | ||||||
|  |             auto eff = std::atof(substr.c_str()); | ||||||
|  |             library->SetEffectiveness(attackingType, types[current], eff); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         return library; | ||||||
|  |     } | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | #endif // GEN7TESTS_BUILDTYPES_HPP | ||||||
							
								
								
									
										4
									
								
								src/Library.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								src/Library.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,4 @@ | |||||||
|  | #include "Library.hpp" | ||||||
|  |  | ||||||
|  | PkmnLib::Library::PokemonLibrary* Library::_staticLib = nullptr; | ||||||
|  | PkmnLib::Battling::BattleLibrary* Library::_library = nullptr; | ||||||
							
								
								
									
										19
									
								
								src/Library.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								src/Library.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,19 @@ | |||||||
|  | #ifndef GEN7TESTS_LIBRARY_HPP | ||||||
|  | #define GEN7TESTS_LIBRARY_HPP | ||||||
|  |  | ||||||
|  | #include <PkmnLib/Battling/Library/BattleLibrary.hpp> | ||||||
|  | #include <PkmnLib/Library/PokemonLibrary.hpp> | ||||||
|  | class Library { | ||||||
|  |     static PkmnLib::Library::PokemonLibrary* _staticLib; | ||||||
|  |     static PkmnLib::Battling::BattleLibrary* _library; | ||||||
|  |  | ||||||
|  | public: | ||||||
|  |     static const PkmnLib::Library::PokemonLibrary* GetStaticLib() { return _staticLib; } | ||||||
|  |     static const PkmnLib::Battling::BattleLibrary* GetLibrary() { return _library; } | ||||||
|  |  | ||||||
|  |     static void SetStaticLib(PkmnLib::Library::PokemonLibrary* lib) { _staticLib = lib; } | ||||||
|  |     static void SetLibrary(PkmnLib::Battling::BattleLibrary* lib) { _library = lib; } | ||||||
|  | }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #endif // GEN7TESTS_LIBRARY_HPP | ||||||
							
								
								
									
										407
									
								
								src/LibraryTests/TypeTests.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										407
									
								
								src/LibraryTests/TypeTests.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,407 @@ | |||||||
|  | #include "../../extern/catch.hpp" | ||||||
|  | #include "../Library.hpp" | ||||||
|  |  | ||||||
|  | #define CHECK_EFFECTIVENESS(attack, defense, expected)                                                                 \ | ||||||
|  |     CHECK(typeLib->GetSingleEffectiveness(typeLib->GetTypeId(#attack), typeLib->GetTypeId(#defense)) == expected); | ||||||
|  |  | ||||||
|  | TEST_CASE("Type Effectiveness - Normal Attacking", "[type]") { | ||||||
|  |     auto typeLib = Library::GetStaticLib()->GetTypeLibrary(); | ||||||
|  |     CHECK_EFFECTIVENESS(Normal, Normal, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Normal, Fighting, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Normal, Flying, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Normal, Poison, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Normal, Ground, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Normal, Rock, 0.5); | ||||||
|  |     CHECK_EFFECTIVENESS(Normal, Bug, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Normal, Ghost, 0); | ||||||
|  |     CHECK_EFFECTIVENESS(Normal, Steel, 0.5) | ||||||
|  |     CHECK_EFFECTIVENESS(Normal, Fire, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Normal, Water, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Normal, Grass, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Normal, Electric, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Normal, Psychic, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Normal, Ice, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Normal, Dragon, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Normal, Dark, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Normal, Fairy, 1); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | TEST_CASE("Type Effectiveness - Fighting Attacking", "[type]") { | ||||||
|  |     auto typeLib = Library::GetStaticLib()->GetTypeLibrary(); | ||||||
|  |     CHECK_EFFECTIVENESS(Fighting, Normal, 2); | ||||||
|  |     CHECK_EFFECTIVENESS(Fighting, Fighting, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Fighting, Flying, 0.5); | ||||||
|  |     CHECK_EFFECTIVENESS(Fighting, Poison, 0.5); | ||||||
|  |     CHECK_EFFECTIVENESS(Fighting, Ground, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Fighting, Rock, 2); | ||||||
|  |     CHECK_EFFECTIVENESS(Fighting, Bug, 0.5); | ||||||
|  |     CHECK_EFFECTIVENESS(Fighting, Ghost, 0); | ||||||
|  |     CHECK_EFFECTIVENESS(Fighting, Steel, 2); | ||||||
|  |     CHECK_EFFECTIVENESS(Fighting, Fire, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Fighting, Water, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Fighting, Grass, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Fighting, Electric, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Fighting, Psychic, 0.5); | ||||||
|  |     CHECK_EFFECTIVENESS(Fighting, Ice, 2); | ||||||
|  |     CHECK_EFFECTIVENESS(Fighting, Dragon, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Fighting, Dark, 2); | ||||||
|  |     CHECK_EFFECTIVENESS(Fighting, Fairy, 0.5); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | TEST_CASE("Type Effectiveness - Flying Attacking", "[type]") { | ||||||
|  |     auto typeLib = Library::GetStaticLib()->GetTypeLibrary(); | ||||||
|  |     CHECK_EFFECTIVENESS(Flying, Normal, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Flying, Fighting, 2); | ||||||
|  |     CHECK_EFFECTIVENESS(Flying, Flying, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Flying, Poison, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Flying, Ground, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Flying, Rock, 0.5); | ||||||
|  |     CHECK_EFFECTIVENESS(Flying, Bug, 2); | ||||||
|  |     CHECK_EFFECTIVENESS(Flying, Ghost, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Flying, Steel, 0.5); | ||||||
|  |     CHECK_EFFECTIVENESS(Flying, Fire, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Flying, Water, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Flying, Grass, 2); | ||||||
|  |     CHECK_EFFECTIVENESS(Flying, Electric, 0.5); | ||||||
|  |     CHECK_EFFECTIVENESS(Flying, Psychic, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Flying, Ice, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Flying, Dragon, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Flying, Dark, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Flying, Fairy, 1); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | TEST_CASE("Type Effectiveness - Poison Attacking", "[type]") { | ||||||
|  |     auto typeLib = Library::GetStaticLib()->GetTypeLibrary(); | ||||||
|  |     CHECK_EFFECTIVENESS(Poison, Normal, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Poison, Fighting, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Poison, Flying, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Poison, Poison, 0.5); | ||||||
|  |     CHECK_EFFECTIVENESS(Poison, Ground, 0.5); | ||||||
|  |     CHECK_EFFECTIVENESS(Poison, Rock, 0.5); | ||||||
|  |     CHECK_EFFECTIVENESS(Poison, Bug, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Poison, Ghost, 0.5); | ||||||
|  |     CHECK_EFFECTIVENESS(Poison, Steel, 0); | ||||||
|  |     CHECK_EFFECTIVENESS(Poison, Fire, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Poison, Water, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Poison, Grass, 2); | ||||||
|  |     CHECK_EFFECTIVENESS(Poison, Electric, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Poison, Psychic, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Poison, Ice, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Poison, Dragon, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Poison, Dark, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Poison, Fairy, 2); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | TEST_CASE("Type Effectiveness - Ground Attacking", "[type]") { | ||||||
|  |     auto typeLib = Library::GetStaticLib()->GetTypeLibrary(); | ||||||
|  |     CHECK_EFFECTIVENESS(Ground, Normal, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Ground, Fighting, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Ground, Flying, 0); | ||||||
|  |     CHECK_EFFECTIVENESS(Ground, Poison, 2); | ||||||
|  |     CHECK_EFFECTIVENESS(Ground, Ground, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Ground, Rock, 2); | ||||||
|  |     CHECK_EFFECTIVENESS(Ground, Bug, 0.5); | ||||||
|  |     CHECK_EFFECTIVENESS(Ground, Ghost, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Ground, Steel, 2); | ||||||
|  |     CHECK_EFFECTIVENESS(Ground, Fire, 2); | ||||||
|  |     CHECK_EFFECTIVENESS(Ground, Water, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Ground, Grass, 0.5); | ||||||
|  |     CHECK_EFFECTIVENESS(Ground, Electric, 2); | ||||||
|  |     CHECK_EFFECTIVENESS(Ground, Psychic, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Ground, Ice, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Ground, Dragon, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Ground, Dark, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Ground, Fairy, 1); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | TEST_CASE("Type Effectiveness - Rock Attacking", "[type]") { | ||||||
|  |     auto typeLib = Library::GetStaticLib()->GetTypeLibrary(); | ||||||
|  |     CHECK_EFFECTIVENESS(Rock, Normal, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Rock, Fighting, 0.5); | ||||||
|  |     CHECK_EFFECTIVENESS(Rock, Flying, 2); | ||||||
|  |     CHECK_EFFECTIVENESS(Rock, Poison, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Rock, Ground, 0.5); | ||||||
|  |     CHECK_EFFECTIVENESS(Rock, Rock, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Rock, Bug, 2); | ||||||
|  |     CHECK_EFFECTIVENESS(Rock, Ghost, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Rock, Steel, 0.5); | ||||||
|  |     CHECK_EFFECTIVENESS(Rock, Fire, 2); | ||||||
|  |     CHECK_EFFECTIVENESS(Rock, Water, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Rock, Grass, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Rock, Electric, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Rock, Psychic, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Rock, Ice, 2); | ||||||
|  |     CHECK_EFFECTIVENESS(Rock, Dragon, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Rock, Dark, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Rock, Fairy, 1); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | TEST_CASE("Type Effectiveness - Bug Attacking", "[type]") { | ||||||
|  |     auto typeLib = Library::GetStaticLib()->GetTypeLibrary(); | ||||||
|  |     CHECK_EFFECTIVENESS(Bug, Normal, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Bug, Fighting, 0.5); | ||||||
|  |     CHECK_EFFECTIVENESS(Bug, Flying, 0.5); | ||||||
|  |     CHECK_EFFECTIVENESS(Bug, Poison, 0.5); | ||||||
|  |     CHECK_EFFECTIVENESS(Bug, Ground, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Bug, Rock, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Bug, Bug, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Bug, Ghost, 0.5); | ||||||
|  |     CHECK_EFFECTIVENESS(Bug, Steel, 0.5); | ||||||
|  |     CHECK_EFFECTIVENESS(Bug, Fire, 0.5); | ||||||
|  |     CHECK_EFFECTIVENESS(Bug, Water, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Bug, Grass, 2); | ||||||
|  |     CHECK_EFFECTIVENESS(Bug, Electric, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Bug, Psychic, 2); | ||||||
|  |     CHECK_EFFECTIVENESS(Bug, Ice, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Bug, Dragon, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Bug, Dark, 2); | ||||||
|  |     CHECK_EFFECTIVENESS(Bug, Fairy, 0.5); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | TEST_CASE("Type Effectiveness - Ghost Attacking", "[type]") { | ||||||
|  |     auto typeLib = Library::GetStaticLib()->GetTypeLibrary(); | ||||||
|  |     CHECK_EFFECTIVENESS(Ghost, Normal, 0); | ||||||
|  |     CHECK_EFFECTIVENESS(Ghost, Fighting, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Ghost, Flying, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Ghost, Poison, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Ghost, Ground, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Ghost, Rock, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Ghost, Bug, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Ghost, Ghost, 2); | ||||||
|  |     CHECK_EFFECTIVENESS(Ghost, Steel, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Ghost, Fire, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Ghost, Water, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Ghost, Grass, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Ghost, Electric, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Ghost, Psychic, 2); | ||||||
|  |     CHECK_EFFECTIVENESS(Ghost, Ice, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Ghost, Dragon, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Ghost, Dark, 0.5); | ||||||
|  |     CHECK_EFFECTIVENESS(Ghost, Fairy, 1); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | TEST_CASE("Type Effectiveness - Steel Attacking", "[type]") { | ||||||
|  |     auto typeLib = Library::GetStaticLib()->GetTypeLibrary(); | ||||||
|  |     CHECK_EFFECTIVENESS(Steel, Normal, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Steel, Fighting, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Steel, Flying, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Steel, Poison, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Steel, Ground, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Steel, Rock, 2); | ||||||
|  |     CHECK_EFFECTIVENESS(Steel, Bug, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Steel, Ghost, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Steel, Steel, 0.5); | ||||||
|  |     CHECK_EFFECTIVENESS(Steel, Fire, 0.5); | ||||||
|  |     CHECK_EFFECTIVENESS(Steel, Water, 0.5); | ||||||
|  |     CHECK_EFFECTIVENESS(Steel, Grass, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Steel, Electric, 0.5); | ||||||
|  |     CHECK_EFFECTIVENESS(Steel, Psychic, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Steel, Ice, 2); | ||||||
|  |     CHECK_EFFECTIVENESS(Steel, Dragon, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Steel, Dark, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Steel, Fairy, 2); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | TEST_CASE("Type Effectiveness - Fire Attacking", "[type]") { | ||||||
|  |     auto typeLib = Library::GetStaticLib()->GetTypeLibrary(); | ||||||
|  |     CHECK_EFFECTIVENESS(Fire, Normal, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Fire, Fighting, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Fire, Flying, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Fire, Poison, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Fire, Ground, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Fire, Rock, 0.5); | ||||||
|  |     CHECK_EFFECTIVENESS(Fire, Bug, 2); | ||||||
|  |     CHECK_EFFECTIVENESS(Fire, Ghost, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Fire, Steel, 2); | ||||||
|  |     CHECK_EFFECTIVENESS(Fire, Fire, 0.5); | ||||||
|  |     CHECK_EFFECTIVENESS(Fire, Water, 0.5); | ||||||
|  |     CHECK_EFFECTIVENESS(Fire, Grass, 2); | ||||||
|  |     CHECK_EFFECTIVENESS(Fire, Electric, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Fire, Psychic, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Fire, Ice, 2); | ||||||
|  |     CHECK_EFFECTIVENESS(Fire, Dragon, 0.5); | ||||||
|  |     CHECK_EFFECTIVENESS(Fire, Dark, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Fire, Fairy, 1); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | TEST_CASE("Type Effectiveness - Water Attacking", "[type]") { | ||||||
|  |     auto typeLib = Library::GetStaticLib()->GetTypeLibrary(); | ||||||
|  |     CHECK_EFFECTIVENESS(Water, Normal, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Water, Fighting, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Water, Flying, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Water, Poison, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Water, Ground, 2); | ||||||
|  |     CHECK_EFFECTIVENESS(Water, Rock, 2); | ||||||
|  |     CHECK_EFFECTIVENESS(Water, Bug, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Water, Ghost, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Water, Steel, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Water, Fire, 2); | ||||||
|  |     CHECK_EFFECTIVENESS(Water, Water, 0.5); | ||||||
|  |     CHECK_EFFECTIVENESS(Water, Grass, 0.5); | ||||||
|  |     CHECK_EFFECTIVENESS(Water, Electric, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Water, Psychic, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Water, Ice, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Water, Dragon, 0.5); | ||||||
|  |     CHECK_EFFECTIVENESS(Water, Dark, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Water, Fairy, 1); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | TEST_CASE("Type Effectiveness - Grass Attacking", "[type]") { | ||||||
|  |     auto typeLib = Library::GetStaticLib()->GetTypeLibrary(); | ||||||
|  |     CHECK_EFFECTIVENESS(Grass, Normal, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Grass, Fighting, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Grass, Flying, 0.5); | ||||||
|  |     CHECK_EFFECTIVENESS(Grass, Poison, 0.5); | ||||||
|  |     CHECK_EFFECTIVENESS(Grass, Ground, 2); | ||||||
|  |     CHECK_EFFECTIVENESS(Grass, Rock, 2); | ||||||
|  |     CHECK_EFFECTIVENESS(Grass, Bug, 0.5); | ||||||
|  |     CHECK_EFFECTIVENESS(Grass, Ghost, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Grass, Steel, 0.5); | ||||||
|  |     CHECK_EFFECTIVENESS(Grass, Fire, 0.5); | ||||||
|  |     CHECK_EFFECTIVENESS(Grass, Water, 2); | ||||||
|  |     CHECK_EFFECTIVENESS(Grass, Grass, 0.5); | ||||||
|  |     CHECK_EFFECTIVENESS(Grass, Electric, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Grass, Psychic, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Grass, Ice, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Grass, Dragon, 0.5); | ||||||
|  |     CHECK_EFFECTIVENESS(Grass, Dark, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Grass, Fairy, 1); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | TEST_CASE("Type Effectiveness - Electric Attacking", "[type]") { | ||||||
|  |     auto typeLib = Library::GetStaticLib()->GetTypeLibrary(); | ||||||
|  |     CHECK_EFFECTIVENESS(Electric, Normal, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Electric, Fighting, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Electric, Flying, 2); | ||||||
|  |     CHECK_EFFECTIVENESS(Electric, Poison, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Electric, Ground, 0); | ||||||
|  |     CHECK_EFFECTIVENESS(Electric, Rock, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Electric, Bug, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Electric, Ghost, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Electric, Steel, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Electric, Fire, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Electric, Water, 2); | ||||||
|  |     CHECK_EFFECTIVENESS(Electric, Grass, 0.5); | ||||||
|  |     CHECK_EFFECTIVENESS(Electric, Electric, 0.5); | ||||||
|  |     CHECK_EFFECTIVENESS(Electric, Psychic, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Electric, Ice, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Electric, Dragon, 0.5); | ||||||
|  |     CHECK_EFFECTIVENESS(Electric, Dark, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Electric, Fairy, 1); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | TEST_CASE("Type Effectiveness - Psychic Attacking", "[type]") { | ||||||
|  |     auto typeLib = Library::GetStaticLib()->GetTypeLibrary(); | ||||||
|  |     CHECK_EFFECTIVENESS(Psychic, Normal, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Psychic, Fighting, 2); | ||||||
|  |     CHECK_EFFECTIVENESS(Psychic, Flying, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Psychic, Poison, 2); | ||||||
|  |     CHECK_EFFECTIVENESS(Psychic, Ground, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Psychic, Rock, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Psychic, Bug, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Psychic, Ghost, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Psychic, Steel, 0.5); | ||||||
|  |     CHECK_EFFECTIVENESS(Psychic, Fire, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Psychic, Water, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Psychic, Grass, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Psychic, Electric, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Psychic, Psychic, 0.5); | ||||||
|  |     CHECK_EFFECTIVENESS(Psychic, Ice, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Psychic, Dragon, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Psychic, Dark, 0); | ||||||
|  |     CHECK_EFFECTIVENESS(Psychic, Fairy, 1); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | TEST_CASE("Type Effectiveness - Ice Attacking", "[type]") { | ||||||
|  |     auto typeLib = Library::GetStaticLib()->GetTypeLibrary(); | ||||||
|  |     CHECK_EFFECTIVENESS(Ice, Normal, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Ice, Fighting, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Ice, Flying, 2); | ||||||
|  |     CHECK_EFFECTIVENESS(Ice, Poison, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Ice, Ground, 2); | ||||||
|  |     CHECK_EFFECTIVENESS(Ice, Rock, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Ice, Bug, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Ice, Ghost, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Ice, Steel, 0.5); | ||||||
|  |     CHECK_EFFECTIVENESS(Ice, Fire, 0.5); | ||||||
|  |     CHECK_EFFECTIVENESS(Ice, Water, 0.5); | ||||||
|  |     CHECK_EFFECTIVENESS(Ice, Grass, 2); | ||||||
|  |     CHECK_EFFECTIVENESS(Ice, Electric, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Ice, Psychic, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Ice, Ice, 0.5); | ||||||
|  |     CHECK_EFFECTIVENESS(Ice, Dragon, 2); | ||||||
|  |     CHECK_EFFECTIVENESS(Ice, Dark, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Ice, Fairy, 1); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | TEST_CASE("Type Effectiveness - Dragon Attacking", "[type]") { | ||||||
|  |     auto typeLib = Library::GetStaticLib()->GetTypeLibrary(); | ||||||
|  |     CHECK_EFFECTIVENESS(Dragon, Normal, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Dragon, Fighting, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Dragon, Flying, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Dragon, Poison, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Dragon, Ground, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Dragon, Rock, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Dragon, Bug, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Dragon, Ghost, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Dragon, Steel, 0.5); | ||||||
|  |     CHECK_EFFECTIVENESS(Dragon, Fire, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Dragon, Water, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Dragon, Grass, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Dragon, Electric, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Dragon, Psychic, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Dragon, Ice, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Dragon, Dragon, 2); | ||||||
|  |     CHECK_EFFECTIVENESS(Dragon, Dark, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Dragon, Fairy, 0); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | TEST_CASE("Type Effectiveness - Dark Attacking", "[type]") { | ||||||
|  |     auto typeLib = Library::GetStaticLib()->GetTypeLibrary(); | ||||||
|  |     CHECK_EFFECTIVENESS(Dark, Normal, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Dark, Fighting, 0.5); | ||||||
|  |     CHECK_EFFECTIVENESS(Dark, Flying, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Dark, Poison, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Dark, Ground, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Dark, Rock, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Dark, Bug, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Dark, Ghost, 2); | ||||||
|  |     CHECK_EFFECTIVENESS(Dark, Steel, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Dark, Fire, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Dark, Water, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Dark, Grass, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Dark, Electric, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Dark, Psychic, 2); | ||||||
|  |     CHECK_EFFECTIVENESS(Dark, Ice, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Dark, Dragon, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Dark, Dark, 0.5); | ||||||
|  |     CHECK_EFFECTIVENESS(Dark, Fairy, 0.5); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | TEST_CASE("Type Effectiveness - Fairy Attacking", "[type]") { | ||||||
|  |     auto typeLib = Library::GetStaticLib()->GetTypeLibrary(); | ||||||
|  |     CHECK_EFFECTIVENESS(Fairy, Normal, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Fairy, Fighting, 2); | ||||||
|  |     CHECK_EFFECTIVENESS(Fairy, Flying, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Fairy, Poison, 0.5); | ||||||
|  |     CHECK_EFFECTIVENESS(Fairy, Ground, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Fairy, Rock, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Fairy, Bug, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Fairy, Ghost, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Fairy, Steel, 0.5); | ||||||
|  |     CHECK_EFFECTIVENESS(Fairy, Fire, 0.5); | ||||||
|  |     CHECK_EFFECTIVENESS(Fairy, Water, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Fairy, Grass, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Fairy, Electric, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Fairy, Psychic, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Fairy, Ice, 1); | ||||||
|  |     CHECK_EFFECTIVENESS(Fairy, Dragon, 2); | ||||||
|  |     CHECK_EFFECTIVENESS(Fairy, Dark, 2); | ||||||
|  |     CHECK_EFFECTIVENESS(Fairy, Fairy, 1); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #undef CHECK_EFFECTIVENESS | ||||||
							
								
								
									
										34
									
								
								src/main.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								src/main.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,34 @@ | |||||||
|  | #define CATCH_CONFIG_RUNNER | ||||||
|  | #include "../extern/catch.hpp" | ||||||
|  | #include "BuildData/BuildSpecies.hpp" | ||||||
|  | #include "BuildData/BuildTypes.hpp" | ||||||
|  | #include "Library.hpp" | ||||||
|  |  | ||||||
|  | int main(int argc, char* argv[]) { | ||||||
|  |     Catch::Session session; | ||||||
|  |  | ||||||
|  |     std::string typesFile = "Types.csv"; | ||||||
|  |     std::string pokemonFile = "Pokemon.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."); | ||||||
|  |  | ||||||
|  |     session.cli(cli); | ||||||
|  |  | ||||||
|  |     int returnCode = session.applyCommandLine(argc, argv); | ||||||
|  |     if (returnCode != 0) // Indicates a command line error | ||||||
|  |         return returnCode; | ||||||
|  |  | ||||||
|  |     auto typesLibrary = BuildTypes::Build(typesFile); | ||||||
|  |     auto speciesLibrary = BuildSpecies::BuildLibrary(pokemonFile, typesLibrary); | ||||||
|  |  | ||||||
|  |     auto settings = new PkmnLib::Library::LibrarySettings(100, 4, 4096); | ||||||
|  |     auto library = new PkmnLib::Library::PokemonLibrary(settings, speciesLibrary,nullptr,nullptr, nullptr,typesLibrary, | ||||||
|  |             nullptr); | ||||||
|  |  | ||||||
|  |     Library::SetStaticLib(library); | ||||||
|  |  | ||||||
|  |     return session.run(); | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user