From 168e14d394597906481978fcf9e5687c089fd4ea Mon Sep 17 00:00:00 2001 From: Deukhoofd Date: Mon, 4 Nov 2019 17:58:26 +0100 Subject: [PATCH] Implement basic type library. --- src/Library/DataLibrary.cpp | 9 +++++++-- src/Library/DataLibrary.hpp | 7 ++++++- src/Library/TypeLibrary.cpp | 32 +++++++++++++++++++++++++++++++ src/Library/TypeLibrary.hpp | 22 +++++++++++++++++++++ tests/TestLibrary/TestLibrary.cpp | 9 ++++++++- 5 files changed, 75 insertions(+), 4 deletions(-) create mode 100644 src/Library/TypeLibrary.cpp create mode 100644 src/Library/TypeLibrary.hpp diff --git a/src/Library/DataLibrary.cpp b/src/Library/DataLibrary.cpp index 0c78237..d524191 100644 --- a/src/Library/DataLibrary.cpp +++ b/src/Library/DataLibrary.cpp @@ -4,9 +4,10 @@ CreatureLib::Library::DataLibrary::DataLibrary(LibrarySettings settings, CreatureLib::Library::SpeciesLibrary *species, CreatureLib::Library::AttackLibrary *attacks, CreatureLib::Library::ItemLibrary *items, - CreatureLib::Library::GrowthRateLibrary *growthRates) + CreatureLib::Library::GrowthRateLibrary *growthRates, + TypeLibrary* typeLibrary) : _settings(settings), _species(species), _attacks(attacks), _items(items), - _growthRates(growthRates){ + _growthRates(growthRates), _typeLibrary(typeLibrary){ } @@ -30,5 +31,9 @@ const CreatureLib::Library::GrowthRateLibrary *CreatureLib::Library::DataLibrary return _growthRates; } +const CreatureLib::Library::TypeLibrary *CreatureLib::Library::DataLibrary::GetTypeLibrary() const { + return _typeLibrary; +} + diff --git a/src/Library/DataLibrary.hpp b/src/Library/DataLibrary.hpp index 996542c..2a9c44e 100644 --- a/src/Library/DataLibrary.hpp +++ b/src/Library/DataLibrary.hpp @@ -6,6 +6,7 @@ #include "ItemLibrary.hpp" #include "GrowthRates/GrowthRateLibrary.hpp" #include "LibrarySettings.hpp" +#include "TypeLibrary.hpp" namespace CreatureLib::Library { /*! @@ -18,12 +19,14 @@ namespace CreatureLib::Library { const AttackLibrary* _attacks; const ItemLibrary* _items; const GrowthRateLibrary* _growthRates; + const TypeLibrary* _typeLibrary; public: DataLibrary(LibrarySettings settings, CreatureLib::Library::SpeciesLibrary *species, CreatureLib::Library::AttackLibrary *attacks, CreatureLib::Library::ItemLibrary *items, - CreatureLib::Library::GrowthRateLibrary *growthRates + CreatureLib::Library::GrowthRateLibrary *growthRates, + TypeLibrary* typeLibrary ); ~DataLibrary(){ @@ -31,6 +34,7 @@ namespace CreatureLib::Library { delete _attacks; delete _items; delete _growthRates; + delete _typeLibrary; } [[nodiscard]] const LibrarySettings& GetSettings() const; @@ -38,6 +42,7 @@ namespace CreatureLib::Library { [[nodiscard]] const AttackLibrary* GetAttackLibrary() const; [[nodiscard]] const ItemLibrary* GetItemLibrary() const; [[nodiscard]] const GrowthRateLibrary* GetGrowthRates() const; + [[nodiscard]] const TypeLibrary* GetTypeLibrary() const; }; } diff --git a/src/Library/TypeLibrary.cpp b/src/Library/TypeLibrary.cpp new file mode 100644 index 0000000..c7a5eeb --- /dev/null +++ b/src/Library/TypeLibrary.cpp @@ -0,0 +1,32 @@ +#include "TypeLibrary.hpp" + +using namespace CreatureLib::Library; + +float TypeLibrary::GetEffectiveness(uint8_t attacking, const std::vector &defensive) const { + auto eff = 1; + for (auto def: defensive){ + eff *= GetSingleEffectiveness(attacking, def); + } + return eff; +} + +float TypeLibrary::GetSingleEffectiveness(uint8_t attacking, uint8_t defensive) const { + return _effectiveness[attacking][defensive]; +} + +uint8_t TypeLibrary::GetTypeId(const std::string &s) const { + return _types.at(s); +} + +uint8_t TypeLibrary::RegisterType(const std::string& typeName) { + _types.insert({typeName, _types.size()}); + _effectiveness.resize(_types.size()); + for (auto & eff : _effectiveness){ + eff.resize(_types.size(), 1); + } + return _types.size() - 1; +} + +void TypeLibrary::SetEffectiveness(uint8_t attacking, uint8_t defensive, float effectiveness) { + _effectiveness[attacking][defensive] = effectiveness; +} diff --git a/src/Library/TypeLibrary.hpp b/src/Library/TypeLibrary.hpp new file mode 100644 index 0000000..0dd2750 --- /dev/null +++ b/src/Library/TypeLibrary.hpp @@ -0,0 +1,22 @@ +#ifndef CREATURELIB_TYPELIBRARY_HPP +#define CREATURELIB_TYPELIBRARY_HPP + +#include +#include + +namespace CreatureLib::Library{ + class TypeLibrary { + std::unordered_map _types; + std::vector> _effectiveness; + public: + uint8_t GetTypeId(const std::string& s) const; + float GetSingleEffectiveness(uint8_t attacking, uint8_t defensive) const; + float GetEffectiveness(uint8_t attacking, const std::vector& defensive) const; + + uint8_t RegisterType(const std::string& typeName); + void SetEffectiveness(uint8_t attacking, uint8_t defensive, float effectiveness); + }; +} + + +#endif //CREATURELIB_TYPELIBRARY_HPP diff --git a/tests/TestLibrary/TestLibrary.cpp b/tests/TestLibrary/TestLibrary.cpp index 99310b1..a45dc80 100644 --- a/tests/TestLibrary/TestLibrary.cpp +++ b/tests/TestLibrary/TestLibrary.cpp @@ -41,10 +41,17 @@ static GrowthRateLibrary* BuildGrowthRateLibrary(){ return l; } +static TypeLibrary* BuildTypeLibrary(){ + auto l = new TypeLibrary(); + l->RegisterType("testType1"); + l->RegisterType("testType2"); + l->RegisterType("testType3"); + return l; +} static BattleLibrary* BuildLibrary(){ auto l = new DataLibrary(LibrarySettings(100, 4), BuildSpeciesLibrary(), BuildAttackLibrary(), - BuildItemLibrary(), BuildGrowthRateLibrary()); + BuildItemLibrary(), BuildGrowthRateLibrary(), BuildTypeLibrary()); auto battleLib = new BattleLibrary(l, new BattleStatCalculator()); return battleLib; }