Example #1
0
 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);
        }
Example #3
0
        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);
        }
Example #4
0
 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);
 }
Example #5
0
 private Dictionary <Ability, AbilityScore> ParseAbilities(MonsterRaw raw, ref List <string> errors)
 {
     return(AbilityScore.GetFromString(raw.AbilityString, ref errors));
 }