diff --git a/Maple2.File.Parser/Maple2.File.Parser.csproj b/Maple2.File.Parser/Maple2.File.Parser.csproj
index 4c68eb3..0d82b0d 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.2.1
+ 2.2.2
net8.0
README.md
enable
diff --git a/Maple2.File.Parser/TableParser.cs b/Maple2.File.Parser/TableParser.cs
index 7eaedf7..bfc6b57 100644
--- a/Maple2.File.Parser/TableParser.cs
+++ b/Maple2.File.Parser/TableParser.cs
@@ -70,6 +70,7 @@ public class TableParser {
private readonly XmlSerializer adventureLevelMissionSerializer;
private readonly XmlSerializer adventureLevelRewardSerializer;
private readonly XmlSerializer ugcDesignSerializer;
+ private readonly XmlSerializer masteryUgcHousingSerializer;
private readonly XmlSerializer bannerSerializer;
private readonly XmlSerializer nameTagSymbolSerializer;
private readonly XmlSerializer commonExpSerializer;
@@ -154,6 +155,7 @@ public TableParser(M2dReader xmlReader) {
adventureLevelMissionSerializer = new XmlSerializer(typeof(AdventureLevelMissionRoot));
adventureLevelRewardSerializer = new XmlSerializer(typeof(AdventureLevelRewardRoot));
ugcDesignSerializer = new XmlSerializer(typeof(UgcDesignRoot));
+ masteryUgcHousingSerializer = new XmlSerializer(typeof(MasteryUgcHousingRoot));
bannerSerializer = new XmlSerializer(typeof(BannerRoot));
nameTagSymbolSerializer = new XmlSerializer(typeof(NameTagSymbolRoot));
commonExpSerializer = new XmlSerializer(typeof(CommonExpRoot));
@@ -1006,6 +1008,17 @@ public IEnumerable ParseJobTable() {
}
}
+ public IEnumerable<(int Id, MasteryUgcHousing)> ParseMasteryUgcHousing() {
+ string xml = Sanitizer.RemoveEmpty(xmlReader.GetString(xmlReader.GetEntry("table/masteryugchousing.xml")));
+ var reader = XmlReader.Create(new StringReader(xml));
+ var data = masteryUgcHousingSerializer.Deserialize(reader) as MasteryUgcHousingRoot;
+ Debug.Assert(data != null);
+
+ foreach (MasteryUgcHousing entry in data.MasteryUgcHousing.Entries) {
+ yield return (entry.grade, entry);
+ }
+ }
+
public IEnumerable<(int Id, Banner Banner)> ParseBanner() {
string xml = Sanitizer.RemoveEmpty(xmlReader.GetString(xmlReader.GetEntry("table/na/banner.xml")));
var reader = XmlReader.Create(new StringReader(xml));
diff --git a/Maple2.File.Parser/Xml/Table/MasteryUgcHousingRoot.cs b/Maple2.File.Parser/Xml/Table/MasteryUgcHousingRoot.cs
new file mode 100644
index 0000000..c4e3c4e
--- /dev/null
+++ b/Maple2.File.Parser/Xml/Table/MasteryUgcHousingRoot.cs
@@ -0,0 +1,22 @@
+using System.Xml.Serialization;
+using M2dXmlGenerator;
+
+namespace Maple2.File.Parser.Xml.Table;
+
+// ./data/xml/table/masteryugchousing.xml
+[XmlRoot("ms2")]
+public partial class MasteryUgcHousingRoot {
+ [XmlElement("masteryUGCHousing")] public MasteryUgcHousingList MasteryUgcHousing;
+}
+
+public partial class MasteryUgcHousingList {
+ [XmlElement("v")] public List Entries;
+}
+
+public partial class MasteryUgcHousing {
+ [XmlAttribute] public int grade;
+ [XmlAttribute] public int value;
+ [XmlAttribute] public int rewardJobItemID;
+ [XmlAttribute] public int rewardJobItemRank;
+ [XmlAttribute] public int rewardJobItemCount;
+}
diff --git a/Maple2.File.Tests/TableParserTest.cs b/Maple2.File.Tests/TableParserTest.cs
index 07fac14..fc539ad 100644
--- a/Maple2.File.Tests/TableParserTest.cs
+++ b/Maple2.File.Tests/TableParserTest.cs
@@ -597,6 +597,15 @@ public void TestUgcDesign() {
}
}
+ [TestMethod]
+ public void TestMasteryUgcHousing() {
+ var parser = new TableParser(TestUtils.XmlReader);
+
+ foreach ((_, _) in parser.ParseMasteryUgcHousing()) {
+ continue;
+ }
+ }
+
[TestMethod]
public void TestBanner() {
var parser = new TableParser(TestUtils.XmlReader);