Rework for C Interfaces to handle exceptions a bit better.
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
@@ -10,7 +10,7 @@ namespace CreatureLib::Battling {
|
||||
class EventData {
|
||||
public:
|
||||
virtual ~EventData() = default;
|
||||
virtual EventDataKind GetKind() const = 0;
|
||||
virtual EventDataKind GetKind() const noexcept = 0;
|
||||
};
|
||||
|
||||
class DamageEvent : public EventData {
|
||||
@@ -20,13 +20,13 @@ namespace CreatureLib::Battling {
|
||||
uint32_t _newHealth;
|
||||
|
||||
public:
|
||||
DamageEvent(Creature* c, DamageSource s, uint32_t oHealth, uint32_t newHealth)
|
||||
DamageEvent(Creature* c, DamageSource s, uint32_t oHealth, uint32_t newHealth) noexcept
|
||||
: _creature(c), _damageSource(s), _originalHealth(oHealth), _newHealth(newHealth) {}
|
||||
EventDataKind GetKind() const override { return EventDataKind ::Damage; }
|
||||
Creature* GetCreature() const { return _creature; }
|
||||
DamageSource GetDamageSource() const { return _damageSource; }
|
||||
uint32_t GetOriginalHealth() const { return _originalHealth; }
|
||||
uint32_t GetNewHealth() const { return _newHealth; }
|
||||
EventDataKind GetKind() const noexcept override { return EventDataKind ::Damage; }
|
||||
Creature* GetCreature() const noexcept { return _creature; }
|
||||
DamageSource GetDamageSource() const noexcept { return _damageSource; }
|
||||
uint32_t GetOriginalHealth() const noexcept { return _originalHealth; }
|
||||
uint32_t GetNewHealth() const noexcept { return _newHealth; }
|
||||
};
|
||||
|
||||
class HealEvent : public EventData {
|
||||
@@ -35,30 +35,30 @@ namespace CreatureLib::Battling {
|
||||
uint32_t _newHealth;
|
||||
|
||||
public:
|
||||
HealEvent(Creature* c, uint32_t oHealth, uint32_t newHealth)
|
||||
HealEvent(Creature* c, uint32_t oHealth, uint32_t newHealth) noexcept
|
||||
: _creature(c), _originalHealth(oHealth), _newHealth(newHealth) {}
|
||||
EventDataKind GetKind() const override { return EventDataKind ::Heal; }
|
||||
Creature* GetCreature() const { return _creature; }
|
||||
uint32_t GetOriginalHealth() const { return _originalHealth; }
|
||||
uint32_t GetNewHealth() const { return _newHealth; }
|
||||
EventDataKind GetKind() const noexcept override { return EventDataKind ::Heal; }
|
||||
Creature* GetCreature() const noexcept { return _creature; }
|
||||
uint32_t GetOriginalHealth() const noexcept { return _originalHealth; }
|
||||
uint32_t GetNewHealth() const noexcept { return _newHealth; }
|
||||
};
|
||||
|
||||
class FaintEvent : public EventData {
|
||||
Creature* _creature;
|
||||
|
||||
public:
|
||||
FaintEvent(Creature* c) : _creature(c) {}
|
||||
EventDataKind GetKind() const override { return EventDataKind ::Faint; }
|
||||
Creature* GetCreature() const { return _creature; }
|
||||
FaintEvent(Creature* c) noexcept : _creature(c) {}
|
||||
EventDataKind GetKind() const noexcept override { return EventDataKind ::Faint; }
|
||||
Creature* GetCreature() const noexcept { return _creature; }
|
||||
};
|
||||
|
||||
class DisplayTextEvent : public EventData {
|
||||
const std::string _text;
|
||||
|
||||
public:
|
||||
DisplayTextEvent(const std::string& text) : _text(text) {}
|
||||
EventDataKind GetKind() const override { return EventDataKind ::DisplayText; }
|
||||
const std::string& GetText() const { return _text; }
|
||||
DisplayTextEvent(const std::string& text) noexcept : _text(text) {}
|
||||
EventDataKind GetKind() const noexcept override { return EventDataKind ::DisplayText; }
|
||||
const std::string& GetText() const noexcept { return _text; }
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@@ -17,25 +17,31 @@ BattleLibrary::~BattleLibrary() {
|
||||
delete _miscLibrary;
|
||||
}
|
||||
|
||||
const CreatureLib::Library::LibrarySettings* BattleLibrary::GetSettings() const { return _staticLib->GetSettings(); }
|
||||
const CreatureLib::Library::LibrarySettings* BattleLibrary::GetSettings() const noexcept {
|
||||
return _staticLib->GetSettings();
|
||||
}
|
||||
|
||||
const BattleStatCalculator* BattleLibrary::GetStatCalculator() const { return _statCalculator; }
|
||||
const BattleStatCalculator* BattleLibrary::GetStatCalculator() const noexcept { return _statCalculator; }
|
||||
|
||||
const CreatureLib::Library::SpeciesLibrary* BattleLibrary::GetSpeciesLibrary() const {
|
||||
const CreatureLib::Library::SpeciesLibrary* BattleLibrary::GetSpeciesLibrary() const noexcept {
|
||||
return _staticLib->GetSpeciesLibrary();
|
||||
}
|
||||
|
||||
const CreatureLib::Library::ItemLibrary* BattleLibrary::GetItemLibrary() const { return _staticLib->GetItemLibrary(); }
|
||||
const CreatureLib::Library::ItemLibrary* BattleLibrary::GetItemLibrary() const noexcept {
|
||||
return _staticLib->GetItemLibrary();
|
||||
}
|
||||
|
||||
const CreatureLib::Library::AttackLibrary* BattleLibrary::GetAttackLibrary() const {
|
||||
const CreatureLib::Library::AttackLibrary* BattleLibrary::GetAttackLibrary() const noexcept {
|
||||
return _staticLib->GetAttackLibrary();
|
||||
}
|
||||
|
||||
const CreatureLib::Library::TypeLibrary* BattleLibrary::GetTypeLibrary() const { return _staticLib->GetTypeLibrary(); }
|
||||
const CreatureLib::Library::TypeLibrary* BattleLibrary::GetTypeLibrary() const noexcept {
|
||||
return _staticLib->GetTypeLibrary();
|
||||
}
|
||||
|
||||
const DamageLibrary* BattleLibrary::GetDamageLibrary() const { return _damageLibrary; }
|
||||
const DamageLibrary* BattleLibrary::GetDamageLibrary() const noexcept { return _damageLibrary; }
|
||||
|
||||
const MiscLibrary* BattleLibrary::GetMiscLibrary() const { return _miscLibrary; }
|
||||
const MiscLibrary* BattleLibrary::GetMiscLibrary() const noexcept { return _miscLibrary; }
|
||||
|
||||
Script* BattleLibrary::LoadScript(ScriptCategory category, const ConstString& scriptName) const {
|
||||
return _scriptResolver->LoadScript(category, scriptName);
|
||||
|
||||
@@ -23,21 +23,21 @@ namespace CreatureLib::Battling {
|
||||
DamageLibrary* damageLibrary, ExperienceLibrary* experienceLibrary,
|
||||
ScriptResolver* scriptResolver, MiscLibrary* miscLibrary);
|
||||
~BattleLibrary();
|
||||
inline const Library::DataLibrary* GetStaticLib() const { return _staticLib; }
|
||||
inline const Library::DataLibrary* GetStaticLib() const noexcept { return _staticLib; }
|
||||
|
||||
[[nodiscard]] const Library::LibrarySettings* GetSettings() const;
|
||||
[[nodiscard]] const Library::SpeciesLibrary* GetSpeciesLibrary() const;
|
||||
[[nodiscard]] const Library::ItemLibrary* GetItemLibrary() const;
|
||||
[[nodiscard]] const Library::AttackLibrary* GetAttackLibrary() const;
|
||||
[[nodiscard]] const Library::TypeLibrary* GetTypeLibrary() const;
|
||||
[[nodiscard]] const Library::GrowthRateLibrary* GetGrowthRateLibrary() const {
|
||||
[[nodiscard]] const Library::LibrarySettings* GetSettings() const noexcept;
|
||||
[[nodiscard]] const Library::SpeciesLibrary* GetSpeciesLibrary() const noexcept;
|
||||
[[nodiscard]] const Library::ItemLibrary* GetItemLibrary() const noexcept;
|
||||
[[nodiscard]] const Library::AttackLibrary* GetAttackLibrary() const noexcept;
|
||||
[[nodiscard]] const Library::TypeLibrary* GetTypeLibrary() const noexcept;
|
||||
[[nodiscard]] const Library::GrowthRateLibrary* GetGrowthRateLibrary() const noexcept {
|
||||
return _staticLib->GetGrowthRates();
|
||||
}
|
||||
|
||||
[[nodiscard]] const BattleStatCalculator* GetStatCalculator() const;
|
||||
[[nodiscard]] const DamageLibrary* GetDamageLibrary() const;
|
||||
[[nodiscard]] const MiscLibrary* GetMiscLibrary() const;
|
||||
[[nodiscard]] const ExperienceLibrary* GetExperienceLibrary() const { return _experienceLibrary; }
|
||||
[[nodiscard]] const BattleStatCalculator* GetStatCalculator() const noexcept;
|
||||
[[nodiscard]] const DamageLibrary* GetDamageLibrary() const noexcept;
|
||||
[[nodiscard]] const MiscLibrary* GetMiscLibrary() const noexcept;
|
||||
[[nodiscard]] const ExperienceLibrary* GetExperienceLibrary() const noexcept { return _experienceLibrary; }
|
||||
|
||||
[[nodiscard]] Script* LoadScript(ScriptCategory category, const ConstString& scriptName) const;
|
||||
};
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
using namespace CreatureLib;
|
||||
using namespace CreatureLib::Battling;
|
||||
|
||||
const BattleLibrary* Battle::GetLibrary() const { return _library; }
|
||||
const BattleLibrary* Battle::GetLibrary() const noexcept { return _library; }
|
||||
|
||||
bool Battle::CanUse(const BaseTurnChoice* choice) {
|
||||
AssertNotNull(choice)
|
||||
@@ -69,9 +69,9 @@ void Battle::CheckChoicesSetAndRun() {
|
||||
}
|
||||
}
|
||||
|
||||
ChoiceQueue* Battle::GetCurrentTurnQueue() const { return _currentTurnQueue; }
|
||||
ChoiceQueue* Battle::GetCurrentTurnQueue() const noexcept { return _currentTurnQueue; }
|
||||
|
||||
BattleRandom* Battle::GetRandom() { return &_random; }
|
||||
BattleRandom* Battle::GetRandom() noexcept { return &_random; }
|
||||
|
||||
bool Battle::CreatureInField(const Creature* creature) const {
|
||||
AssertNotNull(creature)
|
||||
@@ -87,7 +87,6 @@ void Battle::ForceRecall(uint8_t side, uint8_t index) { _sides[side]->SetCreatur
|
||||
void Battle::GetActiveScripts(Arbutils::Collections::List<ScriptWrapper>& scripts) { scripts.Append(&_volatile); }
|
||||
|
||||
void Battle::SwitchCreature(uint8_t sideIndex, uint8_t index, Creature* c) {
|
||||
AssertNotNull(c)
|
||||
auto side = this->_sides[sideIndex];
|
||||
side->SetCreature(c, index);
|
||||
}
|
||||
|
||||
@@ -57,18 +57,18 @@ namespace CreatureLib::Battling {
|
||||
delete _currentTurnQueue;
|
||||
}
|
||||
|
||||
[[nodiscard]] const BattleLibrary* GetLibrary() const;
|
||||
[[nodiscard]] const BattleLibrary* GetLibrary() const noexcept;
|
||||
[[nodiscard]] uint32_t GetCurrentTurn() const noexcept { return _currentTurn; }
|
||||
|
||||
virtual bool CanUse(const BaseTurnChoice* choice);
|
||||
virtual bool TrySetChoice(BaseTurnChoice* choice);
|
||||
|
||||
bool CanFlee() const { return _canFlee; }
|
||||
bool CanFlee() const noexcept { return _canFlee; }
|
||||
|
||||
void CheckChoicesSetAndRun();
|
||||
|
||||
[[nodiscard]] ChoiceQueue* GetCurrentTurnQueue() const;
|
||||
BattleRandom* GetRandom();
|
||||
[[nodiscard]] ChoiceQueue* GetCurrentTurnQueue() const noexcept;
|
||||
BattleRandom* GetRandom() noexcept;
|
||||
|
||||
bool CreatureInField(const Creature* creature) const;
|
||||
|
||||
@@ -84,12 +84,12 @@ namespace CreatureLib::Battling {
|
||||
void GetActiveScripts(Arbutils::Collections::List<ScriptWrapper>& scripts) override;
|
||||
|
||||
void ValidateBattleState();
|
||||
inline bool HasEnded() const { return _hasEnded; }
|
||||
inline const BattleResult& GetResult() const { return _battleResult; }
|
||||
inline bool HasEnded() const noexcept { return _hasEnded; }
|
||||
inline const BattleResult& GetResult() const noexcept { return _battleResult; }
|
||||
|
||||
const List<BattleSide*>& GetSides() const { return _sides; }
|
||||
const List<BattleSide*>& GetSides() const noexcept { return _sides; }
|
||||
Script* GetVolatileScript(const ConstString& key) const { return _volatile.Get(key); }
|
||||
Script* GetVolatileScript(uint32_t keyHash) const { return _volatile.Get(keyHash); }
|
||||
Script* GetVolatileScript(uint32_t keyHash) const noexcept { return _volatile.Get(keyHash); }
|
||||
void AddVolatileScript(const ConstString& key);
|
||||
void AddVolatileScript(Script* script);
|
||||
void RemoveVolatileScript(const ConstString& name) { _volatile.Remove(name); }
|
||||
|
||||
@@ -16,9 +16,9 @@ namespace CreatureLib::Battling {
|
||||
static BattleResult Empty() { return BattleResult(false, 0); }
|
||||
|
||||
/// Whether or not the battle has ended with a conclusive result.
|
||||
bool IsConclusiveResult() const { return _conclusiveResult; }
|
||||
bool IsConclusiveResult() const noexcept { return _conclusiveResult; }
|
||||
/// Get the index of the side that has won the battle. Only valid if the battle has a conclusive result.
|
||||
uint8_t GetWinningSide() const { return _winningSide; }
|
||||
uint8_t GetWinningSide() const noexcept { return _winningSide; }
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -39,14 +39,15 @@ void BattleSide::SetChoice(BaseTurnChoice* choice) {
|
||||
}
|
||||
|
||||
void BattleSide::SetCreature(Creature* creature, uint8_t index) {
|
||||
AssertNotNull(creature)
|
||||
auto old = _creatures[index];
|
||||
if (old != nullptr) {
|
||||
old->SetOnBattleField(false);
|
||||
}
|
||||
_creatures[index] = creature;
|
||||
creature->SetBattleData(_battle, this);
|
||||
creature->SetOnBattleField(true);
|
||||
if (creature != nullptr) {
|
||||
creature->SetBattleData(_battle, this);
|
||||
creature->SetOnBattleField(true);
|
||||
}
|
||||
if (_battle == nullptr)
|
||||
return;
|
||||
for (auto side : _battle->GetSides()) {
|
||||
|
||||
@@ -24,7 +24,12 @@ Battling::Creature::Creature(const BattleLibrary* library, const Library::Creatu
|
||||
}
|
||||
|
||||
void Battling::Creature::ChangeLevelBy(int8_t amount) {
|
||||
this->_level += amount;
|
||||
auto level = _level + amount;
|
||||
if (level > _library->GetSettings()->GetMaximalLevel())
|
||||
level = _library->GetSettings()->GetMaximalLevel();
|
||||
if (level < 1)
|
||||
level = 1;
|
||||
_level = level;
|
||||
_experience = _library->GetGrowthRateLibrary()->CalculateExperience(_species->GetGrowthRate(), _level);
|
||||
RecalculateFlatStats();
|
||||
}
|
||||
@@ -52,13 +57,17 @@ void Battling::Creature::ChangeStatBoost(Library::Statistic stat, int8_t diffAmo
|
||||
this->RecalculateBoostedStat(stat);
|
||||
}
|
||||
|
||||
uint32_t Battling::Creature::GetFlatStat(Library::Statistic stat) const { return _flatStats.GetStat(stat); }
|
||||
uint32_t Battling::Creature::GetFlatStat(Library::Statistic stat) const noexcept { return _flatStats.GetStat(stat); }
|
||||
|
||||
uint32_t Battling::Creature::GetBoostedStat(Library::Statistic stat) const { return _boostedStats.GetStat(stat); }
|
||||
uint32_t Battling::Creature::GetBoostedStat(Library::Statistic stat) const noexcept {
|
||||
return _boostedStats.GetStat(stat);
|
||||
}
|
||||
|
||||
uint32_t Battling::Creature::GetBaseStat(Library::Statistic stat) const { return _variant->GetStatistic(stat); }
|
||||
uint32_t Battling::Creature::GetBaseStat(Library::Statistic stat) const noexcept {
|
||||
return _variant->GetStatistic(stat);
|
||||
}
|
||||
|
||||
int8_t Battling::Creature::GetStatBoost(Library::Statistic stat) const { return _statBoost.GetStat(stat); }
|
||||
int8_t Battling::Creature::GetStatBoost(Library::Statistic stat) const noexcept { return _statBoost.GetStat(stat); }
|
||||
|
||||
void Battling::Creature::RecalculateFlatStats() {
|
||||
auto statCalc = this->_library->GetStatCalculator();
|
||||
@@ -174,13 +183,13 @@ void Battling::Creature::AddExperience(uint32_t amount) {
|
||||
_experience = exp;
|
||||
_level = level;
|
||||
}
|
||||
const Library::CreatureSpecies* Battling::Creature::GetDisplaySpecies() const {
|
||||
const Library::CreatureSpecies* Battling::Creature::GetDisplaySpecies() const noexcept {
|
||||
auto species = _displaySpecies;
|
||||
if (species == nullptr)
|
||||
species = _species;
|
||||
return species;
|
||||
}
|
||||
const Library::SpeciesVariant* Battling::Creature::GetDisplayVariant() const {
|
||||
const Library::SpeciesVariant* Battling::Creature::GetDisplayVariant() const noexcept {
|
||||
auto variant = _displayVariant;
|
||||
if (variant == nullptr)
|
||||
variant = _variant;
|
||||
|
||||
@@ -129,21 +129,21 @@ namespace CreatureLib::Battling {
|
||||
void RemoveVolatileScript(Script* script);
|
||||
bool HasVolatileScript(const ConstString& name) const;
|
||||
|
||||
List<LearnedAttack*>& GetAttacks() { return _attacks; }
|
||||
List<LearnedAttack*>& GetAttacks() noexcept { return _attacks; }
|
||||
|
||||
const Library::CreatureSpecies* GetDisplaySpecies() const;
|
||||
const Library::SpeciesVariant* GetDisplayVariant() const;
|
||||
const Library::CreatureSpecies* GetDisplaySpecies() const noexcept;
|
||||
const Library::SpeciesVariant* GetDisplayVariant() const noexcept;
|
||||
|
||||
const void SetDisplaySpecies(const Library::CreatureSpecies* species) { _displaySpecies = species; }
|
||||
const void SetDisplayVariant(const Library::SpeciesVariant* variant) { _displayVariant = variant; };
|
||||
const void SetDisplaySpecies(const Library::CreatureSpecies* species) noexcept { _displaySpecies = species; }
|
||||
const void SetDisplayVariant(const Library::SpeciesVariant* variant) noexcept { _displayVariant = variant; };
|
||||
|
||||
// region Stat APIs
|
||||
|
||||
void ChangeStatBoost(Library::Statistic stat, int8_t diffAmount);
|
||||
[[nodiscard]] uint32_t GetFlatStat(Library::Statistic stat) const;
|
||||
[[nodiscard]] uint32_t GetBoostedStat(Library::Statistic stat) const;
|
||||
[[nodiscard]] uint32_t GetBaseStat(Library::Statistic stat) const;
|
||||
[[nodiscard]] int8_t GetStatBoost(Library::Statistic stat) const;
|
||||
[[nodiscard]] uint32_t GetFlatStat(Library::Statistic stat) const noexcept;
|
||||
[[nodiscard]] uint32_t GetBoostedStat(Library::Statistic stat) const noexcept;
|
||||
[[nodiscard]] uint32_t GetBaseStat(Library::Statistic stat) const noexcept;
|
||||
[[nodiscard]] int8_t GetStatBoost(Library::Statistic stat) const noexcept;
|
||||
void RecalculateFlatStats();
|
||||
void RecalculateBoostedStats();
|
||||
void RecalculateFlatStat(Library::Statistic);
|
||||
|
||||
@@ -10,16 +10,18 @@ namespace CreatureLib::Battling {
|
||||
uint8_t _creature;
|
||||
|
||||
public:
|
||||
CreatureIndex() : _side(0), _creature(0) {}
|
||||
CreatureIndex(uint8_t side, uint8_t creature) : _side(side), _creature(creature) {}
|
||||
CreatureIndex() noexcept : _side(0), _creature(0) {}
|
||||
CreatureIndex(uint8_t side, uint8_t creature) noexcept : _side(side), _creature(creature) {}
|
||||
|
||||
uint8_t GetSideIndex() const { return _side; }
|
||||
uint8_t GetSideIndex() const noexcept { return _side; }
|
||||
|
||||
uint8_t GetCreatureIndex() const { return _creature; }
|
||||
uint8_t GetCreatureIndex() const noexcept { return _creature; }
|
||||
|
||||
bool operator==(const CreatureIndex& rhs) const { return (_side == rhs._side) && (_creature == rhs._creature); }
|
||||
bool operator==(const CreatureIndex& rhs) const noexcept {
|
||||
return (_side == rhs._side) && (_creature == rhs._creature);
|
||||
}
|
||||
|
||||
bool operator!=(const CreatureIndex& rhs) const { return !operator==(rhs); }
|
||||
bool operator!=(const CreatureIndex& rhs) const noexcept { return !operator==(rhs); }
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -9,25 +9,25 @@ namespace CreatureLib::Battling {
|
||||
Arbutils::Collections::List<Creature*> _party;
|
||||
|
||||
public:
|
||||
CreatureParty(size_t size) : _party(size) {}
|
||||
CreatureParty(Arbutils::Collections::List<Creature*> party) : _party(party) {}
|
||||
CreatureParty(std::initializer_list<Creature*> party) : _party(party) {}
|
||||
CreatureParty(size_t size) noexcept : _party(size) {}
|
||||
CreatureParty(Arbutils::Collections::List<Creature*> party) noexcept : _party(party) {}
|
||||
CreatureParty(std::initializer_list<Creature*> party) noexcept : _party(party) {}
|
||||
|
||||
virtual ~CreatureParty() {
|
||||
virtual ~CreatureParty() noexcept {
|
||||
for (auto c : _party) {
|
||||
delete c;
|
||||
}
|
||||
}
|
||||
|
||||
Creature* GetAtIndex(size_t index) const { return _party[index]; }
|
||||
Creature* GetAtIndex(size_t index) const noexcept { return _party[index]; }
|
||||
|
||||
void Switch(size_t a, size_t b) {
|
||||
void Switch(size_t a, size_t b) noexcept {
|
||||
auto ca = _party[a];
|
||||
_party[a] = _party[b];
|
||||
_party[b] = ca;
|
||||
}
|
||||
|
||||
bool HasAvailableCreatures() const {
|
||||
bool HasAvailableCreatures() const noexcept {
|
||||
for (Creature* c : _party) {
|
||||
if (c == nullptr)
|
||||
continue;
|
||||
@@ -38,10 +38,10 @@ namespace CreatureLib::Battling {
|
||||
return false;
|
||||
}
|
||||
|
||||
Arbutils::Collections::List<Creature*>& GetParty() { return _party; }
|
||||
const Arbutils::Collections::List<Creature*>& GetParty() const { return _party; }
|
||||
Arbutils::Collections::List<Creature*>& GetParty() noexcept { return _party; }
|
||||
const Arbutils::Collections::List<Creature*>& GetParty() const noexcept { return _party; }
|
||||
|
||||
size_t GetLength() const { return _party.Count(); }
|
||||
size_t GetLength() const noexcept { return _party.Count(); }
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
namespace CreatureLib::Battling {
|
||||
class ScriptSet {
|
||||
Arbutils::Collections::List<Script*> _scripts;
|
||||
std::unordered_map<uint32_t, size_t> _lookup;
|
||||
Arbutils::Collections::Dictionary<uint32_t, size_t> _lookup;
|
||||
|
||||
public:
|
||||
~ScriptSet() {
|
||||
@@ -18,22 +18,23 @@ namespace CreatureLib::Battling {
|
||||
}
|
||||
|
||||
void Add(Script* script) {
|
||||
auto f = _lookup.find(script->GetName());
|
||||
if (f != _lookup.end()) {
|
||||
_scripts[f.operator*().second]->Stack();
|
||||
size_t v;
|
||||
if (_lookup.TryGet(script->GetName(), v)) {
|
||||
_scripts[v]->Stack();
|
||||
delete script;
|
||||
return;
|
||||
}
|
||||
|
||||
_scripts.Append(script);
|
||||
_lookup.insert({script->GetName(), _scripts.Count() - 1});
|
||||
_lookup.Insert(script->GetName(), _scripts.Count() - 1);
|
||||
}
|
||||
|
||||
Script* Get(const ConstString& key) const { return Get(key.GetHash()); }
|
||||
|
||||
Script* Get(uint32_t keyHash) const {
|
||||
auto f = _lookup.find(keyHash);
|
||||
if (f != _lookup.end()) {
|
||||
return _scripts[f->second];
|
||||
Script* Get(uint32_t keyHash) const noexcept {
|
||||
size_t v;
|
||||
if (_lookup.TryGet(keyHash, v)) {
|
||||
return _scripts[v];
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
@@ -41,27 +42,28 @@ namespace CreatureLib::Battling {
|
||||
void Remove(const ConstString& key) { Remove(key.GetHash()); }
|
||||
|
||||
void Remove(uint32_t keyHash) {
|
||||
auto find = _lookup.find(keyHash);
|
||||
if (find != _lookup.end()) {
|
||||
auto script = _scripts[find->second];
|
||||
size_t v;
|
||||
if (_lookup.TryGet(keyHash, v)) {
|
||||
auto script = _scripts[v];
|
||||
script->OnRemove();
|
||||
delete script;
|
||||
_scripts.Remove(find.operator*().second);
|
||||
_lookup.erase(keyHash);
|
||||
_scripts.Remove(v);
|
||||
_lookup.Remove(keyHash);
|
||||
}
|
||||
}
|
||||
|
||||
void Clear() {
|
||||
for (auto s : _scripts) {
|
||||
s->OnRemove();
|
||||
delete s;
|
||||
}
|
||||
_scripts.Clear();
|
||||
_lookup.clear();
|
||||
_lookup.Clear();
|
||||
}
|
||||
|
||||
bool Has(const ConstString& key) const { return _lookup.find(key) != _lookup.end(); }
|
||||
bool Has(const ConstString& key) const { return _lookup.Has(key); }
|
||||
|
||||
bool Has(uint32_t keyHash) const { return _lookup.find(keyHash) != _lookup.end(); }
|
||||
bool Has(uint32_t keyHash) const { return _lookup.Has(keyHash); }
|
||||
|
||||
size_t Count() const { return _scripts.Count(); }
|
||||
|
||||
|
||||
@@ -32,21 +32,21 @@ namespace CreatureLib::Battling {
|
||||
AssertNotNull(attack)
|
||||
ResolveScript();
|
||||
}
|
||||
AttackTurnChoice(Creature* user, LearnedAttack* attack, const CreatureIndex& target, Script* script)
|
||||
AttackTurnChoice(Creature* user, LearnedAttack* attack, const CreatureIndex& target, Script* script) noexcept
|
||||
: BaseTurnChoice(user), _attack(attack), _target(target), _attackScript(script) {}
|
||||
|
||||
inline LearnedAttack* GetAttack() const { return _attack; }
|
||||
inline LearnedAttack* GetAttack() const noexcept { return _attack; }
|
||||
|
||||
TurnChoiceKind GetKind() const override { return TurnChoiceKind ::Attack; }
|
||||
TurnChoiceKind GetKind() const noexcept override { return TurnChoiceKind ::Attack; }
|
||||
|
||||
int8_t GetPriority() const {
|
||||
// HOOK: Change priority
|
||||
return _attack->GetAttack()->GetPriority();
|
||||
}
|
||||
|
||||
const CreatureIndex& GetTarget() const { return _target; }
|
||||
const CreatureIndex& GetTarget() const noexcept { return _target; }
|
||||
|
||||
Script* GetAttackScript() const { return _attackScript; }
|
||||
Script* GetAttackScript() const noexcept { return _attackScript; }
|
||||
|
||||
protected:
|
||||
void GetActiveScripts(Arbutils::Collections::List<ScriptWrapper>& scripts) override {
|
||||
|
||||
@@ -12,12 +12,12 @@ namespace CreatureLib::Battling {
|
||||
Creature* _user;
|
||||
|
||||
protected:
|
||||
BaseTurnChoice(Creature* user) : _user(user){};
|
||||
BaseTurnChoice(Creature* user) noexcept : _user(user){};
|
||||
|
||||
public:
|
||||
virtual ~BaseTurnChoice() = default;
|
||||
[[nodiscard]] virtual TurnChoiceKind GetKind() const = 0;
|
||||
[[nodiscard]] inline Creature* GetUser() const { return _user; }
|
||||
[[nodiscard]] virtual TurnChoiceKind GetKind() const noexcept = 0;
|
||||
[[nodiscard]] inline Creature* GetUser() const noexcept { return _user; }
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@ namespace CreatureLib::Battling {
|
||||
public:
|
||||
FleeTurnChoice(Creature* user) : BaseTurnChoice(user) {}
|
||||
|
||||
TurnChoiceKind GetKind() const override { return TurnChoiceKind ::Flee; }
|
||||
TurnChoiceKind GetKind() const noexcept override { return TurnChoiceKind ::Flee; }
|
||||
|
||||
protected:
|
||||
void GetActiveScripts(Arbutils::Collections::List<ScriptWrapper>& scripts) override {
|
||||
|
||||
@@ -8,7 +8,7 @@ namespace CreatureLib::Battling {
|
||||
public:
|
||||
PassTurnChoice(Creature* c) : BaseTurnChoice(c) {}
|
||||
|
||||
TurnChoiceKind GetKind() const override { return TurnChoiceKind ::Pass; }
|
||||
TurnChoiceKind GetKind() const noexcept override { return TurnChoiceKind ::Pass; }
|
||||
|
||||
protected:
|
||||
void GetActiveScripts(Arbutils::Collections::List<ScriptWrapper>& scripts) override {
|
||||
|
||||
@@ -7,13 +7,12 @@ namespace CreatureLib::Battling {
|
||||
Creature* _newCreature;
|
||||
|
||||
public:
|
||||
SwitchTurnChoice(Creature* user, Creature* newCreature) : BaseTurnChoice(user), _newCreature(newCreature) {
|
||||
AssertNotNull(_newCreature)
|
||||
}
|
||||
SwitchTurnChoice(Creature* user, Creature* newCreature) noexcept
|
||||
: BaseTurnChoice(user), _newCreature(newCreature) {}
|
||||
|
||||
TurnChoiceKind GetKind() const final { return TurnChoiceKind::Switch; }
|
||||
TurnChoiceKind GetKind() const noexcept final { return TurnChoiceKind::Switch; }
|
||||
|
||||
inline Creature* GetNewCreature() const { return _newCreature; }
|
||||
inline Creature* GetNewCreature() const noexcept { return _newCreature; }
|
||||
|
||||
protected:
|
||||
void GetActiveScripts(Arbutils::Collections::List<ScriptWrapper>& scripts) override {
|
||||
|
||||
@@ -9,9 +9,9 @@ CreatureLib::Library::AttackData::AttackData(const ConstString& name, uint8_t ty
|
||||
: _name(std::move(name)), _type(type), _category(category), _basePower(power), _accuracy(accuracy),
|
||||
_baseUsages(baseUsage), _target(target), _priority(priority), _flags(std::move(flags)) {}
|
||||
|
||||
bool CreatureLib::Library::AttackData::HasFlag(const ConstString& key) const {
|
||||
bool CreatureLib::Library::AttackData::HasFlag(const ConstString& key) const noexcept {
|
||||
return this->_flags.find(key) != this->_flags.end();
|
||||
}
|
||||
bool CreatureLib::Library::AttackData::HasFlag(uint32_t key) const {
|
||||
bool CreatureLib::Library::AttackData::HasFlag(uint32_t key) const noexcept {
|
||||
return this->_flags.find(key) != this->_flags.end();
|
||||
}
|
||||
|
||||
@@ -27,17 +27,17 @@ namespace CreatureLib::Library {
|
||||
uint8_t baseUsage, AttackTarget target, int8_t priority, std::unordered_set<uint32_t> flags);
|
||||
virtual ~AttackData() = default;
|
||||
|
||||
inline const ConstString& GetName() const { return _name; }
|
||||
inline const uint8_t GetType() const { return _type; }
|
||||
inline AttackCategory GetCategory() const { return _category; }
|
||||
inline uint8_t GetBasePower() const { return _basePower; }
|
||||
inline uint8_t GetAccuracy() const { return _accuracy; }
|
||||
inline uint8_t GetBaseUsages() const { return _baseUsages; }
|
||||
inline AttackTarget GetTarget() const { return _target; }
|
||||
inline int8_t GetPriority() const { return _priority; }
|
||||
inline const ConstString& GetName() const noexcept { return _name; }
|
||||
inline const uint8_t GetType() const noexcept { return _type; }
|
||||
inline AttackCategory GetCategory() const noexcept { return _category; }
|
||||
inline uint8_t GetBasePower() const noexcept { return _basePower; }
|
||||
inline uint8_t GetAccuracy() const noexcept { return _accuracy; }
|
||||
inline uint8_t GetBaseUsages() const noexcept { return _baseUsages; }
|
||||
inline AttackTarget GetTarget() const noexcept { return _target; }
|
||||
inline int8_t GetPriority() const noexcept { return _priority; }
|
||||
|
||||
bool HasFlag(const ConstString& key) const;
|
||||
bool HasFlag(uint32_t keyHash) const;
|
||||
bool HasFlag(const ConstString& key) const noexcept;
|
||||
bool HasFlag(uint32_t keyHash) const noexcept;
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -15,24 +15,26 @@ CreatureLib::Library::DataLibrary::DataLibrary(LibrarySettings* settings, Creatu
|
||||
AssertNotNull(_typeLibrary)
|
||||
}
|
||||
|
||||
const CreatureLib::Library::LibrarySettings* CreatureLib::Library::DataLibrary::GetSettings() const {
|
||||
const CreatureLib::Library::LibrarySettings* CreatureLib::Library::DataLibrary::GetSettings() const noexcept {
|
||||
return _settings;
|
||||
}
|
||||
|
||||
const CreatureLib::Library::SpeciesLibrary* CreatureLib::Library::DataLibrary::GetSpeciesLibrary() const {
|
||||
const CreatureLib::Library::SpeciesLibrary* CreatureLib::Library::DataLibrary::GetSpeciesLibrary() const noexcept {
|
||||
return _species;
|
||||
}
|
||||
|
||||
const CreatureLib::Library::AttackLibrary* CreatureLib::Library::DataLibrary::GetAttackLibrary() const {
|
||||
const CreatureLib::Library::AttackLibrary* CreatureLib::Library::DataLibrary::GetAttackLibrary() const noexcept {
|
||||
return _attacks;
|
||||
}
|
||||
|
||||
const CreatureLib::Library::ItemLibrary* CreatureLib::Library::DataLibrary::GetItemLibrary() const { return _items; }
|
||||
const CreatureLib::Library::ItemLibrary* CreatureLib::Library::DataLibrary::GetItemLibrary() const noexcept {
|
||||
return _items;
|
||||
}
|
||||
|
||||
const CreatureLib::Library::GrowthRateLibrary* CreatureLib::Library::DataLibrary::GetGrowthRates() const {
|
||||
const CreatureLib::Library::GrowthRateLibrary* CreatureLib::Library::DataLibrary::GetGrowthRates() const noexcept {
|
||||
return _growthRates;
|
||||
}
|
||||
|
||||
const CreatureLib::Library::TypeLibrary* CreatureLib::Library::DataLibrary::GetTypeLibrary() const {
|
||||
const CreatureLib::Library::TypeLibrary* CreatureLib::Library::DataLibrary::GetTypeLibrary() const noexcept {
|
||||
return _typeLibrary;
|
||||
}
|
||||
|
||||
@@ -34,12 +34,12 @@ namespace CreatureLib::Library {
|
||||
delete _typeLibrary;
|
||||
}
|
||||
|
||||
[[nodiscard]] const LibrarySettings* GetSettings() const;
|
||||
[[nodiscard]] const SpeciesLibrary* GetSpeciesLibrary() const;
|
||||
[[nodiscard]] const AttackLibrary* GetAttackLibrary() const;
|
||||
[[nodiscard]] const ItemLibrary* GetItemLibrary() const;
|
||||
[[nodiscard]] const GrowthRateLibrary* GetGrowthRates() const;
|
||||
[[nodiscard]] const TypeLibrary* GetTypeLibrary() const;
|
||||
[[nodiscard]] const LibrarySettings* GetSettings() const noexcept;
|
||||
[[nodiscard]] const SpeciesLibrary* GetSpeciesLibrary() const noexcept;
|
||||
[[nodiscard]] const AttackLibrary* GetAttackLibrary() const noexcept;
|
||||
[[nodiscard]] const ItemLibrary* GetItemLibrary() const noexcept;
|
||||
[[nodiscard]] const GrowthRateLibrary* GetGrowthRates() const noexcept;
|
||||
[[nodiscard]] const TypeLibrary* GetTypeLibrary() const noexcept;
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
#include "Item.hpp"
|
||||
|
||||
bool CreatureLib::Library::Item::HasFlag(const Arbutils::CaseInsensitiveConstString& flag) const {
|
||||
bool CreatureLib::Library::Item::HasFlag(const Arbutils::CaseInsensitiveConstString& flag) const noexcept {
|
||||
return this->_flags.find(flag) != this->_flags.end();
|
||||
}
|
||||
bool CreatureLib::Library::Item::HasFlag(uint32_t flag) const noexcept {
|
||||
return this->_flags.find(flag) != this->_flags.end();
|
||||
}
|
||||
bool CreatureLib::Library::Item::HasFlag(uint32_t flag) const { return this->_flags.find(flag) != this->_flags.end(); }
|
||||
|
||||
CreatureLib::Library::Item::Item(const Arbutils::CaseInsensitiveConstString& name,
|
||||
CreatureLib::Library::ItemCategory category,
|
||||
|
||||
@@ -20,13 +20,13 @@ namespace CreatureLib::Library {
|
||||
Item(const Arbutils::CaseInsensitiveConstString& name, ItemCategory category, BattleItemCategory battleCategory,
|
||||
int32_t price, std::unordered_set<uint32_t> flags);
|
||||
|
||||
inline const Arbutils::CaseInsensitiveConstString& GetName() const { return _name; }
|
||||
inline ItemCategory GetCategory() const { return _category; }
|
||||
inline BattleItemCategory GetBattleCategory() const { return _battleCategory; }
|
||||
inline const int32_t GetPrice() const { return _price; }
|
||||
inline const Arbutils::CaseInsensitiveConstString& GetName() const noexcept { return _name; }
|
||||
inline ItemCategory GetCategory() const noexcept { return _category; }
|
||||
inline BattleItemCategory GetBattleCategory() const noexcept { return _battleCategory; }
|
||||
inline const int32_t GetPrice() const noexcept { return _price; }
|
||||
|
||||
bool HasFlag(const Arbutils::CaseInsensitiveConstString& flag) const;
|
||||
bool HasFlag(uint32_t flag) const;
|
||||
bool HasFlag(const Arbutils::CaseInsensitiveConstString& flag) const noexcept;
|
||||
bool HasFlag(uint32_t flag) const noexcept;
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user