aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/node
diff options
context:
space:
mode:
authorRenaud G <renaud@rolisteam.org>2019-09-25 01:04:09 +0200
committerRenaud G <renaud@rolisteam.org>2019-09-25 01:04:09 +0200
commit69a238f0d1937fe5bc97b69e3cc4af0bf0ddde2b (patch)
tree62578c384c469a55e3589d18c3c693a639483d6a /node
parent5023d160ccea41df6f31e11d471cf8045a49fe67 (diff)
downloadOneRoll-69a238f0d1937fe5bc97b69e3cc4af0bf0ddde2b.tar.gz
OneRoll-69a238f0d1937fe5bc97b69e3cc4af0bf0ddde2b.zip
Second part for fixing #55
Diffstat (limited to 'node')
-rw-r--r--node/ifnode.cpp68
-rw-r--r--node/ifnode.h14
2 files changed, 80 insertions, 2 deletions
diff --git a/node/ifnode.cpp b/node/ifnode.cpp
index f0f28aa..1c28555 100644
--- a/node/ifnode.cpp
+++ b/node/ifnode.cpp
@@ -20,6 +20,66 @@
#include "ifnode.h"
#include "result/diceresult.h"
+PartialDiceRollNode::PartialDiceRollNode() : m_diceResult(new DiceResult)
+{
+ m_result= m_diceResult;
+}
+
+void PartialDiceRollNode::insertDie(Die* die)
+{
+ m_diceResult->insertResult(die);
+}
+
+void PartialDiceRollNode::run(ExecutionNode* previous)
+{
+ m_previousNode= previous;
+ Result* presult= previous->getResult();
+ if(nullptr != presult)
+ {
+ m_result->setPrevious(presult);
+ }
+ if(nullptr != m_nextNode)
+ {
+ m_nextNode->run(this);
+ }
+}
+ExecutionNode* PartialDiceRollNode::getCopy() const
+{
+ return new PartialDiceRollNode();
+}
+qint64 PartialDiceRollNode::getPriority() const
+{
+ qint64 priority= 4;
+ return priority;
+}
+
+QString PartialDiceRollNode::toString(bool withLabel) const
+{
+ if(withLabel)
+ {
+ return QString("%1 [label=\"PartialDiceRollNode \"]").arg(m_id);
+ }
+ else
+ {
+ return m_id;
+ }
+}
+
+DiceResult* getFirstDiceResult(Result* result)
+{
+ DiceResult* found= nullptr;
+
+ if(nullptr == result)
+ return found;
+ do
+ {
+ found= dynamic_cast<DiceResult*>(result);
+ result= result->getPrevious();
+ } while((nullptr == found) && (result != nullptr));
+
+ return found;
+}
+
IfNode::IfNode() : m_validator(nullptr), m_conditionType(AllOfThem), m_true(nullptr), m_false(nullptr)
{
// m_result = new DiceResult();
@@ -49,7 +109,7 @@ void IfNode::run(ExecutionNode* previous)
if(nullptr != m_validator)
{
- DiceResult* previousDiceResult= dynamic_cast<DiceResult*>(previousResult);
+ DiceResult* previousDiceResult= getFirstDiceResult(previousResult);
if(nullptr != previousDiceResult)
{
QList<Die*> diceList= previousDiceResult->getResultList();
@@ -58,6 +118,8 @@ void IfNode::run(ExecutionNode* previous)
{
for(Die* dice : diceList)
{
+ auto diceNode= new PartialDiceRollNode();
+ diceNode->insertDie(new Die(*dice));
if(m_validator->hasValid(dice, true, true))
{
nextNode= (nullptr == m_true) ? nullptr : m_true->getCopy();
@@ -77,7 +139,8 @@ void IfNode::run(ExecutionNode* previous)
{
m_nextNode= nextNode;
}
- nextNode->run(previousLoop);
+ diceNode->setNextNode(nextNode);
+ diceNode->run(previousLoop);
previousLoop= getLeafNode(nextNode);
}
}
@@ -133,6 +196,7 @@ void IfNode::run(ExecutionNode* previous)
}
}
}
+
if(m_conditionType == OnScalar)
{
Die dice;
diff --git a/node/ifnode.h b/node/ifnode.h
index b4dcd76..55a6051 100644
--- a/node/ifnode.h
+++ b/node/ifnode.h
@@ -24,6 +24,20 @@
#include "result/diceresult.h"
#include "validator.h"
#include <QDebug>
+class PartialDiceRollNode : public ExecutionNode
+{
+public:
+ PartialDiceRollNode();
+
+ void insertDie(Die* die);
+ virtual void run(ExecutionNode* previous= nullptr) override;
+ virtual qint64 getPriority() const override;
+ virtual ExecutionNode* getCopy() const override;
+ virtual QString toString(bool withLabel) const override;
+
+private:
+ DiceResult* m_diceResult;
+};
/**
* @brief The ifNode class explode dice while is valid by the validator.