Support turn queue return prematurely when a creature is recalled, and the ability to resume it later.

This commit is contained in:
2019-11-06 18:04:00 +01:00
parent f184572837
commit 5fc2bf564a
5 changed files with 52 additions and 21 deletions

View File

@@ -38,7 +38,7 @@ void Battle::CheckChoicesSetAndRun() {
for (auto side: _sides){
for (auto choice: side->GetChoices()){
if (choice->GetKind() == TurnChoiceKind::Attack){
auto attack = static_cast<const AttackTurnChoice*>(choice)->GetAttack();
auto attack = dynamic_cast<const AttackTurnChoice*>(choice)->GetAttack();
uint8_t uses = 1;
//HOOK: change number of uses needed.
if (attack->GetRemainingUses() < uses){
@@ -52,10 +52,11 @@ void Battle::CheckChoicesSetAndRun() {
}
}
TurnOrdering::OrderChoices(choices, _random);
auto choiceQueue = ChoiceQueue(choices);
this->_currentTurnQueue = &choiceQueue;
TurnHandler::RunTurn(choiceQueue);
this->_currentTurnQueue = nullptr;
auto choiceQueue = new ChoiceQueue(choices);
this->_currentTurnQueue = choiceQueue;
TurnHandler::RunTurn(this, choiceQueue);
if (choiceQueue->HasCompletedQueue)
_currentTurnQueue = nullptr;
}
ChoiceQueue* Battle::GetCurrentTurnQueue() const {
@@ -73,3 +74,20 @@ bool Battle::CreatureInField(const Creature *creature) const {
}
return false;
}
bool Battle::HasRecalledSlots() const {
return _numberOfRecalledSlots > 0;
}
void Battle::ForceRecall(uint8_t side, uint8_t index) {
_numberOfRecalledSlots++;
//TODO: Switch out.
}
void Battle::FillRecall(uint8_t side, uint8_t, Creature *c) {
_numberOfRecalledSlots--;
//TODO: switch in.
if (_numberOfRecalledSlots == 0 && _currentTurnQueue != nullptr){
TurnHandler::RunTurn(this, _currentTurnQueue);
}
}

View File

@@ -15,17 +15,18 @@ namespace CreatureLib::Battling {
uint8_t _creaturesPerSide;
std::vector<BattleSide*> _sides;
Core::Random _random;
ChoiceQueue* _currentTurnQueue = nullptr;
uint8_t _numberOfRecalledSlots = 0;
public:
const BattleLibrary* GetLibrary() const;
[[nodiscard]] const BattleLibrary* GetLibrary() const;
virtual bool CanUse(const BaseTurnChoice* choice);
virtual bool TrySetChoice(BaseTurnChoice* choice);
void CheckChoicesSetAndRun();
ChoiceQueue* GetCurrentTurnQueue() const;
[[nodiscard]] ChoiceQueue* GetCurrentTurnQueue() const;
Core::Random& GetRandom();
bool CreatureInField(const Creature* creature) const;
@@ -33,6 +34,12 @@ namespace CreatureLib::Battling {
Creature* GetTarget(const Target& target){
return _sides[target.GetSideIndex()]->GetCreature(target.GetCreatureIndex());
}
[[nodiscard]] bool HasRecalledSlots() const;
void ForceRecall(uint8_t side, uint8_t index);
void FillRecall(uint8_t side, uint8_t, Creature* c);
};
}