From 4fd5a0988bef5c6c5d4ca96967d7d3a176f4c410 Mon Sep 17 00:00:00 2001 From: Renaud G Date: Fri, 12 Oct 2018 00:25:06 +0200 Subject: Add ExecutionNode for keep parameters. --- node/keepdiceexecnode.cpp | 58 +++++++++++++++++++++++++++++++---------------- node/keepdiceexecnode.h | 4 +++- 2 files changed, 41 insertions(+), 21 deletions(-) diff --git a/node/keepdiceexecnode.cpp b/node/keepdiceexecnode.cpp index 9f33f74..3966c3f 100644 --- a/node/keepdiceexecnode.cpp +++ b/node/keepdiceexecnode.cpp @@ -21,6 +21,7 @@ #include #include "keepdiceexecnode.h" +#include "parsingtoolbox.h" KeepDiceExecNode::KeepDiceExecNode() : m_diceResult(new DiceResult()) { @@ -30,22 +31,34 @@ KeepDiceExecNode::~KeepDiceExecNode() {} void KeepDiceExecNode::run(ExecutionNode* previous) { m_previousNode= previous; - if(nullptr == previous) + if(nullptr == previous || nullptr == m_numberOfDiceNode) { return; } - DiceResult* previousDiceResult= dynamic_cast(previous->getResult()); + m_numberOfDiceNode->run(previous); + auto lastnode = ParsingToolBox::getLatestNode(m_numberOfDiceNode); + if(nullptr == lastnode) + return; + auto result = lastnode->getResult(); + if(nullptr == result) + return; + if(!result->hasResultOfType(Result::SCALAR)) + return; + + auto numberOfDice = result->getResult(Result::SCALAR).toInt(); + + DiceResult* previousDiceResult = dynamic_cast(previous->getResult()); m_result->setPrevious(previousDiceResult); if(nullptr != previousDiceResult) { QList diceList= previousDiceResult->getResultList(); - if(m_numberOfDice < 0) + if(numberOfDice < 0) { - m_numberOfDice= diceList.size() + m_numberOfDice; + numberOfDice= diceList.size() + numberOfDice; } - QList diceList3= diceList.mid(0, static_cast(m_numberOfDice)); + QList diceList3= diceList.mid(0, static_cast(numberOfDice)); QList diceList2; for(Die* die : diceList3) @@ -56,15 +69,15 @@ void KeepDiceExecNode::run(ExecutionNode* previous) die->displayed(); } - if(m_numberOfDice > static_cast(diceList.size())) + if(numberOfDice > static_cast(diceList.size())) { m_errors.insert(Dice::ERROR_CODE::TOO_MANY_DICE, QObject::tr(" You ask to keep %1 dice but the result only has %2") - .arg(m_numberOfDice) + .arg(numberOfDice) .arg(diceList.size())); } - for(auto& tmp : diceList.mid(static_cast(m_numberOfDice), -1)) + for(auto& tmp : diceList.mid(static_cast(numberOfDice), -1)) { tmp->setHighlighted(false); } @@ -76,20 +89,22 @@ void KeepDiceExecNode::run(ExecutionNode* previous) } } } -void KeepDiceExecNode::setDiceKeepNumber(qint64 n) + +void KeepDiceExecNode::setDiceKeepNumber(ExecutionNode* n) { - m_numberOfDice= n; + m_numberOfDiceNode = n; } QString KeepDiceExecNode::toString(bool wl) const { - if(wl) - { - return QString("%1 [label=\"KeepDiceExecNode %2\"]").arg(m_id).arg(m_numberOfDice); - } - else - { - return m_id; - } + if(wl) + { + auto param = m_numberOfDiceNode->toString(wl); + return QString("%1 [label=\"KeepDiceExecNode %2\"]").arg(m_id).arg(param); + } + else + { + return m_id; + } } qint64 KeepDiceExecNode::getPriority() const { @@ -103,8 +118,11 @@ qint64 KeepDiceExecNode::getPriority() const ExecutionNode* KeepDiceExecNode::getCopy() const { - KeepDiceExecNode* node= new KeepDiceExecNode(); - node->setDiceKeepNumber(m_numberOfDice); + KeepDiceExecNode* node = new KeepDiceExecNode(); + if(nullptr != m_numberOfDiceNode) + { + node->setDiceKeepNumber(m_numberOfDiceNode->getCopy()); + } if(nullptr != m_nextNode) { node->setNextNode(m_nextNode->getCopy()); diff --git a/node/keepdiceexecnode.h b/node/keepdiceexecnode.h index 49680f2..c4aa5c5 100644 --- a/node/keepdiceexecnode.h +++ b/node/keepdiceexecnode.h @@ -34,13 +34,15 @@ public: virtual ~KeepDiceExecNode(); virtual void run(ExecutionNode* previous); - virtual void setDiceKeepNumber(qint64); + //virtual void setDiceKeepNumber(qint64); + virtual void setDiceKeepNumber(ExecutionNode* valueNode ); virtual QString toString(bool) const; virtual qint64 getPriority() const; virtual ExecutionNode* getCopy() const; private: qint64 m_numberOfDice= 0; + ExecutionNode* m_numberOfDiceNode; DiceResult* m_diceResult; }; -- cgit v1.2.3-70-g09d2