Beispiel #1
0
        public DiceRoll Clone()
        {
            var newDiceRoll = new DiceRoll
            {
                Dice        = new List <Die>(),
                FixedAmount = FixedAmount,
            };

            foreach (var die in Dice)
            {
                newDiceRoll.AddDie(new Die
                {
                    DieType      = die.DieType,
                    NumberOfDice = die.NumberOfDice,
                    Operator     = die.Operator
                });
            }
            return(newDiceRoll);
        }
Beispiel #2
0
        public static DiceRoll Parse(string damageString)
        {
            if (string.IsNullOrWhiteSpace(damageString))
            {
                return(null);
            }
            var newDiceRoll = new DiceRoll
            {
                Dice        = new List <Die>(),
                FixedAmount = 0
            };
            var rgx = new Regex("[^dD0-9-+]");

            damageString = rgx.Replace(damageString, "");
            var          currentPart     = "";
            MathOperator?currentOperator = MathOperator.Plus;
            MathOperator?nextOperator    = null;

            //Checking first char for operator, we assume + if there is none.
            if (damageString[0] == '+' || damageString[0] == '-')
            {
                if (damageString[0] == '-')
                {
                    currentOperator = MathOperator.Minus;
                }
                damageString = damageString.Substring(1);
            }

            for (var i = 0; i < damageString.Length; i++)
            {
                var currentChar = damageString[i];
                if (currentChar == '+')
                {
                    nextOperator = MathOperator.Plus;
                }
                else if (currentChar == '-')
                {
                    nextOperator = MathOperator.Minus;
                }
                else
                {
                    currentPart += currentChar;
                }

                if (nextOperator != null || i == damageString.Length - 1)
                {
                    //Adding part
                    if (currentPart.Contains("d"))
                    {
                        //Adding dice
                        var parts = currentPart.ToLower().Split('d');
                        newDiceRoll.Dice.Add(new Die
                        {
                            Operator     = currentOperator.Value,
                            NumberOfDice = int.Parse(parts[0]),
                            DieType      = int.Parse(parts[1])
                        });
                    }
                    else
                    {
                        //Changing fixed value
                        var currentValue = int.Parse(currentPart);
                        switch (currentOperator)
                        {
                        case MathOperator.Minus:
                            newDiceRoll.FixedAmount -= currentValue;
                            break;

                        case MathOperator.Plus:
                            newDiceRoll.FixedAmount += currentValue;
                            break;

                        default:
                            throw new NotImplementedException("Mathoperator not supported");
                        }
                    }

                    //resetting
                    currentOperator = nextOperator;
                    nextOperator    = null;
                    currentPart     = "";
                }
            }
            //grouping dice
            newDiceRoll.Dice = Die.ConcatDice(newDiceRoll.Dice);
            return(newDiceRoll);
        }