public void Roll() { for (int rollNum = 1; rollNum <= DiceParameters.NumberOfDice; rollNum++) { Roll currentRoll = new Roll(); this.Rolls.Add(currentRoll); if (this.DiceParameters.DiceType == DiceType.Normal) { currentRoll.RollValue = Dice.Roll(DiceParameters.NumberOfSides); currentRoll.Result = currentRoll.RollValue; currentRoll.RollType = RollType.Normal; this.Accounting += currentRoll.Result.ToString(); } else if (this.DiceParameters.DiceType == DiceType.SmoothlyExploding || this.DiceParameters.DiceType == DiceType.SmoothlyExplodingDownward || this.DiceParameters.DiceType == DiceType.SmoothlyExplodingUpward) { int extraSides = 1; if (this.DiceParameters.DiceType == DiceType.SmoothlyExploding) { extraSides = 2; } int r = Dice.Roll(this.DiceParameters.NumberOfSides + extraSides) - extraSides; if (r > 0) { //Did not explode currentRoll.RollValue = r; currentRoll.Result = r; currentRoll.RollType = RollType.NotExploded; this.Accounting += currentRoll.Result.ToString(); } else if (r == -1 || (r == 0 && this.DiceParameters.DiceType == DiceType.SmoothlyExplodingUpward)) { //Explode Up currentRoll.RollValue = this.DiceParameters.NumberOfSides; currentRoll.Result = this.DiceParameters.NumberOfSides; currentRoll.RollType = RollType.ExplodedUp; this.Accounting += this.ExplodeSmoothly(currentRoll); } else if (r == 0) { //Explode Down currentRoll.RollValue = 1; currentRoll.Result = 1; currentRoll.RollType = RollType.ExplodedDown; this.Accounting += this.ExplodeSmoothly(currentRoll); } } if (rollNum < this.DiceParameters.NumberOfDice) { this.Accounting += " + "; } } this.Accounting = this.FullResult + " = " + this.Accounting; }
public static ExpandedDiceRoll RollExpanded(string DiceExpression) { ExpandedDiceRoll result = new ExpandedDiceRoll(); int literalInteger; //Allow a literal number to override a dice roll. if (Int32.TryParse(DiceExpression, out literalInteger)) { Roll literalRoll = new Roll(); literalRoll.RollValue = literalInteger; literalRoll.Result = literalInteger; //result.Accounting = "Literal Integer: " + literalInteger; return(result); } DiceParameters diceParams = new DiceParameters(DiceExpression); if (!diceParams.IsValid) { result.IsValid = false; result.DiceParameters = diceParams; return(result); } result.DiceParameters = diceParams; result.Roll(); ////Normal dice //if (diceType == "d" // && !threshold.HasValue) //{ // List<int> rolls = new List<int>(); // if (keepnumber.HasValue) // { // if (keepType == "k") // { // //Keep the highest // rolls = rolls.OrderByDescending(p => p).ToList(); // } // else if (keepType == "l") // { // //keep the lowest // rolls = rolls.OrderBy(p => p).ToList(); // } // } // StringBuilder sb = new StringBuilder(); // int total = 0; // for (int i = 0; i < rolls.Count(); i++) // { // if (keepnumber.HasValue && i < keepnumber.Value) // { // sb.Append(rolls[i] + "*"); // total += rolls[i]; // } // else if (keepnumber.HasValue) // { // //Don't add // sb.Append(rolls[i]); // } // else // { // //normal roll, always add // sb.Append(rolls[i]); // total += rolls[i]; // } // if (i < rolls.Count - 1) // { // sb.Append(" + "); // } // } // result.Accounting = sb.ToString(); // result.Result = total; //} ////Non-smooth exploding dice //if ((diceType == "e" // || diceType == "eu" // || diceType == "ed") // && !threshold.HasValue) //{ // for (int i = 1; (i <= numDice); i++) // { // int roll = Dice.Roll(numSides); // string explodedResultText = ""; // if (roll == numSides && (diceType == "e" || diceType == "eu")) // { // //Non-smooth explode up // explodedResultText += "(UP: " + roll + "+"; // int explodedRoll = 0; // while (explodedRoll == 0 || explodedRoll == numSides) // { // explodedRoll = Dice.Roll(numSides); // if (explodedRoll == numSides) // { // explodedResultText += explodedRoll + "+"; // roll += explodedRoll; // } // else // { // explodedResultText += explodedRoll + ")"; // roll += explodedRoll; // } // } // } // else if (roll == 1 && (diceType == "e" || diceType == "ed")) // { // //Non-smooth explode down // explodedResultText += "(DN: " + roll + "-"; // int explodedRoll = 0; // while (explodedRoll == 0 || explodedRoll == numSides) // { // explodedRoll = Dice.Roll(numSides); // if (explodedRoll == numSides) // { // explodedResultText += explodedRoll + "-"; // roll -= explodedRoll; // } // else // { // explodedResultText += explodedRoll + ")"; // roll -= explodedRoll; // } // } // } // explodedResultText = roll + " " + explodedResultText; // result.Result += roll; // if (!string.IsNullOrWhiteSpace(explodedResultText)) // { // result.Accounting += explodedResultText; // } // if ((i < numDice)) // { // result.Accounting += " + "; // } // //else // //{ // // result.FullResults += " = "; // //} // } //} ////Smooth exploding dice //if ((diceType == "s" // || diceType == "su" // || diceType == "sd") // && !threshold.HasValue) //{ // for (int i = 1; (i <= numDice); i++) // { // int smoothSides = 1; // if (diceType == "s") { smoothSides = 2; } // int roll = Dice.Roll(numSides + smoothSides); // string explodedResultText = ""; // if (roll == numSides + smoothSides && (diceType == "s" || diceType == "su")) // { // //Smooth explode up // roll -= smoothSides; // explodedResultText += "(UP: " + roll + "+"; // int explodedRoll = 0; // while (explodedRoll == 0 || explodedRoll == numSides + 1) // { // explodedRoll = Dice.Roll(numSides + 1); // if (explodedRoll == numSides + 1) // { // explodedResultText += numSides + "+"; // roll += numSides; // } // else // { // explodedResultText += explodedRoll + ")"; // roll += explodedRoll; // } // } // } // else if (roll == numSides + 1 && (diceType == "s" || diceType == "sd")) // { // //Smooth explode down // roll = 1; // explodedResultText += "(DN: " + roll + "-"; // int explodedRoll = 0; // while (explodedRoll == 0 || explodedRoll == numSides + 1) // { // explodedRoll = Dice.Roll(numSides + 1); // if (explodedRoll == numSides + 1) // { // explodedResultText += numSides + "-"; // roll -= numSides; // } // else // { // explodedResultText += explodedRoll + ")"; // roll -= explodedRoll; // } // } // } // explodedResultText = roll + " " + explodedResultText; // result.Result += roll; // if (!string.IsNullOrWhiteSpace(explodedResultText)) // { // result.Accounting += explodedResultText; // } // if ((i < numDice)) // { // result.Accounting += " + "; // } // //else // //{ // // result.FullResults += " = "; // //} // } //} ////Threshold dice //if (threshold.HasValue) //{ // int successes = 0; // string tresultText = ""; // //roll just one die of the type // string newDiceExpression = match.Groups["dsides"].Value; // for (int i = 1; (i <= numDice); i++) // { // int tresult = Dice.Roll(newDiceExpression); // tresultText += tresult; // if (tresult >= threshold.Value) // { // successes += 1; // tresultText += "*"; // if (thresholdType == "b" && tresult >= numSides) // { // //max rolls "burst" to new chances // int burstRoll = 0; // tresultText += "(BURST: "; // while (burstRoll == 0 || burstRoll >= numSides) // { // burstRoll = Dice.Roll(newDiceExpression); // tresultText += burstRoll; // if (burstRoll >= threshold) // { // successes += 1; // tresultText += "*"; // } // if (burstRoll == numSides) // { // tresultText += ", "; // } // } // tresultText += ")"; // } // } // if (i != numDice) // { // tresultText += ", "; // } // } // result.Result = successes; // if (!string.IsNullOrWhiteSpace(tresultText)) // { // result.Accounting += tresultText; // } // //result.FullResults += " = "; //} //result.Result += modifier; //if ((modifier < 0)) //{ // result.Accounting += " (" + modifier + ")"; //} //if ((modifier > 0)) //{ // result.Accounting += " (+" + modifier + ")"; //} //// Limits occur after Modifiers are applied //if ((lowerlimit.HasValue && (result.Result < lowerlimit))) //{ // result.Accounting = result.Result + " (FLOOR " + lowerlimit.Value + ") = " + result.Accounting; // result.Result = lowerlimit.Value; //} //// Limits occur after Modifiers are applied //if ((upperlimit.HasValue && (result.Result > upperlimit))) //{ // result.Accounting = result.Result + " (CEILING " + upperlimit.Value + ") = " + result.Accounting; // result.Result = upperlimit.Value; //} //result.Accounting = result.Result + " = " + result.Accounting; return(result); }
private string ExplodeSmoothly(Roll originalRoll) { int r = 0; string accountingResult = ""; if (originalRoll.RollType == RollType.ExplodedDown) { accountingResult = "(DN: " + originalRoll.RollValue; } else if (originalRoll.RollType == RollType.ExplodedUp) { accountingResult = "(UP: " + originalRoll.RollValue; } do { r = Dice.Roll(this.DiceParameters.NumberOfSides + 1) - 1; Roll extra = new Roll(); originalRoll.ExtraRolls.Add(extra); if (r < 1) { extra.RollValue = this.DiceParameters.NumberOfSides; extra.Result = extra.RollValue; } if (r < 1 && originalRoll.RollType == RollType.ExplodedDown) { originalRoll.Result -= extra.RollValue; extra.RollType = RollType.ExplodedDown; accountingResult += " - " + extra.RollValue.ToString(); } if (r < 1 && originalRoll.RollType == RollType.ExplodedUp) { originalRoll.Result += extra.RollValue; extra.RollType = RollType.ExplodedUp; accountingResult += " + " + extra.RollValue.ToString(); } if (r > 0 && originalRoll.RollType == RollType.ExplodedDown) { originalRoll.Result -= r; extra.RollType = RollType.NotExploded; accountingResult += " - " + r.ToString(); } if (r > 0 && originalRoll.RollType == RollType.ExplodedUp) { originalRoll.Result += r; extra.RollType = RollType.NotExploded; accountingResult += " + " + r.ToString(); } } while (r < 1); accountingResult = originalRoll.Result.ToString() + accountingResult + ")"; return accountingResult; }