aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--cli/CMakeLists.txt1
-rw-r--r--diceparser.cpp39
-rw-r--r--diceparser.h2
-rw-r--r--diceparser.pri2
-rw-r--r--node/valueslistnode.cpp58
-rw-r--r--node/valueslistnode.h24
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