This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
#include "Battle.hpp"
|
||||
void PkmnLib::Battling::Battle::SetWeather(const Arbutils::CaseInsensitiveConstString& name) {
|
||||
void PkmnLib::Battling::Battle::SetWeather(const ArbUt::CaseInsensitiveConstString& name) {
|
||||
if (_weatherScript != nullptr) {
|
||||
_weatherScript->OnRemove();
|
||||
delete _weatherScript;
|
||||
|
||||
@@ -12,16 +12,16 @@ namespace PkmnLib::Battling {
|
||||
CreatureLib::Battling::Script* _weatherScript = nullptr;
|
||||
|
||||
public:
|
||||
Battle(const BattleLibrary* library, const List<CreatureLib::Battling::BattleParty*>& parties,
|
||||
Battle(const BattleLibrary* library, const ArbUt::List<CreatureLib::Battling::BattleParty*>& parties,
|
||||
bool canFlee = true, uint8_t numberOfSides = 2, uint8_t creaturesPerSide = 1)
|
||||
: CreatureLib::Battling::Battle(library, parties, canFlee, numberOfSides, creaturesPerSide) {}
|
||||
|
||||
void SetWeather(const Arbutils::CaseInsensitiveConstString& name);
|
||||
void SetWeather(const ArbUt::CaseInsensitiveConstString& name);
|
||||
void ClearWeather();
|
||||
const Arbutils::CaseInsensitiveConstString& GetWeatherName() noexcept { return _weatherScript->GetName(); }
|
||||
const ArbUt::CaseInsensitiveConstString& GetWeatherName() noexcept { return _weatherScript->GetName(); }
|
||||
|
||||
size_t ScriptCount() const override { return CreatureLib::Battling::Battle::ScriptCount() + 1; }
|
||||
void GetActiveScripts(List<CreatureLib::Battling::ScriptWrapper>& scripts) override {
|
||||
void GetActiveScripts(ArbUt::List<CreatureLib::Battling::ScriptWrapper>& scripts) override {
|
||||
CreatureLib::Battling::Battle::GetActiveScripts(scripts);
|
||||
scripts.Append(CreatureLib::Battling::ScriptWrapper(
|
||||
CreatureLib::Battling::ScriptWrapper::FromScript(&_weatherScript)));
|
||||
|
||||
@@ -6,16 +6,16 @@
|
||||
|
||||
namespace PkmnLib::Battling {
|
||||
class WeatherChangeEvent : public CreatureLib::Battling::EventData {
|
||||
Arbutils::CaseInsensitiveConstString _weatherName;
|
||||
ArbUt::CaseInsensitiveConstString _weatherName;
|
||||
|
||||
public:
|
||||
explicit WeatherChangeEvent(const Arbutils::CaseInsensitiveConstString& name) : _weatherName(name) {}
|
||||
explicit WeatherChangeEvent(const ArbUt::CaseInsensitiveConstString& name) : _weatherName(name) {}
|
||||
|
||||
[[nodiscard]] CreatureLib::Battling::EventDataKind GetKind() const noexcept override {
|
||||
return static_cast<CreatureLib::Battling::EventDataKind>(PkmnEventDataKind::WeatherChange);
|
||||
}
|
||||
|
||||
const Arbutils::CaseInsensitiveConstString GetWeatherName() const noexcept { return _weatherName; }
|
||||
const ArbUt::CaseInsensitiveConstString GetWeatherName() const noexcept { return _weatherName; }
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
#define PKMNLIB_BATTLELIBRARY_HPP
|
||||
|
||||
#include <CreatureLib/Battling/Library/BattleLibrary.hpp>
|
||||
#include <memory>
|
||||
#include "../../Library/PokemonLibrary.hpp"
|
||||
#include "DamageLibrary.hpp"
|
||||
#include "ExperienceLibrary.hpp"
|
||||
@@ -18,25 +19,25 @@ namespace PkmnLib::Battling {
|
||||
: CreatureLib::Battling::BattleLibrary(staticLib, statCalculator, damageLibrary, experienceLibrary,
|
||||
scriptResolver, miscLibrary) {}
|
||||
|
||||
const Library::LibrarySettings* GetSettings() const {
|
||||
return static_cast<const Library::LibrarySettings*>(_staticLib->GetSettings());
|
||||
const std::unique_ptr<const Library::LibrarySettings>& GetSettings() const {
|
||||
return reinterpret_cast<const std::unique_ptr<const Library::LibrarySettings>&>(_staticLib->GetSettings());
|
||||
}
|
||||
|
||||
const Library::PokemonLibrary* GetStaticLib() const {
|
||||
return dynamic_cast<const Library::PokemonLibrary*>(CreatureLib::Battling::BattleLibrary::_staticLib);
|
||||
const std::unique_ptr<const Library::PokemonLibrary>& GetStaticLib() const {
|
||||
return reinterpret_cast<const std::unique_ptr<const Library::PokemonLibrary>&>(_staticLib);
|
||||
}
|
||||
|
||||
const Library::SpeciesLibrary* GetSpeciesLibrary() const {
|
||||
return dynamic_cast<const Library::SpeciesLibrary*>(
|
||||
CreatureLib::Battling::BattleLibrary::GetSpeciesLibrary());
|
||||
const std::unique_ptr<const Library::SpeciesLibrary>& GetSpeciesLibrary() const {
|
||||
return reinterpret_cast<const std::unique_ptr<const Library::SpeciesLibrary>&>(
|
||||
_staticLib->GetSpeciesLibrary());
|
||||
}
|
||||
|
||||
const Library::MoveLibrary* GetMoveLibrary() const {
|
||||
return dynamic_cast<const Library::MoveLibrary*>(CreatureLib::Battling::BattleLibrary::GetAttackLibrary());
|
||||
const std::unique_ptr<const Library::MoveLibrary>& GetMoveLibrary() const {
|
||||
return reinterpret_cast<const std::unique_ptr<const Library::MoveLibrary>&>(_staticLib->GetAttackLibrary());
|
||||
}
|
||||
|
||||
const Library::ItemLibrary* GetItemLibrary() const {
|
||||
return dynamic_cast<const Library::ItemLibrary*>(CreatureLib::Battling::BattleLibrary::GetItemLibrary());
|
||||
const std::unique_ptr<const Library::ItemLibrary>& GetItemLibrary() const {
|
||||
return reinterpret_cast<const std::unique_ptr<const Library::ItemLibrary>&>(_staticLib->GetItemLibrary());
|
||||
}
|
||||
|
||||
const Library::NatureLibrary* GetNatureLibrary() const { return GetStaticLib()->GetNatureLibrary(); }
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#include "CreatePokemon.hpp"
|
||||
|
||||
PkmnLib::Battling::CreatePokemon PkmnLib::Battling::CreatePokemon::WithRandomIndividualValues(Arbutils::Random rand) {
|
||||
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);
|
||||
@@ -37,19 +37,20 @@ PkmnLib::Battling::CreatePokemon PkmnLib::Battling::CreatePokemon::WithEffortVal
|
||||
}
|
||||
|
||||
PkmnLib::Battling::Pokemon* PkmnLib::Battling::CreatePokemon::Build() {
|
||||
auto rand = Arbutils::Random();
|
||||
const PkmnLib::Library::PokemonSpecies* species = nullptr;
|
||||
auto rand = ArbUt::Random();
|
||||
ArbUt::BorrowedPtr<const Library::PokemonSpecies> species = nullptr;
|
||||
if (!this->_library->GetSpeciesLibrary()->TryGet(this->_species, species)) {
|
||||
std::stringstream err;
|
||||
err << "Invalid species '" << _species << "'.";
|
||||
throw CreatureException(err.str());
|
||||
}
|
||||
const PkmnLib::Library::PokemonForme* forme;
|
||||
ArbUt::BorrowedPtr<const PkmnLib::Library::PokemonForme> 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);
|
||||
@@ -64,15 +65,16 @@ PkmnLib::Battling::Pokemon* PkmnLib::Battling::CreatePokemon::Build() {
|
||||
if (gender == static_cast<CreatureLib::Library::Gender>(-1)) {
|
||||
gender = species->GetRandomGender(rand);
|
||||
}
|
||||
const Library::Item* heldItem = nullptr;
|
||||
ArbUt::BorrowedPtr<const Library::Item> heldItem = nullptr;
|
||||
if (!this->_heldItem.Empty()) {
|
||||
if (!_library->GetItemLibrary()->TryGet(this->_heldItem, heldItem)) {
|
||||
throw CreatureException("Unknown Item: " + this->_heldItem.std_str());
|
||||
}
|
||||
AssertNotNull(heldItem);
|
||||
}
|
||||
auto experience = _library->GetGrowthRateLibrary()->CalculateExperience(species->GetGrowthRate(), _level);
|
||||
|
||||
auto attacks = List<CreatureLib::Battling::LearnedAttack*>(_attacks.Count());
|
||||
auto attacks = ArbUt::List<CreatureLib::Battling::LearnedAttack*>(_attacks.Count());
|
||||
for (size_t i = 0; i < _attacks.Count(); i++) {
|
||||
auto& kv = _attacks[i];
|
||||
auto move = kv.Move;
|
||||
@@ -102,7 +104,7 @@ PkmnLib::Battling::Pokemon* PkmnLib::Battling::CreatePokemon::Build() {
|
||||
return pkmn;
|
||||
}
|
||||
PkmnLib::Battling::CreatePokemon
|
||||
PkmnLib::Battling::CreatePokemon::WithNature(const Arbutils::CaseInsensitiveConstString& nature) {
|
||||
PkmnLib::Battling::CreatePokemon::WithNature(const ArbUt::CaseInsensitiveConstString& nature) {
|
||||
_nature = nature;
|
||||
return *this;
|
||||
}
|
||||
@@ -129,7 +131,7 @@ PkmnLib::Battling::CreatePokemon PkmnLib::Battling::CreatePokemon::WithEffortVal
|
||||
return *this;
|
||||
}
|
||||
PkmnLib::Battling::CreatePokemon
|
||||
PkmnLib::Battling::CreatePokemon::WithForme(const Arbutils::CaseInsensitiveConstString& forme) {
|
||||
PkmnLib::Battling::CreatePokemon::WithForme(const ArbUt::CaseInsensitiveConstString& forme) {
|
||||
_forme = forme;
|
||||
return *this;
|
||||
}
|
||||
@@ -143,14 +145,14 @@ PkmnLib::Battling::CreatePokemon PkmnLib::Battling::CreatePokemon::IsShiny(bool
|
||||
return *this;
|
||||
}
|
||||
PkmnLib::Battling::CreatePokemon
|
||||
PkmnLib::Battling::CreatePokemon::WithHeldItem(const Arbutils::CaseInsensitiveConstString& item) {
|
||||
PkmnLib::Battling::CreatePokemon::WithHeldItem(const ArbUt::CaseInsensitiveConstString& item) {
|
||||
_heldItem = item;
|
||||
return *this;
|
||||
}
|
||||
PkmnLib::Battling::CreatePokemon
|
||||
PkmnLib::Battling::CreatePokemon::LearnMove(const Arbutils::CaseInsensitiveConstString& moveName,
|
||||
PkmnLib::Battling::CreatePokemon::LearnMove(const ArbUt::CaseInsensitiveConstString& moveName,
|
||||
CreatureLib::Battling::AttackLearnMethod method) {
|
||||
const PkmnLib::Library::MoveData* move = nullptr;
|
||||
ArbUt::BorrowedPtr<const PkmnLib::Library::MoveData> move = nullptr;
|
||||
if (!_library->GetMoveLibrary()->TryGet(moveName, move)) {
|
||||
throw CreatureException("Invalid Move given: " + moveName.std_str());
|
||||
}
|
||||
|
||||
@@ -7,25 +7,26 @@ namespace PkmnLib::Battling {
|
||||
class CreatePokemon {
|
||||
private:
|
||||
const BattleLibrary* _library;
|
||||
Arbutils::CaseInsensitiveConstString _species = ""_cnc;
|
||||
Arbutils::CaseInsensitiveConstString _forme = "default"_cnc;
|
||||
ArbUt::CaseInsensitiveConstString _species = ""_cnc;
|
||||
ArbUt::CaseInsensitiveConstString _forme = "default"_cnc;
|
||||
uint8_t _level;
|
||||
std::string _nickname = "";
|
||||
|
||||
Arbutils::CaseInsensitiveConstString _ability = ""_cnc;
|
||||
Arbutils::CaseInsensitiveConstString _nature;
|
||||
ArbUt::CaseInsensitiveConstString _ability = ""_cnc;
|
||||
ArbUt::CaseInsensitiveConstString _nature;
|
||||
CreatureLib::Library::Gender _gender = static_cast<CreatureLib::Library::Gender>(-1);
|
||||
Arbutils::CaseInsensitiveConstString _heldItem = ""_cnc;
|
||||
ArbUt::CaseInsensitiveConstString _heldItem = ""_cnc;
|
||||
uint32_t _identifier = 0;
|
||||
|
||||
struct ToLearnMethod {
|
||||
const Library::MoveData* Move;
|
||||
ArbUt::BorrowedPtr<const Library::MoveData> Move;
|
||||
CreatureLib::Battling::AttackLearnMethod LearnMethod;
|
||||
ToLearnMethod() : Move(nullptr), LearnMethod(CreatureLib::Battling::AttackLearnMethod::Unknown){};
|
||||
ToLearnMethod(const Library::MoveData* move, CreatureLib::Battling::AttackLearnMethod method)
|
||||
ToLearnMethod(ArbUt::BorrowedPtr<const Library::MoveData> move,
|
||||
CreatureLib::Battling::AttackLearnMethod method)
|
||||
: Move(move), LearnMethod(method){};
|
||||
};
|
||||
Arbutils::Collections::List<ToLearnMethod> _attacks;
|
||||
ArbUt::List<ToLearnMethod> _attacks;
|
||||
uint8_t _currentMove = 0;
|
||||
|
||||
uint8_t _ivHp = 0;
|
||||
@@ -47,18 +48,18 @@ namespace PkmnLib::Battling {
|
||||
bool _allowedExperienceGain = true;
|
||||
|
||||
public:
|
||||
CreatePokemon(const BattleLibrary* library, const Arbutils::CaseInsensitiveConstString& species, uint8_t level)
|
||||
CreatePokemon(const BattleLibrary* library, const ArbUt::CaseInsensitiveConstString& species, uint8_t level)
|
||||
: _library(library), _species(species), _level(level), _attacks(library->GetSettings()->GetMaximalMoves()) {
|
||||
}
|
||||
|
||||
CreatePokemon WithForme(const Arbutils::CaseInsensitiveConstString& forme);
|
||||
CreatePokemon WithForme(const ArbUt::CaseInsensitiveConstString& forme);
|
||||
CreatePokemon WithGender(CreatureLib::Library::Gender gender);
|
||||
CreatePokemon IsShiny(bool value);
|
||||
CreatePokemon WithHeldItem(const Arbutils::CaseInsensitiveConstString& item);
|
||||
CreatePokemon LearnMove(const Arbutils::CaseInsensitiveConstString& move,
|
||||
CreatePokemon WithHeldItem(const ArbUt::CaseInsensitiveConstString& item);
|
||||
CreatePokemon LearnMove(const ArbUt::CaseInsensitiveConstString& move,
|
||||
CreatureLib::Battling::AttackLearnMethod method);
|
||||
|
||||
CreatePokemon WithRandomIndividualValues(Arbutils::Random rand = Arbutils::Random());
|
||||
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);
|
||||
@@ -66,7 +67,7 @@ namespace PkmnLib::Battling {
|
||||
CreatePokemon WithEffortValues(uint8_t hp, uint8_t att, uint8_t def, uint8_t spAtt, uint8_t spDef,
|
||||
uint8_t speed);
|
||||
|
||||
CreatePokemon WithNature(const Arbutils::CaseInsensitiveConstString& nature);
|
||||
CreatePokemon WithNature(const ArbUt::CaseInsensitiveConstString& nature);
|
||||
CreatePokemon IsAllowedExperienceGain(bool value);
|
||||
|
||||
Pokemon* Build();
|
||||
|
||||
@@ -6,10 +6,13 @@
|
||||
namespace PkmnLib::Battling {
|
||||
class LearnedMove : public CreatureLib::Battling::LearnedAttack {
|
||||
public:
|
||||
LearnedMove(const Library::MoveData* move, CreatureLib::Battling::AttackLearnMethod learnMethod)
|
||||
: CreatureLib::Battling::LearnedAttack(move, learnMethod) {}
|
||||
LearnedMove(const ArbUt::BorrowedPtr<const Library::MoveData>& move,
|
||||
CreatureLib::Battling::AttackLearnMethod learnMethod)
|
||||
: CreatureLib::Battling::LearnedAttack(move.As<const CreatureLib::Library::AttackData>(), learnMethod) {}
|
||||
|
||||
const Library::MoveData* GetMoveData() const { return dynamic_cast<const Library::MoveData*>(GetAttack()); }
|
||||
const ArbUt::BorrowedPtr<const Library::MoveData> GetMoveData() const {
|
||||
return GetAttack().As<const Library::MoveData>();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -18,26 +18,29 @@ namespace PkmnLib::Battling {
|
||||
const BattleLibrary* GetLibrary() const { return reinterpret_cast<const BattleLibrary*>(_library); }
|
||||
|
||||
public:
|
||||
Pokemon(const BattleLibrary* library, const Library::PokemonSpecies* species,
|
||||
const Library::PokemonForme* forme, uint8_t level, uint32_t experience, uint32_t uid,
|
||||
CreatureLib::Library::Gender gender, uint8_t coloring, const Library::Item* heldItem,
|
||||
const std::string& nickname, const CreatureLib::Library::TalentIndex& talent,
|
||||
const List<CreatureLib::Battling::LearnedAttack*>& moves,
|
||||
Pokemon(const BattleLibrary* library, const ArbUt::BorrowedPtr<const Library::PokemonSpecies>& species,
|
||||
const ArbUt::BorrowedPtr<const Library::PokemonForme>& forme, uint8_t level, uint32_t experience,
|
||||
uint32_t uid, CreatureLib::Library::Gender gender, uint8_t coloring,
|
||||
ArbUt::BorrowedPtr<const Library::Item> heldItem, const std::string& nickname,
|
||||
const CreatureLib::Library::TalentIndex& talent,
|
||||
const ArbUt::List<CreatureLib::Battling::LearnedAttack*>& moves,
|
||||
CreatureLib::Library::StatisticSet<uint8_t> individualValues,
|
||||
CreatureLib::Library::StatisticSet<uint8_t> effortValues, const PkmnLib::Library::Nature* nature,
|
||||
bool allowedExperienceGain = true)
|
||||
: CreatureLib::Battling::Creature(library, species, forme, level, experience, uid, gender, coloring,
|
||||
heldItem, nickname, talent, moves, allowedExperienceGain),
|
||||
: CreatureLib::Battling::Creature(library, species.As<const CreatureLib::Library::CreatureSpecies>(),
|
||||
forme.As<const CreatureLib::Library::SpeciesVariant>(), level, experience,
|
||||
uid, gender, coloring, heldItem.As<const CreatureLib::Library::Item>(),
|
||||
nickname, talent, moves, allowedExperienceGain),
|
||||
_individualValues(individualValues), _effortValues(effortValues), _nature(nature) {}
|
||||
|
||||
const Library::PokemonForme* GetForme() const {
|
||||
return dynamic_cast<const Library::PokemonForme*>(GetVariant());
|
||||
const ArbUt::BorrowedPtr<const Library::PokemonForme> GetForme() const {
|
||||
return _variant.As<const Library::PokemonForme>();
|
||||
}
|
||||
|
||||
inline bool IsShiny() const noexcept { return _coloring == 1; }
|
||||
|
||||
const Arbutils::Collections::List<LearnedMove*>& GetMoves() const {
|
||||
return reinterpret_cast<const Arbutils::Collections::List<LearnedMove*>&>(_attacks);
|
||||
const ArbUt::List<LearnedMove*>& GetMoves() const {
|
||||
return reinterpret_cast<const ArbUt::List<LearnedMove*>&>(_attacks);
|
||||
}
|
||||
|
||||
inline const Library::Nature* GetNature() const noexcept { return _nature; }
|
||||
@@ -48,8 +51,8 @@ namespace PkmnLib::Battling {
|
||||
return _effortValues.GetStat(stat);
|
||||
}
|
||||
|
||||
inline const PkmnLib::Library::PokemonSpecies* GetPokemonSpecies() const noexcept {
|
||||
return dynamic_cast<const Library::PokemonSpecies*>(_species);
|
||||
inline ArbUt::BorrowedPtr<const PkmnLib::Library::PokemonSpecies> GetPokemonSpecies() const noexcept {
|
||||
return _species.As<const PkmnLib::Library::PokemonSpecies>();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user