private void UpdateCreatureSpecialQualities(Creature creature) { var specialQualities = featsGenerator.GenerateSpecialQualities( CreatureConstants.Templates.HalfFiend, creature.Type, creature.HitPoints, creature.Abilities, creature.Skills, creature.CanUseEquipment, creature.Size, creature.Alignment); foreach (var sq in specialQualities) { var matching = creature.SpecialQualities.FirstOrDefault(f => f.Name == sq.Name && !f.Foci.Except(sq.Foci).Any() && !sq.Foci.Except(f.Foci).Any()); if (matching == null) { creature.SpecialQualities = creature.SpecialQualities.Union(new[] { sq }); } else if (matching.Power < sq.Power) { matching.Power = sq.Power; } } }
private void UpdateCreatureSpecialQualitiesAndFeats(Creature creature) { var featNamesToKeep = new List <string>(); featNamesToKeep.Add(FeatConstants.SpecialQualities.AttackBonus); var weaponProficiencies = collectionSelector.SelectFrom(TableNameConstants.Collection.FeatGroups, GroupConstants.WeaponProficiency); featNamesToKeep.AddRange(weaponProficiencies); var armorProficiencies = collectionSelector.SelectFrom(TableNameConstants.Collection.FeatGroups, GroupConstants.ArmorProficiency); featNamesToKeep.AddRange(armorProficiencies); var zombieQualities = featsGenerator.GenerateSpecialQualities( CreatureConstants.Templates.Zombie, creature.Type, creature.HitPoints, creature.Abilities, creature.Skills, creature.CanUseEquipment, creature.Size, creature.Alignment); creature.SpecialQualities = creature.SpecialQualities .Where(sq => featNamesToKeep.Contains(sq.Name)) .Union(zombieQualities); creature.Feats = creature.Feats.Where(f => featNamesToKeep.Contains(f.Name)); }
private void UpdateCreatureSpecialQualities(Creature creature) { var vampireQualities = featsGenerator.GenerateSpecialQualities( CreatureConstants.Templates.Vampire, creature.Type, creature.HitPoints, creature.Abilities, creature.Skills, creature.CanUseEquipment, creature.Size, creature.Alignment); creature.SpecialQualities = creature.SpecialQualities.Union(vampireQualities); }
public void GetSpecialQualities() { var feat1 = new SpecialQualitySelection(); feat1.Feat = "special quality 1"; var feat2 = new SpecialQualitySelection(); feat2.Feat = "special quality 2"; feat2.Power = 9266; feat2.Frequency.Quantity = 42; feat2.Frequency.TimePeriod = "fortnight"; specialQualitySelections.Add(feat1); specialQualitySelections.Add(feat2); var specialQualities = featsGenerator.GenerateSpecialQualities("creature", creatureType, hitPoints, abilities, skills, false, "size", alignment); var first = specialQualities.First(); var last = specialQualities.Last(); Assert.That(first.Name, Is.EqualTo("special quality 1")); Assert.That(first.Power, Is.Zero); Assert.That(first.Frequency.Quantity, Is.Zero); Assert.That(first.Frequency.TimePeriod, Is.Empty); Assert.That(last.Name, Is.EqualTo("special quality 2")); Assert.That(last.Power, Is.EqualTo(9266)); Assert.That(last.Frequency.Quantity, Is.EqualTo(42)); Assert.That(last.Frequency.TimePeriod, Is.EqualTo("fortnight")); }
private Creature GeneratePrototype(string creatureName, bool asCharacter) { var creature = new Creature(); creature.Name = creatureName; var creatureData = creatureDataSelector.SelectFor(creatureName); creature.Size = creatureData.Size; creature.Space.Value = creatureData.Space; creature.Reach.Value = creatureData.Reach; creature.CanUseEquipment = creatureData.CanUseEquipment; creature.ChallengeRating = creatureData.ChallengeRating; creature.LevelAdjustment = creatureData.LevelAdjustment; creature.CasterLevel = creatureData.CasterLevel; creature.NumberOfHands = creatureData.NumberOfHands; creature.Type = GetCreatureType(creatureName); creature.Abilities = abilitiesGenerator.GenerateFor(creatureName); if (advancementSelector.IsAdvanced(creatureName)) { var advancement = advancementSelector.SelectRandomFor(creatureName, creature.Type, creature.Size, creature.ChallengeRating); creature.IsAdvanced = true; creature.Size = advancement.Size; creature.Space.Value = advancement.Space; creature.Reach.Value = advancement.Reach; creature.CasterLevel += advancement.CasterLevelAdjustment; creature.ChallengeRating = advancement.AdjustedChallengeRating; creatureData.NaturalArmor += advancement.NaturalArmorAdjustment; creature.Abilities[AbilityConstants.Strength].AdvancementAdjustment += advancement.StrengthAdjustment; creature.Abilities[AbilityConstants.Dexterity].AdvancementAdjustment += advancement.DexterityAdjustment; creature.Abilities[AbilityConstants.Constitution].AdvancementAdjustment += advancement.ConstitutionAdjustment; creature.HitPoints = hitPointsGenerator.GenerateFor( creatureName, creature.Type, creature.Abilities[AbilityConstants.Constitution], creature.Size, advancement.AdditionalHitDice, asCharacter); } else { creature.HitPoints = hitPointsGenerator.GenerateFor( creatureName, creature.Type, creature.Abilities[AbilityConstants.Constitution], creature.Size, asCharacter: asCharacter); } if (creature.HitPoints.HitDiceQuantity == 0) { creature.ChallengeRating = ChallengeRatingConstants.Zero; } creature.Alignment = alignmentGenerator.Generate(creatureName); creature.Skills = skillsGenerator.GenerateFor(creature.HitPoints, creatureName, creature.Type, creature.Abilities, creature.CanUseEquipment, creature.Size); creature.Languages = languageGenerator.GenerateWith(creatureName, creature.Abilities, creature.Skills); creature.SpecialQualities = featsGenerator.GenerateSpecialQualities( creatureName, creature.Type, creature.HitPoints, creature.Abilities, creature.Skills, creature.CanUseEquipment, creature.Size, creature.Alignment); creature.BaseAttackBonus = attacksGenerator.GenerateBaseAttackBonus(creature.Type, creature.HitPoints); creature.Attacks = attacksGenerator.GenerateAttacks( creatureName, creatureData.Size, creature.Size, creature.BaseAttackBonus, creature.Abilities, creature.HitPoints.RoundedHitDiceQuantity); creature.Feats = featsGenerator.GenerateFeats( creature.HitPoints, creature.BaseAttackBonus, creature.Abilities, creature.Skills, creature.Attacks, creature.SpecialQualities, creature.CasterLevel, creature.Speeds, creatureData.NaturalArmor, creature.NumberOfHands, creature.Size, creature.CanUseEquipment); creature.Skills = skillsGenerator.ApplyBonusesFromFeats(creature.Skills, creature.Feats, creature.Abilities); creature.HitPoints = hitPointsGenerator.RegenerateWith(creature.HitPoints, creature.Feats); creature.GrappleBonus = attacksGenerator.GenerateGrappleBonus( creatureName, creature.Size, creature.BaseAttackBonus, creature.Abilities[AbilityConstants.Strength]); var allFeats = creature.Feats.Union(creature.SpecialQualities); creature.Attacks = attacksGenerator.ApplyAttackBonuses(creature.Attacks, allFeats, creature.Abilities); creature.Attacks = equipmentGenerator.AddAttacks(allFeats, creature.Attacks, creature.NumberOfHands); creature.Equipment = equipmentGenerator.Generate( creature.Name, creature.CanUseEquipment, allFeats, creature.HitPoints.RoundedHitDiceQuantity, creature.Attacks, creature.Abilities, creature.Size); creature.Abilities = abilitiesGenerator.SetMaxBonuses(creature.Abilities, creature.Equipment); creature.Skills = skillsGenerator.SetArmorCheckPenalties(creature.Name, creature.Skills, creature.Equipment); creature.InitiativeBonus = ComputeInitiativeBonus(creature.Feats); creature.Speeds = speedsGenerator.Generate(creature.Name); creature.ArmorClass = armorClassGenerator.GenerateWith( creature.Abilities, creature.Size, creatureName, creature.Type, allFeats, creatureData.NaturalArmor, creature.Equipment); creature.Saves = savesGenerator.GenerateWith(creature.Name, creature.Type, creature.HitPoints, allFeats, creature.Abilities); creature.Magic = magicGenerator.GenerateWith(creature.Name, creature.Alignment, creature.Abilities, creature.Equipment); return(creature); }
private IEnumerable <Feat> UpdateCreatureSpecialQualities( Creature creature, CreatureType animalCreatureType, HitPoints animalHitPoints, CreatureDataSelection animalData, IEnumerable <Skill> animalSkills) { var animalSpecialQualities = featsGenerator.GenerateSpecialQualities( AnimalSpecies, animalCreatureType, animalHitPoints, creature.Abilities, animalSkills, animalData.CanUseEquipment, animalData.Size, creature.Alignment); foreach (var sq in animalSpecialQualities) { var matching = creature.SpecialQualities.FirstOrDefault(f => f.Name == sq.Name && !f.Foci.Except(sq.Foci).Any() && !sq.Foci.Except(f.Foci).Any()); if (matching == null) { creature.SpecialQualities = creature.SpecialQualities.Union(new[] { sq }); } else if (matching.Power < sq.Power) { matching.Power = sq.Power; } } var lycanthropeSpecialQualities = featsGenerator.GenerateSpecialQualities( LycanthropeSpecies, creature.Type, creature.HitPoints, creature.Abilities, creature.Skills, creature.CanUseEquipment, creature.Size, creature.Alignment); foreach (var sq in lycanthropeSpecialQualities) { var matching = creature.SpecialQualities.FirstOrDefault(f => f.Name == sq.Name && !f.Foci.Except(sq.Foci).Any() && !sq.Foci.Except(f.Foci).Any()); if (matching == null) { creature.SpecialQualities = creature.SpecialQualities.Union(new[] { sq }); } else if (matching.Power < sq.Power) { matching.Power = sq.Power; } } return(animalSpecialQualities); }