public override string ToString() { if (items.Count == 0) { return("0"); } StringBuilder sb = new StringBuilder(); for (int i = 0; i < items.Count; i++) { DiceItem item = items[i]; if (i > 0 || item.sign < 0) { sb.Append(item.sign < 0 ? '-' : '+'); } switch (item.type) { case DiceItem.TypeConstant: sb.Append(item.value); break; case DiceItem.TypeRandom: sb.Append(item.times).Append('d').Append(item.value); break; case DiceItem.TypeDamageBonus: sb.Append(item.times).Append("DB"); break; } } return(sb.ToString()); }
private static bool TryParseItem(StringReader reader, out DiceItem item, bool needSign) { int signCount = 0; int sign = 1; while (reader.HasNext) { char ch = reader.Peek(); if (ch == '+') { reader.Skip(); signCount++; } else if (ch == '-') { sign *= -1; reader.Skip(); signCount++; } else { break; } } if ((needSign && signCount == 0) || !reader.HasNext) { item = null; return(false); } int tStart = reader.Cursor; while (reader.HasNext && char.IsDigit(reader.Peek())) { reader.Skip(); } int times = tStart >= reader.Cursor ? 1 : int.Parse(reader.Data.Substring(tStart, reader.Cursor - tStart)); if (!reader.HasNext || (reader.Peek() != 'D' && reader.Peek() != 'd')) { item = DiceItem.Constant(sign, times); return(true); } reader.Skip(); if (!reader.HasNext) { item = null; return(false); } if (reader.Peek() == 'B' || reader.Peek() == 'b') { reader.Skip(); item = DiceItem.DamageBonus(sign, times); return(true); } else if (char.IsDigit(reader.Peek())) { int vStart = reader.Cursor; reader.Skip(); while (reader.HasNext && char.IsDigit(reader.Peek())) { reader.Skip(); } int value = vStart >= reader.Cursor ? 1 : int.Parse(reader.Data.Substring(vStart, reader.Cursor - vStart)); item = DiceItem.Random(sign, value, times); return(true); } else { item = null; return(false); } }
public static int Roll(int max) { return(DiceItem.NextInt(Math.Max(1, max))); }