public Spellcasting CheckForSpellcasting(List <Spell> spells, MonsterRaw raw, ref List <string> errors) { for (var i = 0; i < raw.Traits.Count; i++) { var trait = raw.Traits[i]; if (trait.Name.Equals("Spellcasting")) { var spellcasting = _spellParser.ParseSpellcasting(trait.Text, spells, ref errors); raw.Traits.RemoveAt(i); return(spellcasting); } } return(null); }
public Monster Parse(MonsterRaw raw, List <Spell> spells) { var errors = new List <string>(); var actions = raw.Actions.Where(r => r.Name?.Trim()?.Trim('.')?.Equals("Multiattack", StringComparison.InvariantCultureIgnoreCase) == false).ToList(); var multiActions = raw.Actions.Where(r => r.Name?.Trim()?.Trim('.')?.Equals("Multiattack", StringComparison.InvariantCultureIgnoreCase) == true || r.Name == null).ToList(); if (multiActions.Count > 1) { return(null); } var parsedActions = ParseActions(actions, errors, _dep); var monster = new Monster { Name = raw.Name, Abilities = ParseAbilities(raw, ref errors), Actions = parsedActions, Alignment = ParseAlignment(raw, errors), Armor = raw.Armor, Armorclass = raw.Armorclass, ChallengeRating = new ChallengeRating(raw.CR), ConditionImmune = ParseConditions(raw.ConditionImmune, errors), Immune = ParseDamageTypes(raw.Immune), Languages = raw.Languages, LegendaryActions = ParseActions(raw.LegendaryActions, errors, _dep).Select(a => new LegendaryAction { Action = a }).ToList(), MaximumHitpoints = raw.MaximumHitpoints, MultiattackAction = ParseMultiattack(multiActions, errors, parsedActions).FirstOrDefault(), Reactions = ParseActions(raw.Reactions, errors, _dep).Select(a => new Reaction { Action = a }).ToList(), Resist = ParseDamageTypes(raw.Resist), SavingThrows = raw.SavingThrows.ToDictionary(s => s.GetAbility(_dep), s => s.Modifier), Senses = ParseSenses(raw.Senses, errors), Size = (Size)(raw.SizeId ?? 2), Skillmodifiers = raw.Skills.ToDictionary(s => s.Skill, s => s.Modifier), Speed = ParseSpeed(raw.Speed, errors), Spellcasting = CheckForSpellcasting(spells, raw, ref errors, _dep), Traits = raw.Traits.Select(t => new Trait() { Name = t.Name, Text = t.Text }).ToList(), Race = ParseMonsterType(raw.Type), Vulnerable = ParseDamageTypes(raw.Vulnerable) }; monster.HitDie = GetHealthDies(monster.MaximumHitpoints, monster.Abilities["Constitution"], raw.SizeId); return(monster); }
public Monster Parse(MonsterRaw raw, List <Spell> spells) { var errors = new List <string>(); var monster = new Monster { Name = raw.Name, Abilities = ParseAbilities(raw, ref errors), Actions = ParseActions(raw.Actions, errors), Alignment = ParseAlignment(raw, errors), Armor = raw.Armor, Armorclass = raw.Armorclass, ChallengeRating = new ChallengeRating(raw.CR), ConditionImmune = ParseConditions(raw.ConditionImmune, errors), Immune = ParseDamageTypes(raw.Immune), Languages = raw.Languages, LegendaryActions = ParseActions(raw.LegendaryActions, errors).Select(a => new LegendaryAction { Action = a }).ToList(), MaximumHitpoints = raw.MaximumHitpoints, Reactions = ParseActions(raw.Reactions, errors).Select(a => new Reaction { Action = a }).ToList(), Resist = ParseDamageTypes(raw.Resist), SavingThrows = raw.SavingThrows.ToDictionary(s => s.Ability, s => s.Modifier), Senses = ParseSenses(raw.Senses, errors), Size = (Size)(raw.SizeId ?? 2), Skillmodifiers = raw.Skills.ToDictionary(s => s.Skill, s => s.Modifier), Speed = ParseSpeed(raw.Speed, errors), Spellcasting = CheckForSpellcasting(spells, raw, ref errors), Traits = raw.Traits.Select(t => new Trait() { Name = t.Name, Text = t.Text }).ToList(), Race = ParseMonsterType(raw.Type), Vulnerable = ParseDamageTypes(raw.Vulnerable) }; monster.HitDie = GetHealthDies(monster.MaximumHitpoints, monster.Abilities[Ability.Constitution], raw.SizeId); return(monster); }
private AlignmentDistribution ParseAlignment(MonsterRaw raw, List <string> errors) { foreach (Morality morality in Enum.GetValues(typeof(Morality))) { foreach (Order order in Enum.GetValues(typeof(Order))) { if (raw.Alignment.ToLower().Contains($"{order} {morality}".ToLower())) { return(new AlignmentDistribution(new Alignment(morality, order), raw.Alignment)); } } if (raw.Alignment.ToLower().Contains("any " + morality.ToString().ToLower() + "alignment")) { return(AlignmentDistribution.Any(raw.Alignment, morality)); } } foreach (Morality morality in Enum.GetValues(typeof(Morality))) { if (raw.Alignment.ToLower().Contains("any " + morality.ToString().ToLower() + "alignment")) { return(AlignmentDistribution.Any(raw.Alignment, morality)); } } if (raw.Alignment.Contains("neutral")) { return(new AlignmentDistribution(new Alignment(Morality.Neutral, Order.Neutral), raw.Alignment)); } if (raw.Alignment.Contains("any")) { return(AlignmentDistribution.Any(raw.Alignment)); } if (raw.Alignment.Contains("unaligned")) { return(AlignmentDistribution.Unaligned(raw.Alignment)); } errors.Add("Could not find Alignment"); return(null); }
private Dictionary <Ability, AbilityScore> ParseAbilities(MonsterRaw raw, ref List <string> errors) { return(AbilityScore.GetFromString(raw.AbilityString, ref errors)); }