diff --git a/Maple2.File.Parser/Maple2.File.Parser.csproj b/Maple2.File.Parser/Maple2.File.Parser.csproj
index fe8d1a0..823ef50 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.13
+ 2.4.14
net8.0
README.md
enable
diff --git a/Maple2.File.Parser/TableParser.cs b/Maple2.File.Parser/TableParser.cs
index d16e8c4..255b4d1 100644
--- a/Maple2.File.Parser/TableParser.cs
+++ b/Maple2.File.Parser/TableParser.cs
@@ -116,6 +116,7 @@ public class TableParser {
private readonly XmlSerializer fameLimitSerializer;
private readonly XmlSerializer fameLogSerializer;
private readonly XmlSerializer famePickMethodSerializer;
+ private readonly XmlSerializer characterAbilitySerializer;
private readonly string locale;
private readonly string language;
@@ -226,6 +227,7 @@ public TableParser(M2dReader xmlReader, string language) {
fameLimitSerializer = new XmlSerializer(typeof(FameLimitRoot));
fameLogSerializer = new XmlSerializer(typeof(FameLogRoot));
famePickMethodSerializer = new XmlSerializer(typeof(FamePickMethod));
+ characterAbilitySerializer = new XmlSerializer(typeof(CharacterAbilityRoot));
locale = FeatureLocaleFilter.Locale.ToLower();
this.language = language;
@@ -1733,4 +1735,15 @@ public IEnumerable ParseJobTableNew() {
yield return (pickMethod.type, pickMethod.repeatType, pickMethod);
}
}
+
+ public IEnumerable<(int Id, CharacterAbility Ability)> ParseCharacterAbility() {
+ string xml = Sanitizer.RemoveEmpty(xmlReader.GetString(xmlReader.GetEntry($"table/characterability.xml")));
+ var reader = XmlReader.Create(new StringReader(xml));
+ var data = characterAbilitySerializer.Deserialize(reader) as CharacterAbilityRoot;
+ Debug.Assert(data != null);
+
+ foreach (CharacterAbility entry in data.ability) {
+ yield return (entry.id, entry);
+ }
+ }
}
diff --git a/Maple2.File.Parser/Xml/Table/CharacterAbility.cs b/Maple2.File.Parser/Xml/Table/CharacterAbility.cs
new file mode 100644
index 0000000..567b4b4
--- /dev/null
+++ b/Maple2.File.Parser/Xml/Table/CharacterAbility.cs
@@ -0,0 +1,18 @@
+using System.Xml.Serialization;
+using M2dXmlGenerator;
+
+namespace Maple2.File.Parser.Xml.Table;
+
+// ./data/xml/table/characterability.xml
+[XmlRoot("ms2")]
+public class CharacterAbilityRoot {
+ [XmlElement] public List ability;
+}
+
+public class CharacterAbility {
+ [XmlAttribute] public int id;
+ [XmlAttribute] public int categoryID;
+ [XmlAttribute] public int requireLevel;
+ [XmlAttribute] public int additionalEffectID;
+ [XmlAttribute] public int additionalEffectLevel;
+}
diff --git a/Maple2.File.Tests/TableParserTest.cs b/Maple2.File.Tests/TableParserTest.cs
index 872f680..38ab84a 100644
--- a/Maple2.File.Tests/TableParserTest.cs
+++ b/Maple2.File.Tests/TableParserTest.cs
@@ -836,4 +836,11 @@ public void TestFamePickMethod() {
continue;
}
}
+
+ [TestMethod]
+ public void TestCharacterAbility() {
+ foreach ((_, _) in _parser.ParseCharacterAbility()) {
+ continue;
+ }
+ }
}