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); }
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); }