From 224491159a6208e7937bc9cd1d2dd3f24e787616 Mon Sep 17 00:00:00 2001 From: Zin <62830952+Zintixx@users.noreply.github.com> Date: Sun, 4 Oct 2026 09:57:49 -0700 Subject: [PATCH] Parse table/petevolution.xml Adds PetEvolution (requireItemLevel, Grade1-4) and TableParser.ParsePetEvolution. The client keys the table on the pet item's levelLimit and indexes the grades by the pet's rarity (PetEvolutionTable_GetMaxPoints). Maple2 needs it for pet evolution (MS2Community/PrivateMaple2#1508). Co-Authored-By: Claude Opus 5.5 (1M context) --- Maple2.File.Parser/Maple2.File.Parser.csproj | 2 +- Maple2.File.Parser/TableParser.cs | 12 ++++++++++++ Maple2.File.Parser/Xml/Table/PetEvolution.cs | 19 +++++++++++++++++++ Maple2.File.Tests/TableParserTest.cs | 3 +++ 4 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 Maple2.File.Parser/Xml/Table/PetEvolution.cs 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]