From bb9eeae7d5798d5c2c8579949c544b55be1bcbca Mon Sep 17 00:00:00 2001 From: Renaud G Date: Thu, 25 Jan 2018 01:06:07 +0100 Subject: -Add management of unique for dice and list. --- node/listsetrollnode.cpp | 58 ++++++++++++++++++++++++++++++++++-------------- 1 file changed, 41 insertions(+), 17 deletions(-) (limited to 'node/listsetrollnode.cpp') diff --git a/node/listsetrollnode.cpp b/node/listsetrollnode.cpp index 21d5403..d7d4566 100644 --- a/node/listsetrollnode.cpp +++ b/node/listsetrollnode.cpp @@ -65,17 +65,24 @@ void ListSetRollNode::run(ExecutionNode* previous) if(nullptr!=result) { quint64 diceCount = result->getResult(Result::SCALAR).toReal(); - m_result->setPrevious(result); - QStringList rollResult; - for(quint64 i=0; i < diceCount ; ++i) + if(diceCount > m_values.size() && m_unique) { - Die* die = new Die(); - computeFacesNumber(die); - die->roll(); - m_diceResult->insertResult(die); - getValueFromDie(die,rollResult); + m_errors.insert(TOO_MANY_DICE,QObject::tr("More unique values asked than possible values (L operator)")); + } + else + { + m_result->setPrevious(result); + QStringList rollResult; + for(quint64 i=0; i < diceCount ; ++i) + { + Die* die = new Die(); + computeFacesNumber(die); + die->roll(); + m_diceResult->insertResult(die); + getValueFromDie(die,rollResult); + } + m_stringResult->setText(rollResult.join(",")); } - m_stringResult->setText(rollResult.join(",")); if(nullptr!=m_nextNode) { m_nextNode->run(this); @@ -110,12 +117,10 @@ void ListSetRollNode::computeFacesNumber(Die* die) { if(((i==0)||(maxsetMaxValue(max); } @@ -126,20 +131,39 @@ void ListSetRollNode::getValueFromDie(Die* die,QStringList& rollResult) { if(die->getValue()-1getValue()-1]; + auto str = m_values[die->getValue()-1]; + while(m_unique && rollResult.contains(str)) + { + die->roll(false); + str = m_values[die->getValue()-1]; + } + rollResult << str; } } else { Q_ASSERT(m_values.size() == m_rangeList.size()); - int i=0; - foreach (Range range, m_rangeList) + bool found = false; + while(!found) { - if(range.hasValid(die,false)) + int i=0; + for (Range& range: m_rangeList) { - rollResult << m_values[i]; + auto it = std::find(m_rangeIndexResult.begin(),m_rangeIndexResult.end(),i); + auto isValid = range.hasValid(die,false); + if((isValid && !m_unique)|| + (isValid && it == m_rangeIndexResult.end())) + { + m_rangeIndexResult.push_back(i); + rollResult << m_values[i]; + found=true; + } + ++i; + } + if(!found) + { + die->roll(false); } - ++i; } } } -- cgit v1.2.3-70-g09d2