Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Maple2.File.Parser/Maple2.File.Parser.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
<PackageTags>MapleStory2, File, Parser, m2d, xml</PackageTags>
<!-- Use following lines to write the generated files to disk. -->
<EmitCompilerGeneratedFiles Condition=" '$(Configuration)' == 'Debug' ">true</EmitCompilerGeneratedFiles>
<PackageVersion>2.4.13</PackageVersion>
<PackageVersion>2.4.14</PackageVersion>
<TargetFramework>net8.0</TargetFramework>
<PackageReadmeFile>README.md</PackageReadmeFile>
<ImplicitUsings>enable</ImplicitUsings>
Expand Down
13 changes: 13 additions & 0 deletions Maple2.File.Parser/TableParser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -1733,4 +1735,15 @@ public IEnumerable<JobTableNew> 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);
Comment on lines +1742 to +1746

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Guard against null ability before enumeration.

At Line [1745], data.ability can be null (e.g., empty/malformed table), causing a runtime NullReferenceException in Release builds where Debug.Assert is ignored. Add a null-safe guard before iterating.

Suggested fix
     var data = characterAbilitySerializer.Deserialize(reader) as CharacterAbilityRoot;
     Debug.Assert(data != null);

-    foreach (CharacterAbility entry in data.ability) {
+    if (data?.ability == null) {
+        yield break;
+    }
+
+    foreach (CharacterAbility entry in data.ability) {
         yield return (entry.id, entry);
     }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@Maple2.File.Parser/TableParser.cs` around lines 1742 - 1746, The loop assumes
data.ability is non-null but Debug.Assert is omitted in Release builds; update
the code around the deserialization (where you assign var data =
characterAbilitySerializer.Deserialize(reader) as CharacterAbilityRoot) to guard
against null ability on CharacterAbilityRoot (data == null or data.ability ==
null) before iterating over data.ability; if it's null, safely return/exit the
iterator (e.g., yield break) or handle the empty case so the foreach over
CharacterAbility does not throw.

}
}
}
18 changes: 18 additions & 0 deletions Maple2.File.Parser/Xml/Table/CharacterAbility.cs
Original file line number Diff line number Diff line change
@@ -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<CharacterAbility> ability;
}

public class CharacterAbility {
[XmlAttribute] public int id;
[XmlAttribute] public int categoryID;
[XmlAttribute] public int requireLevel;
[XmlAttribute] public int additionalEffectID;
[XmlAttribute] public int additionalEffectLevel;
}
7 changes: 7 additions & 0 deletions Maple2.File.Tests/TableParserTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -836,4 +836,11 @@ public void TestFamePickMethod() {
continue;
}
}

[TestMethod]
public void TestCharacterAbility() {
foreach ((_, _) in _parser.ParseCharacterAbility()) {
continue;
}
}
}
Loading