66 lines
1.8 KiB
C++
66 lines
1.8 KiB
C++
#ifndef CREATURELIB_SCRIPTAGGREGATOR_HPP
|
|
#define CREATURELIB_SCRIPTAGGREGATOR_HPP
|
|
|
|
#include "BattleScript.hpp"
|
|
#include "ScriptSet.hpp"
|
|
#include "ScriptWrapper.hpp"
|
|
|
|
namespace CreatureLib::Battling {
|
|
class ScriptAggregator {
|
|
const ScriptWrapper* nullable _scripts;
|
|
i32 _size;
|
|
i32 _index = -1;
|
|
i32 _setIndex = -1;
|
|
|
|
inline bool IncrementToNextNotNull() {
|
|
if (_index != -1 && _scripts[_index].IsSet()) {
|
|
_setIndex++;
|
|
if (_setIndex >= (i32)_scripts[_index].GetScriptSet()->Count()) {
|
|
_setIndex = -1;
|
|
} else {
|
|
return true;
|
|
}
|
|
}
|
|
for (_index++; _index < _size; ++_index) {
|
|
if (_scripts[_index].HasValue()) {
|
|
if (_scripts[_index].IsSet()) {
|
|
_setIndex = 0;
|
|
}
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public:
|
|
ScriptAggregator(){};
|
|
|
|
explicit ScriptAggregator(const ArbUt::List<ScriptWrapper>& scripts)
|
|
: _scripts(scripts.RawData()), _size(scripts.Count()){};
|
|
|
|
inline void Reset() {
|
|
_index = -1;
|
|
_setIndex = -1;
|
|
}
|
|
|
|
bool GetNext(ArbUt::BorrowedPtr<BattleScript>& out) {
|
|
if (!IncrementToNextNotNull()) {
|
|
return false;
|
|
}
|
|
auto& current = _scripts[_index];
|
|
if (!current.IsSet()) {
|
|
auto s = current.GetScript();
|
|
out = *s;
|
|
return true;
|
|
} else {
|
|
auto& set = current.GetScriptSet()->GetIterator();
|
|
auto v = set[_setIndex];
|
|
out = v;
|
|
return true;
|
|
}
|
|
}
|
|
};
|
|
}
|
|
|
|
#endif // CREATURELIB_SCRIPTAGGREGATOR_HPP
|