コード例 #1
0
ファイル: PrettyPrinter.cs プロジェクト: envy/NDice
        private string DiceModToString(Expr.Dice.DiceMod mod)
        {
            switch (mod)
            {
            case Expr.Dice.DiceMod.None:
                return("");

            case Expr.Dice.DiceMod.KeepHighest:
                return("kh");

            case Expr.Dice.DiceMod.KeepLowest:
                return("kl");

            case Expr.Dice.DiceMod.DropHighest:
                return("dh");

            case Expr.Dice.DiceMod.DropLowest:
                return("dl");

            case Expr.Dice.DiceMod.CountSuccesses:
                return("cs");

            case Expr.Dice.DiceMod.MarginOfSuccess:
                return("ms");

            case Expr.Dice.DiceMod.Explode:
                return("x");

            case Expr.Dice.DiceMod.CompoundExplode:
                return("cx");

            case Expr.Dice.DiceMod.ReRoll:
                return("r");

            default:
                return("??");
            }
        }
コード例 #2
0
        private void GetDiceModifiers(Expr faces, out Expr.Dice.DiceMod mod, out Expr.Dice.ModOperator modOp, out Expr modValue)
        {
            Token tMod = Previous();

            switch (tMod.Lexeme)
            {
            case "r":
                mod = Expr.Dice.DiceMod.ReRoll;
                break;

            case "!":
            case "x":
                mod = Expr.Dice.DiceMod.Explode;
                break;

            case "!!":
            case "cx":
                mod = Expr.Dice.DiceMod.CompoundExplode;
                break;

            case "cs":
                mod = Expr.Dice.DiceMod.CountSuccesses;
                break;

            case "ms":
                mod = Expr.Dice.DiceMod.MarginOfSuccess;
                break;

            case "kh":
                mod = Expr.Dice.DiceMod.KeepHighest;
                break;

            case "kl":
                mod = Expr.Dice.DiceMod.KeepLowest;
                break;

            case "dh":
                mod = Expr.Dice.DiceMod.DropHighest;
                break;

            case "dl":
                mod = Expr.Dice.DiceMod.DropLowest;
                break;

            default:
                throw new ParserException($"Expected dice modifier, got '{tMod}'.");
            }

            // Now there should be a operator
            Token tModOp = Peek();

            modValue = null;
            switch (tModOp.Type)
            {
            case TokenType.Equal:
                modOp = Expr.Dice.ModOperator.Equal;
                Advance();
                break;

            case TokenType.Less:
                modOp = Expr.Dice.ModOperator.Less;
                Advance();
                break;

            case TokenType.LessEqual:
                modOp = Expr.Dice.ModOperator.LessEqual;
                Advance();
                break;

            case TokenType.Greater:
                modOp = Expr.Dice.ModOperator.Greater;
                Advance();
                break;

            case TokenType.GreaterEqual:
                modOp = Expr.Dice.ModOperator.GreaterEqual;
                Advance();
                break;

            case TokenType.Number:
                modOp    = Expr.Dice.ModOperator.Equal;
                modValue = Primary();
                break;

            default:
                if (mod == Expr.Dice.DiceMod.CountSuccesses)
                {
                    modOp    = Expr.Dice.ModOperator.Equal;
                    modValue = faces;
                }
                else
                {
                    modOp    = Expr.Dice.ModOperator.Equal;
                    modValue = new Expr.Literal(1.0d);
                }
                break;
            }

            if (modValue == null)
            {
                modValue = Call();
            }

            if (mod == Expr.Dice.DiceMod.KeepHighest || mod == Expr.Dice.DiceMod.KeepLowest ||
                mod == Expr.Dice.DiceMod.DropHighest || mod == Expr.Dice.DiceMod.DropLowest)
            {
                if (modOp != Expr.Dice.ModOperator.Equal)
                {
                    throw new ParserException($"{mod} only makes sense with operator equal.");
                }
            }
        }