CreatureLib/src/Battling/Models/CreatureParty.hpp

82 lines
2.5 KiB
C++

#ifndef CREATURELIB_CREATUREPARTY_HPP
#define CREATURELIB_CREATUREPARTY_HPP
#include "Creature.hpp"
namespace CreatureLib::Battling {
class CreatureParty {
ArbUt::OptionalUniquePtrList<Creature> _party;
public:
CreatureParty(size_t size) noexcept : _party(size) {
for (size_t i = 0; i < size; i++) {
_party.Append(nullptr);
}
}
CreatureParty(ArbUt::List<Creature*> party) noexcept : _party(party.GetStdList()) {}
CreatureParty(std::initializer_list<Creature*> party) noexcept : _party(party) {}
virtual ~CreatureParty() = default;
ArbUt::OptionalBorrowedPtr<Creature> GetAtIndex(size_t index) const noexcept { return _party[index]; }
void Switch(size_t a, size_t b) noexcept { _party.Swap(a, b); }
Creature* SwapInto(size_t index, Creature* creature) {
if (index >= _party.Count()) {
THROW("Index was out of bounds for party.")
}
auto p = _party.TakeOwnership(index);
_party.Set(index, creature);
return p;
}
bool HasAvailableCreatures() const noexcept {
for (Creature* c : _party) {
if (c == nullptr)
continue;
if (c->IsFainted())
continue;
return true;
}
return false;
}
ArbUt::OptionalUniquePtrList<Creature>& GetParty() noexcept { return _party; }
const ArbUt::OptionalUniquePtrList<Creature>& GetParty() const noexcept { return _party; }
size_t GetLength() const noexcept { return _party.Count(); }
void PackParty() {
int32_t firstNil = -1;
for (size_t i = 0; i < _party.Count(); i++) {
if (_party[i] == nullptr) {
if (firstNil == -1) {
firstNil = i;
}
} else {
if (firstNil != -1) {
_party.Swap(firstNil, i);
i = firstNil;
firstNil = -1;
}
}
}
}
virtual CreatureParty* Clone() {
auto party = new CreatureParty(_party.Count());
auto i = 0;
for (auto c : _party) {
if (c != nullptr) {
party->SwapInto(i, c->Clone());
i++;
}
}
return party;
}
};
}
#endif // CREATURELIB_CREATUREPARTY_HPP