Added Helper function to ChoiceQueue to move a specific creature's choice up next.
This commit is contained in:
parent
d4fd7282f5
commit
442d6cd5b1
|
@ -1 +1,28 @@
|
||||||
#include "ChoiceQueue.hpp"
|
#include "ChoiceQueue.hpp"
|
||||||
|
|
||||||
|
bool CreatureLib::Battling::ChoiceQueue::MoveCreatureChoiceNext(CreatureLib::Battling::Creature* creature) {
|
||||||
|
// Find which index the creature choice is at.
|
||||||
|
size_t choiceIndex = -1;
|
||||||
|
for (size_t index = _current; index < _queue.size(); index++) {
|
||||||
|
if (_queue.at(index)->GetUser() == creature) {
|
||||||
|
// If the creature choice is already next up, return.
|
||||||
|
if (index == _current)
|
||||||
|
return false;
|
||||||
|
choiceIndex = index;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// If the creature has no choice anymore, return.
|
||||||
|
if (choiceIndex == -1)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Save the pointer to the creature choice.
|
||||||
|
auto creatureChoice = _queue[choiceIndex];
|
||||||
|
// Starting at the position before the current creature choice, and iterating backwards up till the current choice.
|
||||||
|
for (size_t i = choiceIndex - 1; i >= _current && i != SIZE_MAX; i--) {
|
||||||
|
// Place everything in one spot later.
|
||||||
|
_queue[i + 1] = _queue[i];
|
||||||
|
}
|
||||||
|
// Set the creature choice up next.
|
||||||
|
_queue[_current] = creatureChoice;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
|
@ -21,9 +21,13 @@ namespace CreatureLib::Battling {
|
||||||
return b;
|
return b;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BaseTurnChoice* Peek() { return _queue[_current]; }
|
||||||
|
|
||||||
[[nodiscard]] bool HasNext() const { return _current < _queue.size(); }
|
[[nodiscard]] bool HasNext() const { return _current < _queue.size(); }
|
||||||
|
|
||||||
std::vector<BaseTurnChoice*>& GetInnerQueue() { return _queue; }
|
std::vector<BaseTurnChoice*>& GetInnerQueue() { return _queue; }
|
||||||
|
|
||||||
|
bool MoveCreatureChoiceNext(Creature* creature);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,48 @@
|
||||||
|
#ifdef TESTS_BUILD
|
||||||
|
|
||||||
|
#include "../../extern/catch.hpp"
|
||||||
|
#include "../../src/Battling/Flow/ChoiceQueue.hpp"
|
||||||
|
#include "../../src/Battling/Models/BattleSide.hpp"
|
||||||
|
#include "../../src/Battling/Models/CreateCreature.hpp"
|
||||||
|
#include "../../src/Battling/TurnChoices/PassTurnChoice.hpp"
|
||||||
|
#include "../TestLibrary/TestLibrary.hpp"
|
||||||
|
|
||||||
|
using namespace CreatureLib::Battling;
|
||||||
|
|
||||||
|
TEST_CASE("Move creature choice up next.", "[Battling]") {
|
||||||
|
auto lib = TestLibrary::Get();
|
||||||
|
auto c1 = CreateCreature(lib, "testSpecies1", 1).Create();
|
||||||
|
auto c2 = CreateCreature(lib, "testSpecies1", 1).Create();
|
||||||
|
auto c3 = CreateCreature(lib, "testSpecies1", 1).Create();
|
||||||
|
auto c4 = CreateCreature(lib, "testSpecies1", 1).Create();
|
||||||
|
|
||||||
|
std::vector<BaseTurnChoice*> choices = {
|
||||||
|
new PassTurnChoice(c1),
|
||||||
|
new PassTurnChoice(c2),
|
||||||
|
new PassTurnChoice(c3),
|
||||||
|
new PassTurnChoice(c4),
|
||||||
|
};
|
||||||
|
|
||||||
|
auto choiceQueue = ChoiceQueue(choices);
|
||||||
|
CHECK(choiceQueue.MoveCreatureChoiceNext(c4));
|
||||||
|
auto currentChoices = choiceQueue.GetInnerQueue();
|
||||||
|
CHECK(currentChoices[0]->GetUser() == c4);
|
||||||
|
CHECK(currentChoices[1]->GetUser() == c1);
|
||||||
|
CHECK(currentChoices[2]->GetUser() == c2);
|
||||||
|
CHECK(currentChoices[3]->GetUser() == c3);
|
||||||
|
|
||||||
|
CHECK_FALSE(choiceQueue.MoveCreatureChoiceNext(c4));
|
||||||
|
delete choiceQueue.Dequeue();
|
||||||
|
delete choiceQueue.Dequeue();
|
||||||
|
CHECK_FALSE(choiceQueue.MoveCreatureChoiceNext(c1));
|
||||||
|
|
||||||
|
delete choiceQueue.Dequeue();
|
||||||
|
delete choiceQueue.Dequeue();
|
||||||
|
|
||||||
|
delete c1;
|
||||||
|
delete c2;
|
||||||
|
delete c3;
|
||||||
|
delete c4;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in New Issue