public PurchaseMeleeWeaponTests() { var weapons = new List <Weapon> (); var wpn1 = new Weapon("Mace", 0f, "1d6", DamageTypes.Bludgeoning, 20, 2, 0, WeaponType.OneHanded, WeaponGroup.Hammers, WeaponTrainingLevel.Simple); wpn1.Value = 3000; var wpn2 = new Weapon("Bow", 0, "1d6", DamageTypes.Piercing, 20, 2, 0, WeaponType.Ranged, WeaponGroup.Bows, WeaponTrainingLevel.Martial); var wpn3 = new Weapon("Never Pick", 0, "1d6", DamageTypes.Piercing, 20, 2, 0, WeaponType.Ranged, WeaponGroup.Bows, WeaponTrainingLevel.Exotic); weapons.Add(wpn1); weapons.Add(wpn2); weapons.Add(wpn3); shop = new WeaponShop(weapons); subject = new PurchaseMeleeWeapon(shop); var proficiencies = new string[] { "simple" }; character = CharacterTestTemplates.AverageBob(); character.Inventory.CoinPurse.SetValue(30000); character.Offense.AddWeaponProficiencies(proficiencies); }
public FlurryOfBlowsTests() { monk = CharacterTestTemplates.MarkyMonk(); var strike = new MonkUnarmedStrike(); monk.Add(strike); }
public void ConfiguresTheAttacksBasedOnAttributesOfTheCharacter() { var sorcerer = CharacterTestTemplates.Sorcerer(); var claws = new Claws(); sorcerer.Add(claws); Assert.Equal(2, claws.NumberOfAttacks); Assert.Equal(2, claws.CriticalModifier.TotalValue); Assert.Equal(20, claws.CriticalThreat); Assert.Equal(AttackTypes.Special, claws.AttackType); Assert.Equal(0, claws.SaveDC); Assert.Equal(0, claws.Range); Assert.Equal(3, claws.RoundsPerDay); sorcerer.AbilityScores.SetScore(AbilityScoreTypes.Charisma, 16); Assert.Equal(6, claws.RoundsPerDay); Assert.Equal("1d4", claws.Damage.ToString()); sorcerer.AbilityScores.SetScore(AbilityScoreTypes.Strength, 16); Assert.Equal("1d4+3", claws.Damage.ToString()); Assert.Equal(3, claws.AttackBonus.TotalValue); Assert.Equal("2 claws +3 (1d4+3) 6 rounds/day", claws.DisplayString()); }
public void HasAttributesLoadedThatSpecifySpecialAbilities() { var c = CharacterTestTemplates.AverageBob(); c.Add(dwarf); AssertCharacter.ContainsFeature("Darkvision", c); }
public void CanBeUsedAnExtraTimeADayEveryTwoDruidLevelsAfterFourth() { var wildShape = new WildShape(); var donna = CharacterTestTemplates.DruidDonna(); donna.Add(wildShape); donna.SetLevel(6); Assert.Equal(2, wildShape.UsesPerDay); donna.SetLevel(8); Assert.Equal(3, wildShape.UsesPerDay); donna.SetLevel(12); Assert.Equal(5, wildShape.UsesPerDay); donna.SetLevel(13); Assert.Equal(5, wildShape.UsesPerDay); donna.SetLevel(17); Assert.Equal(7, wildShape.UsesPerDay); donna.SetLevel(18); Assert.Equal(8, wildShape.UsesPerDay); Assert.Equal("Wild Shape (8/day)", wildShape.DisplayString()); }
public void CanGetTheCharacterSheet() { var bob = CharacterTestTemplates.AverageBob(); var context = new CharacterContext(bob); Assert.Equal(bob, context.GetValue <CharacterSheet>("charactersheet")); }
public void ChooseAnAbilityAndApplyTheModifierToIt() { var wizard = CharacterTestTemplates.Wizard(); var enhance = new PhysicalEnhancement(); wizard.Add(enhance); //Modifiers have to equal one with the bonus Assert.Equal ( 31, wizard.AbilityScores.GetScore(AbilityScoreTypes.Strength) + wizard.AbilityScores.GetScore(AbilityScoreTypes.Dexterity) + wizard.AbilityScores.GetScore(AbilityScoreTypes.Constitution) ); wizard.SetLevel(15); Assert.Equal ( 34, wizard.AbilityScores.GetScore(AbilityScoreTypes.Strength) + wizard.AbilityScores.GetScore(AbilityScoreTypes.Dexterity) + wizard.AbilityScores.GetScore(AbilityScoreTypes.Constitution) ); }
public void AddsDiceToTheStatisticBasedOnLevelOfCharacter() { var character = CharacterTestTemplates.Cleric(); var diceStat = new DiceStatistic("stat-name", "1d6"); character.Add(diceStat); //Example based on channel energy var yaml = @"--- name: stat-name class: cleric dice: 1d6 rate: 2 start-level: 1"; var mod = new DiceClassLevelModifier(yaml.ParseYaml()); character.Add(mod); Assert.Equal("1d6", diceStat.DisplayString()); character.SetLevel(2); Assert.Equal("1d6", diceStat.DisplayString()); character.SetLevel(3); Assert.Equal("2d6", diceStat.DisplayString()); character.SetLevel(4); Assert.Equal("2d6", diceStat.DisplayString()); character.SetLevel(12); Assert.Equal("6d6", diceStat.DisplayString()); character.SetLevel(19); Assert.Equal("10d6", diceStat.DisplayString()); }
public void SometimesWantToDoForEveryFourInStatAddTwoSomewhereElse() { var character = CharacterTestTemplates.AverageBob(); var yaml = @"--- name: power attack modifier: base attack bonus modifier-type: circumstance every: 4 add: 2"; var statMod = new StatisticStatModifier(yaml.ParseYaml()); character.Add(statMod); Assert.Equal(0, statMod.Modifier); character.Offense.BaseAttackBonus.SetValue(3); Assert.Equal(0, statMod.Modifier); character.Offense.BaseAttackBonus.SetValue(4); Assert.Equal(2, statMod.Modifier); character.Offense.BaseAttackBonus.SetValue(7); Assert.Equal(2, statMod.Modifier); character.Offense.BaseAttackBonus.SetValue(8); Assert.Equal(4, statMod.Modifier); character.Offense.BaseAttackBonus.SetValue(11); Assert.Equal(4, statMod.Modifier); character.Offense.BaseAttackBonus.SetValue(12); Assert.Equal(6, statMod.Modifier); }
public void SelectsTenSkillsForClassSkills() { //Add twelve skills var skills = new Skill[] { new Skill("Skill 1", AbilityScoreTypes.Strength, false), new Skill("Skill 2", AbilityScoreTypes.Strength, false), new Skill("Skill 3", AbilityScoreTypes.Strength, false), new Skill("Skill 4", AbilityScoreTypes.Strength, false), new Skill("Skill 5", AbilityScoreTypes.Strength, false), new Skill("Skill 6", AbilityScoreTypes.Strength, false), new Skill("Skill 7", AbilityScoreTypes.Strength, false), new Skill("Skill 9", AbilityScoreTypes.Strength, false), new Skill("Skill 10", AbilityScoreTypes.Strength, false), new Skill("Skill 11", AbilityScoreTypes.Strength, false), new Skill("Skill 12", AbilityScoreTypes.Strength, false) }; var character = CharacterTestTemplates.AverageBob(); character.SkillRanks.FillSkills(skills); var subject = new ExpertCustomSteps(); subject.Execute(character.Components); Assert.Equal(character.SkillRanks.GetClassSkills().Count(), 10); }
public void ProvidesDamageBasedOnEnergyType() { var sorcerer = CharacterTestTemplates.Sorcerer(); var dragonType = new DragonType(); dragonType.EnergyType = "cold"; dragonType.BreathRange = 30; dragonType.BreathShape = "cone"; var draconic = new Mock <IDraconicBloodline>(); draconic.Setup(x => x.DragonType).Returns(dragonType); sorcerer.Add(draconic.Object); sorcerer.SetLevel(10); var breath = new BreathWeapon(); sorcerer.Add(breath); Assert.Equal("10d6", breath.Damage.ToString()); Assert.Equal(15, breath.SaveDC); sorcerer.AbilityScores.SetScore(AbilityScoreTypes.Charisma, 16); Assert.Equal(18, breath.SaveDC); Assert.Equal(1, breath.UsesPerDay); Assert.Equal("Breath Weapon (30' cone, 10d6 cold, DC 18, 1/day)", breath.DisplayString()); }
public void BasicYamlConfiguration() { var yaml = @" name: Bite attack-type: Melee damage: name: Bite Damage dice: 1d4 attack-bonus: name: Bite Attack Bonus base-value: 0"; var bite = new Bite(yaml.ParseYaml()); Assert.Equal("Bite", bite.Name); Assert.Equal(AttackTypes.Melee, bite.AttackType); Assert.Equal("1d4", bite.Damage.ToString()); Assert.Equal("Bite +0 (1d4)", bite.DisplayString()); var bob = CharacterTestTemplates.AverageBob(); bob.Add(bite); Assert.NotNull(bob.FindStat("Bite Attack Bonus")); Assert.NotNull(bob.FindStat("Bite Damage")); }
public void AddsToTheLanguageList() { var bob = CharacterTestTemplates.AverageBob(); bob.Add(new TongueOfSunAndMoon()); Assert.Contains("Tongue of Sun and Moon", bob.Languages.Select(x => x.Name)); }
public void AddingToCharacterGrantsNewClassSkill() { var character = CharacterTestTemplates.AverageBob().WithSkills(new string[] { "Knowledge Dungeoneering" }); character.Add(aberrant); Assert.True(character.SkillRanks.GetSkill("Knowledge Dungeoneering").ClassSkill); }
public void ProvidesImmunityToPoison() { var monk = CharacterTestTemplates.MarkyMonk(); monk.Add(new DiamondBody()); AssertCharacter.IsImmuneTo("poison", monk); }
public void GetReadySpellsReturnsEmptyListIfNoSpellsAreReady() { var cleric = CharacterTestTemplates.Cleric().WithDivineCasting(); var casting = cleric.Get <DivineCasting>(); AssertExtensions.EquivalentLists(new string[] { }, casting.GetReadySpells(6)); }
public void ConvertsDamageBasedOnCharacterSize() { var bob = CharacterTestTemplates.AverageBob(); bob.Size.SetSize(CharacterSize.Small, 4, 120); var yaml = @" name: Bite attack-type: Melee damage: name: Bite Damage dice: 1d4 attack-bonus: name: Bite Attack Bonus base-value: 0"; var bite = new Bite(yaml.ParseYaml()); bob.Add(bite); var modYaml = @" name: Bite Damage"; var sizeMod = new ConvertDamageDiceOnSizeModifier(modYaml.ParseYaml()); bob.Add(sizeMod); Assert.Equal("1d3", bite.Damage.ToString()); }
public void AuraOfCourageEnablesImmunityToFear() { var character = CharacterTestTemplates.AverageBob(); character.Add(new AuraOfCourage()); AssertCharacter.IsImmuneTo("Fear", character); }
public void AdjustDamageToMeetCharacterSize() { var monk = CharacterTestTemplates.MarkyMonk(); monk.Size.SetSize(CharacterSize.Small, 0, 0); monk.Add(unarmedStrike); Assert.Equal("1d4", unarmedStrike.Attack.Damage.ToString()); }
public void AddsUnarmedMeleeAttackToOffenseStats() { var monk = CharacterTestTemplates.MarkyMonk(); monk.Add(unarmedStrike); Assert.Contains(unarmedStrike.Attack, monk.Offense.Attacks()); Assert.Equal("1d6", unarmedStrike.Attack.Damage.ToString()); }
public void NeutralCharactersPickSomething() { var c = CharacterTestTemplates.Cleric(); c.Alignment = CharacterAlignment.Neutral; c.Add(channel); Assert.False(string.IsNullOrEmpty(channel.EnergyType)); }
public void PicksNegativeEnergyIfAlignmentIsEvil() { var c = CharacterTestTemplates.Cleric(); c.Alignment = CharacterAlignment.LawfulEvil; c.Add(channel); Assert.Equal(ChannelEnergy.NEGATIVE_ENERGY, channel.EnergyType); }
public void PicksPositiveEnergyIfAlignmentIsGood() { var c = CharacterTestTemplates.Cleric(); c.Alignment = CharacterAlignment.ChaoticGood; c.Add(channel); Assert.Equal(ChannelEnergy.POSITIVE_ENERGY, channel.EnergyType); }
public void CanAddPerformCharacterSkills() { var bard = CharacterTestTemplates.BardyBard().WithSkills(new string[] { "Perform (Oratory)" }); var versatilePerformance = new VersatilePerformance(); versatilePerformance.AddSkill(bard.SkillRanks.GetSkill("Perform (Oratory)")); AssertExtensions.Contains(bard.SkillRanks.GetSkill("Perform (Oratory)"), versatilePerformance.Skills); }
public void LevelsCanModifyStats() { var level = new Level(fighter); var character = CharacterTestTemplates.AverageBob(); character.Add(level); AssertCharacter.HasWillSave(1, "fear", character); }
public void CreatesAStatForTrackingUsesPerDay() { var character = CharacterTestTemplates.AverageBob(); var lay = new LayOnHands(); character.Add(lay); Assert.NotNull(character.FindStat(lay.UsesPerDayStatName())); }
public void AbilityIsNotQualifiedIfNotExceedingScore() { var pre = new AbilityPrerequisite(AbilityScoreTypes.Intelligence, 13); var c = CharacterTestTemplates.AverageBob(); c.AbilityScores.SetScore(AbilityScoreTypes.Intelligence, 11); Assert.False(pre.IsQualified(c.Components)); }
public void AddsDiceStatisticForHealingDice() { var character = CharacterTestTemplates.AverageBob(); var lay = new LayOnHands(); character.Add(lay); Assert.NotNull(character.FindStat("Lay On Hands Dice")); }
public void MeleeAttackUsesTheBaseAttackBonusForTheCharacterAsABase() { var bob = CharacterTestTemplates.AverageBob(); var calculator = bob.Get <MeleeAttackBonus>(); bob.Offense.BaseAttackBonus.SetValue(10); Assert.Equal(10, calculator.TotalValue); }
public void IfNoPreferredSkillsAvailableJustChooseOne() { var generic = CharacterTestTemplates.WithSkills(new string[] { "Climb" }); var skillFocus = SkillFocus.CreateForTesting(); generic.Add(skillFocus); Assert.Equal(3, generic.SkillRanks.GetScore("Climb")); }