diff --git a/Maple2.File.Parser/Maple2.File.Parser.csproj b/Maple2.File.Parser/Maple2.File.Parser.csproj index a6b94ee..4017a59 100644 --- a/Maple2.File.Parser/Maple2.File.Parser.csproj +++ b/Maple2.File.Parser/Maple2.File.Parser.csproj @@ -13,7 +13,7 @@ MapleStory2, File, Parser, m2d, xml true - 2.4.25 + 2.4.26 net8.0 README.md enable diff --git a/Maple2.File.Parser/TableParser.cs b/Maple2.File.Parser/TableParser.cs index c45e1f4..bff97b4 100644 --- a/Maple2.File.Parser/TableParser.cs +++ b/Maple2.File.Parser/TableParser.cs @@ -57,6 +57,7 @@ public class TableParser { private readonly XmlSerializer masteryRewardSerializer; private readonly XmlSerializer paletteSerializer; private readonly XmlSerializer petExpSerializer; + private readonly XmlSerializer petEvolutionSerializer; private readonly XmlSerializer petPropertySerializer; private readonly XmlSerializer petSpawnInfoSerializer; private readonly XmlSerializer premiumClubEffectSerializer; @@ -176,6 +177,7 @@ public TableParser(M2dReader xmlReader, string language) { masteryRewardSerializer = new XmlSerializer(typeof(MasteryRewardRoot)); paletteSerializer = new XmlSerializer(typeof(ColorPaletteRoot)); petExpSerializer = new XmlSerializer(typeof(PetExpRoot)); + petEvolutionSerializer = new XmlSerializer(typeof(PetEvolutionRoot)); petPropertySerializer = new XmlSerializer(typeof(PetPropertyRoot)); petSpawnInfoSerializer = new XmlSerializer(typeof(PetSpawnInfoRoot)); premiumClubEffectSerializer = new XmlSerializer(typeof(PremiumClubEffectRoot)); @@ -761,6 +763,16 @@ public IEnumerable ParseJobTableNew() { } } + public IEnumerable<(short RequireItemLevel, PetEvolution Evolution)> ParsePetEvolution() { + XmlReader reader = xmlReader.GetXmlReader(xmlReader.GetEntry("table/petevolution.xml")); + var data = petEvolutionSerializer.Deserialize(reader) as PetEvolutionRoot; + Debug.Assert(data != null); + + foreach (PetEvolution evolution in data.petEvolution) { + yield return (evolution.requireItemLevel, evolution); + } + } + public IEnumerable<(int Id, PetProperty Property)> ParsePetProperty() { XmlReader reader = xmlReader.GetXmlReader(xmlReader.GetEntry("table/petproperty.xml")); var data = petPropertySerializer.Deserialize(reader) as PetPropertyRoot; diff --git a/Maple2.File.Parser/Xml/Table/PetEvolution.cs b/Maple2.File.Parser/Xml/Table/PetEvolution.cs new file mode 100644 index 0000000..2b7d9e6 --- /dev/null +++ b/Maple2.File.Parser/Xml/Table/PetEvolution.cs @@ -0,0 +1,19 @@ +using System.Xml.Serialization; +using M2dXmlGenerator; + +namespace Maple2.File.Parser.Xml.Table; + +// ./data/xml/table/petevolution.xml +// Evolution points a pet needs, keyed by the pet item's levelLimit; GradeN is the cap at rarity N. +[XmlRoot("ms2")] +public partial class PetEvolutionRoot { + [M2dFeatureLocale(Selector = "requireItemLevel")] private IList _petEvolution; +} + +public partial class PetEvolution : IFeatureLocale { + [XmlAttribute] public short requireItemLevel; + [XmlAttribute] public int Grade1; + [XmlAttribute] public int Grade2; + [XmlAttribute] public int Grade3; + [XmlAttribute] public int Grade4; +} diff --git a/Maple2.File.Tests/TableParserTest.cs b/Maple2.File.Tests/TableParserTest.cs index e67ade7..78ab3a6 100644 --- a/Maple2.File.Tests/TableParserTest.cs +++ b/Maple2.File.Tests/TableParserTest.cs @@ -349,6 +349,9 @@ public void TestParsePetTable() { foreach ((_, _) in _parser.ParsePetSpawnInfo()) { continue; } + foreach ((_, _) in _parser.ParsePetEvolution()) { + continue; + } } [TestMethod]