public bool VerifyCharacterClassCompatibility(Alignment alignment, CharacterClass characterClass, ILevelRandomizer levelRandomizer, RaceRandomizer baseRaceRandomizer, RaceRandomizer metaraceRandomizer) { var baseRaces = baseRaceRandomizer.GetAllPossible(alignment, characterClass); var metaraces = metaraceRandomizer.GetAllPossible(alignment, characterClass); var races = GetAllRacePrototypes(baseRaces, metaraces); return races.Any(r => VerifyRaceCompatibility(r, characterClass, levelRandomizer)); }
public bool VerifyAlignmentCompatibility(Alignment alignment, IClassNameRandomizer classNameRandomizer, ILevelRandomizer levelRandomizer, RaceRandomizer baseRaceRandomizer, RaceRandomizer metaraceRandomizer) { var classNames = classNameRandomizer.GetAllPossibleResults(alignment); var levels = levelRandomizer.GetAllPossibleResults(); var characterClasses = GetAllCharacterClassPrototypes(classNames, levels); return characterClasses.Any(c => VerifyCharacterClassCompatibility(alignment, c, levelRandomizer, baseRaceRandomizer, metaraceRandomizer)); }
public bool VerifyRaceCompatibility(Race race, CharacterClass characterClass, ILevelRandomizer levelRandomizer) { if (levelRandomizer is ISetLevelRandomizer && (levelRandomizer as ISetLevelRandomizer).AllowAdjustments == false) return true; var levelAdjustments = adjustmentsSelector.SelectFrom(TableNameConstants.Set.Adjustments.LevelAdjustments); return characterClass.Level + levelAdjustments[race.BaseRace] + levelAdjustments[race.Metarace] > 0; }
private Alignment GenerateAlignment(IAlignmentRandomizer alignmentRandomizer, IClassNameRandomizer classNameRandomizer, ILevelRandomizer levelRandomizer, RaceRandomizer baseRaceRandomizer, RaceRandomizer metaraceRandomizer) { var alignment = generator.Generate(() => alignmentGenerator.GenerateWith(alignmentRandomizer), a => randomizerVerifier.VerifyAlignmentCompatibility(a, classNameRandomizer, levelRandomizer, baseRaceRandomizer, metaraceRandomizer)); if (alignment == null) throw new IncompatibleRandomizersException(); return alignment; }
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 CharacterClass GenerateWith(Alignment alignment, ILevelRandomizer levelRandomizer, IClassNameRandomizer classNameRandomizer) { var characterClass = new CharacterClass(); characterClass.Level = levelRandomizer.Randomize(); characterClass.Name = classNameRandomizer.Randomize(alignment); var tableName = string.Format(TableNameConstants.Formattable.TrueOrFalse.CLASSHasSpecialistFields, characterClass.Name); var isSpecialist = booleanPercentileSelector.SelectFrom(tableName); if (!isSpecialist) return characterClass; characterClass.SpecialistFields = GenerateSpecialistFields(characterClass, alignment); characterClass.ProhibitedFields = GenerateProhibitedFields(characterClass); return characterClass; }
public void Setup() { mockDice = new Mock<Dice>(); randomizer = new AnyLevelRandomizer(mockDice.Object); }
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; }
private void VerifyRandomizers(IAlignmentRandomizer alignmentRandomizer, IClassNameRandomizer classNameRandomizer, ILevelRandomizer levelRandomizer, RaceRandomizer baseRaceRandomizer, RaceRandomizer metaraceRandomizer) { var verified = randomizerVerifier.VerifyCompatibility(alignmentRandomizer, classNameRandomizer, levelRandomizer, baseRaceRandomizer, metaraceRandomizer); if (verified == false) throw new IncompatibleRandomizersException(); }
private Race GenerateRace(RaceRandomizer baseRaceRandomizer, RaceRandomizer metaraceRandomizer, Alignment alignment, CharacterClass characterClass, ILevelRandomizer levelRandomizer) { var race = generator.Generate(() => raceGenerator.GenerateWith(alignment, characterClass, baseRaceRandomizer, metaraceRandomizer), r => randomizerVerifier.VerifyRaceCompatibility(r, characterClass, levelRandomizer)); if (race == null) throw new IncompatibleRandomizersException(); return race; }
private CharacterClass GenerateCharacterClass(IClassNameRandomizer classNameRandomizer, ILevelRandomizer levelRandomizer, Alignment alignment, RaceRandomizer baseRaceRandomizer, RaceRandomizer metaraceRandomizer) { var characterClass = generator.Generate(() => characterClassGenerator.GenerateWith(alignment, levelRandomizer, classNameRandomizer), c => randomizerVerifier.VerifyCharacterClassCompatibility(alignment, c, levelRandomizer, baseRaceRandomizer, metaraceRandomizer)); if (characterClass == null) throw new IncompatibleRandomizersException(); return characterClass; }
public bool VerifyCompatibility(IAlignmentRandomizer alignmentRandomizer, IClassNameRandomizer classNameRandomizer, ILevelRandomizer levelRandomizer, RaceRandomizer baseRaceRandomizer, RaceRandomizer metaraceRandomizer) { var alignments = alignmentRandomizer.GetAllPossibleResults(); return alignments.Any(a => VerifyAlignmentCompatibility(a, classNameRandomizer, levelRandomizer, baseRaceRandomizer, metaraceRandomizer)); }