Furter rework on script hooks, simplifying required logic.

This commit is contained in:
2019-11-10 14:32:05 +01:00
parent f72fd5f905
commit 3488784409
18 changed files with 79 additions and 37 deletions

View File

@@ -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){};

View File

@@ -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();

View File

@@ -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; \

View File

@@ -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;
}
};

View File

@@ -8,7 +8,7 @@
namespace CreatureLib::Battling{
class ScriptSource {
public:
virtual void GetActiveScripts(ScriptAggregator& aggr) = 0;
virtual void GetActiveScripts(ScriptAggregator& aggr) const = 0;
};
}