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]