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;

 
        }
Esempio n. 2
0
        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;
        }