#ifndef CREATURELIB_TYPELIBRARY_HPP #define CREATURELIB_TYPELIBRARY_HPP #include #include #include #include #include #include namespace CreatureLib::Library { class TypeLibrary { ArbUt::Dictionary _types; ArbUt::List> _effectiveness; public: TypeLibrary(size_t initialCapacity = 20) : _types(ArbUt::Dictionary(initialCapacity)) {} inline uint8_t GetTypeId(const ArbUt::CaseInsensitiveConstString& key) const { return _types.Get(key); } inline uint8_t GetTypeId(uint32_t s) const { return _types.Get(s); } [[nodiscard]] inline float GetSingleEffectiveness(uint8_t attacking, uint8_t defensive) const { return _effectiveness[attacking][defensive]; } [[nodiscard]] inline float GetEffectiveness(uint8_t attacking, const std::unordered_set& defensive) const { return std::accumulate(defensive.begin(), defensive.end(), (float)1, [this, attacking](float init, uint8_t defense) { return init * GetSingleEffectiveness(attacking, defense); }); } uint8_t RegisterType(const ArbUt::CaseInsensitiveConstString& typeName); uint8_t RegisterType(uint32_t typeHash); void SetEffectiveness(uint8_t attacking, uint8_t defensive, float effectiveness); }; } #endif // CREATURELIB_TYPELIBRARY_HPP