aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorRenaud G <renaud@rolisteam.org>2019-10-30 12:06:04 +0100
committerRenaud G <renaud@rolisteam.org>2020-03-28 02:05:05 +0100
commit57a32d7e0be949b174f16563d660e5a98231c57e (patch)
tree2bcf90a75191fa407bb122977fbeb227f404c1f0
parent932d863c2a2c9b08d8ce1f4e1041e5795daedc6d (diff)
downloadOneRoll-57a32d7e0be949b174f16563d660e5a98231c57e.tar.gz
OneRoll-57a32d7e0be949b174f16563d660e5a98231c57e.zip
Add repeater node.
-rw-r--r--diceparser/node/repeaternode.cpp116
-rw-r--r--diceparser/node/repeaternode.h48
2 files changed, 164 insertions, 0 deletions
diff --git a/diceparser/node/repeaternode.cpp b/diceparser/node/repeaternode.cpp
new file mode 100644
index 0000000..09e88bd
--- /dev/null
+++ b/diceparser/node/repeaternode.cpp
@@ -0,0 +1,116 @@
+/***************************************************************************
+ * Copyright (C) 2019 by Renaud Guezennec *
+ * http://www.rolisteam.org/contact *
+ * *
+ * This file is part of DiceParser *
+ * *
+ * DiceParser is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+#include "node/repeaternode.h"
+
+#include "diceparserhelper.h"
+#include "executionnode.h"
+#include "parsingtoolbox.h"
+#include "result/stringresult.h"
+
+RepeaterNode::RepeaterNode() {}
+
+void RepeaterNode::run(ExecutionNode* previousNode)
+{
+ m_previousNode= previousNode;
+ m_times->run(this);
+ m_times= ParsingToolBox::getLeafNode(m_times);
+ auto times= m_times->getResult();
+ auto timeCount= times->getResult(Dice::RESULT_TYPE::SCALAR).toInt();
+ auto cmd= m_cmd->getCopy();
+ for(int i= 0; i < timeCount; ++i)
+ {
+ m_cmd->run(this);
+ auto end= ParsingToolBox::getLeafNode(cmd);
+ auto result= end->getResult();
+
+ if(nullptr == result)
+ continue;
+
+ if(result->hasResultOfType(Dice::RESULT_TYPE::SCALAR))
+ {
+ if(m_sumAll)
+ {
+ auto res= new ScalarResult();
+
+ m_result= res;
+ }
+ else
+ {
+ auto res= new StringResult();
+ m_result= res;
+ }
+ }
+ else if(result->hasResultOfType(Dice::RESULT_TYPE::STRING))
+ {
+ auto res= new StringResult();
+
+ m_result= res;
+ }
+ else if(result->hasResultOfType(Dice::RESULT_TYPE::DICE_LIST))
+ {
+ if(m_sumAll)
+ {
+ auto res= new ScalarResult();
+
+ m_result= res;
+ }
+ else
+ {
+ auto res= new StringResult();
+
+ m_result= res;
+ }
+ }
+
+ cmd= m_cmd->getCopy();
+ }
+}
+
+QString RepeaterNode::toString(bool withLabel) const
+{
+ return withLabel ? QStringLiteral("") : QStringLiteral("");
+}
+
+qint64 RepeaterNode::getPriority() const
+{
+ return 4;
+}
+
+ExecutionNode* RepeaterNode::getCopy() const
+{
+ return nullptr;
+}
+
+void RepeaterNode::setCommand(ExecutionNode* cmd)
+{
+ m_cmd.reset(cmd);
+}
+
+void RepeaterNode::setTimeNode(ExecutionNode* time)
+{
+ m_times= time;
+}
+
+void RepeaterNode::setSumAll(bool b)
+{
+ m_sumAll= b;
+}
diff --git a/diceparser/node/repeaternode.h b/diceparser/node/repeaternode.h
new file mode 100644
index 0000000..847db17
--- /dev/null
+++ b/diceparser/node/repeaternode.h
@@ -0,0 +1,48 @@
+/***************************************************************************
+ * Copyright (C) 2019 by Renaud Guezennec *
+ * http://www.rolisteam.org/contact *
+ * *
+ * This file is part of DiceParser *
+ * *
+ * DiceParser is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+#ifndef REPEATER_NODE_H
+#define REPEATER_NODE_H
+
+#include "node/executionnode.h"
+#include <memory>
+
+class RepeaterNode : public ExecutionNode
+{
+public:
+ RepeaterNode();
+ void run(ExecutionNode* previous) override;
+ virtual QString toString(bool withLabel) const override;
+ virtual qint64 getPriority() const override;
+
+ virtual ExecutionNode* getCopy() const override;
+
+ void setCommand(ExecutionNode* node);
+ void setTimeNode(ExecutionNode* times);
+ void setSumAll(bool b);
+
+private:
+ std::unique_ptr<ExecutionNode> m_cmd;
+ ExecutionNode* m_times= nullptr;
+ bool m_sumAll= false;
+};
+
+#endif // REPEATER_NODE_H