From be8007d3c467935e7d810aeb5a70bae24a604bcd Mon Sep 17 00:00:00 2001
From: Zin <62830952+Zintixx@users.noreply.github.com>
Date: Sat, 28 Feb 2026 11:32:02 -0800
Subject: [PATCH 1/2] quest group
---
Maple2.File.Parser/Maple2.File.Parser.csproj | 2 +-
Maple2.File.Parser/TableParser.cs | 13 +++++++++++++
Maple2.File.Parser/Xml/Table/QuestGroupTable.cs | 16 ++++++++++++++++
Maple2.File.Tests/TableParserTest.cs | 8 ++++++++
4 files changed, 38 insertions(+), 1 deletion(-)
create mode 100644 Maple2.File.Parser/Xml/Table/QuestGroupTable.cs
diff --git a/Maple2.File.Parser/Maple2.File.Parser.csproj b/Maple2.File.Parser/Maple2.File.Parser.csproj
index 4cb0c45..a01f8f2 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.3.6
+ 2.3.7
net8.0
README.md
enable
diff --git a/Maple2.File.Parser/TableParser.cs b/Maple2.File.Parser/TableParser.cs
index 68d066c..5268109 100644
--- a/Maple2.File.Parser/TableParser.cs
+++ b/Maple2.File.Parser/TableParser.cs
@@ -103,6 +103,7 @@ public class TableParser {
private readonly XmlSerializer statStringSerializer;
private readonly XmlSerializer autoActionPricePackageSerializer;
private readonly XmlSerializer pvpRankingDuelModeSerializer;
+ private readonly XmlSerializer questGroupSerializer;
private readonly string locale;
private readonly string language;
@@ -200,6 +201,7 @@ public TableParser(M2dReader xmlReader, string language) {
statStringSerializer = new XmlSerializer(typeof(StatStringRoot));
autoActionPricePackageSerializer = new XmlSerializer(typeof(AutoActionPricePackageRoot));
pvpRankingDuelModeSerializer = new XmlSerializer(typeof(PvpRankingDuelModeRoot));
+ questGroupSerializer = new XmlSerializer(typeof(QuestGroupRoot));
locale = FeatureLocaleFilter.Locale.ToLower();
this.language = language;
@@ -1562,4 +1564,15 @@ public IEnumerable ParseJobTableNew() {
yield return (entry.grade, entry);
}
}
+
+ public IEnumerable<(int Id, QuestGroup Data)> ParseQuestGroup() {
+ string xml = Sanitizer.RemoveEmpty(xmlReader.GetString(xmlReader.GetEntry("table/questgrouptable.xml")));
+ var reader = XmlReader.Create(new StringReader(xml));
+ var data = questGroupSerializer.Deserialize(reader) as QuestGroupRoot;
+ Debug.Assert(data != null);
+
+ foreach (QuestGroup entry in data.group) {
+ yield return (entry.id, entry);
+ }
+ }
}
diff --git a/Maple2.File.Parser/Xml/Table/QuestGroupTable.cs b/Maple2.File.Parser/Xml/Table/QuestGroupTable.cs
new file mode 100644
index 0000000..f746464
--- /dev/null
+++ b/Maple2.File.Parser/Xml/Table/QuestGroupTable.cs
@@ -0,0 +1,16 @@
+using System.Xml.Serialization;
+using M2dXmlGenerator;
+
+namespace Maple2.File.Parser.Xml.Table;
+
+// ./data/xml/table/questgrouptable.xml
+[XmlRoot("ms2")]
+public class QuestGroupRoot {
+ [XmlElement] public List group;
+}
+
+public class QuestGroup {
+ [XmlAttribute] public int id;
+ [XmlAttribute] public int pickCount;
+ [XmlAttribute] public string dependency;
+}
diff --git a/Maple2.File.Tests/TableParserTest.cs b/Maple2.File.Tests/TableParserTest.cs
index 4df0fc6..ce0b469 100644
--- a/Maple2.File.Tests/TableParserTest.cs
+++ b/Maple2.File.Tests/TableParserTest.cs
@@ -732,5 +732,13 @@ public void TestPvpRankingDuelMode() {
continue;
}
}
+
+ [TestMethod]
+ public void TestQuestGroup() {
+ var results = _parser.ParseQuestGroup().ToList();
+ foreach ((_, _) in _parser.ParseQuestGroup()) {
+ continue;
+ }
+ }
}
From 24fdaab25946d3f7532e18bd309eb2203e59bc85 Mon Sep 17 00:00:00 2001
From: Zin <62830952+Zintixx@users.noreply.github.com>
Date: Sat, 28 Feb 2026 11:37:32 -0800
Subject: [PATCH 2/2] cleanup
---
Maple2.File.Tests/TableParserTest.cs | 2 --
1 file changed, 2 deletions(-)
diff --git a/Maple2.File.Tests/TableParserTest.cs b/Maple2.File.Tests/TableParserTest.cs
index ce0b469..67ff68d 100644
--- a/Maple2.File.Tests/TableParserTest.cs
+++ b/Maple2.File.Tests/TableParserTest.cs
@@ -735,10 +735,8 @@ public void TestPvpRankingDuelMode() {
[TestMethod]
public void TestQuestGroup() {
- var results = _parser.ParseQuestGroup().ToList();
foreach ((_, _) in _parser.ParseQuestGroup()) {
continue;
}
}
}
-