aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorRenaud G <renaud@rolisteam.org>2019-03-23 18:03:35 +0100
committerGitHub <noreply@github.com>2019-03-23 18:03:35 +0100
commitd1b2ac03a90fe00ee3b09e60584f895b40e2e9df (patch)
treedf5a5653f0978e700fe7ba6450230789b5e9be34
parent607b8284672c75f134616a826e3475be4cf8e277 (diff)
parente672047be7bb9e4e1b163a04a55b98b52d39e16a (diff)
downloadOneRoll-d1b2ac03a90fe00ee3b09e60584f895b40e2e9df.tar.gz
OneRoll-d1b2ac03a90fe00ee3b09e60584f895b40e2e9df.zip
Merge pull request #39 from Rolisteam/occurence
Occurence
-rw-r--r--CMakeLists.txt2
-rw-r--r--HelpMe.md20
-rw-r--r--cli/CMakeLists.txt16
-rw-r--r--diceparser.cpp27
-rw-r--r--diceparser.h3
-rw-r--r--node/occurencecountnode.cpp147
-rw-r--r--node/occurencecountnode.h54
-rw-r--r--parsingtoolbox.cpp11
-rw-r--r--parsingtoolbox.h2
9 files changed, 273 insertions, 9 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 2899cb1..9460032 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 2.8)
project(diceparser)
-add_subdirectory(irc)
+#add_subdirectory(irc)
add_subdirectory(cli)
#add_subdirectory(mobile)
#add_subdirectory(webserver)
diff --git a/HelpMe.md b/HelpMe.md
index 90ed48c..6e910dd 100644
--- a/HelpMe.md
+++ b/HelpMe.md
@@ -14,6 +14,7 @@
* [Reroll until](#reroll-until)
* [Explode](#explode)
* [Add](#add)
+ * [Occurence](#occurence)
* [Backward Jump](#backward-jump)
* [Paint](#paint)
* [Merge](#merge)
@@ -229,6 +230,23 @@ Result: 35 details: 3, 27 [9,10,8], 5
Reroll the die if its value fits the Validator and add the new value to the previous one. It does that only once.
+### Occurence
+
+> 10d10o
+
+Count and sort occurences of each value.
+Result: `3x1,1x2,3x4,2x9,1x10 - [1,1,1,2,4,4,4,9,9,10]`
+
+> 10d10o2,7
+
+Count and sort occurence when they occur at least 2 times, the value is 7 or more.
+Result: `2x8 - [1,2,3,5,6,7,8,8,9,10]`
+
+> 10d10o2[<6]
+
+Count and sort occurence when they occur at least 2 times, the value should respect the validator (here less than 6).
+Result: `2x3,2x5 - [3,3,5,5,6,6,6,7,7,8]`
+
### Backward Jump
This operator is dedicated to apply its next operator to the second to last result.
@@ -271,7 +289,7 @@ It makes exploded dice as new dice.
> 4d6e6u6k3
Result: 6 4 3 3 2
-Final result: 6+4+3 = 13
+Final result: 6+4+3 = 13
### Bind
diff --git a/cli/CMakeLists.txt b/cli/CMakeLists.txt
index 3c14576..f3dd61d 100644
--- a/cli/CMakeLists.txt
+++ b/cli/CMakeLists.txt
@@ -52,12 +52,12 @@ ENDIF(UPDATE_TRANSLATIONS)
if(Qt5Core_FOUND)
- IF(UPDATE_TRANSLATIONS)
+ #IF(UPDATE_TRANSLATIONS)
MESSAGE(status "find" ${dice_TS} ${translate_SRCS} )
- QT5_CREATE_TRANSLATION(dice_QM ${translate_SRCS} ${dice_TS})
- ELSE()
- QT5_ADD_TRANSLATION(dice_QM ${dice_TS})
- ENDIF()
+ #QT5_CREATE_TRANSLATION(dice_QM ${translate_SRCS} ${dice_TS})
+ #ELSE()
+ #QT5_ADD_TRANSLATION(dice_QM ${dice_TS})
+ #ENDIF()
QT5_ADD_RESOURCES(dice_RESOURCES_RCC ${dice_RESOURCES})
@@ -93,6 +93,7 @@ SET( dice_sources
../node/listsetrollnode.cpp
../node/numbernode.cpp
../node/parenthesesnode.cpp
+ ../node/forloopnode.cpp
../node/paintnode.cpp
../node/rerolldicenode.cpp
../node/scalaroperatornode.cpp
@@ -104,13 +105,16 @@ SET( dice_sources
../node/splitnode.cpp
../node/groupnode.cpp
../node/bind.cpp
+ ../node/occurencecountnode.cpp
main.cpp
displaytoolbox.cpp
../highlightdice.cpp
../node/variablenode.cpp
)
-add_executable( dice ${dice_sources} ${dice_QM} )
+set(documentation_files ../HelpMe.md ../README.md)
+
+add_executable( dice ${dice_sources} ${dice_QM} ${documentation_files})
target_link_libraries(dice ${Qt5Core_LIBRARIES} ${Qt5Gui_LIBRARIES} ${Qt5Svg_LIBRARIES})
INSTALL_TARGETS(/bin dice)
diff --git a/diceparser.cpp b/diceparser.cpp
index 5ec7122..8efa83e 100644
--- a/diceparser.cpp
+++ b/diceparser.cpp
@@ -39,6 +39,7 @@
#include "node/listsetrollnode.h"
#include "node/mergenode.h"
#include "node/numbernode.h"
+#include "node/occurencecountnode.h"
#include "node/paintnode.h"
#include "node/parenthesesnode.h"
#include "node/rerolldicenode.h"
@@ -78,6 +79,7 @@ DiceParser::DiceParser()
m_OptionOp->insert(QStringLiteral("u"), Split);
m_OptionOp->insert(QStringLiteral("g"), Group);
m_OptionOp->insert(QStringLiteral("b"), Bind);
+ m_OptionOp->insert(QStringLiteral("o"), Occurences);
m_aliasList= new QList<DiceAlias*>();
@@ -1113,6 +1115,31 @@ bool DiceParser::readOption(QString& str, ExecutionNode* previous) //,
found= true;
}
break;
+ case Occurences:
+ {
+ qint64 number= 0;
+ auto occNode= new OccurenceCountNode();
+ if(m_parsingToolbox->readNumber(str, number))
+ {
+ occNode->setWidth(number);
+ Validator* validator= m_parsingToolbox->readCompositeValidator(str);
+ if(validator)
+ {
+ occNode->setValidator(validator);
+ }
+ else if(m_parsingToolbox->readComma(str))
+ {
+ if(m_parsingToolbox->readNumber(str, number))
+ {
+ occNode->setHeight(number);
+ }
+ }
+ }
+ previous->setNextNode(occNode);
+ node= occNode;
+ found= true;
+ }
+ break;
case Painter:
{
PainterNode* painter= new PainterNode();
diff --git a/diceparser.h b/diceparser.h
index bb3f5f3..ca50d10 100644
--- a/diceparser.h
+++ b/diceparser.h
@@ -90,7 +90,8 @@ public:
Filter,
Split,
Group,
- Bind
+ Bind,
+ Occurences
};
/**
* @brief The CommandOperator enum
diff --git a/node/occurencecountnode.cpp b/node/occurencecountnode.cpp
new file mode 100644
index 0000000..4fdbc51
--- /dev/null
+++ b/node/occurencecountnode.cpp
@@ -0,0 +1,147 @@
+/***************************************************************************
+ * Copyright (C) 2018 by Renaud Guezennec *
+ * http://www.rolisteam.org/contact *
+ * *
+ * rolisteam 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 "occurencecountnode.h"
+#include "result/diceresult.h"
+#include "result/stringresult.h"
+
+OccurenceCountNode::OccurenceCountNode() : ExecutionNode()
+{
+ m_stringResult= new StringResult();
+ m_result= m_stringResult;
+}
+
+void OccurenceCountNode::run(ExecutionNode* previous)
+{
+ m_previousNode= previous;
+ std::map<qint64, qint64> mapOccurence;
+ if(nullptr == m_previousNode)
+ return;
+
+ DiceResult* previousDiceResult= dynamic_cast<DiceResult*>(m_previousNode->getResult());
+ // m_diceResult->setPrevious(previousDiceResult);
+ if(nullptr == previousDiceResult)
+ return;
+
+ auto const& diceList= previousDiceResult->getResultList();
+ QVector<qint64> vec;
+
+ for(auto dice : diceList)
+ {
+ auto val= dice->getValue();
+
+ vec << val;
+ auto it= mapOccurence.find(val);
+ if(it == mapOccurence.end())
+ mapOccurence[val]= 1;
+ else
+ mapOccurence[val]+= 1;
+ }
+
+ std::sort(vec.begin(), vec.end());
+
+ QStringList list;
+ for(auto key : mapOccurence)
+ {
+ if(nullptr != m_validator)
+ {
+ Die die;
+ die.insertRollValue(key.first);
+ if(!m_validator->hasValid(&die, true))
+ continue;
+ }
+
+ if(key.second < m_width)
+ continue;
+
+ if(key.first >= m_height)
+ list << QStringLiteral("%1x%2").arg(key.second).arg(key.first);
+ }
+
+ QStringList resultList;
+ std::for_each(vec.begin(), vec.end(), [&resultList](qint64 val) { resultList << QString::number(val); });
+
+ QString result;
+
+ if(!list.isEmpty())
+ result= list.join(',');
+ else
+ result= QObject::tr("No matching result");
+
+ m_stringResult->setText(QStringLiteral("%1 - [%2]").arg(result).arg(resultList.join(',')));
+
+ if(nullptr != m_nextNode)
+ {
+ m_nextNode->run(this);
+ }
+}
+QString OccurenceCountNode::toString(bool label) const
+{
+ if(label)
+ {
+ return QString("%1 [label=\"OccurenceCountNode %2\"]").arg(m_id);
+ }
+ else
+ {
+ return m_id;
+ }
+}
+ExecutionNode* OccurenceCountNode::getCopy() const
+{
+ return nullptr;
+}
+qint64 OccurenceCountNode::getPriority() const
+{
+ qint64 priority= 0;
+ if(nullptr != m_previousNode)
+ {
+ priority= m_previousNode->getPriority();
+ }
+ return priority;
+}
+
+qint64 OccurenceCountNode::getWidth() const
+{
+ return m_width;
+}
+
+void OccurenceCountNode::setWidth(const qint64& width)
+{
+ m_width= width;
+}
+
+qint64 OccurenceCountNode::getHeight() const
+{
+ return m_height;
+}
+
+void OccurenceCountNode::setHeight(const qint64& height)
+{
+ m_height= height;
+}
+
+Validator* OccurenceCountNode::getValidator() const
+{
+ return m_validator;
+}
+
+void OccurenceCountNode::setValidator(Validator* validator)
+{
+ m_validator= validator;
+}
diff --git a/node/occurencecountnode.h b/node/occurencecountnode.h
new file mode 100644
index 0000000..125f340
--- /dev/null
+++ b/node/occurencecountnode.h
@@ -0,0 +1,54 @@
+/***************************************************************************
+ * Copyright (C) 2018 by Renaud Guezennec *
+ * http://www.rolisteam.org/contact *
+ * *
+ * rolisteam 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 OCCURENCECOUNTNODE_H
+#define OCCURENCECOUNTNODE_H
+
+#include "executionnode.h"
+#include "validator.h"
+
+class StringResult;
+class OccurenceCountNode : public ExecutionNode
+{
+public:
+ OccurenceCountNode();
+
+ void run(ExecutionNode* previous= nullptr);
+ virtual QString toString(bool withLabel) const;
+
+ ExecutionNode* getCopy() const;
+ qint64 getPriority() const;
+
+ qint64 getWidth() const;
+ void setWidth(const qint64& width);
+
+ qint64 getHeight() const;
+ void setHeight(const qint64& height);
+
+ Validator* getValidator() const;
+ void setValidator(Validator* validator);
+
+private:
+ qint64 m_width= 1;
+ qint64 m_height= 0;
+ Validator* m_validator= nullptr;
+ StringResult* m_stringResult= nullptr;
+};
+
+#endif // OCCURENCECOUNTNODE_H
diff --git a/parsingtoolbox.cpp b/parsingtoolbox.cpp
index 2b77fe2..ffc4a60 100644
--- a/parsingtoolbox.cpp
+++ b/parsingtoolbox.cpp
@@ -517,6 +517,16 @@ bool ParsingToolBox::readVariable(QString& str, qint64& myNumber, QString& reaso
return false;
}
+bool ParsingToolBox::readComma(QString& str)
+{
+ if(str.startsWith(","))
+ {
+ str= str.remove(0, 1);
+ return true;
+ }
+ else
+ return false;
+}
bool ParsingToolBox::readOpenParentheses(QString& str)
{
if(str.startsWith("("))
@@ -527,6 +537,7 @@ bool ParsingToolBox::readOpenParentheses(QString& str)
else
return false;
}
+
bool ParsingToolBox::readCloseParentheses(QString& str)
{
if(str.startsWith(")"))
diff --git a/parsingtoolbox.h b/parsingtoolbox.h
index 4b50b6d..7bb6059 100644
--- a/parsingtoolbox.h
+++ b/parsingtoolbox.h
@@ -232,6 +232,8 @@ public:
static void readSubtitutionParameters(SubtituteInfo& info, QString& rest);
+ static bool readComma(QString& str);
+
private:
QMap<QString, BooleanCondition::LogicOperator>* m_logicOp;
QMap<QString, CompositeValidator::LogicOperation>* m_logicOperation;