#ifndef CREATURELIB_CREATUREPARTY_HPP #define CREATURELIB_CREATUREPARTY_HPP #include "Creature.hpp" namespace CreatureLib::Battling { class CreatureParty { ArbUt::OptionalUniquePtrList _party; public: CreatureParty(size_t size) noexcept : _party(size) { for (size_t i = 0; i < size; i++) { _party.Append(nullptr); } } CreatureParty(ArbUt::List party) noexcept : _party(party.GetStdList()) {} CreatureParty(std::initializer_list party) noexcept : _party(party) {} virtual ~CreatureParty() = default; ArbUt::OptionalBorrowedPtr 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& GetParty() noexcept { return _party; } const ArbUt::OptionalUniquePtrList& 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