Initial commit
This commit is contained in:
commit
265923231f
|
@ -0,0 +1,2 @@
|
|||
/cmake-build-debug/
|
||||
/.idea/
|
|
@ -0,0 +1,45 @@
|
|||
cmake_minimum_required(VERSION 3.15)
|
||||
|
||||
if (NOT CMAKE_C_COMPILER)
|
||||
if (GCC)
|
||||
set(CMAKE_C_COMPILER "gcc")
|
||||
set(CMAKE_CXX_COMPILER "g++")
|
||||
else()
|
||||
set(CMAKE_C_COMPILER "clang")
|
||||
set(CMAKE_CXX_COMPILER "clang++")
|
||||
endif(GCC)
|
||||
endif(NOT CMAKE_C_COMPILER)
|
||||
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Werror")
|
||||
|
||||
project(CreatureLib)
|
||||
|
||||
set(CMAKE_CXX_STANDARD 17)
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
|
||||
|
||||
if (WINDOWS)
|
||||
ADD_DEFINITIONS(-D WINDOWS=1)
|
||||
endif(WINDOWS)
|
||||
|
||||
file(GLOB_RECURSE CORE_SRC_FILES "src/Core/*.cpp" "src/Core/*.hpp")
|
||||
add_library(CreatureLibCore SHARED ${CORE_SRC_FILES})
|
||||
|
||||
file(GLOB_RECURSE LIBRARY_SRC_FILES "src/Library/*.cpp" "src/Library/*.hpp")
|
||||
add_library(CreatureLibLibrary SHARED ${LIBRARY_SRC_FILES})
|
||||
|
||||
file(GLOB_RECURSE TEST_FILES "tests/*.cpp" "tests/*.hpp")
|
||||
add_executable(CreatureLibTests ${TEST_FILES} extern/catch.hpp)
|
||||
|
||||
target_link_libraries(CreatureLibLibrary -static-libgcc -static-libstdc++)
|
||||
target_link_libraries(CreatureLibTests -static-libgcc -static-libstdc++)
|
||||
|
||||
target_link_libraries(CreatureLibLibrary CreatureLibCore)
|
||||
target_link_libraries(CreatureLibTests CreatureLibLibrary)
|
||||
|
||||
if (WINDOWS)
|
||||
target_link_libraries(CreatureLibLibrary -static -static-libgcc -static-libstdc++)
|
||||
target_link_libraries(CreatureLibTests -static -static-libgcc -static-libstdc++)
|
||||
endif(WINDOWS)
|
||||
|
||||
target_compile_definitions(CreatureLibTests PRIVATE TESTS_BUILD)
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,30 @@
|
|||
#include "Random.hpp"
|
||||
#include <limits>
|
||||
|
||||
// Seed parameterless constructor with current milliseconds since epoch.
|
||||
CreatureLib::Core::Random::Random() : _rng(std::mt19937(duration_cast<milliseconds>(system_clock::now().time_since_epoch()).count())){}
|
||||
|
||||
float CreatureLib::Core::Random::GetFloat() {
|
||||
return static_cast<float>(_rng()) / (static_cast<float>(std::mt19937::max() - std::mt19937::min()) - 0.5f);
|
||||
}
|
||||
|
||||
double CreatureLib::Core::Random::GetDouble() {
|
||||
return static_cast<double>(_rng()) / ((static_cast<double>(std::mt19937::max()) - std::mt19937::min()) - 0.5);
|
||||
}
|
||||
|
||||
int32_t CreatureLib::Core::Random::Get() {
|
||||
return static_cast<int32_t >(GetDouble() * static_cast<float>(std::numeric_limits<int32_t >::max()));
|
||||
}
|
||||
|
||||
int32_t CreatureLib::Core::Random::Get(int32_t max) {
|
||||
return static_cast<int32_t >(GetDouble() * static_cast<float>(max));
|
||||
}
|
||||
|
||||
int32_t CreatureLib::Core::Random::Get(int32_t min, int32_t max) {
|
||||
return static_cast<int32_t >(GetDouble() * static_cast<float>(max - min) + min);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,23 @@
|
|||
#ifndef CREATURELIB_RANDOM_HPP
|
||||
#define CREATURELIB_RANDOM_HPP
|
||||
#include <cstdint>
|
||||
#include <chrono>
|
||||
#include <random>
|
||||
using namespace std::chrono;
|
||||
namespace CreatureLib::Core {
|
||||
class Random {
|
||||
private:
|
||||
std::mt19937 _rng;
|
||||
public:
|
||||
Random();
|
||||
explicit Random(int32_t seed) : _rng(seed){};
|
||||
|
||||
[[nodiscard]] float GetFloat();
|
||||
[[nodiscard]] double GetDouble();
|
||||
[[nodiscard]] int32_t Get();
|
||||
[[nodiscard]] int32_t Get(int32_t max);
|
||||
[[nodiscard]] int32_t Get(int32_t min, int32_t max);
|
||||
};
|
||||
}
|
||||
|
||||
#endif //CREATURELIB_RANDOM_HPP
|
|
@ -0,0 +1,17 @@
|
|||
#ifndef CREATURELIB_STATISTIC_HPP
|
||||
#define CREATURELIB_STATISTIC_HPP
|
||||
|
||||
#include <cstdint>
|
||||
|
||||
namespace CreatureLib::Core{
|
||||
enum Statistic : uint8_t {
|
||||
Health,
|
||||
PhysicalAttack,
|
||||
PhysicalDefense,
|
||||
MagicalAttack,
|
||||
MagicalDefense,
|
||||
Speed
|
||||
};
|
||||
}
|
||||
|
||||
#endif //CREATURELIB_STATISTIC_HPP
|
|
@ -0,0 +1,13 @@
|
|||
#include <exception>
|
||||
#include "StatisticSet.hpp"
|
||||
|
||||
CreatureLib::Core::StatisticSet::StatisticSet(uint32_t health, uint32_t physicalAttack, uint32_t physicalDefense,
|
||||
uint32_t magicalAttack, uint32_t magicalDefense, uint32_t speed)
|
||||
:
|
||||
__Health(health),
|
||||
__PhysicalAttack(physicalAttack),
|
||||
__PhysicalDefense(physicalDefense),
|
||||
__MagicalAttack(magicalAttack),
|
||||
__MagicalDefense(magicalDefense),
|
||||
__Speed(speed)
|
||||
{}
|
|
@ -0,0 +1,35 @@
|
|||
#ifndef CREATURELIB_STATISTICSET_HPP
|
||||
#define CREATURELIB_STATISTICSET_HPP
|
||||
#include <stdint.h>
|
||||
#include "Statistic.hpp"
|
||||
#include "../GenericTemplates.cpp"
|
||||
|
||||
namespace CreatureLib::Core{
|
||||
class StatisticSet {
|
||||
public:
|
||||
StatisticSet(uint32_t health, uint32_t physicalAttack, uint32_t physicalDefense, uint32_t magicalAttack,
|
||||
uint32_t magicalDefense, uint32_t speed);
|
||||
|
||||
GetSetProperty(uint32_t, Health)
|
||||
GetSetProperty(uint32_t, PhysicalAttack)
|
||||
GetSetProperty(uint32_t, PhysicalDefense)
|
||||
GetSetProperty(uint32_t, MagicalAttack)
|
||||
GetSetProperty(uint32_t, MagicalDefense)
|
||||
GetSetProperty(uint32_t, Speed)
|
||||
|
||||
[[nodiscard]] inline uint32_t GetStat(Statistic stat) const{
|
||||
switch (stat){
|
||||
case Health: return __Health;
|
||||
case PhysicalAttack: return __PhysicalAttack;
|
||||
case PhysicalDefense: return __PhysicalDefense;
|
||||
case MagicalAttack: return __MagicalAttack;
|
||||
case MagicalDefense: return __MagicalDefense;
|
||||
case Speed: return __Speed;
|
||||
}
|
||||
throw std::exception();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
#endif //CREATURELIB_STATISTICSET_HPP
|
|
@ -0,0 +1,15 @@
|
|||
/*!
|
||||
\brief GetProperty creates a simple wrapper for a field, creating a private field, and a public getter method.
|
||||
*/
|
||||
#define GetProperty(type, name) \
|
||||
private: type __##name; \
|
||||
public: [[nodiscard]] inline type Get##name() const{ return __##name; };
|
||||
|
||||
/*!
|
||||
\brief GetProperty creates a simple wrapper for a field, creating a private field, a public getter method, and a public
|
||||
setter method.
|
||||
*/
|
||||
#define GetSetProperty(type, name) \
|
||||
private: type __##name; \
|
||||
public: [[nodiscard]] inline type Get##name() const{ return __##name; }; \
|
||||
public: inline void Set##name(type value) { __##name = value; }; \
|
|
@ -0,0 +1,20 @@
|
|||
#include "AttackLibrary.hpp"
|
||||
|
||||
const CreatureLib::Library::AttackData *CreatureLib::Library::AttackLibrary::GetAttack(const std::string &name) const {
|
||||
return this->_attacks.at(name);
|
||||
}
|
||||
|
||||
const CreatureLib::Library::AttackData *CreatureLib::Library::AttackLibrary::operator[](const std::string &name) const {
|
||||
return GetAttack(name);
|
||||
}
|
||||
|
||||
void CreatureLib::Library::AttackLibrary::LoadAttack(const std::string &name,
|
||||
const CreatureLib::Library::AttackData* attack) {
|
||||
this->_attacks.insert({name, attack});
|
||||
}
|
||||
|
||||
void CreatureLib::Library::AttackLibrary::DeleteAttack(const std::string &name) {
|
||||
this->_attacks.erase(name);
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
#ifndef CREATURELIB_ATTACKLIBRARY_HPP
|
||||
#define CREATURELIB_ATTACKLIBRARY_HPP
|
||||
|
||||
#include <string>
|
||||
#include <unordered_map>
|
||||
#include "Attacks/AttackData.hpp"
|
||||
|
||||
namespace CreatureLib::Library {
|
||||
class AttackLibrary {
|
||||
private:
|
||||
std::unordered_map<std::string, const AttackData*> _attacks;
|
||||
public:
|
||||
AttackLibrary() = default;
|
||||
|
||||
~AttackLibrary(){
|
||||
_attacks.clear();
|
||||
}
|
||||
|
||||
[[nodiscard]] const AttackData* GetAttack(const std::string& name) const;
|
||||
[[nodiscard]] const AttackData* operator[] (const std::string& name) const;
|
||||
|
||||
void LoadAttack(const std::string& name, const AttackData* attack);
|
||||
void DeleteAttack(const std::string& name);
|
||||
};
|
||||
}
|
||||
|
||||
#endif //CREATURELIB_ATTACKLIBRARY_HPP
|
|
@ -0,0 +1,14 @@
|
|||
#ifndef CREATURELIB_ATTACKCATEGORY_HPP
|
||||
#define CREATURELIB_ATTACKCATEGORY_HPP
|
||||
|
||||
#include <cstdint>
|
||||
|
||||
namespace CreatureLib::Library {
|
||||
enum class AttackCategory : uint8_t {
|
||||
Physical,
|
||||
Magical,
|
||||
Status
|
||||
};
|
||||
}
|
||||
|
||||
#endif //CREATURELIB_ATTACKCATEGORY_HPP
|
|
@ -0,0 +1,25 @@
|
|||
#include "AttackData.hpp"
|
||||
|
||||
#include <utility>
|
||||
|
||||
CreatureLib::Library::AttackData::AttackData(std::string name, std::string type,
|
||||
CreatureLib::Library::AttackCategory category, uint8_t power,
|
||||
uint8_t accuracy, uint8_t baseUsage,
|
||||
CreatureLib::Library::AttackTarget target, uint8_t priority,
|
||||
std::unordered_set<std::string> flags)
|
||||
:
|
||||
__Name(std::move(name)),
|
||||
__Type(std::move(type)),
|
||||
__Category(category),
|
||||
__BasePower(power),
|
||||
__Accuracy(accuracy),
|
||||
__BaseUsages(baseUsage),
|
||||
__Target(target),
|
||||
__Priority(priority),
|
||||
_flags(std::move(flags))
|
||||
{}
|
||||
|
||||
bool CreatureLib::Library::AttackData::HasFlag(const std::string& key) const{
|
||||
return this->_flags.find(key) != this->_flags.end();
|
||||
}
|
||||
|
|
@ -0,0 +1,32 @@
|
|||
#ifndef CREATURELIB_ATTACKDATA_HPP
|
||||
#define CREATURELIB_ATTACKDATA_HPP
|
||||
|
||||
#include <string>
|
||||
#include <unordered_set>
|
||||
#include "AttackCategory.hpp"
|
||||
#include "AttackTarget.hpp"
|
||||
|
||||
#include "../../GenericTemplates.cpp"
|
||||
|
||||
namespace CreatureLib::Library {
|
||||
class AttackData {
|
||||
GetProperty(std::string, Name);
|
||||
GetProperty(std::string, Type);
|
||||
GetProperty(AttackCategory , Category);
|
||||
GetProperty(uint8_t , BasePower);
|
||||
GetProperty(uint8_t , Accuracy);
|
||||
GetProperty(uint8_t , BaseUsages);
|
||||
GetProperty(AttackTarget, Target);
|
||||
GetProperty(uint8_t , Priority);
|
||||
private:
|
||||
std::unordered_set<std::string> _flags;
|
||||
public:
|
||||
AttackData(std::string name, std::string type, AttackCategory category, uint8_t power, uint8_t accuracy,
|
||||
uint8_t baseUsage, AttackTarget target, uint8_t priority, std::unordered_set<std::string> flags);
|
||||
|
||||
bool HasFlag(const std::string& key) const;
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
#endif //CREATURELIB_ATTACKDATA_HPP
|
|
@ -0,0 +1,26 @@
|
|||
#ifndef CREATURELIB_ATTACKTARGET_HPP
|
||||
#define CREATURELIB_ATTACKTARGET_HPP
|
||||
|
||||
#include <cstdint>
|
||||
|
||||
namespace CreatureLib::Library {
|
||||
enum class AttackTarget : uint8_t{
|
||||
Adjacent,
|
||||
AdjacentAlly,
|
||||
AdjacentAllySelf,
|
||||
AdjacentOpponent,
|
||||
|
||||
All,
|
||||
AllAdjacent,
|
||||
AllAdjacentOpponent,
|
||||
AllAlly,
|
||||
AllOpponent,
|
||||
|
||||
Any,
|
||||
|
||||
RandomOpponent,
|
||||
Self,
|
||||
};
|
||||
}
|
||||
|
||||
#endif //CREATURELIB_ATTACKTARGET_HPP
|
|
@ -0,0 +1,97 @@
|
|||
#include "CreateCreature.hpp"
|
||||
#include <utility>
|
||||
|
||||
using namespace CreatureLib::Library;
|
||||
|
||||
CreateCreature* CreateCreature::WithVariant(std::string variant) {
|
||||
this->_variant = std::move(variant);
|
||||
return this;
|
||||
}
|
||||
|
||||
CreateCreature *CreateCreature::WithNickname(std::string nickname) {
|
||||
this->_nickname = std::move(nickname);
|
||||
return this;
|
||||
}
|
||||
|
||||
CreateCreature *CreateCreature::WithStatPotential(CreatureLib::Core::Statistic stat, uint32_t value) {
|
||||
switch (stat){
|
||||
case Core::Health:_healthPotential = value;
|
||||
case Core::PhysicalAttack: _physAttackPotential = value;
|
||||
case Core::PhysicalDefense: _physDefensePotential = value;
|
||||
case Core::MagicalAttack: _magAttackPotential = value;
|
||||
case Core::MagicalDefense:_magDefensePotential = value;
|
||||
case Core::Speed: _speedPotential = value;
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
CreateCreature * CreateCreature::WithStatPotentials(uint32_t health, uint32_t physAttack, uint32_t physDefense,
|
||||
uint32_t magAttack, uint32_t magDefense, uint32_t speed) {
|
||||
_healthPotential = health;
|
||||
_physAttackPotential = physAttack;
|
||||
_physDefensePotential = physDefense;
|
||||
_magAttackPotential = magAttack;
|
||||
_magDefensePotential = magDefense;
|
||||
_speedPotential = speed;
|
||||
return this;
|
||||
}
|
||||
|
||||
CreateCreature* CreateCreature::WithStatExperience(Core::Statistic stat, uint32_t value) {
|
||||
switch (stat){
|
||||
case Core::Health:_healthExperience = value;
|
||||
case Core::PhysicalAttack: _physAttackExperience = value;
|
||||
case Core::PhysicalDefense: _physDefenseExperience = value;
|
||||
case Core::MagicalAttack: _magAttackExperience = value;
|
||||
case Core::MagicalDefense:_magDefenseExperience = value;
|
||||
case Core::Speed: _speedExperience = value;
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
CreateCreature *
|
||||
CreateCreature::WithStatExperiences(uint32_t health, uint32_t physAttack, uint32_t physDefense, uint32_t magAttack,
|
||||
uint32_t magDefense, uint32_t speed) {
|
||||
_healthExperience = health;
|
||||
_physAttackExperience = physAttack;
|
||||
_physDefenseExperience = physDefense;
|
||||
_magAttackExperience = magAttack;
|
||||
_magDefenseExperience = magDefense;
|
||||
_speedExperience = speed;
|
||||
return this;
|
||||
}
|
||||
|
||||
CreateCreature *CreateCreature::WithGender(Gender gender) {
|
||||
this->_gender = gender;
|
||||
return this;
|
||||
}
|
||||
|
||||
Creature *CreateCreature::Create() {
|
||||
auto rand = Core::Random();
|
||||
auto species = this->_library->GetSpeciesLibrary()->GetSpecies(this->_species);
|
||||
auto variant = species->GetVariant(this->_variant);
|
||||
int8_t talent;
|
||||
if (this->_talent.empty()){
|
||||
talent = variant->GetRandomTalent(&rand);
|
||||
}
|
||||
else{
|
||||
talent = variant->GetTalentIndex(this->_talent);
|
||||
}
|
||||
auto identifier = this->_identifier;
|
||||
if (identifier == 0){
|
||||
identifier = rand.Get();
|
||||
}
|
||||
auto gender = this->_gender;
|
||||
if (gender == static_cast<Gender >(-1)){
|
||||
gender = species->GetRandomGender(rand);
|
||||
}
|
||||
const Item* heldItem = nullptr;
|
||||
if (!this->_heldItem.empty()){
|
||||
heldItem = _library->GetItemLibrary()->GetItem(this->_heldItem);
|
||||
}
|
||||
return new Creature(this->_library, species, variant, this->_level, this->_nickname, talent,
|
||||
Core::StatisticSet(_healthExperience, _physAttackExperience, _physDefenseExperience,
|
||||
_magAttackExperience, _magDefenseExperience, _speedExperience),
|
||||
Core::StatisticSet(_healthPotential, _physAttackPotential, _physDefensePotential,
|
||||
_magAttackPotential, _magDefensePotential, _speedPotential),
|
||||
identifier, gender, _coloring, heldItem);
|
||||
}
|
|
@ -0,0 +1,58 @@
|
|||
#ifndef CREATURELIB_CREATECREATURE_HPP
|
||||
#define CREATURELIB_CREATECREATURE_HPP
|
||||
|
||||
|
||||
#include "DataLibrary.hpp"
|
||||
#include "Creature.hpp"
|
||||
|
||||
namespace CreatureLib::Library {
|
||||
class CreateCreature {
|
||||
const DataLibrary *_library;
|
||||
std::string _species;
|
||||
std::string _variant = "default";
|
||||
uint8_t _level;
|
||||
std::string _nickname = "";
|
||||
|
||||
uint32_t _healthPotential = 0;
|
||||
uint32_t _physAttackPotential = 0;
|
||||
uint32_t _physDefensePotential = 0;
|
||||
uint32_t _magAttackPotential = 0;
|
||||
uint32_t _magDefensePotential = 0;
|
||||
uint32_t _speedPotential = 0;
|
||||
|
||||
uint32_t _healthExperience = 0;
|
||||
uint32_t _physAttackExperience = 0;
|
||||
uint32_t _physDefenseExperience = 0;
|
||||
uint32_t _magAttackExperience = 0;
|
||||
uint32_t _magDefenseExperience = 0;
|
||||
uint32_t _speedExperience = 0;
|
||||
|
||||
std::string _talent = "";
|
||||
Gender _gender = static_cast<Gender>(-1);
|
||||
uint8_t _coloring = 0;
|
||||
std::string _heldItem = "";
|
||||
uint32_t _identifier = 0;
|
||||
|
||||
public:
|
||||
CreateCreature(const DataLibrary *library, std::string species, uint8_t level)
|
||||
: _library(library), _species(std::move(species)), _level(level)
|
||||
{
|
||||
}
|
||||
|
||||
CreateCreature* WithVariant(std::string variant);
|
||||
CreateCreature* WithNickname(std::string nickname);
|
||||
CreateCreature* WithStatPotential(Core::Statistic stat, uint32_t value);
|
||||
CreateCreature* WithStatPotentials(uint32_t health, uint32_t physAttack, uint32_t physDefense, uint32_t magAttack,
|
||||
uint32_t magDefense,uint32_t speed);
|
||||
CreateCreature* WithStatExperience(Core::Statistic stat, uint32_t value);
|
||||
CreateCreature* WithStatExperiences(uint32_t health, uint32_t physAttack, uint32_t physDefense, uint32_t magAttack,
|
||||
uint32_t magDefense,uint32_t speed);
|
||||
CreateCreature* WithGender(Gender gender);
|
||||
|
||||
|
||||
Creature* Create();
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
#endif //CREATURELIB_CREATECREATURE_HPP
|
|
@ -0,0 +1,36 @@
|
|||
#include "Creature.hpp"
|
||||
|
||||
CreatureLib::Library::Creature::Creature(const CreatureLib::Library::DataLibrary *library,
|
||||
const CreatureLib::Library::CreatureSpecies *species,
|
||||
const CreatureLib::Library::SpeciesVariant *variant, uint8_t level,
|
||||
std::string nickname, int8_t talentIndex,
|
||||
CreatureLib::Core::StatisticSet statExperience,
|
||||
CreatureLib::Core::StatisticSet statPotential,
|
||||
uint32_t identifier, CreatureLib::Library::Gender gender, uint8_t coloring,
|
||||
const CreatureLib::Library::Item *heldItem)
|
||||
:
|
||||
__Library(library),
|
||||
__Species(species),
|
||||
__Variant(variant),
|
||||
__Level(level),
|
||||
__StatExperience(statExperience),
|
||||
__StatPotential(statPotential),
|
||||
__UniqueIdentifier(identifier),
|
||||
__Gender(gender),
|
||||
__Coloring(coloring),
|
||||
__HeldItem(heldItem),
|
||||
_nickname(nickname),
|
||||
_talentIndex(talentIndex)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
std::string CreatureLib::Library::Creature::GetTalent() const {
|
||||
return __Variant->GetTalent(_talentIndex);
|
||||
}
|
||||
|
||||
std::string CreatureLib::Library::Creature::GetNickname() const {
|
||||
if (_nickname.empty())
|
||||
return __Species->GetName();
|
||||
return _nickname;
|
||||
}
|
|
@ -0,0 +1,39 @@
|
|||
#ifndef CREATURELIB_CREATURE_HPP
|
||||
#define CREATURELIB_CREATURE_HPP
|
||||
|
||||
#include "DataLibrary.hpp"
|
||||
#include "Gender.hpp"
|
||||
#include "../GenericTemplates.cpp"
|
||||
#include "../Core/StatisticSet.hpp"
|
||||
|
||||
namespace CreatureLib::Library{
|
||||
class Creature {
|
||||
GetProperty(const DataLibrary*, Library);
|
||||
GetProperty(const CreatureSpecies*, Species);
|
||||
GetProperty(const SpeciesVariant*, Variant);
|
||||
GetProperty(uint8_t, Level);
|
||||
GetProperty(uint32_t, Experience);
|
||||
GetProperty(Core::StatisticSet, StatExperience);
|
||||
GetProperty(Core::StatisticSet, StatPotential);
|
||||
GetProperty(uint32_t, UniqueIdentifier);
|
||||
GetProperty(Gender, Gender);
|
||||
GetProperty(uint8_t, Coloring);
|
||||
GetProperty(const Item*, HeldItem);
|
||||
|
||||
GetProperty(uint32_t, CurrentHealth);
|
||||
private:
|
||||
std::string _nickname = "";
|
||||
int8_t _talentIndex;
|
||||
public:
|
||||
Creature(const DataLibrary* library, const CreatureSpecies* species, const SpeciesVariant* variant,
|
||||
uint8_t level, std::string nickname, int8_t talentIndex, Core::StatisticSet statExperience,
|
||||
Core::StatisticSet statPotential, uint32_t identifier, Gender gender,
|
||||
uint8_t coloring, const Item* heldItem);
|
||||
|
||||
std::string GetTalent() const;
|
||||
std::string GetNickname() const;
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
#endif //CREATURELIB_CREATURE_HPP
|
|
@ -0,0 +1,16 @@
|
|||
#include "CreatureMoves.hpp"
|
||||
#include <utility>
|
||||
|
||||
CreatureLib::Library::LevelMove::LevelMove(uint8_t level, std::string name)
|
||||
:_level(level),
|
||||
_name(std::move(name))
|
||||
{}
|
||||
|
||||
uint8_t CreatureLib::Library::LevelMove::GetLevel() const {
|
||||
return this->_level;
|
||||
}
|
||||
|
||||
std::string CreatureLib::Library::LevelMove::GetName() const {
|
||||
return this->_name;
|
||||
}
|
||||
|
|
@ -0,0 +1,32 @@
|
|||
#ifndef CREATURELIB_CREATUREMOVES_HPP
|
||||
#define CREATURELIB_CREATUREMOVES_HPP
|
||||
|
||||
#include <cstdint>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
namespace CreatureLib::Library{
|
||||
class LevelMove{
|
||||
private:
|
||||
uint8_t _level;
|
||||
std::string _name;
|
||||
public:
|
||||
LevelMove(uint8_t level, std::string name);
|
||||
[[nodiscard]] inline uint8_t GetLevel() const;
|
||||
[[nodiscard]] inline std::string GetName() const;
|
||||
};
|
||||
|
||||
class CreatureMoves {
|
||||
private:
|
||||
std::vector<LevelMove> _levelMoves;
|
||||
std::vector<std::string> _eggMoves;
|
||||
std::vector<std::string> _machineMoves;
|
||||
std::vector<std::string> _tutorMoves;
|
||||
std::vector<std::string> _variantDependentMoves;
|
||||
public:
|
||||
//TODO: Public API funcs
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
#endif //CREATURELIB_CREATUREMOVES_HPP
|
|
@ -0,0 +1,28 @@
|
|||
#include "CreatureSpecies.hpp"
|
||||
|
||||
#include <utility>
|
||||
using namespace CreatureLib::Library;
|
||||
|
||||
CreatureSpecies::CreatureSpecies(uint16_t id, std::string name, const SpeciesVariant* defaultVariant,
|
||||
float genderRatio, std::string growthRate, uint8_t captureRate, uint8_t baseHappiness)
|
||||
:
|
||||
__Id(id),
|
||||
__Name(std::move(name)),
|
||||
__GenderRate(genderRatio),
|
||||
__GrowthRate(std::move(growthRate)),
|
||||
__CaptureRate(captureRate),
|
||||
__BaseHappiness(baseHappiness),
|
||||
_variants({{"default", defaultVariant}})
|
||||
{}
|
||||
|
||||
const SpeciesVariant *CreatureSpecies::GetVariant(const std::string& key) const {
|
||||
return _variants.at(key);
|
||||
}
|
||||
|
||||
Gender CreatureSpecies::GetRandomGender(CreatureLib::Core::Random &rand) const {
|
||||
// TODO: Genderless creatures
|
||||
auto val = rand.GetDouble();
|
||||
if (val >= this->__GenderRate) return Gender ::Female;
|
||||
return Gender ::Male;
|
||||
}
|
||||
|
|
@ -0,0 +1,31 @@
|
|||
#ifndef CREATURELIB_CREATURESPECIES_HPP
|
||||
#define CREATURELIB_CREATURESPECIES_HPP
|
||||
|
||||
#include <string>
|
||||
#include <unordered_map>
|
||||
#include "SpeciesVariant.hpp"
|
||||
#include "../Gender.hpp"
|
||||
|
||||
namespace CreatureLib::Library {
|
||||
/*!
|
||||
\brief This holds the data required for a species of a creature, so the general data we can describe different creatures with.
|
||||
*/
|
||||
class CreatureSpecies {
|
||||
GetProperty(uint16_t, Id);
|
||||
GetProperty(std::string, Name);
|
||||
GetProperty(float, GenderRate);
|
||||
GetProperty(std::string, GrowthRate);
|
||||
GetProperty(uint8_t, CaptureRate);
|
||||
GetProperty(uint8_t, BaseHappiness);
|
||||
private:
|
||||
std::unordered_map<std::string, const SpeciesVariant*> _variants;
|
||||
public:
|
||||
CreatureSpecies(uint16_t id, std::string name, const SpeciesVariant* defaultVariant,
|
||||
float genderRatio, std::string growthRate, uint8_t captureRate, uint8_t baseHappiness);
|
||||
|
||||
[[nodiscard]] const SpeciesVariant* GetVariant(const std::string& key) const;
|
||||
[[nodiscard]] Gender GetRandomGender(Core::Random& rand) const;
|
||||
};
|
||||
}
|
||||
|
||||
#endif //CREATURELIB_CREATURESPECIES_HPP
|
|
@ -0,0 +1,58 @@
|
|||
#include "SpeciesVariant.hpp"
|
||||
#include <algorithm>
|
||||
|
||||
size_t CreatureLib::Library::SpeciesVariant::GetTypeCount() const {
|
||||
return _types.size();
|
||||
}
|
||||
|
||||
std::string CreatureLib::Library::SpeciesVariant::GetType(size_t index) const {
|
||||
return _types[index];
|
||||
}
|
||||
|
||||
uint32_t CreatureLib::Library::SpeciesVariant::GetStatistic(CreatureLib::Core::Statistic stat) const {
|
||||
return _baseStatistics.GetStat(stat);
|
||||
}
|
||||
|
||||
std::string CreatureLib::Library::SpeciesVariant::GetTalent(int32_t index) const {
|
||||
if (index < 0){
|
||||
index = -index - 1;
|
||||
return _secretTalents[index];
|
||||
}
|
||||
return _talents[index];
|
||||
}
|
||||
|
||||
/*const CreatureLib::Library::CreatureMoves *CreatureLib::Library::SpeciesVariant::GetCreatureMoves() const {
|
||||
return &_moves;
|
||||
}*/
|
||||
|
||||
int8_t CreatureLib::Library::SpeciesVariant::GetTalentIndex(std::string talent) const{
|
||||
auto i = std::find(_talents.begin(), _talents.end(), talent);
|
||||
if (i != _talents.end()){
|
||||
return std::distance(_talents.begin(), i);
|
||||
}
|
||||
i = std::find(_secretTalents.begin(), _secretTalents.end(), talent);
|
||||
if (i != _secretTalents.end()){
|
||||
return std::distance(_secretTalents.begin(), i);
|
||||
}
|
||||
//TODO: implement better exception.
|
||||
throw;
|
||||
}
|
||||
|
||||
int8_t CreatureLib::Library::SpeciesVariant::GetRandomTalent(CreatureLib::Core::Random *rand) const {
|
||||
return rand->Get(_talents.size());
|
||||
}
|
||||
|
||||
CreatureLib::Library::SpeciesVariant::SpeciesVariant(std::string name, float height, float weight,
|
||||
uint32_t baseExperience, std::vector<std::string> types,
|
||||
CreatureLib::Core::StatisticSet baseStats,
|
||||
std::vector<std::string> talents,
|
||||
std::vector<std::string> secretTalents)
|
||||
: __Name(name),
|
||||
__Height(height),
|
||||
__Weight(weight),
|
||||
__BaseExperience(baseExperience),
|
||||
_types(types),
|
||||
_baseStatistics(baseStats),
|
||||
_talents(talents),
|
||||
_secretTalents(secretTalents)
|
||||
{}
|
|
@ -0,0 +1,40 @@
|
|||
#ifndef CREATURELIB_SPECIESVARIANT_HPP
|
||||
#define CREATURELIB_SPECIESVARIANT_HPP
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include "CreatureMoves.hpp"
|
||||
#include "../../Core/StatisticSet.hpp"
|
||||
#include "../../GenericTemplates.cpp"
|
||||
#include "../../Core/Random.hpp"
|
||||
|
||||
namespace CreatureLib::Library {
|
||||
/*!
|
||||
\brief A single species can have more than one variant. This class holds the data for those variants.
|
||||
*/
|
||||
class SpeciesVariant {
|
||||
GetProperty(std::string, Name);
|
||||
GetProperty(float, Height);
|
||||
GetProperty(float, Weight);
|
||||
GetProperty(uint32_t, BaseExperience);
|
||||
private:
|
||||
std::vector<std::string> _types;
|
||||
const Core::StatisticSet _baseStatistics;
|
||||
std::vector<std::string> _talents;
|
||||
std::vector<std::string> _secretTalents;
|
||||
//CreatureMoves _moves;
|
||||
public:
|
||||
SpeciesVariant(std::string name, float height, float weight, uint32_t baseExperience,
|
||||
std::vector<std::string> types, Core::StatisticSet baseStats, std::vector<std::string> talents,
|
||||
std::vector<std::string> secretTalents);
|
||||
[[nodiscard]] size_t GetTypeCount() const;
|
||||
[[nodiscard]] std::string GetType(size_t index) const;
|
||||
[[nodiscard]] uint32_t GetStatistic(Core::Statistic stat) const;
|
||||
[[nodiscard]] std::string GetTalent(int32_t index) const;
|
||||
//[[nodiscard]] const CreatureMoves* GetCreatureMoves() const;
|
||||
[[nodiscard]] int8_t GetTalentIndex(std::string talent) const;
|
||||
[[nodiscard]] int8_t GetRandomTalent(Core::Random* rand) const;
|
||||
};
|
||||
}
|
||||
|
||||
#endif //CREATURELIB_SPECIESVARIANT_HPP
|
|
@ -0,0 +1,29 @@
|
|||
#include "DataLibrary.hpp"
|
||||
|
||||
CreatureLib::Library::DataLibrary::DataLibrary(CreatureLib::Library::SpeciesLibrary *species,
|
||||
CreatureLib::Library::AttackLibrary *attacks,
|
||||
CreatureLib::Library::ItemLibrary *items,
|
||||
CreatureLib::Library::GrowthRateLibrary* growthRates)
|
||||
:_species(species), _attacks(attacks), _items(items), _growthRates(growthRates)
|
||||
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
const CreatureLib::Library::SpeciesLibrary *CreatureLib::Library::DataLibrary::GetSpeciesLibrary() const {
|
||||
return _species;
|
||||
}
|
||||
|
||||
const CreatureLib::Library::AttackLibrary *CreatureLib::Library::DataLibrary::GetAttackLibrary() const {
|
||||
return _attacks;
|
||||
}
|
||||
|
||||
const CreatureLib::Library::ItemLibrary *CreatureLib::Library::DataLibrary::GetItemLibrary() const {
|
||||
return _items;
|
||||
}
|
||||
|
||||
const CreatureLib::Library::GrowthRateLibrary *CreatureLib::Library::DataLibrary::GetGrowthRates() const {
|
||||
return _growthRates;
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,36 @@
|
|||
#ifndef CREATURELIB_DATALIBRARY_HPP
|
||||
#define CREATURELIB_DATALIBRARY_HPP
|
||||
|
||||
#include "SpeciesLibrary.hpp"
|
||||
#include "AttackLibrary.hpp"
|
||||
#include "ItemLibrary.hpp"
|
||||
#include "GrowthRates/GrowthRateLibrary.hpp"
|
||||
|
||||
namespace CreatureLib::Library {
|
||||
/*!
|
||||
\brief The core library. This library holds all static data for a creature set.
|
||||
*/
|
||||
class DataLibrary {
|
||||
private:
|
||||
const SpeciesLibrary* _species;
|
||||
const AttackLibrary* _attacks;
|
||||
const ItemLibrary* _items;
|
||||
const GrowthRateLibrary* _growthRates;
|
||||
public:
|
||||
DataLibrary(SpeciesLibrary* species, AttackLibrary* attacks, ItemLibrary* items, GrowthRateLibrary* growthRates);
|
||||
~DataLibrary(){
|
||||
delete _species;
|
||||
delete _attacks;
|
||||
delete _items;
|
||||
delete _growthRates;
|
||||
}
|
||||
|
||||
[[nodiscard]] const SpeciesLibrary* GetSpeciesLibrary() const;
|
||||
[[nodiscard]] const AttackLibrary* GetAttackLibrary() const;
|
||||
[[nodiscard]] const ItemLibrary* GetItemLibrary() const;
|
||||
[[nodiscard]] const GrowthRateLibrary* GetGrowthRates() const;
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
#endif //CREATURELIB_DATALIBRARY_HPP
|
|
@ -0,0 +1,18 @@
|
|||
#ifndef CREATURELIB_GENDER_HPP
|
||||
#define CREATURELIB_GENDER_HPP
|
||||
|
||||
#include <cstdint>
|
||||
|
||||
namespace CreatureLib::Library{
|
||||
/*!
|
||||
\brief Might be somewhat controversial nowadays, but as many creature battling games only have two genders, we'll
|
||||
hardcode those.
|
||||
*/
|
||||
enum class Gender : uint8_t {
|
||||
Male,
|
||||
Female,
|
||||
Genderless
|
||||
};
|
||||
}
|
||||
|
||||
#endif //CREATURELIB_GENDER_HPP
|
|
@ -0,0 +1 @@
|
|||
#include "GrowthRate.hpp"
|
|
@ -0,0 +1,14 @@
|
|||
#ifndef CREATURELIB_GROWTHRATE_HPP
|
||||
#define CREATURELIB_GROWTHRATE_HPP
|
||||
|
||||
#include <cstdint>
|
||||
|
||||
namespace CreatureLib::Library {
|
||||
class GrowthRate {
|
||||
public:
|
||||
[[nodiscard]] virtual uint8_t CalculateLevel(uint32_t experience) const = 0;
|
||||
[[nodiscard]] virtual uint32_t CalculateExperience(uint8_t level) const = 0;
|
||||
};
|
||||
}
|
||||
|
||||
#endif //CREATURELIB_GROWTHRATE_HPP
|
|
@ -0,0 +1,9 @@
|
|||
#include "GrowthRateLibrary.hpp"
|
||||
|
||||
uint8_t CreatureLib::Library::GrowthRateLibrary::CalculateLevel(const std::string &growthRate, uint32_t experience) const {
|
||||
return _growthRates.at(growthRate)->CalculateLevel(experience);
|
||||
}
|
||||
|
||||
uint32_t CreatureLib::Library::GrowthRateLibrary::CalculateExperience(const std::string &growthRate, uint8_t level) const {
|
||||
return _growthRates.at(growthRate)->CalculateExperience(level);
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
#ifndef CREATURELIB_GROWTHRATELIBRARY_HPP
|
||||
#define CREATURELIB_GROWTHRATELIBRARY_HPP
|
||||
|
||||
#include <cstdint>
|
||||
#include <string>
|
||||
#include <unordered_map>
|
||||
#include "GrowthRate.hpp"
|
||||
|
||||
namespace CreatureLib::Library{
|
||||
class GrowthRateLibrary {
|
||||
private:
|
||||
std::unordered_map<std::string, GrowthRate*> _growthRates;
|
||||
public:
|
||||
[[nodiscard]] uint8_t CalculateLevel(const std::string& growthRate, uint32_t experience) const;
|
||||
[[nodiscard]] uint32_t CalculateExperience(const std::string& growthRate, uint8_t level) const;
|
||||
};
|
||||
}
|
||||
|
||||
#endif //CREATURELIB_GROWTHRATELIBRARY_HPP
|
|
@ -0,0 +1,17 @@
|
|||
#include "ItemLibrary.hpp"
|
||||
|
||||
const CreatureLib::Library::Item *CreatureLib::Library::ItemLibrary::GetItem(const std::string &name) const {
|
||||
return this->_items.at(name);
|
||||
}
|
||||
|
||||
const CreatureLib::Library::Item *CreatureLib::Library::ItemLibrary::operator[](const std::string &name) const {
|
||||
return this->GetItem(name);
|
||||
}
|
||||
|
||||
void CreatureLib::Library::ItemLibrary::LoadItem(const std::string &name, const CreatureLib::Library::Item *item) {
|
||||
this->_items.insert({name, item});
|
||||
}
|
||||
|
||||
void CreatureLib::Library::ItemLibrary::DeleteItem(const std::string &name) {
|
||||
this->_items.erase(name);
|
||||
}
|
|
@ -0,0 +1,28 @@
|
|||
#ifndef CREATURELIB_ITEMLIBRARY_HPP
|
||||
#define CREATURELIB_ITEMLIBRARY_HPP
|
||||
|
||||
#include <string>
|
||||
#include <unordered_map>
|
||||
#include "Items/Item.hpp"
|
||||
|
||||
namespace CreatureLib::Library {
|
||||
class ItemLibrary {
|
||||
private:
|
||||
std::unordered_map<std::string, const Item *> _items;
|
||||
public:
|
||||
ItemLibrary() = default;
|
||||
~ItemLibrary(){
|
||||
_items.clear();
|
||||
}
|
||||
|
||||
[[nodiscard]] const Item* GetItem(const std::string& name) const;
|
||||
[[nodiscard]] const Item* operator[] (const std::string& name) const;
|
||||
|
||||
void LoadItem(const std::string& name, const Item* item);
|
||||
void DeleteItem(const std::string& name);
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
#endif //CREATURELIB_ITEMLIBRARY_HPP
|
|
@ -0,0 +1,16 @@
|
|||
#ifndef CREATURELIB_BATTLEITEMCATEGORY_HPP
|
||||
#define CREATURELIB_BATTLEITEMCATEGORY_HPP
|
||||
|
||||
#include <cstdint>
|
||||
|
||||
namespace CreatureLib::Library {
|
||||
enum class BattleItemCategory : uint8_t {
|
||||
None,
|
||||
Healing,
|
||||
StatusHealing,
|
||||
CaptureDevice,
|
||||
MiscBattleItem
|
||||
};
|
||||
}
|
||||
|
||||
#endif //CREATURELIB_BATTLEITEMCATEGORY_HPP
|
|
@ -0,0 +1,5 @@
|
|||
#include "Item.hpp"
|
||||
|
||||
bool CreatureLib::Library::Item::HasFlag(const std::string& flag) const {
|
||||
return this->_flags.find(flag) != this->_flags.end();
|
||||
}
|
|
@ -0,0 +1,26 @@
|
|||
#ifndef CREATURELIB_ITEM_HPP
|
||||
#define CREATURELIB_ITEM_HPP
|
||||
|
||||
#include <string>
|
||||
#include <unordered_set>
|
||||
#include "ItemCategory.hpp"
|
||||
#include "BattleItemCategory.hpp"
|
||||
#include "../../GenericTemplates.cpp"
|
||||
|
||||
namespace CreatureLib::Library {
|
||||
class Item {
|
||||
GetProperty(std::string, Name);
|
||||
GetProperty(ItemCategory, Category);
|
||||
GetProperty(BattleItemCategory, BattleCategory);
|
||||
GetProperty(int32_t , Price);
|
||||
private:
|
||||
std::unordered_set<std::string> _flags;
|
||||
public:
|
||||
Item(std::string name, ItemCategory category, BattleItemCategory battleCategory, int32_t price,
|
||||
std::unordered_set<std::string> flags);
|
||||
|
||||
bool HasFlag(const std::string& flag) const;
|
||||
};
|
||||
}
|
||||
|
||||
#endif //CREATURELIB_ITEM_HPP
|
|
@ -0,0 +1,19 @@
|
|||
#ifndef CREATURELIB_ITEMCATEGORY_HPP
|
||||
#define CREATURELIB_ITEMCATEGORY_HPP
|
||||
|
||||
#include <cstdint>
|
||||
|
||||
namespace CreatureLib::Library{
|
||||
enum class ItemCategory : uint8_t {
|
||||
MiscItem,
|
||||
CaptureDevice,
|
||||
Medicine,
|
||||
Berry,
|
||||
TM,
|
||||
VariantChanger,
|
||||
KeyItem,
|
||||
Mail,
|
||||
};
|
||||
}
|
||||
|
||||
#endif //CREATURELIB_ITEMCATEGORY_HPP
|
|
@ -0,0 +1,19 @@
|
|||
#include "SpeciesLibrary.hpp"
|
||||
|
||||
const CreatureLib::Library::CreatureSpecies *CreatureLib::Library::SpeciesLibrary::GetSpecies(const std::string& name) const{
|
||||
return _species.at(name);
|
||||
}
|
||||
|
||||
const CreatureLib::Library::CreatureSpecies* CreatureLib::Library::SpeciesLibrary::operator[](const std::string &name) const{
|
||||
return GetSpecies(name);
|
||||
}
|
||||
|
||||
void CreatureLib::Library::SpeciesLibrary::LoadSpecies(const std::string &name,
|
||||
const CreatureLib::Library::CreatureSpecies* species) {
|
||||
_species.insert({name, species});
|
||||
}
|
||||
|
||||
void CreatureLib::Library::SpeciesLibrary::DeleteSpecies(const std::string &name) {
|
||||
_species.erase(name);
|
||||
}
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
#ifndef CREATURELIB_SPECIESLIBRARY_HPP
|
||||
#define CREATURELIB_SPECIESLIBRARY_HPP
|
||||
|
||||
#include <string>
|
||||
#include <unordered_map>
|
||||
#include "CreatureData/CreatureSpecies.hpp"
|
||||
|
||||
namespace CreatureLib::Library {
|
||||
class SpeciesLibrary {
|
||||
private:
|
||||
std::unordered_map<std::string, const CreatureSpecies*> _species;
|
||||
public:
|
||||
SpeciesLibrary() = default;
|
||||
|
||||
~SpeciesLibrary(){
|
||||
_species.clear();
|
||||
}
|
||||
|
||||
[[nodiscard]] const CreatureSpecies* GetSpecies(const std::string& name) const;
|
||||
[[nodiscard]] const CreatureSpecies* operator[] (const std::string& name) const;
|
||||
|
||||
void LoadSpecies(const std::string& name, const CreatureSpecies* species);
|
||||
void DeleteSpecies(const std::string& name);
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
#endif //CREATURELIB_SPECIESLIBRARY_HPP
|
|
@ -0,0 +1,66 @@
|
|||
#ifdef TESTS_BUILD
|
||||
#include "../../src/Library/CreateCreature.hpp"
|
||||
#include "TestLibrary.cpp"
|
||||
|
||||
using namespace CreatureLib::Library;
|
||||
TEST_CASE( "Create basic creature", "[Library]" ) {
|
||||
auto library = GetLibrary();
|
||||
auto creature = CreateCreature(library, "testSpecies1", 1).Create();
|
||||
delete creature;
|
||||
}
|
||||
|
||||
TEST_CASE( "Get creature species", "[Library]" ) {
|
||||
auto library = GetLibrary();
|
||||
auto creature = CreateCreature(library, "testSpecies1", 1).Create();
|
||||
REQUIRE(creature->GetSpecies()->GetName() == "testSpecies1");
|
||||
delete creature;
|
||||
}
|
||||
|
||||
TEST_CASE( "Get creature level", "[Library]" ) {
|
||||
auto library = GetLibrary();
|
||||
auto creature = CreateCreature(library, "testSpecies1", 1).Create();
|
||||
REQUIRE(creature->GetLevel() == 1);
|
||||
delete creature;
|
||||
}
|
||||
|
||||
TEST_CASE( "Get creature variant when unset", "[Library]" ) {
|
||||
auto library = GetLibrary();
|
||||
auto creature = CreateCreature(library, "testSpecies1", 1).Create();
|
||||
REQUIRE(creature->GetVariant()->GetName() == "default");
|
||||
delete creature;
|
||||
}
|
||||
|
||||
TEST_CASE( "Get creature nickname when unset", "[Library]" ) {
|
||||
auto library = GetLibrary();
|
||||
auto creature = CreateCreature(library, "testSpecies1", 1).Create();
|
||||
REQUIRE(creature->GetNickname() == "testSpecies1");
|
||||
delete creature;
|
||||
}
|
||||
|
||||
TEST_CASE( "Get creature stat potentials when unset", "[Library]" ) {
|
||||
auto library = GetLibrary();
|
||||
auto creature = CreateCreature(library, "testSpecies1", 1).Create();
|
||||
auto potentials = creature->GetStatPotential();
|
||||
REQUIRE(potentials.GetHealth() == 0);
|
||||
REQUIRE(potentials.GetPhysicalAttack() == 0);
|
||||
REQUIRE(potentials.GetPhysicalDefense() == 0);
|
||||
REQUIRE(potentials.GetMagicalAttack() == 0);
|
||||
REQUIRE(potentials.GetMagicalDefense() == 0);
|
||||
REQUIRE(potentials.GetSpeed() == 0);
|
||||
delete creature;
|
||||
}
|
||||
|
||||
TEST_CASE( "Get creature stat experience when unset", "[Library]" ) {
|
||||
auto library = GetLibrary();
|
||||
auto creature = CreateCreature(library, "testSpecies1", 1).Create();
|
||||
auto experiences = creature->GetStatExperience();
|
||||
REQUIRE(experiences.GetHealth() == 0);
|
||||
REQUIRE(experiences.GetPhysicalAttack() == 0);
|
||||
REQUIRE(experiences.GetPhysicalDefense() == 0);
|
||||
REQUIRE(experiences.GetMagicalAttack() == 0);
|
||||
REQUIRE(experiences.GetMagicalDefense() == 0);
|
||||
REQUIRE(experiences.GetSpeed() == 0);
|
||||
delete creature;
|
||||
}
|
||||
|
||||
#endif
|
|
@ -0,0 +1,51 @@
|
|||
#ifdef TESTS_BUILD
|
||||
#include "../../extern/catch.hpp"
|
||||
#include "../../src/Library/DataLibrary.hpp"
|
||||
|
||||
using namespace CreatureLib::Core;
|
||||
using namespace CreatureLib::Library;
|
||||
static DataLibrary* __library = nullptr;
|
||||
|
||||
static SpeciesLibrary* BuildSpeciesLibrary(){
|
||||
auto l = new SpeciesLibrary();
|
||||
l->LoadSpecies("testSpecies1", new CreatureSpecies(0, "testSpecies1",
|
||||
new SpeciesVariant("default", 1,1, 10, {"fire", "water"}, StatisticSet(10,10,10,10,10,10),
|
||||
{"testTalent"}, {"testSecretTalent"}),
|
||||
0.5f, "testGrowthRate", 5, 100));
|
||||
return l;
|
||||
}
|
||||
|
||||
static AttackLibrary* BuildAttackLibrary(){
|
||||
auto l = new AttackLibrary();
|
||||
return l;
|
||||
}
|
||||
|
||||
static ItemLibrary* BuildItemLibrary(){
|
||||
auto l = new ItemLibrary();
|
||||
return l;
|
||||
}
|
||||
|
||||
static GrowthRateLibrary* BuildGrowthRateLibrary(){
|
||||
auto l = new GrowthRateLibrary();
|
||||
return l;
|
||||
}
|
||||
|
||||
|
||||
static DataLibrary* BuildLibrary(){
|
||||
auto l = new DataLibrary(BuildSpeciesLibrary(), BuildAttackLibrary(), BuildItemLibrary(), BuildGrowthRateLibrary());
|
||||
return l;
|
||||
}
|
||||
|
||||
[[maybe_unused]]
|
||||
static DataLibrary* GetLibrary(){
|
||||
if (__library == nullptr){
|
||||
__library = BuildLibrary();
|
||||
}
|
||||
return __library;
|
||||
}
|
||||
|
||||
#ifndef LIBRARY_BUILD_TESTS
|
||||
#define LIBRARY_BUILD_TESTS
|
||||
|
||||
#endif
|
||||
#endif
|
|
@ -0,0 +1,37 @@
|
|||
#ifdef TESTS_BUILD
|
||||
#define CATCH_CONFIG_MAIN
|
||||
|
||||
#include "../../extern/catch.hpp"
|
||||
#include "TestLibrary.cpp"
|
||||
|
||||
TEST_CASE( "Can Create Species Library", "[Library]" ) {
|
||||
auto l = BuildSpeciesLibrary();
|
||||
REQUIRE(l != nullptr);
|
||||
delete l;
|
||||
}
|
||||
|
||||
TEST_CASE( "Can Create Attack Library", "[Library]" ) {
|
||||
auto l = BuildAttackLibrary();
|
||||
REQUIRE(l != nullptr);
|
||||
delete l;
|
||||
}
|
||||
|
||||
TEST_CASE( "Can Create Item Library", "[Library]" ) {
|
||||
auto l = BuildItemLibrary();
|
||||
REQUIRE(l != nullptr);
|
||||
delete l;
|
||||
}
|
||||
|
||||
TEST_CASE( "Can Create Growthrate Library", "[Library]" ) {
|
||||
auto l = BuildGrowthRateLibrary();
|
||||
REQUIRE(l != nullptr);
|
||||
delete l;
|
||||
}
|
||||
|
||||
TEST_CASE( "Can Create Data Library", "[Library]" ) {
|
||||
auto l = BuildLibrary();
|
||||
REQUIRE(l != nullptr);
|
||||
delete l;
|
||||
}
|
||||
|
||||
#endif
|
|
@ -0,0 +1,58 @@
|
|||
#ifdef TESTS_BUILD
|
||||
#include "../extern/catch.hpp"
|
||||
#include "../src/Core/Random.hpp"
|
||||
|
||||
TEST_CASE( "Random ints", "[Utilities]" ) {
|
||||
auto rand = CreatureLib::Core::Random(10);
|
||||
CHECK(rand.Get() == 1656398469);
|
||||
CHECK(rand.Get() == 641584702);
|
||||
CHECK(rand.Get() == 44564466);
|
||||
CHECK(rand.Get() == 1062123783);
|
||||
CHECK(rand.Get() == 1360749216);
|
||||
CHECK(rand.Get() == 951367352);
|
||||
CHECK(rand.Get() == 1608044094);
|
||||
CHECK(rand.Get() == 1786516046);
|
||||
CHECK(rand.Get() == 1070535660);
|
||||
CHECK(rand.Get() == 1252673902);
|
||||
}
|
||||
|
||||
TEST_CASE( "Random ints with limit", "[Utilities]" ) {
|
||||
auto rand = CreatureLib::Core::Random(10);
|
||||
CHECK(rand.Get(10) == 7);
|
||||
CHECK(rand.Get(10) == 2);
|
||||
CHECK(rand.Get(10) == 0);
|
||||
CHECK(rand.Get(10) == 4);
|
||||
CHECK(rand.Get(10) == 6);
|
||||
CHECK(rand.Get(10) == 4);
|
||||
CHECK(rand.Get(10) == 7);
|
||||
CHECK(rand.Get(10) == 8);
|
||||
CHECK(rand.Get(10) == 4);
|
||||
CHECK(rand.Get(10) == 5);
|
||||
|
||||
CHECK(rand.Get(2) == 0);
|
||||
CHECK(rand.Get(2) == 0);
|
||||
CHECK(rand.Get(2) == 0);
|
||||
CHECK(rand.Get(2) == 1);
|
||||
CHECK(rand.Get(2) == 1);
|
||||
CHECK(rand.Get(2) == 0);
|
||||
CHECK(rand.Get(2) == 0);
|
||||
CHECK(rand.Get(2) == 0);
|
||||
CHECK(rand.Get(2) == 0);
|
||||
|
||||
}
|
||||
|
||||
TEST_CASE( "Random ints with upper and bottom", "[Utilities]" ) {
|
||||
auto rand = CreatureLib::Core::Random(10);
|
||||
CHECK(rand.Get(10, 30) == 25);
|
||||
CHECK(rand.Get(10, 30) == 15);
|
||||
CHECK(rand.Get(10, 30) == 10);
|
||||
CHECK(rand.Get(10, 30) == 19);
|
||||
CHECK(rand.Get(10, 30) == 22);
|
||||
CHECK(rand.Get(10, 30) == 18);
|
||||
CHECK(rand.Get(10, 30) == 24);
|
||||
CHECK(rand.Get(10, 30) == 26);
|
||||
CHECK(rand.Get(10, 30) == 19);
|
||||
CHECK(rand.Get(10, 30) == 21);
|
||||
}
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue