Example #1
0
        private bool CanAdjustStats(IStatsRandomizer statsRandomizer)
        {
            if ((statsRandomizer is ISetStatsRandomizer) == false)
                return true;

            var setStatsRandomizer = statsRandomizer as ISetStatsRandomizer;
            return setStatsRandomizer.AllowAdjustments;
        }
        public void Setup()
        {
            mockDice = new Mock<Dice>();
            var generator = new ConfigurableIterationGenerator(2);
            randomizer = new RawStatsRandomizer(mockDice.Object, generator);

            mockDice.Setup(d => d.Roll(It.IsAny<int>()).d(It.IsAny<int>()).AsSum()).Returns(1);
        }
        public void Setup()
        {
            mockDice = new Mock<Dice>();
            var generator = new ConfigurableIterationGenerator(2);
            randomizer = new OnesAsSixesStatsRandomizer(mockDice.Object, generator);

            mockDice.Setup(d => d.Roll(3).d(6).AsIndividualRolls()).Returns(new[] { 2, 3, 4 });
        }
        public void Setup()
        {
            mockDice = new Mock<Dice>();
            var generator = new ConfigurableIterationGenerator(2);
            randomizer = new BestOfFourStatsRandomizer(mockDice.Object, generator);

            mockDice.Setup(d => d.Roll("4d6k3").AsSum()).Returns(3);
        }
        public void Setup()
        {
            generator = new ConfigurableIterationGenerator(2);
            mockDice = new Mock<Dice>();
            mockDice.SetupSequence(d => d.Roll(3).d(6).AsSum())
                .Returns(min).Returns(max).Returns(middle)
                .Returns(min - 1).Returns(max + 1).Returns(middle);

            randomizer = new PoorStatsRandomizer(mockDice.Object, generator);
        }
        public Character GenerateWith(IAlignmentRandomizer alignmentRandomizer, IClassNameRandomizer classNameRandomizer,
            ILevelRandomizer levelRandomizer, RaceRandomizer baseRaceRandomizer, RaceRandomizer metaraceRandomizer,
            IStatsRandomizer statsRandomizer)
        {
            VerifyRandomizers(alignmentRandomizer, classNameRandomizer, levelRandomizer, baseRaceRandomizer, metaraceRandomizer);

            var character = GenerateCharacter(alignmentRandomizer, classNameRandomizer, levelRandomizer, baseRaceRandomizer, metaraceRandomizer,
                statsRandomizer);

            return character;
        }
        public EncounterCharacterGenerator(ICharacterGenerator characterGenerator, IAlignmentRandomizer alignmentRandomizer, IClassNameRandomizer anyPlayerClassNameRandomizer,
            ISetLevelRandomizer setLevelRandomizer, RaceRandomizer baseRaceRandomizer, RaceRandomizer metaraceRandomizer, IStatsRandomizer statsRandomizer,
            ICollectionSelector collectionSelector, ISetMetaraceRandomizer setMetaraceRandomizer, IClassNameRandomizer anyNPCClassNameRandomizer,
            ISetClassNameRandomizer setClassNameRandomizer, Dice dice)
        {
            this.characterGenerator = characterGenerator;
            this.alignmentRandomizer = alignmentRandomizer;
            this.anyPlayerClassNameRandomizer = anyPlayerClassNameRandomizer;
            this.setLevelRandomizer = setLevelRandomizer;
            this.baseRaceRandomizer = baseRaceRandomizer;
            this.metaraceRandomizer = metaraceRandomizer;
            this.statsRandomizer = statsRandomizer;
            this.collectionSelector = collectionSelector;
            this.setMetaraceRandomizer = setMetaraceRandomizer;
            this.anyNPCClassNameRandomizer = anyNPCClassNameRandomizer;
            this.setClassNameRandomizer = setClassNameRandomizer;
            this.dice = dice;

            challengeRatingRegex = new Regex(RegexConstants.ChallengeRatingPattern);
            setCharacterLevelRegex = new Regex(RegexConstants.SetCharacterLevelPattern);
            subTypeRegex = new Regex(RegexConstants.DescriptionPattern);
        }
Example #8
0
        public Dictionary<string, Stat> GenerateWith(IStatsRandomizer statsRandomizer, CharacterClass characterClass, Race race)
        {
            var stats = statsRandomizer.Randomize();

            if (CanAdjustStats(statsRandomizer))
            {
                stats = PrioritizeStats(stats, characterClass);
                stats = AdjustStats(race, stats);
                stats = SetMinimumStats(stats);
                stats = IncreaseStats(stats, characterClass, race);
            }
            else
            {
                stats = SetMinimumStats(stats);
            }

            var undead = collectionsSelector.SelectFrom(TableNameConstants.Set.Collection.MetaraceGroups, GroupConstants.Undead);

            if (undead.Contains(race.Metarace))
                stats.Remove(StatConstants.Constitution);

            return stats;
        }
 public LeadershipGenerator(ICharacterGenerator characterGenerator, ILeadershipSelector leadershipSelector, IPercentileSelector percentileSelector,
     IAdjustmentsSelector adjustmentsSelector, ISetLevelRandomizer setLevelRandomizer, ISetAlignmentRandomizer setAlignmentRandomizer,
     IAlignmentRandomizer anyAlignmentRandomizer, IClassNameRandomizer anyPlayerClassNameRandomizer, RaceRandomizer anyBaseRaceRandomizer,
     RaceRandomizer anyMetaraceRandomizer, IStatsRandomizer rawStatsRandomizer, IBooleanPercentileSelector booleanPercentileSelector,
     ICollectionsSelector collectionsSelector, IAlignmentGenerator alignmentGenerator, Generator generator, IClassNameRandomizer anyNPCClassNameRandomizer)
 {
     this.characterGenerator = characterGenerator;
     this.leadershipSelector = leadershipSelector;
     this.percentileSelector = percentileSelector;
     this.adjustmentsSelector = adjustmentsSelector;
     this.setLevelRandomizer = setLevelRandomizer;
     this.setAlignmentRandomizer = setAlignmentRandomizer;
     this.anyAlignmentRandomizer = anyAlignmentRandomizer;
     this.anyPlayerClassNameRandomizer = anyPlayerClassNameRandomizer;
     this.anyBaseRaceRandomizer = anyBaseRaceRandomizer;
     this.anyMetaraceRandomizer = anyMetaraceRandomizer;
     this.rawStatsRandomizer = rawStatsRandomizer;
     this.booleanPercentileSelector = booleanPercentileSelector;
     this.collectionsSelector = collectionsSelector;
     this.alignmentGenerator = alignmentGenerator;
     this.generator = generator;
     this.anyNPCClassNameRandomizer = anyNPCClassNameRandomizer;
 }
Example #10
0
        private Character GenerateCharacter(IAlignmentRandomizer alignmentRandomizer, IClassNameRandomizer classNameRandomizer,
            ILevelRandomizer levelRandomizer, RaceRandomizer baseRaceRandomizer, RaceRandomizer metaraceRandomizer,
            IStatsRandomizer statsRandomizer)
        {
            var character = new Character();

            character.Alignment = GenerateAlignment(alignmentRandomizer, classNameRandomizer, levelRandomizer, baseRaceRandomizer, metaraceRandomizer);
            character.Class = GenerateCharacterClass(classNameRandomizer, levelRandomizer, character.Alignment, baseRaceRandomizer, metaraceRandomizer);
            character.Race = GenerateRace(baseRaceRandomizer, metaraceRandomizer, character.Alignment, character.Class, levelRandomizer);

            if ((levelRandomizer is ISetLevelRandomizer) == false || (levelRandomizer as ISetLevelRandomizer).AllowAdjustments)
            {
                var levelAdjustments = adjustmentsSelector.SelectFrom(TableNameConstants.Set.Adjustments.LevelAdjustments);
                character.Class.Level += levelAdjustments[character.Race.BaseRace];
                character.Class.Level += levelAdjustments[character.Race.Metarace];
            }

            character.Class.SpecialistFields = characterClassGenerator.RegenerateSpecialistFields(character.Alignment, character.Class, character.Race);

            var stats = abilitiesGenerator.GenerateStats(character.Class, character.Race, statsRandomizer);
            var baseAttack = combatGenerator.GenerateBaseAttackWith(character.Class, character.Race, stats);

            character.Ability = abilitiesGenerator.GenerateWith(character.Class, character.Race, stats, baseAttack);
            character.Equipment = equipmentGenerator.GenerateWith(character.Ability.Feats, character.Class, character.Race);

            var armorCheckPenaltySkills = collectionsSelector.SelectFrom(TableNameConstants.Set.Collection.SkillGroups, GroupConstants.ArmorCheckPenalty);
            var armorCheckPenalties = adjustmentsSelector.SelectFrom(TableNameConstants.Set.Adjustments.ArmorCheckPenalties);

            if (character.Equipment.Armor != null)
            {
                foreach (var skill in armorCheckPenaltySkills)
                {
                    if (character.Ability.Skills.ContainsKey(skill) == false)
                        continue;

                    if (skill == SkillConstants.Swim && character.Equipment.Armor.Name == ArmorConstants.PlateArmorOfTheDeep)
                        continue;

                    character.Ability.Skills[skill].ArmorCheckPenalty += armorCheckPenalties[character.Equipment.Armor.Name];

                    var specialMaterials = character.Equipment.Armor.Traits.Intersect(armorCheckPenalties.Keys);
                    foreach (var material in specialMaterials)
                        character.Ability.Skills[skill].ArmorCheckPenalty += armorCheckPenalties[material];

                    character.Ability.Skills[skill].ArmorCheckPenalty = Math.Min(0, character.Ability.Skills[skill].ArmorCheckPenalty);
                }
            }

            if (character.Equipment.OffHand != null && character.Equipment.OffHand.Attributes.Contains(AttributeConstants.Shield))
            {
                foreach (var skill in armorCheckPenaltySkills)
                {
                    if (character.Ability.Skills.ContainsKey(skill) == false)
                        continue;

                    character.Ability.Skills[skill].ArmorCheckPenalty += armorCheckPenalties[character.Equipment.OffHand.Name];

                    var specialMaterials = character.Equipment.OffHand.Traits.Intersect(armorCheckPenalties.Keys);
                    foreach (var material in specialMaterials)
                        character.Ability.Skills[skill].ArmorCheckPenalty += armorCheckPenalties[material];

                    character.Ability.Skills[skill].ArmorCheckPenalty = Math.Min(0, character.Ability.Skills[skill].ArmorCheckPenalty);
                }
            }

            if (character.Ability.Skills.ContainsKey(SkillConstants.Swim))
                character.Ability.Skills[SkillConstants.Swim].ArmorCheckPenalty *= 2;

            character.Combat = combatGenerator.GenerateWith(baseAttack, character.Class, character.Race, character.Ability.Feats, character.Ability.Stats, character.Equipment);
            character.InterestingTrait = percentileSelector.SelectFrom(TableNameConstants.Set.Percentile.Traits);
            character.Magic = magicGenerator.GenerateWith(character.Alignment, character.Class, character.Race, character.Ability.Stats, character.Ability.Feats, character.Equipment);

            return character;
        }
Example #11
0
 public Dictionary<string, Stat> GenerateStats(CharacterClass characterClass, Race race, IStatsRandomizer statsRandomizer)
 {
     return statsGenerator.GenerateWith(statsRandomizer, characterClass, race);
 }