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("??"); } }
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."); } } }