public void DefaultReroll_ShouldBeNone() { var rollBuilder = RollBuilder.WithDie(Die.D6) .Targeting(Target.ValueAndAbove(4)) as RollBuilder; rollBuilder.RerollBehaviour.GetType().Should().Be <RerollNone>(); }
public void DefaultRollModifier_ShouldBeNoModifier() { var rollBuilder = RollBuilder.WithDie(Die.D6) .Targeting(Target.ValueAndAbove(4)) as RollBuilder; rollBuilder.RollModifier.GetType().Should().Be <NoModifier>(); }
public void GivenD6_NoReroll_NoModifier(int valueAndAboveTarget) { var roll = RollBuilder.WithDie(Die.D6) .Targeting(Target.ValueAndAbove(valueAndAboveTarget)) .Build(); // Calc - SuccessfulSideCount / Sides var expectedProbability = (7 - valueAndAboveTarget) / 6m; CheckProbability(roll, expectedProbability); }
public void GivenD6_NoReroll_NoModifier(int numberToGenerate, int expected) { var roll = RollBuilder.WithDie(Die.D6) .WithNumbers(new ForcedNumberGenerator(numberToGenerate)) .Targeting(Target.ValueAndAbove(3)) .Build(); var result = roll.Simulate(); _output.WriteLine(result.ToString()); result.Final.Should().Be(expected); }
public void GivenD6_RerollFailures_NoModifier(int targeting, int initialRoll, int reroll, bool expectedReroll, int expectedFinal, bool expectedSuccess) { var roll = RollBuilder.WithDie(Die.D6) .WithNumbers(new ForcedNumberGenerator(initialRoll, reroll)) .Targeting(Target.ValueAndAbove(targeting)) .WithReroll(Reroll.Failures) .Build(); var result = roll.Simulate(); _output.WriteLine(result.ToString()); ValidateRollResult(result, initialRoll, reroll, expectedReroll, expectedFinal, expectedSuccess); }
public void GivenD6_RerollOnes_WhenOneIsSuccess() { var die = Die.D6; var roll = RollBuilder.WithDie(die) .Targeting(Target.ValueAndAbove(1)) .WithReroll(Reroll.Ones) .Build(); // Calc - If the base probability is already 100%, reroll should not increase it further as you should not be rerolling. var expectedProbability = 1m; CheckProbability(roll, expectedProbability); }
public void GivenD6_RerollOnes(int valueAndAboveTarget) { var die = Die.D6; var roll = RollBuilder.WithDie(die) .Targeting(Target.ValueAndAbove(valueAndAboveTarget)) .WithReroll(Reroll.Ones) .Build(); // Calc - (SuccessfulSideCount / Sides) + ((1 / Sides) * (SuccessfulSideCount / Sides)) var decimalSides = (decimal)die.TotalSides; var successfulSideCount = die.TotalSides + 1 - valueAndAboveTarget; var expectedProbability = successfulSideCount / decimalSides + 1 / decimalSides * (successfulSideCount / decimalSides); CheckProbability(roll, expectedProbability); }
public void GivenD6_RerollOnes_ModifierDecreaseByOne(int valueAndAboveTarget) { var modifier = -1; var die = Die.D6; var roll = RollBuilder.WithDie(die) .Targeting(Target.ValueAndAbove(valueAndAboveTarget)) .WithReroll(Reroll.Ones) .WithModifier(modifier) .Build(); // Calc - See CalcRerollWithModifier var successfulSideCount = die.TotalSides + 1 - valueAndAboveTarget; var expectedProbability = CalcProbabilityForRerollWithModifier(die.TotalSides, successfulSideCount, 1, modifier); CheckProbability(roll, expectedProbability); }
public void GivenD6_NoReroll_ModifierDecreaseByOne(int valueAndAboveTarget) { var modifier = -1; var die = Die.D6; var roll = RollBuilder.WithDie(die) .Targeting(Target.ValueAndAbove(valueAndAboveTarget)) .WithReroll(Reroll.None) .WithModifier(-1) .Build(); // Calc - ((SuccessfulSideCount + ModifierAmount) / Sides) var decimalSides = (decimal)die.TotalSides; var successfulSideCount = die.TotalSides + 1 - valueAndAboveTarget; var expectedProbability = (successfulSideCount + modifier) / decimalSides; CheckProbability(roll, expectedProbability); }
/// <summary> /// Constructs the {RollBuilder} from the list of rolls and signs. /// </summary> /// <param name="rollTable">A list of strings containing representations of requested rolls.</param> /// <param name="signTable">A list of integers representing if the roll was added or subtracted.</param> /// <returns>A {RollBuilder} containing the represented rolls.</returns> private static RollBuilder ParseAndBuild(List <string> rollTable, List <int> signTable) { RollBuilder builder = new RollBuilder(); for (int i = 0; i < rollTable.Count; i++) { (string nakedRollText, FilterType filterType, int filterValue) = PaseFilter(rollTable[i]); (int count, int sides) = ParseRollText(nakedRollText); if (filterType == FilterType.ADVANTAGE) { filterValue = count; count *= 2; } else if (filterType == FilterType.DISADVANTAGE) { filterValue = count; count *= 2; } else if (filterType == FilterType.NONE) { filterType = FilterType.KEEP_HIGH; filterValue = count; } RollRequest r = builder.AddRequest(signTable[i], count, sides, filterType, filterValue); if (signTable[i] == -1) { r.IsNeg(); } } return(builder); }
/// <summary> /// Generate the RollBuilder and use it to roll. /// </summary> /// <param name="rollText">Text to use for building the roll.</param> /// <returns>A <see cref="List{List{RollResult}} containg the results of the roll." /></returns> private static List <List <RollResult> > BuildAndRoll(string rollText) { RollBuilder build = RollParser.Parse(rollText); return(build.Roll()); }