private Monster ParseMonsterMatch(string name, string statBlock) { statBlock = statBlock.Trim(); var firstLine = statBlock.PopToken(PopType.Newline, out statBlock).Replace("*", string.Empty); var monster = new Monster { Name = name.Trim(), Size = firstLine.PopToken(PopType.Space, out firstLine), Type = firstLine.PopToken(PopType.Comma, out firstLine), Alignment = firstLine.Trim(), }; Extract.AC(monster, ref statBlock); Extract.HPAndDice(monster, ref statBlock); Extract.Speed(monster, ref statBlock); Extract.Skills(monster, ref statBlock); Extract.Senses(monster, ref statBlock); Extract.Languages(monster, ref statBlock); Extract.Saves(monster, ref statBlock); Extract.DamageImmunities(monster, ref statBlock); Extract.DamageResistances(monster, ref statBlock); Extract.DamageVulnerabilities(monster, ref statBlock); Extract.ConditionImmunities(monster, ref statBlock); Extract.Challenge(monster, ref statBlock); Extract.LegendaryResistances(monster, ref statBlock); Extract.Attributes(monster, ref statBlock); Extract.LegendaryActions(monster, ref statBlock); Extract.Reactions(monster, ref statBlock); Extract.Actions(monster, ref statBlock); Extract.InnateSpellcasting(monster, ref statBlock); Extract.Spellcasting(monster, ref statBlock); monster.WhatsLeft = statBlock; return(monster); }