aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/parsingtoolbox.cpp
diff options
context:
space:
mode:
authorRenaud G <renaud@rolisteam.org>2015-06-09 08:44:49 +0200
committerRenaud G <renaud@rolisteam.org>2015-06-09 08:44:49 +0200
commit2d9fe10724dc1d5de86e63670536b9a1b6599ba1 (patch)
tree5341bf5d7f7b3236cac12791ea547644302f987b /parsingtoolbox.cpp
parent88e5130bd86992819a036ef982733b5ee344d656 (diff)
downloadOneRoll-2d9fe10724dc1d5de86e63670536b9a1b6599ba1.tar.gz
OneRoll-2d9fe10724dc1d5de86e63670536b9a1b6599ba1.zip
-add method to read list with probability value. It sets range for all
values in List node.
Diffstat (limited to 'parsingtoolbox.cpp')
-rw-r--r--parsingtoolbox.cpp94
1 files changed, 92 insertions, 2 deletions
diff --git a/parsingtoolbox.cpp b/parsingtoolbox.cpp
index f6b1f12..696d330 100644
--- a/parsingtoolbox.cpp
+++ b/parsingtoolbox.cpp
@@ -179,17 +179,20 @@ bool ParsingToolBox::readCloseParentheses(QString& str)
else
return false;
}
-bool ParsingToolBox::readList(QString& str,QStringList& list)
+bool ParsingToolBox::readList(QString& str,QStringList& list,QList<Range>& ranges)
{
if(str.startsWith("["))
{
str=str.remove(0,1);
- int pos = str.indexOf("]");
+ int pos = str.lastIndexOf("]");
if(-1!=pos)
{
QString liststr = str.left(pos);
list = liststr.split(",");
str=str.remove(0,pos+1);
+ readProbability(list,ranges);
+
+
return true;
}
}
@@ -271,3 +274,90 @@ bool ParsingToolBox::readDiceRange(QString& str,int& start, int& end)
}
}
+ParsingToolBox::LIST_OPERATOR ParsingToolBox::readListOperator(QString& str)
+{
+
+ if(str.startsWith('u'))
+ {
+ return UNIQUE;
+ }
+ return NONE;
+}
+void ParsingToolBox::readProbability(QStringList& str,QList<Range>& ranges)
+{
+ quint64 totalDistance=0;
+ quint64 undefDistance = 0;
+ int undefCount=0;
+ int maxValue = 0;
+ int i=0;
+ int j=0;
+ //range
+ foreach(QString line,str)
+ {
+ int pos = line.indexOf('[');
+ if(-1!=pos)
+ {
+ QString range = line.right(line.length()-pos);
+ line = line.left(pos);
+ str[j]=line;
+ int start;
+ int end;
+ if(readDiceRange(range,start,end))
+ {
+ Range range;
+ range.setValue(start,end);
+ ranges.append(range);
+ totalDistance += end-start+1;
+ ++i;
+ }
+ else
+ {
+ Range range;
+ range.setStart(start);
+ ranges.append(range);
+ ++undefCount;
+ undefDistance +=start;
+ }
+ if((end>maxValue)||(i==1))
+ {
+ maxValue = end;
+ }
+ }
+ ++j;
+
+ }
+
+
+
+
+ ///Normalize list
+// qDebug() << 100 - undefDistance;
+// qDebug() << totalDistance;
+
+ qint64 totalDistPourcent = totalDistance * undefDistance / (100-undefDistance);
+
+ if(totalDistPourcent<undefCount)
+ {
+ totalDistPourcent = undefCount;
+ }
+
+ for(int i = 0; i< ranges.size(); ++i)
+ {
+ Range tmp = ranges.at(i);
+ if(!tmp.isFullyDefined())
+ {
+ int dist = tmp.getStart();
+ tmp.setStart(maxValue+1);
+ maxValue+=1;
+ double truc = undefDistance*1.0/dist;
+
+ tmp.setEnd(maxValue+(truc*totalDistPourcent));
+ maxValue = maxValue+(truc*totalDistPourcent);
+ qDebug() << truc << totalDistPourcent << undefDistance << totalDistance << maxValue << dist << totalDistPourcent << tmp.toString();
+ ranges[i]=tmp;
+ }
+ }
+
+
+
+}