From 8290bf546aaa96c9c7d292f6a596dc7610aaf512 Mon Sep 17 00:00:00 2001 From: Deukhoofd Date: Tue, 4 Aug 2020 17:19:14 +0200 Subject: [PATCH] Pass back CreatePokemon by reference. --- src/Battling/Pokemon/CreatePokemon.cpp | 312 ++++++++++++------------- src/Battling/Pokemon/CreatePokemon.hpp | 28 +-- 2 files changed, 168 insertions(+), 172 deletions(-) diff --git a/src/Battling/Pokemon/CreatePokemon.cpp b/src/Battling/Pokemon/CreatePokemon.cpp index 173e6a3..1a17f44 100644 --- a/src/Battling/Pokemon/CreatePokemon.cpp +++ b/src/Battling/Pokemon/CreatePokemon.cpp @@ -1,166 +1,162 @@ #include "CreatePokemon.hpp" +namespace PkmnLib::Battling { + CreatePokemon& CreatePokemon::WithRandomIndividualValues(ArbUt::Random rand) { + _ivHp = rand.Get(0, 32); + _ivAttack = rand.Get(0, 32); + _ivDefense = rand.Get(0, 32); + _ivSpAtt = rand.Get(0, 32); + _ivSpDef = rand.Get(0, 32); + _ivSpeed = rand.Get(0, 32); + return *this; + } -PkmnLib::Battling::CreatePokemon PkmnLib::Battling::CreatePokemon::WithRandomIndividualValues(ArbUt::Random rand) { - _ivHp = rand.Get(0, 32); - _ivAttack = rand.Get(0, 32); - _ivDefense = rand.Get(0, 32); - _ivSpAtt = rand.Get(0, 32); - _ivSpDef = rand.Get(0, 32); - _ivSpeed = rand.Get(0, 32); - return *this; -} - -PkmnLib::Battling::CreatePokemon -PkmnLib::Battling::CreatePokemon::WithIndividualValue(CreatureLib::Library::Statistic stat, uint8_t value) { - switch (stat) { - case PkmnLib::Library::Statistic::HealthPoints: _ivHp = value; break; - case PkmnLib::Library::Statistic::PhysicalAttack: _ivAttack = value; break; - case PkmnLib::Library::Statistic::PhysicalDefense: _ivDefense = value; break; - case PkmnLib::Library::Statistic::SpecialAttack: _ivSpAtt = value; break; - case PkmnLib::Library::Statistic::SpecialDefense: _ivSpDef = value; break; - case PkmnLib::Library::Statistic::Speed: _ivSpeed = value; break; - } - return *this; -} - -PkmnLib::Battling::CreatePokemon PkmnLib::Battling::CreatePokemon::WithEffortValue(CreatureLib::Library::Statistic stat, - uint8_t value) { - switch (stat) { - case PkmnLib::Library::Statistic::HealthPoints: _evHp = value; break; - case PkmnLib::Library::Statistic::PhysicalAttack: _evAttack = value; break; - case PkmnLib::Library::Statistic::PhysicalDefense: _evDefense = value; break; - case PkmnLib::Library::Statistic::SpecialAttack: _evSpAtt = value; break; - case PkmnLib::Library::Statistic::SpecialDefense: _evSpDef = value; break; - case PkmnLib::Library::Statistic::Speed: _evSpeed = value; break; - } - return *this; -} - -PkmnLib::Battling::Pokemon* PkmnLib::Battling::CreatePokemon::Build() { - auto rand = ArbUt::Random(); - ArbUt::BorrowedPtr species = nullptr; - if (!this->_library->GetSpeciesLibrary()->TryGet(this->_species, species)) { - std::stringstream err; - err << "Invalid species '" << _species << "'."; - throw CreatureException(err.str()); - } - ArbUt::BorrowedPtr forme; - if (!species->TryGetForme(this->_forme, forme)) { - std::stringstream err; - err << "Invalid forme '" << _forme << "' for species '" << _forme << "'."; - throw CreatureException(err.str()); - } - AssertNotNull(forme); - CreatureLib::Library::TalentIndex ability; - if (this->_ability.Empty()) { - ability = forme->GetRandomTalent(rand); - } else { - ability = forme->GetTalentIndex(this->_ability); - } - auto identifier = this->_identifier; - if (identifier == 0) { - identifier = rand.Get(); - } - auto gender = this->_gender; - if (gender == static_cast(-1)) { - gender = species->GetRandomGender(rand); - } - ArbUt::BorrowedPtr heldItem = nullptr; - if (!this->_heldItem.Empty()) { - if (!_library->GetItemLibrary()->TryGet(this->_heldItem, heldItem)) { - THROW_CREATURE("Unknown Item: " << this->_heldItem.std_str()); + CreatePokemon& CreatePokemon::WithIndividualValue(CreatureLib::Library::Statistic stat, uint8_t value) { + switch (stat) { + case PkmnLib::Library::Statistic::HealthPoints: _ivHp = value; break; + case PkmnLib::Library::Statistic::PhysicalAttack: _ivAttack = value; break; + case PkmnLib::Library::Statistic::PhysicalDefense: _ivDefense = value; break; + case PkmnLib::Library::Statistic::SpecialAttack: _ivSpAtt = value; break; + case PkmnLib::Library::Statistic::SpecialDefense: _ivSpDef = value; break; + case PkmnLib::Library::Statistic::Speed: _ivSpeed = value; break; } - AssertNotNull(heldItem); - } - auto experience = _library->GetGrowthRateLibrary()->CalculateExperience(species->GetGrowthRate(), _level); - - auto attacks = std::vector(_attacks.Count()); - for (size_t i = 0; i < _attacks.Count(); i++) { - auto& kv = _attacks[i]; - auto move = kv.Move; - if (move != nullptr) - attacks[i] = new LearnedMove(move, kv.LearnMethod); - else - attacks[i] = nullptr; - } - auto ivs = CreatureLib::Library::StatisticSet(_ivHp, _ivAttack, _ivDefense, _ivSpAtt, _ivSpDef, _ivSpeed); - auto evs = CreatureLib::Library::StatisticSet(_evHp, _evAttack, _evDefense, _evSpAtt, _evSpDef, _evSpeed); - - if (_nature.Empty()) { - _nature = _library->GetNatureLibrary()->GetRandomNatureName(rand); - } - auto nature = _library->GetNatureLibrary()->GetNatureByName(_nature); - - auto shiny = false; - if (_shininessSet) { - shiny = _isShiny; - } else { - shiny = rand.Get(_library->GetSettings()->GetShinyRate()) == 0; + return *this; } - auto pkmn = new Pokemon(_library, species, forme, _level, experience, identifier, gender, shiny, heldItem, - _nickname, ability, attacks, ivs, evs, nature, _allowedExperienceGain); - pkmn->Initialize(); - return pkmn; -} -PkmnLib::Battling::CreatePokemon PkmnLib::Battling::CreatePokemon::WithNature(const ArbUt::StringView& nature) { - _nature = nature; - return *this; -} -PkmnLib::Battling::CreatePokemon PkmnLib::Battling::CreatePokemon::WithIndividualValues(uint8_t hp, uint8_t att, - uint8_t def, uint8_t spAtt, - uint8_t spDef, uint8_t speed) { - _ivHp = hp; - _ivAttack = att; - _ivDefense = def; - _ivSpAtt = spAtt; - _ivSpDef = spDef; - _ivSpeed = speed; - return *this; -} -PkmnLib::Battling::CreatePokemon PkmnLib::Battling::CreatePokemon::WithEffortValues(uint8_t hp, uint8_t att, - uint8_t def, uint8_t spAtt, - uint8_t spDef, uint8_t speed) { - _evHp = hp; - _evAttack = att; - _evDefense = def; - _evSpAtt = spAtt; - _evSpDef = spDef; - _evSpeed = speed; - return *this; -} -PkmnLib::Battling::CreatePokemon PkmnLib::Battling::CreatePokemon::WithForme(const ArbUt::StringView& forme) { - _forme = forme; - return *this; -} -PkmnLib::Battling::CreatePokemon PkmnLib::Battling::CreatePokemon::WithGender(CreatureLib::Library::Gender gender) { - _gender = gender; - return *this; -} -PkmnLib::Battling::CreatePokemon PkmnLib::Battling::CreatePokemon::IsShiny(bool value) { - _shininessSet = true; - _isShiny = value; - return *this; -} -PkmnLib::Battling::CreatePokemon PkmnLib::Battling::CreatePokemon::WithHeldItem(const ArbUt::StringView& item) { - _heldItem = item; - return *this; -} -PkmnLib::Battling::CreatePokemon -PkmnLib::Battling::CreatePokemon::LearnMove(const ArbUt::StringView& moveName, + CreatePokemon& CreatePokemon::WithEffortValue(CreatureLib::Library::Statistic stat, uint8_t value) { + switch (stat) { + case PkmnLib::Library::Statistic::HealthPoints: _evHp = value; break; + case PkmnLib::Library::Statistic::PhysicalAttack: _evAttack = value; break; + case PkmnLib::Library::Statistic::PhysicalDefense: _evDefense = value; break; + case PkmnLib::Library::Statistic::SpecialAttack: _evSpAtt = value; break; + case PkmnLib::Library::Statistic::SpecialDefense: _evSpDef = value; break; + case PkmnLib::Library::Statistic::Speed: _evSpeed = value; break; + } + return *this; + } + + Pokemon* CreatePokemon::Build() { + auto rand = ArbUt::Random(); + ArbUt::BorrowedPtr species = nullptr; + if (!this->_library->GetSpeciesLibrary()->TryGet(this->_species, species)) { + std::stringstream err; + err << "Invalid species '" << _species << "'."; + throw CreatureException(err.str()); + } + ArbUt::BorrowedPtr forme; + if (!species->TryGetForme(this->_forme, forme)) { + std::stringstream err; + err << "Invalid forme '" << _forme << "' for species '" << _forme << "'."; + throw CreatureException(err.str()); + } + AssertNotNull(forme); + CreatureLib::Library::TalentIndex ability; + if (this->_ability.Empty()) { + ability = forme->GetRandomTalent(rand); + } else { + ability = forme->GetTalentIndex(this->_ability); + } + auto identifier = this->_identifier; + if (identifier == 0) { + identifier = rand.Get(); + } + auto gender = this->_gender; + if (gender == static_cast(-1)) { + gender = species->GetRandomGender(rand); + } + ArbUt::BorrowedPtr heldItem = nullptr; + if (!this->_heldItem.Empty()) { + if (!_library->GetItemLibrary()->TryGet(this->_heldItem, heldItem)) { + THROW_CREATURE("Unknown Item: " << this->_heldItem.std_str()); + } + AssertNotNull(heldItem); + } + auto experience = _library->GetGrowthRateLibrary()->CalculateExperience(species->GetGrowthRate(), _level); + + auto attacks = std::vector(_attacks.Count()); + for (size_t i = 0; i < _attacks.Count(); i++) { + auto& kv = _attacks[i]; + auto move = kv.Move; + if (move != nullptr) + attacks[i] = new LearnedMove(move, kv.LearnMethod); + else + attacks[i] = nullptr; + } + auto ivs = CreatureLib::Library::StatisticSet(_ivHp, _ivAttack, _ivDefense, _ivSpAtt, _ivSpDef, _ivSpeed); + auto evs = CreatureLib::Library::StatisticSet(_evHp, _evAttack, _evDefense, _evSpAtt, _evSpDef, _evSpeed); + + if (_nature.Empty()) { + _nature = _library->GetNatureLibrary()->GetRandomNatureName(rand); + } + auto nature = _library->GetNatureLibrary()->GetNatureByName(_nature); + + auto shiny = false; + if (_shininessSet) { + shiny = _isShiny; + } else { + shiny = rand.Get(_library->GetSettings()->GetShinyRate()) == 0; + } + + auto pkmn = new Pokemon(_library, species, forme, _level, experience, identifier, gender, shiny, heldItem, + _nickname, ability, attacks, ivs, evs, nature, _allowedExperienceGain); + pkmn->Initialize(); + return pkmn; + } + CreatePokemon& CreatePokemon::WithNature(const ArbUt::StringView& nature) { + _nature = nature; + return *this; + } + CreatePokemon& CreatePokemon::WithIndividualValues(uint8_t hp, uint8_t att, uint8_t def, uint8_t spAtt, + uint8_t spDef, uint8_t speed) { + _ivHp = hp; + _ivAttack = att; + _ivDefense = def; + _ivSpAtt = spAtt; + _ivSpDef = spDef; + _ivSpeed = speed; + return *this; + } + CreatePokemon& CreatePokemon::WithEffortValues(uint8_t hp, uint8_t att, uint8_t def, uint8_t spAtt, uint8_t spDef, + uint8_t speed) { + _evHp = hp; + _evAttack = att; + _evDefense = def; + _evSpAtt = spAtt; + _evSpDef = spDef; + _evSpeed = speed; + return *this; + } + CreatePokemon& CreatePokemon::WithForme(const ArbUt::StringView& forme) { + _forme = forme; + return *this; + } + CreatePokemon& CreatePokemon::WithGender(CreatureLib::Library::Gender gender) { + _gender = gender; + return *this; + } + CreatePokemon& CreatePokemon::IsShiny(bool value) { + _shininessSet = true; + _isShiny = value; + return *this; + } + CreatePokemon& CreatePokemon::WithHeldItem(const ArbUt::StringView& item) { + _heldItem = item; + return *this; + } + CreatePokemon& CreatePokemon::LearnMove(const ArbUt::StringView& moveName, CreatureLib::Battling::AttackLearnMethod method) { - ArbUt::BorrowedPtr move = nullptr; - if (!_library->GetMoveLibrary()->TryGet(moveName, move)) { - THROW_CREATURE("Invalid Move given: " << moveName.std_str()); + ArbUt::BorrowedPtr move = nullptr; + if (!_library->GetMoveLibrary()->TryGet(moveName, move)) { + THROW_CREATURE("Invalid Move given: " << moveName.std_str()); + } + if (_currentMove >= _library->GetSettings()->GetMaximalMoves()) { + throw CreatureException("This pokemon already has the maximal allowed moves."); + } + Assert(move != nullptr); + _attacks.Append(ToLearnMethod(move, method)); + return *this; } - if (_currentMove >= _library->GetSettings()->GetMaximalMoves()) { - throw CreatureException("This pokemon already has the maximal allowed moves."); + CreatePokemon& CreatePokemon::IsAllowedExperienceGain(bool value) { + _allowedExperienceGain = value; + return *this; } - Assert(move != nullptr); - _attacks.Append(ToLearnMethod(move, method)); - return *this; -} -PkmnLib::Battling::CreatePokemon PkmnLib::Battling::CreatePokemon::IsAllowedExperienceGain(bool value) { - _allowedExperienceGain = value; - return *this; -} +} \ No newline at end of file diff --git a/src/Battling/Pokemon/CreatePokemon.hpp b/src/Battling/Pokemon/CreatePokemon.hpp index b6e8c22..dba1e67 100644 --- a/src/Battling/Pokemon/CreatePokemon.hpp +++ b/src/Battling/Pokemon/CreatePokemon.hpp @@ -52,22 +52,22 @@ namespace PkmnLib::Battling { : _library(library), _species(species), _level(level), _attacks(library->GetSettings()->GetMaximalMoves()) { } - CreatePokemon WithForme(const ArbUt::StringView& forme); - CreatePokemon WithGender(CreatureLib::Library::Gender gender); - CreatePokemon IsShiny(bool value); - CreatePokemon WithHeldItem(const ArbUt::StringView& item); - CreatePokemon LearnMove(const ArbUt::StringView& move, CreatureLib::Battling::AttackLearnMethod method); + CreatePokemon& WithForme(const ArbUt::StringView& forme); + CreatePokemon& WithGender(CreatureLib::Library::Gender gender); + CreatePokemon& IsShiny(bool value); + CreatePokemon& WithHeldItem(const ArbUt::StringView& item); + CreatePokemon& LearnMove(const ArbUt::StringView& move, CreatureLib::Battling::AttackLearnMethod method); - CreatePokemon WithRandomIndividualValues(ArbUt::Random rand = ArbUt::Random()); - CreatePokemon WithIndividualValue(CreatureLib::Library::Statistic stat, uint8_t value); - CreatePokemon WithIndividualValues(uint8_t hp, uint8_t att, uint8_t def, uint8_t spAtt, uint8_t spDef, - uint8_t speed); - CreatePokemon WithEffortValue(CreatureLib::Library::Statistic stat, uint8_t value); - CreatePokemon WithEffortValues(uint8_t hp, uint8_t att, uint8_t def, uint8_t spAtt, uint8_t spDef, - uint8_t speed); + CreatePokemon& WithRandomIndividualValues(ArbUt::Random rand = ArbUt::Random()); + CreatePokemon& WithIndividualValue(CreatureLib::Library::Statistic stat, uint8_t value); + CreatePokemon& WithIndividualValues(uint8_t hp, uint8_t att, uint8_t def, uint8_t spAtt, uint8_t spDef, + uint8_t speed); + CreatePokemon& WithEffortValue(CreatureLib::Library::Statistic stat, uint8_t value); + CreatePokemon& WithEffortValues(uint8_t hp, uint8_t att, uint8_t def, uint8_t spAtt, uint8_t spDef, + uint8_t speed); - CreatePokemon WithNature(const ArbUt::StringView& nature); - CreatePokemon IsAllowedExperienceGain(bool value); + CreatePokemon& WithNature(const ArbUt::StringView& nature); + CreatePokemon& IsAllowedExperienceGain(bool value); Pokemon* Build(); };