aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/src/libparser/node/rerolldicenode.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/libparser/node/rerolldicenode.cpp')
-rw-r--r--src/libparser/node/rerolldicenode.cpp148
1 files changed, 148 insertions, 0 deletions
diff --git a/src/libparser/node/rerolldicenode.cpp b/src/libparser/node/rerolldicenode.cpp
new file mode 100644
index 0000000..fd8c258
--- /dev/null
+++ b/src/libparser/node/rerolldicenode.cpp
@@ -0,0 +1,148 @@
+#include <diceparser/parsingtoolbox.h>
+
+#include "rerolldicenode.h"
+#include "validatorlist.h"
+#include <utility>
+
+RerollDiceNode::RerollDiceNode(bool reroll, bool addingMode)
+ : m_diceResult(new DiceResult()), m_validatorList(nullptr), m_reroll(reroll), m_adding(addingMode)
+{
+ m_result= m_diceResult;
+}
+RerollDiceNode::~RerollDiceNode()
+{
+ if(nullptr != m_validatorList)
+ {
+ delete m_validatorList;
+ m_validatorList= nullptr;
+ }
+}
+void RerollDiceNode::run(ExecutionNode* previous)
+{
+ m_previousNode= previous;
+ if((nullptr != previous) && (nullptr != previous->getResult()))
+ {
+ DiceResult* previous_result= dynamic_cast<DiceResult*>(previous->getResult());
+ m_result->setPrevious(previous_result);
+ if(nullptr != previous_result)
+ {
+ for(auto& die : previous_result->getResultList())
+ {
+ Die* tmpdie= new Die(*die);
+ m_diceResult->insertResult(tmpdie);
+ die->displayed();
+ }
+ // m_diceResult->setResultList(list);
+
+ QList<Die*>& list= m_diceResult->getResultList();
+ QList<Die*> toRemove;
+
+ for(auto& die : list)
+ {
+ bool finished= false;
+ auto state= m_validatorList->isValidRangeSize(
+ std::make_pair<qint64, qint64>(die->getBase(), die->getMaxValue()));
+ if((Dice::CONDITION_STATE::ALWAYSTRUE == state && m_adding)
+ || (!m_reroll && !m_adding && state == Dice::CONDITION_STATE::UNREACHABLE))
+ {
+ m_errors.insert(Dice::ERROR_CODE::ENDLESS_LOOP_ERROR,
+ QObject::tr("Condition (%1) cause an endless loop with this dice: %2")
+ .arg(toString(true))
+ .arg(QStringLiteral("d[%1,%2]")
+ .arg(static_cast<int>(die->getBase()))
+ .arg(static_cast<int>(die->getMaxValue()))));
+ continue;
+ }
+ while(m_validatorList->hasValid(die, false) && !finished)
+ {
+ if(m_instruction != nullptr)
+ {
+ m_instruction->run(this);
+ auto lastNode= ParsingToolBox::getLeafNode(m_instruction);
+ if(lastNode != nullptr)
+ {
+ auto lastResult= dynamic_cast<DiceResult*>(lastNode->getResult());
+ if(lastResult != nullptr)
+ {
+ toRemove.append(die);
+ list.append(lastResult->getResultList());
+ lastResult->clear();
+ }
+ }
+ }
+ else
+ {
+ die->roll(m_adding);
+ }
+ if(m_reroll)
+ {
+ finished= true;
+ }
+ }
+ }
+
+ for(auto die : toRemove)
+ {
+ list.removeOne(die);
+ }
+
+ if(nullptr != m_nextNode)
+ {
+ m_nextNode->run(this);
+ }
+ }
+ else
+ {
+ m_errors.insert(
+ Dice::ERROR_CODE::DIE_RESULT_EXPECTED,
+ QObject::tr(
+ " The a operator expects dice result. Please check the documentation and fix your command."));
+ }
+ }
+}
+void RerollDiceNode::setValidatorList(ValidatorList* val)
+{
+ m_validatorList= val;
+}
+QString RerollDiceNode::toString(bool wl) const
+{
+ if(wl)
+ {
+ return QString("%1 [label=\"RerollDiceNode validatior: %2\"]").arg(m_id, m_validatorList->toString());
+ }
+ else
+ {
+ return m_id;
+ }
+ // return QString("RerollDiceNode [label=\"RerollDiceNode validatior:%1\"");
+}
+qint64 RerollDiceNode::getPriority() const
+{
+ qint64 priority= 0;
+ if(nullptr != m_nextNode)
+ {
+ priority= m_nextNode->getPriority();
+ }
+
+ return priority;
+}
+ExecutionNode* RerollDiceNode::getCopy() const
+{
+ RerollDiceNode* node= new RerollDiceNode(m_reroll, m_adding);
+ node->setValidatorList(m_validatorList);
+ if(nullptr != m_nextNode)
+ {
+ node->setNextNode(m_nextNode->getCopy());
+ }
+ return node;
+}
+
+ExecutionNode* RerollDiceNode::getInstruction() const
+{
+ return m_instruction;
+}
+
+void RerollDiceNode::setInstruction(ExecutionNode* instruction)
+{
+ m_instruction= instruction;
+}