Beispiel #1
0
        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());
        }
Beispiel #2
0
        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);
            }
        }
Beispiel #3
0
 public static int Roll(int max)
 {
     return(DiceItem.NextInt(Math.Max(1, max)));
 }