CreatureLib/src/Battling/Models/CreateCreature.cpp

65 lines
2.1 KiB
C++
Raw Normal View History

2019-10-06 11:50:52 +00:00
#include "CreateCreature.hpp"
#include <utility>
#include "../Library/BattleLibrary.hpp"
2019-10-06 11:50:52 +00:00
using namespace CreatureLib::Battling;
2019-10-06 11:50:52 +00:00
CreateCreature* CreateCreature::WithVariant(std::string variant) {
this->_variant = std::move(variant);
return this;
}
CreateCreature* CreateCreature::WithNickname(std::string nickname) {
2019-10-06 11:50:52 +00:00
this->_nickname = std::move(nickname);
return this;
}
CreateCreature* CreateCreature::WithGender(Library::Gender gender) {
2019-10-06 11:50:52 +00:00
this->_gender = gender;
return this;
}
CreateCreature* CreateCreature::WithAttack(const std::string& attackName, AttackLearnMethod learnMethod) {
if (_attacks.size() >= _library->GetSettings().GetMaximalMoves())
2019-10-31 12:26:56 +00:00
throw CreatureException("You have already set the maximum amount of allowed moves.");
auto attackData = _library->GetAttackLibrary()->GetAttack(attackName);
_attacks.emplace_back(attackData, learnMethod);
return this;
}
Creature* CreateCreature::Create() {
2019-10-06 11:50:52 +00:00
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()) {
2019-10-06 11:50:52 +00:00
talent = variant->GetRandomTalent(&rand);
} else {
2019-10-06 11:50:52 +00:00
talent = variant->GetTalentIndex(this->_talent);
}
auto identifier = this->_identifier;
if (identifier == 0) {
2019-10-06 11:50:52 +00:00
identifier = rand.Get();
}
auto gender = this->_gender;
if (gender == static_cast<Library::Gender>(-1)) {
2019-10-06 11:50:52 +00:00
gender = species->GetRandomGender(rand);
}
const Library::Item* heldItem = nullptr;
if (!this->_heldItem.empty()) {
2019-10-06 11:50:52 +00:00
heldItem = _library->GetItemLibrary()->GetItem(this->_heldItem);
}
// FIXME: implement experience
auto experience = 0;
auto attacks = std::vector<LearnedAttack*>(_attacks.size());
for (size_t i = 0; i < attacks.size(); i++) {
auto kv = _attacks[i];
attacks[i] = new LearnedAttack(std::get<0>(kv), std::get<1>(kv));
}
return new Creature(_library, species, variant, _level, experience, identifier, gender, _coloring, heldItem,
_nickname, talent, attacks);
2019-10-06 11:50:52 +00:00
}