2019-11-05 13:31:54 +00:00
|
|
|
#include <algorithm>
|
2019-11-10 16:08:42 +00:00
|
|
|
#include <utility>
|
2019-10-24 11:37:55 +00:00
|
|
|
#include "Creature.hpp"
|
|
|
|
#include "../Models/Battle.hpp"
|
|
|
|
|
|
|
|
using namespace CreatureLib;
|
|
|
|
|
|
|
|
Battling::Creature::Creature(const Library::CreatureSpecies* species, const Library::SpeciesVariant* variant,
|
|
|
|
uint8_t level, uint32_t experience, Core::StatisticSet<uint8_t> statExp,
|
|
|
|
Core::StatisticSet<uint8_t> statPotential, uint32_t uid, Library::Gender gender,
|
|
|
|
uint8_t coloring, const Library::Item *heldItem, std::string nickname, int8_t talent,
|
|
|
|
std::vector<LearnedAttack *> attacks)
|
|
|
|
:
|
|
|
|
__Species(species),
|
|
|
|
__Variant(variant),
|
|
|
|
__Level(level),
|
|
|
|
__Experience(experience),
|
|
|
|
__StatExperience(statExp),
|
|
|
|
__StatPotential(statPotential),
|
|
|
|
__UniqueIdentifier(uid),
|
|
|
|
__Gender(gender),
|
|
|
|
__Coloring(coloring),
|
|
|
|
__HeldItem(heldItem),
|
2019-11-10 16:08:42 +00:00
|
|
|
_nickname(std::move(nickname)),
|
2019-10-24 11:37:55 +00:00
|
|
|
_talentIndex(talent),
|
2019-11-10 16:08:42 +00:00
|
|
|
_attacks(std::move(attacks))
|
2019-10-24 11:37:55 +00:00
|
|
|
{}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void Battling::Creature::ChangeLevel(int8_t amount) {
|
|
|
|
this->__Level += amount;
|
|
|
|
RecalculateFlatStats();
|
|
|
|
}
|
|
|
|
|
|
|
|
void Battling::Creature::SetBattle(Battling::Battle *battle) {
|
|
|
|
this->_battle = battle;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Battling::Creature::SetBattleLibrary(Battling::BattleLibrary *library) {
|
|
|
|
this->_library = library;
|
|
|
|
}
|
|
|
|
|
|
|
|
const std::string &Battling::Creature::GetNickname() const {
|
|
|
|
if (_nickname.empty())
|
|
|
|
return __Species->GetName();
|
|
|
|
return _nickname;
|
|
|
|
}
|
|
|
|
|
|
|
|
const std::string &Battling::Creature::GetTalent() const {
|
|
|
|
return __Variant->GetTalent(_talentIndex);
|
|
|
|
}
|
|
|
|
|
2019-10-29 10:19:25 +00:00
|
|
|
void Battling::Creature::SetBattleData(Battling::Battle *battle, Battling::BattleSide *side) {
|
|
|
|
_battle = battle;
|
|
|
|
_side = side;
|
|
|
|
}
|
|
|
|
|
2019-10-24 11:37:55 +00:00
|
|
|
//region Stat APIs
|
|
|
|
|
|
|
|
void Battling::Creature::ChangeStatBoost(Core::Statistic stat, int8_t diffAmount){
|
|
|
|
if (diffAmount > 0)
|
|
|
|
this->_statBoost.IncreaseStatBy(stat, diffAmount);
|
|
|
|
else
|
|
|
|
this->_statBoost.DecreaseStatBy(stat, diffAmount);
|
|
|
|
this->RecalculateBoostedStat(stat);
|
|
|
|
}
|
|
|
|
|
|
|
|
uint32_t Battling::Creature::GetFlatStat(Core::Statistic stat) const{
|
|
|
|
return _flatStats.GetStat(stat);
|
|
|
|
}
|
|
|
|
|
|
|
|
uint32_t Battling::Creature::GetBoostedStat(Core::Statistic stat) const{
|
|
|
|
return _boostedStats.GetStat(stat);
|
|
|
|
}
|
|
|
|
|
|
|
|
uint32_t Battling::Creature::GetBaseStat(Core::Statistic stat) const {
|
|
|
|
return __Variant->GetStatistic(stat);
|
|
|
|
}
|
|
|
|
|
|
|
|
uint32_t Battling::Creature::GetStatPotential(Core::Statistic stat) const {
|
|
|
|
return __StatPotential.GetStat(stat);
|
|
|
|
}
|
|
|
|
|
|
|
|
uint32_t Battling::Creature::GetStatExperience(Core::Statistic stat) const {
|
|
|
|
return __StatExperience.GetStat(stat);
|
|
|
|
}
|
|
|
|
|
2019-11-05 13:31:54 +00:00
|
|
|
int8_t Battling::Creature::GetStatBoost(Core::Statistic stat) const {
|
|
|
|
return _statBoost.GetStat(stat);
|
|
|
|
}
|
|
|
|
|
2019-10-24 11:37:55 +00:00
|
|
|
void Battling::Creature::RecalculateFlatStats() {
|
|
|
|
this->_flatStats = this->_library->GetStatCalculator()->CalculateFlatStats(this);
|
|
|
|
RecalculateBoostedStats();
|
|
|
|
}
|
|
|
|
void Battling::Creature::RecalculateBoostedStats() {
|
|
|
|
this->_boostedStats = this->_library->GetStatCalculator()->CalculateFlatStats(this);
|
|
|
|
}
|
|
|
|
|
|
|
|
void Battling::Creature::RecalculateFlatStat(Core::Statistic stat) {
|
|
|
|
auto s = this->_library->GetStatCalculator()->CalculateFlatStat(this, stat);
|
|
|
|
this->_flatStats.SetStat(stat, s);
|
|
|
|
RecalculateBoostedStat(stat);
|
|
|
|
}
|
|
|
|
|
|
|
|
void Battling::Creature::RecalculateBoostedStat(Core::Statistic stat) {
|
|
|
|
auto s = this->_library->GetStatCalculator()->CalculateBoostedStat(this, stat);
|
|
|
|
this->_boostedStats.SetStat(stat, s);
|
|
|
|
}
|
|
|
|
|
2019-11-02 12:57:43 +00:00
|
|
|
//endregion
|
|
|
|
|
2019-10-29 10:19:25 +00:00
|
|
|
Battling::Battle *Battling::Creature::GetBattle() const{
|
|
|
|
return _battle;
|
|
|
|
}
|
|
|
|
|
|
|
|
Battling::BattleSide *Battling::Creature::GetBattleSide() const {
|
|
|
|
return _side;
|
|
|
|
}
|
|
|
|
|
2019-11-02 12:57:43 +00:00
|
|
|
bool Battling::Creature::IsFainted() const {
|
|
|
|
return this->__CurrentHealth <= 0;
|
|
|
|
}
|
2019-11-03 12:47:50 +00:00
|
|
|
|
|
|
|
void Battling::Creature::Damage(uint32_t damage, Battling::DamageSource source) {
|
|
|
|
if (damage > __CurrentHealth){
|
|
|
|
damage = __CurrentHealth;
|
|
|
|
}
|
|
|
|
// HOOK: On Damage
|
|
|
|
__CurrentHealth -= damage;
|
|
|
|
}
|
2019-11-05 07:06:12 +00:00
|
|
|
|
|
|
|
const std::vector<uint8_t>& Battling::Creature::GetTypes() const {
|
|
|
|
//HOOK: override types.
|
|
|
|
return this->__Variant->GetTypes();
|
|
|
|
}
|
2019-11-05 13:31:54 +00:00
|
|
|
|
|
|
|
bool Battling::Creature::HasType(uint8_t type) const {
|
|
|
|
auto t = GetTypes();
|
|
|
|
return std::find(t.begin(), t.end(), type) != t.end();
|
|
|
|
}
|
2019-11-10 13:32:05 +00:00
|
|
|
|
2019-11-10 16:08:42 +00:00
|
|
|
void Battling::Creature::GetActiveScripts(std::vector<ScriptWrapper> &scripts) {
|
2019-11-17 10:25:52 +00:00
|
|
|
scripts.emplace_back(&_activeTalent);
|
2019-11-10 16:08:42 +00:00
|
|
|
scripts.emplace_back(&_status);
|
|
|
|
scripts.emplace_back(&_volatile);
|
|
|
|
_side->GetActiveScripts(scripts);
|
2019-11-10 13:32:05 +00:00
|
|
|
}
|