diff options
| author | 2019-07-10 11:49:45 +0200 | |
|---|---|---|
| committer | 2019-07-10 11:49:45 +0200 | |
| commit | 9317fc5571784bafdd6d5de88f2e86e55b646648 (patch) | |
| tree | daeab58cc93a807379196c2656ef997fa13b1249 | |
| parent | 46b82f84e5c3407d4ce3f2d38c4309aa074b9a9e (diff) | |
| download | OneRoll-9317fc5571784bafdd6d5de88f2e86e55b646648.tar.gz OneRoll-9317fc5571784bafdd6d5de88f2e86e55b646648.zip | |
Add valueslistnode
| -rw-r--r-- | cli/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | diceparser.cpp | 39 | ||||
| -rw-r--r-- | diceparser.h | 2 | ||||
| -rw-r--r-- | diceparser.pri | 2 | ||||
| -rw-r--r-- | node/valueslistnode.cpp | 58 | ||||
| -rw-r--r-- | node/valueslistnode.h | 24 |
6 files changed, 125 insertions, 1 deletions
diff --git a/cli/CMakeLists.txt b/cli/CMakeLists.txt index 6268fb4..5886240 100644 --- a/cli/CMakeLists.txt +++ b/cli/CMakeLists.txt @@ -93,6 +93,7 @@ SET( dice_sources ../node/listsetrollnode.cpp ../node/numbernode.cpp ../node/parenthesesnode.cpp + ../node/valueslistnode.cpp # ../node/forloopnode.cpp ../node/paintnode.cpp ../node/rerolldicenode.cpp diff --git a/diceparser.cpp b/diceparser.cpp index f5d543f..78f5fff 100644 --- a/diceparser.cpp +++ b/diceparser.cpp @@ -33,7 +33,6 @@ #include "node/groupnode.h" #include "node/helpnode.h" #include "node/ifnode.h" -#include "node/uniquenode.h" #include "node/jumpbackwardnode.h" #include "node/keepdiceexecnode.h" #include "node/listaliasnode.h" @@ -49,6 +48,8 @@ #include "node/splitnode.h" #include "node/startingnode.h" #include "node/stringnode.h" +#include "node/uniquenode.h" +#include "node/valueslistnode.h" #include "node/variablenode.h" #define DEFAULT_FACES_NUMBER 10 @@ -263,6 +264,11 @@ bool DiceParser::readExpression(QString& str, ExecutionNode*& node) node= operandNode; return true; } + else if(readValuesList(str, operandNode)) + { + node= operandNode; + return true; + } else { ExecutionNode* diceNode= nullptr; @@ -308,6 +314,37 @@ bool DiceParser::readOperatorFromNull(QString& str, ExecutionNode*& node) return false; } +bool DiceParser::readValuesList(QString& str, ExecutionNode*& node) +{ + if(str.startsWith("[")) + { + str= str.remove(0, 1); + int pos= ParsingToolBox::findClosingCharacterIndexOf('[', ']', str, 1); // str.indexOf("]"); + if(-1 != pos) + { + QString liststr= str.left(pos); + auto list= liststr.split(","); + str= str.remove(0, pos + 1); + auto values= new ValuesListNode(); + for(auto var : list) + { + qint64 number= 1; + QString error; + if(ParsingToolBox::readDynamicVariable(var, number)) + { + VariableNode* variableNode= new VariableNode(); + variableNode->setIndex(number - 1); + variableNode->setData(&m_startNodes); + values->insertValue(variableNode); + } + } + node= values; + return true; + } + } + return false; +} + bool DiceParser::readNode(QString& str, ExecutionNode*& node) { if(str.isEmpty()) diff --git a/diceparser.h b/diceparser.h index ff162e3..a5e8619 100644 --- a/diceparser.h +++ b/diceparser.h @@ -254,6 +254,8 @@ public: void getDiceResultFromAllInstruction(QList<ExportedDiceResult>& resultList); QString humanReadableWarning(); + bool readValuesList(QString& str, ExecutionNode*& node); + protected: bool readParameterNode(QString& str, ExecutionNode*& node); diff --git a/diceparser.pri b/diceparser.pri index c51c96d..8bdd93f 100644 --- a/diceparser.pri +++ b/diceparser.pri @@ -39,6 +39,7 @@ SOURCES += $$PWD/diceparser.cpp \ $$PWD/node/paintnode.cpp \ $$PWD/node/ifnode.cpp \ $$PWD/node/splitnode.cpp \ + $$PWD/node/valueslistnode.cpp \ $$PWD/node/uniquenode.cpp \ $$PWD/node/listsetrollnode.cpp\ $$PWD/node/variablenode.cpp\ @@ -78,6 +79,7 @@ HEADERS += \ $$PWD/node/keepdiceexecnode.h \ $$PWD/node/countexecutenode.h \ $$PWD/node/explodedicenode.h \ + $$PWD/node/valueslistnode.h \ $$PWD/node/parenthesesnode.h \ $$PWD/node/helpnode.h \ $$PWD/node/jumpbackwardnode.h \ diff --git a/node/valueslistnode.cpp b/node/valueslistnode.cpp new file mode 100644 index 0000000..e022741 --- /dev/null +++ b/node/valueslistnode.cpp @@ -0,0 +1,58 @@ +#include "valueslistnode.h" + +ValuesListNode::ValuesListNode() : m_diceResult(new DiceResult()) +{ + m_result= m_diceResult; +} + +void ValuesListNode::run(ExecutionNode* previous) +{ + m_previousNode= previous; + for(auto node : m_data) + { + node->run(this); + auto result= node->getResult(); + if(!result) + continue; + auto val= result->getResult(Result::SCALAR).toInt(); + Die* die= new Die(); + die->displayed(); + die->insertRollValue(val); + m_diceResult->insertResult(die); + } + + if(nullptr != m_nextNode) + { + m_nextNode->run(this); + } +} + +void ValuesListNode::insertValue(ExecutionNode* value) +{ + m_data.push_back(value); +} +ExecutionNode* ValuesListNode::getCopy() const +{ + ValuesListNode* node= new ValuesListNode(); + if(nullptr != m_nextNode) + { + node->setNextNode(m_nextNode->getCopy()); + } + return node; +} +QString ValuesListNode::toString(bool wl) const +{ + if(wl) + { + return QString("%1 [label=\"ValuesListNode list:\"]").arg(m_id); + } + else + { + return m_id; + } +} +qint64 ValuesListNode::getPriority() const +{ + qint64 priority= 4; + return priority; +} diff --git a/node/valueslistnode.h b/node/valueslistnode.h new file mode 100644 index 0000000..100f275 --- /dev/null +++ b/node/valueslistnode.h @@ -0,0 +1,24 @@ +#ifndef VALUESLISTNODE_H +#define VALUESLISTNODE_H + +#include "executionnode.h" +#include "result/diceresult.h" + +class ValuesListNode : public ExecutionNode +{ +public: + ValuesListNode(); + + virtual void run(ExecutionNode* previous= nullptr) override; + virtual QString toString(bool) const override; + virtual qint64 getPriority() const override; + virtual ExecutionNode* getCopy() const override; + + void insertValue(ExecutionNode*); + +private: + std::vector<ExecutionNode*> m_data; + DiceResult* m_diceResult = nullptr; +}; + +#endif // VALUESLISTNODE_H |