2019-10-17 12:33:25 +00:00
|
|
|
#ifndef CREATURELIB_BATTLE_HPP
|
|
|
|
#define CREATURELIB_BATTLE_HPP
|
|
|
|
|
|
|
|
#include <vector>
|
2019-12-15 11:24:08 +00:00
|
|
|
#include "../EventHooks/EventHook.hpp"
|
2019-11-28 11:55:22 +00:00
|
|
|
#include "../Flow/ChoiceQueue.hpp"
|
2019-10-17 12:33:25 +00:00
|
|
|
#include "../Library/BattleLibrary.hpp"
|
2019-10-29 10:19:25 +00:00
|
|
|
#include "../TurnChoices/BaseTurnChoice.hpp"
|
2019-12-05 11:56:41 +00:00
|
|
|
#include "BattleParty.hpp"
|
2019-12-15 10:52:10 +00:00
|
|
|
#include "BattleResult.hpp"
|
2019-11-28 11:55:22 +00:00
|
|
|
#include "BattleSide.hpp"
|
2019-12-05 08:53:48 +00:00
|
|
|
#include "CreatureIndex.hpp"
|
2019-10-17 12:33:25 +00:00
|
|
|
|
|
|
|
namespace CreatureLib::Battling {
|
2019-11-28 11:55:22 +00:00
|
|
|
class Battle : public ScriptSource {
|
2019-10-17 12:33:25 +00:00
|
|
|
const BattleLibrary* _library;
|
2019-12-05 11:56:41 +00:00
|
|
|
std::vector<BattleParty> _parties;
|
2019-12-15 10:52:10 +00:00
|
|
|
bool _canFlee;
|
2019-10-31 11:02:23 +00:00
|
|
|
uint8_t _numberOfSides;
|
|
|
|
uint8_t _creaturesPerSide;
|
2019-10-17 12:33:25 +00:00
|
|
|
std::vector<BattleSide*> _sides;
|
2019-10-31 11:31:31 +00:00
|
|
|
Core::Random _random;
|
2019-10-31 11:02:23 +00:00
|
|
|
ChoiceQueue* _currentTurnQueue = nullptr;
|
2019-12-07 20:56:29 +00:00
|
|
|
bool _hasEnded = false;
|
2019-12-15 10:52:10 +00:00
|
|
|
BattleResult _battleResult = BattleResult::Empty();
|
2019-12-15 11:27:56 +00:00
|
|
|
EventHook _eventHook = EventHook();
|
2019-11-06 17:04:00 +00:00
|
|
|
|
2019-11-10 13:32:05 +00:00
|
|
|
ScriptSet _volatile;
|
2019-11-28 11:55:22 +00:00
|
|
|
|
2019-10-17 12:33:25 +00:00
|
|
|
public:
|
2019-12-15 10:52:10 +00:00
|
|
|
Battle(const BattleLibrary* library, std::vector<BattleParty> parties, bool canFlee = true,
|
|
|
|
uint8_t numberOfSides = 2, uint8_t creaturesPerSide = 1)
|
|
|
|
: _library(library), _parties(parties), _canFlee(canFlee), _numberOfSides(numberOfSides),
|
|
|
|
_creaturesPerSide(creaturesPerSide) {
|
2019-12-05 11:56:41 +00:00
|
|
|
_sides = std::vector<BattleSide*>(numberOfSides);
|
|
|
|
for (size_t i = 0; i < numberOfSides; i++) {
|
2019-12-07 11:13:12 +00:00
|
|
|
_sides[i] = new BattleSide(i, this, creaturesPerSide);
|
2019-12-05 11:56:41 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
~Battle() {
|
|
|
|
for (auto s : _sides) {
|
|
|
|
delete s;
|
|
|
|
}
|
2020-02-05 13:52:50 +00:00
|
|
|
delete _currentTurnQueue;
|
2019-12-05 11:56:41 +00:00
|
|
|
}
|
|
|
|
|
2019-11-06 17:04:00 +00:00
|
|
|
[[nodiscard]] const BattleLibrary* GetLibrary() const;
|
2019-10-29 10:19:25 +00:00
|
|
|
|
2019-11-02 12:57:43 +00:00
|
|
|
virtual bool CanUse(const BaseTurnChoice* choice);
|
2019-10-29 10:19:25 +00:00
|
|
|
virtual bool TrySetChoice(BaseTurnChoice* choice);
|
2019-10-31 11:02:23 +00:00
|
|
|
|
2019-12-15 10:52:10 +00:00
|
|
|
bool CanFlee() const { return _canFlee; }
|
|
|
|
|
2019-10-31 11:02:23 +00:00
|
|
|
void CheckChoicesSetAndRun();
|
|
|
|
|
2019-11-06 17:04:00 +00:00
|
|
|
[[nodiscard]] ChoiceQueue* GetCurrentTurnQueue() const;
|
2019-10-31 11:31:31 +00:00
|
|
|
Core::Random& GetRandom();
|
2019-11-02 12:57:43 +00:00
|
|
|
|
|
|
|
bool CreatureInField(const Creature* creature) const;
|
|
|
|
|
2019-12-05 08:53:48 +00:00
|
|
|
Creature* GetTarget(const CreatureIndex& target) {
|
2019-11-02 12:57:43 +00:00
|
|
|
return _sides[target.GetSideIndex()]->GetCreature(target.GetCreatureIndex());
|
|
|
|
}
|
2019-11-06 17:04:00 +00:00
|
|
|
|
|
|
|
void ForceRecall(uint8_t side, uint8_t index);
|
2019-12-05 11:56:41 +00:00
|
|
|
void SwitchCreature(uint8_t side, uint8_t index, Creature* c);
|
2019-12-07 11:13:12 +00:00
|
|
|
bool CanSlotBeFilled(uint8_t side, uint8_t index) const;
|
2019-11-10 13:32:05 +00:00
|
|
|
|
2019-11-28 11:55:22 +00:00
|
|
|
void GetActiveScripts(std::vector<ScriptWrapper>& scripts) override;
|
2019-12-07 20:56:29 +00:00
|
|
|
|
|
|
|
void ValidateBattleState();
|
|
|
|
inline bool HasEnded() const { return _hasEnded; }
|
2019-12-15 10:52:10 +00:00
|
|
|
inline const BattleResult& GetResult() const { return _battleResult; }
|
2019-12-14 11:40:50 +00:00
|
|
|
|
|
|
|
const std::vector<BattleSide*>& GetSides() const { return _sides; }
|
2019-12-15 11:24:08 +00:00
|
|
|
|
2019-12-15 11:27:56 +00:00
|
|
|
void RegisterEventListener(EVENT_HOOK_FUNC(listener)) { this->_eventHook.RegisterListener(listener); }
|
|
|
|
void TriggerEventListener(EventData* data) { this->_eventHook.TriggerEvent(data); }
|
2019-10-17 12:33:25 +00:00
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2019-11-28 11:55:22 +00:00
|
|
|
#endif // CREATURELIB_BATTLE_HPP
|