Furter rework on script hooks, simplifying required logic.
This commit is contained in:
@@ -7,6 +7,7 @@
|
||||
#include <vector>
|
||||
|
||||
namespace CreatureLib::Battling{
|
||||
class BaseTurnChoice;
|
||||
class ExecutingAttack;
|
||||
class Creature;
|
||||
|
||||
@@ -23,6 +24,7 @@ namespace CreatureLib::Battling{
|
||||
return _name;
|
||||
}
|
||||
|
||||
virtual void OnBeforeTurn(const BaseTurnChoice* choice);
|
||||
virtual void FailIncomingAttack(ExecutingAttack* attack, Creature* target, bool& result){};
|
||||
virtual void IsInvulnerable(ExecutingAttack* attack, Creature* target , bool& result){};
|
||||
virtual void OnAttackMiss(ExecutingAttack* attack, Creature* target){};
|
||||
|
||||
@@ -5,13 +5,14 @@
|
||||
#include <queue>
|
||||
#include "Script.hpp"
|
||||
#include "ScriptSet.hpp"
|
||||
#include "../../Core/Exceptions/NotReachableException.hpp"
|
||||
|
||||
namespace CreatureLib::Battling{
|
||||
class ScriptAggregator{
|
||||
std::queue<std::any> _queue;
|
||||
bool _isSetSet = false;
|
||||
std::__detail::_Node_iterator<std::pair<const std::string, Script *>, false, true> _setIterator;
|
||||
std::__detail::_Node_iterator<std::pair<const std::string, Script *>, false, true> _setEnd;
|
||||
std::__detail::_Node_const_iterator<std::pair<const std::string, Script *>, false, true> _setIterator;
|
||||
std::__detail::_Node_const_iterator<std::pair<const std::string, Script *>, false, true> _setEnd;
|
||||
public:
|
||||
ScriptAggregator() = default;
|
||||
|
||||
@@ -19,7 +20,7 @@ namespace CreatureLib::Battling{
|
||||
_queue.push(script);
|
||||
}
|
||||
|
||||
void Add(ScriptSet* scriptSet){
|
||||
void Add(const ScriptSet* scriptSet){
|
||||
_queue.push(scriptSet);
|
||||
}
|
||||
|
||||
@@ -49,7 +50,7 @@ namespace CreatureLib::Battling{
|
||||
return std::any_cast<Script*>(next);
|
||||
}
|
||||
else{
|
||||
auto set = std::any_cast<ScriptSet*>(next);
|
||||
auto set = std::any_cast<const ScriptSet*>(next);
|
||||
if (set->Count() == 0)
|
||||
return GetNext();
|
||||
auto it = set->GetIterator();
|
||||
|
||||
@@ -1,9 +1,7 @@
|
||||
#define HOOK(hookName, sources, ... ) \
|
||||
#define HOOK(hookName, source, ... ) \
|
||||
{ \
|
||||
auto aggregator = CreatureLib::Battling::ScriptAggregator(); \
|
||||
for (auto& source: sources){ \
|
||||
source -> GetActiveScripts(aggregator); \
|
||||
} \
|
||||
source -> GetActiveScripts(aggregator); \
|
||||
while (aggregator.HasNext()){ \
|
||||
auto next = aggregator.GetNext(); \
|
||||
if (next == nullptr) continue; \
|
||||
|
||||
@@ -27,7 +27,7 @@ namespace CreatureLib::Battling{
|
||||
return _scripts.size();
|
||||
}
|
||||
|
||||
std::unordered_map<std::string, Script *> * GetIterator(){
|
||||
const std::unordered_map<std::string, Script *> * GetIterator() const{
|
||||
return &_scripts;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
namespace CreatureLib::Battling{
|
||||
class ScriptSource {
|
||||
public:
|
||||
virtual void GetActiveScripts(ScriptAggregator& aggr) = 0;
|
||||
virtual void GetActiveScripts(ScriptAggregator& aggr) const = 0;
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user