Skip to content

Commit 8bec2a1

Browse files
Parse Adjustments on new XML format (#51)
* New Xml Adjustments * differentiate between locale and lang * More adjustments * formatting * small adjustments to be all uniform * More fixes. * Remove Language enum * rabbit comments * Update Maple2.File.Parser/SkillParser.cs --------- Co-authored-by: Ângelo Tadeucci <angelo_tadeucci@hotmail.com.br>
1 parent 62e3829 commit 8bec2a1

80 files changed

Lines changed: 1767 additions & 1716 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

Maple2.File.Parser/AdditionalEffectParser.cs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,13 @@ namespace Maple2.File.Parser;
99
public class AdditionalEffectParser {
1010
private readonly M2dReader xmlReader;
1111
private readonly XmlSerializer effectSerializer;
12+
private readonly XmlSerializer effectNewSerializer;
1213

1314
public AdditionalEffectParser(M2dReader xmlReader) {
1415
this.xmlReader = xmlReader;
16+
1517
effectSerializer = new XmlSerializer(typeof(AdditionalEffectLevelData));
18+
effectNewSerializer = new XmlSerializer(typeof(AdditionalEffectDataRootNew));
1619
}
1720

1821
public IEnumerable<(int Id, IList<AdditionalEffectData> Data)> Parse() {
@@ -27,4 +30,18 @@ public AdditionalEffectParser(M2dReader xmlReader) {
2730
yield return (effectId, data);
2831
}
2932
}
33+
34+
public IEnumerable<(int Id, IList<AdditionalEffectDataNew> Data)> ParseNew() {
35+
foreach (PackFileEntry entry in xmlReader.Files.Where(entry => entry.Name.StartsWith("additional/"))) {
36+
var root = effectNewSerializer.Deserialize(xmlReader.GetXmlReader(entry)) as AdditionalEffectDataRootNew;
37+
38+
Debug.Assert(root != null);
39+
40+
foreach (AdditionalEffectLevelDataNew data in root.additional) {
41+
//if (data.id != 10200201) continue;
42+
if (data.level.Count == 0) continue;
43+
yield return (data.id, data.level);
44+
}
45+
}
46+
}
3047
}

Maple2.File.Parser/Enum/Locale.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
namespace Maple2.File.Parser.Enum;
2+
3+
public enum Locale {
4+
KR,
5+
NA,
6+
TW,
7+
TH,
8+
JP,
9+
CN,
10+
}

Maple2.File.Parser/ItemOptionParser.cs

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -89,25 +89,27 @@ public class ItemOptionParser {
8989

9090
private readonly M2dReader xmlReader;
9191
private readonly XmlSerializer itemOptionConstantSerializer;
92-
private readonly XmlSerializer itemOptionConstantKrSerializer;
92+
private readonly XmlSerializer itemOptionConstantNewSerializer;
9393
private readonly XmlSerializer itemOptionSerializer;
94-
private readonly XmlSerializer itemOptionKrSerializer;
95-
private readonly XmlSerializer itemMergeOptionKrSerializer;
94+
private readonly XmlSerializer itemOptionNewSerializer;
95+
private readonly XmlSerializer itemMergeOptionNewSerializer;
9696
private readonly XmlSerializer itemMergeOptionSerializer;
9797
private readonly XmlSerializer itemOptionPickSerializer;
9898
private readonly XmlSerializer itemVariationSerializer;
99+
private readonly XmlSerializer itemVariationNewSerializer;
99100
private readonly XmlSerializer itemVariationIndexSerializer;
100101

101102
public ItemOptionParser(M2dReader xmlReader) {
102103
this.xmlReader = xmlReader;
103104
itemOptionConstantSerializer = new XmlSerializer(typeof(ItemOptionConstantRoot));
104-
itemOptionConstantKrSerializer = new XmlSerializer(typeof(ItemOptionConstantRootKR));
105+
itemOptionConstantNewSerializer = new XmlSerializer(typeof(ItemOptionConstantRootNew));
105106
itemOptionSerializer = new XmlSerializer(typeof(ItemOptionRoot));
106-
itemOptionKrSerializer = new XmlSerializer(typeof(ItemOptionRandomRootKR));
107-
itemMergeOptionKrSerializer = new XmlSerializer(typeof(ItemMergeOptionRootKR));
107+
itemOptionNewSerializer = new XmlSerializer(typeof(ItemOptionRandomRootNew));
108+
itemMergeOptionNewSerializer = new XmlSerializer(typeof(ItemMergeOptionRootNew));
108109
itemMergeOptionSerializer = new XmlSerializer(typeof(ItemMergeOptionRoot));
109110
itemOptionPickSerializer = new XmlSerializer(typeof(ItemOptionPickRoot));
110111
itemVariationSerializer = new XmlSerializer(typeof(ItemOptionVariation));
112+
itemVariationNewSerializer = new XmlSerializer(typeof(ItemOptionVariationNewRoot));
111113
itemVariationIndexSerializer = new XmlSerializer(typeof(ItemOptionVariationEquip));
112114
}
113115

@@ -127,11 +129,11 @@ public IEnumerable<ItemOptionConstantData> ParseConstant() {
127129
}
128130
}
129131

130-
public IEnumerable<ItemOptionConstant> ParseConstantKr() {
132+
public IEnumerable<ItemOptionConstant> ParseConstantNew() {
131133
string xml = Sanitizer.RemoveEmpty(xmlReader.GetString(xmlReader.GetEntry("table/itemoptionconstant.xml")));
132134
xml = Sanitizer.RemoveUtf8Bom(xml);
133135
var reader = XmlReader.Create(new StringReader(xml));
134-
var root = itemOptionConstantKrSerializer.Deserialize(reader) as ItemOptionConstantRootKR;
136+
var root = itemOptionConstantNewSerializer.Deserialize(reader) as ItemOptionConstantRootNew;
135137
Debug.Assert(root != null);
136138

137139
foreach (ItemOptionConstant option in root.options) {
@@ -157,14 +159,14 @@ public IEnumerable<ItemOptionData> ParseRandom() {
157159
}
158160
}
159161

160-
public IEnumerable<ItemOptionRandomKR> ParseRandomKr() {
162+
public IEnumerable<ItemOptionRandomNew> ParseRandomNew() {
161163
string xml = Sanitizer.RemoveEmpty(xmlReader.GetString(xmlReader.GetEntry("table/itemoptionrandom.xml")));
162164
xml = Sanitizer.RemoveUtf8Bom(xml);
163165
var reader = XmlReader.Create(new StringReader(xml));
164-
var root = itemOptionKrSerializer.Deserialize(reader) as ItemOptionRandomRootKR;
166+
var root = itemOptionNewSerializer.Deserialize(reader) as ItemOptionRandomRootNew;
165167
Debug.Assert(root != null);
166168

167-
foreach (ItemOptionRandomKR option in root.options) {
169+
foreach (ItemOptionRandomNew option in root.options) {
168170
if (option.code > 0) {
169171
yield return option;
170172
}
@@ -188,14 +190,14 @@ public IEnumerable<ItemOptionData> ParseStatic() {
188190
}
189191
}
190192

191-
public IEnumerable<MergeOptionKR> ParseMergeOptionBaseKr() {
193+
public IEnumerable<MergeOptionNew> ParseMergeOptionBaseNew() {
192194
string xml = Sanitizer.RemoveEmpty(xmlReader.GetString(xmlReader.GetEntry("table/itemmergeoptionbase.xml")));
193195
xml = Sanitizer.RemoveUtf8Bom(xml);
194196
var reader = XmlReader.Create(new StringReader(xml));
195-
var root = itemMergeOptionKrSerializer.Deserialize(reader) as ItemMergeOptionRootKR;
197+
var root = itemMergeOptionNewSerializer.Deserialize(reader) as ItemMergeOptionRootNew;
196198
Debug.Assert(root != null);
197199

198-
foreach (MergeOptionKR option in root.mergeOption) {
200+
foreach (MergeOptionNew option in root.mergeOption) {
199201
yield return option;
200202
}
201203
}
@@ -242,6 +244,16 @@ public IEnumerable<ItemOptionPick> ParsePick() {
242244
}
243245
}
244246

247+
public IEnumerable<ItemOptionVariationNewRoot.Option> ParseVariationNew() {
248+
XmlReader reader = xmlReader.GetXmlReader(xmlReader.GetEntry("table/itemoptionvariation.xml"));
249+
var data = itemVariationNewSerializer.Deserialize(reader) as ItemOptionVariationNewRoot;
250+
Debug.Assert(data != null);
251+
252+
foreach (ItemOptionVariationNewRoot.Option option in data.option) {
253+
yield return option;
254+
}
255+
}
256+
245257
public IEnumerable<(string Type, List<ItemOptionVariationEquip.Option> Option)> ParseVariationEquip() {
246258
foreach (string suffix in variationSuffix) {
247259
string filename = $"table/itemoptionvariation_{suffix}.xml";

Maple2.File.Parser/ItemParser.cs

Lines changed: 26 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
using System.Diagnostics;
22
using System.Xml;
33
using System.Xml.Serialization;
4-
using M2dXmlGenerator;
54
using Maple2.File.IO;
65
using Maple2.File.IO.Crypto.Common;
76
using Maple2.File.Parser.Xml.Item;
@@ -13,40 +12,44 @@ public class ItemParser {
1312
private readonly M2dReader xmlReader;
1413
private readonly XmlSerializer nameSerializer;
1514
private readonly XmlSerializer itemSerializer;
15+
private readonly XmlSerializer itemNewSerializer;
16+
private readonly string language;
1617

17-
public ItemParser(M2dReader xmlReader) {
18+
public ItemParser(M2dReader xmlReader, string language) {
1819
this.xmlReader = xmlReader;
20+
this.language = language.ToLower();
1921
nameSerializer = new XmlSerializer(typeof(StringMapping));
20-
Type type = FeatureLocaleFilter.Locale is "KR" ? typeof(ItemDataKR) : typeof(ItemDataRoot);
21-
itemSerializer = new XmlSerializer(type);
22-
22+
itemSerializer = new XmlSerializer(typeof(ItemDataRoot));
23+
itemNewSerializer = new XmlSerializer(typeof(ItemDataNew));
2324
}
2425

25-
public IEnumerable<(int Id, string Name, ItemData Data)> Parse<T>() where T : class {
26+
public IEnumerable<(int Id, string Name, ItemData Data)> Parse() {
2627
Dictionary<int, string> itemNames = ItemNames();
27-
string folderName = "item/";
28-
if (FeatureLocaleFilter.Locale == "KR") {
29-
folderName = "itemdata/";
28+
foreach (PackFileEntry entry in xmlReader.Files.Where(e => e.Name.StartsWith("item/"))) {
29+
var xml = itemSerializer.Deserialize(xmlReader.GetXmlReader(entry)) as ItemDataRoot;
30+
Debug.Assert(xml != null);
31+
32+
if (xml.environment == null) continue;
33+
int itemId = int.Parse(Path.GetFileNameWithoutExtension(entry.Name));
34+
yield return (itemId, itemNames.GetValueOrDefault(itemId, string.Empty), xml.environment);
3035
}
31-
foreach (PackFileEntry entry in xmlReader.Files.Where(e => e.Name.StartsWith(folderName))) {
32-
var xml = itemSerializer.Deserialize(xmlReader.GetXmlReader(entry)) as T;
33-
switch (xml) {
34-
case ItemDataRoot root when root.environment != null:
35-
int itemId = int.Parse(Path.GetFileNameWithoutExtension(entry.Name));
36-
yield return (itemId, itemNames.GetValueOrDefault(itemId, string.Empty), root.environment);
37-
break;
38-
case ItemDataKR rootKr:
39-
foreach (var dataRoot in rootKr.items) {
40-
if (dataRoot.environment == null) continue;
41-
yield return (dataRoot.id, itemNames.GetValueOrDefault(dataRoot.id, string.Empty), dataRoot.environment);
42-
}
43-
break;
36+
}
37+
38+
public IEnumerable<(int Id, string Name, ItemData Data)> ParseNew() {
39+
Dictionary<int, string> itemNames = ItemNames();
40+
foreach (PackFileEntry entry in xmlReader.Files.Where(e => e.Name.StartsWith("itemdata/"))) {
41+
var xml = itemNewSerializer.Deserialize(xmlReader.GetXmlReader(entry)) as ItemDataNew;
42+
Debug.Assert(xml != null);
43+
44+
foreach (ItemDataRootNew dataRoot in xml.item) {
45+
if (dataRoot.environment == null) continue;
46+
yield return (dataRoot.id, itemNames.GetValueOrDefault(dataRoot.id, string.Empty), dataRoot.environment);
4447
}
4548
}
4649
}
4750

4851
public Dictionary<int, string> ItemNames() {
49-
XmlReader reader = xmlReader.GetXmlReader(xmlReader.GetEntry("en/itemname.xml"));
52+
XmlReader reader = xmlReader.GetXmlReader(xmlReader.GetEntry($"{language}/itemname.xml"));
5053
var mapping = nameSerializer.Deserialize(reader) as StringMapping;
5154
Debug.Assert(mapping != null);
5255

Maple2.File.Parser/MapParser.cs

Lines changed: 25 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using M2dXmlGenerator;
55
using Maple2.File.IO;
66
using Maple2.File.IO.Crypto.Common;
7+
using Maple2.File.Parser.Enum;
78
using Maple2.File.Parser.Tools;
89
using Maple2.File.Parser.Xml.Map;
910
using Maple2.File.Parser.Xml.String;
@@ -14,50 +15,51 @@ public class MapParser {
1415
private readonly M2dReader xmlReader;
1516
public readonly XmlSerializer NameSerializer;
1617
public readonly XmlSerializer MapSerializer;
18+
public readonly XmlSerializer MapNewSerializer;
19+
private readonly string language;
1720

18-
public MapParser(M2dReader xmlReader) {
21+
public MapParser(M2dReader xmlReader, string language) {
1922
this.xmlReader = xmlReader;
23+
this.language = language;
2024
NameSerializer = new XmlSerializer(typeof(StringMapping));
21-
Type type = FeatureLocaleFilter.Locale == "KR" ? typeof(MapDataRootKR) : typeof(MapDataRoot);
22-
MapSerializer = new XmlSerializer(type);
25+
MapSerializer = new XmlSerializer(typeof(MapDataRoot));
26+
MapNewSerializer = new XmlSerializer(typeof(MapDataRootNew));
2327
}
2428

2529
public IEnumerable<(int Id, string Name, MapData Data)> Parse() {
2630
Dictionary<int, string> mapNames = ParseMapNames();
2731

28-
IEnumerable<PackFileEntry> entries;
29-
if (FeatureLocaleFilter.Locale == "KR") {
30-
entries = [xmlReader.GetEntry("table/fielddata.xml")];
31-
} else {
32-
entries = xmlReader.Files.Where(entry => entry.Name.StartsWith("map/"));
33-
}
34-
35-
foreach (PackFileEntry entry in entries) {
32+
foreach (PackFileEntry entry in xmlReader.Files.Where(entry => entry.Name.StartsWith("map/"))) {
3633
XmlReader reader = XmlReader.Create(new StringReader(Sanitizer.SanitizeMap(xmlReader.GetString(entry))));
37-
if (FeatureLocaleFilter.Locale == "KR") {
38-
var rootKr = MapSerializer.Deserialize(reader) as MapDataRootKR;
39-
Debug.Assert(rootKr != null);
40-
foreach (MapDataRootKR item in rootKr.fieldData) {
41-
if (item.environment == null) continue;
42-
MapData dataKr = item.environment;
43-
yield return (item.id, mapNames.GetValueOrDefault(item.id, string.Empty), dataKr);
44-
}
45-
continue;
46-
}
4734

4835
var root = MapSerializer.Deserialize(reader) as MapDataRoot;
4936
Debug.Assert(root != null);
5037

5138
MapData data = root.environment;
5239
if (data == null) continue;
53-
5440
int mapId = int.Parse(Path.GetFileNameWithoutExtension(entry.Name));
5541
yield return (mapId, mapNames.GetValueOrDefault(mapId, string.Empty), data);
5642
}
5743
}
5844

45+
public IEnumerable<(int Id, string Name, MapData Data)> ParseNew() {
46+
Dictionary<int, string> mapNames = ParseMapNames();
47+
48+
string xml = Sanitizer.RemoveEmpty(xmlReader.GetString(xmlReader.GetEntry("table/fielddata.xml")));
49+
xml = Sanitizer.SanitizeBool(xml);
50+
var reader = XmlReader.Create(new StringReader(xml));
51+
var data = MapNewSerializer.Deserialize(reader) as MapDataRootNew;
52+
Debug.Assert(data != null);
53+
54+
foreach (MapDataRootNew item in data.fieldData) {
55+
if (item.environment == null) continue;
56+
MapData mapData = item.environment;
57+
yield return (item.id, mapNames.GetValueOrDefault(item.id, string.Empty), mapData);
58+
}
59+
}
60+
5961
public Dictionary<int, string> ParseMapNames() {
60-
var reader = xmlReader.GetXmlReader(xmlReader.GetEntry("en/mapname.xml"));
62+
var reader = xmlReader.GetXmlReader(xmlReader.GetEntry($"{language}/mapname.xml"));
6163
var mapping = NameSerializer.Deserialize(reader) as StringMapping;
6264
Debug.Assert(mapping != null);
6365

Maple2.File.Parser/Maple2.File.Parser.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
<PackageTags>MapleStory2, File, Parser, m2d, xml</PackageTags>
1414
<!-- Use following lines to write the generated files to disk. -->
1515
<EmitCompilerGeneratedFiles Condition=" '$(Configuration)' == 'Debug' ">true</EmitCompilerGeneratedFiles>
16-
<PackageVersion>2.2.9</PackageVersion>
16+
<PackageVersion>2.3.0</PackageVersion>
1717
<TargetFramework>net8.0</TargetFramework>
1818
<PackageReadmeFile>README.md</PackageReadmeFile>
1919
<ImplicitUsings>enable</ImplicitUsings>

Maple2.File.Parser/NpcParser.cs

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using M2dXmlGenerator;
55
using Maple2.File.IO;
66
using Maple2.File.IO.Crypto.Common;
7+
using Maple2.File.Parser.Enum;
78
using Maple2.File.Parser.Tools;
89
using Maple2.File.Parser.Xml.Npc;
910
using Maple2.File.Parser.Xml.String;
@@ -14,17 +15,19 @@ public class NpcParser {
1415
private readonly M2dReader xmlReader;
1516
private readonly XmlSerializer nameSerializer;
1617
private readonly XmlSerializer npcSerializer;
17-
private readonly XmlSerializer npcKrSerializer;
18+
private readonly XmlSerializer npcNewSerializer;
19+
private readonly string language;
1820

19-
public NpcParser(M2dReader xmlReader) {
21+
public NpcParser(M2dReader xmlReader, string language) {
2022
this.xmlReader = xmlReader;
23+
this.language = language;
2124
nameSerializer = new XmlSerializer(typeof(StringMapping));
2225
npcSerializer = new XmlSerializer(typeof(NpcDataRoot));
23-
npcKrSerializer = new XmlSerializer(typeof(NpcDataListKR));
26+
npcNewSerializer = new XmlSerializer(typeof(NpcDataListNew));
2427
}
2528

2629
public Dictionary<int, string> ParseNpcNames() {
27-
XmlReader reader = xmlReader.GetXmlReader(xmlReader.GetEntry("en/npcname.xml"));
30+
XmlReader reader = xmlReader.GetXmlReader(xmlReader.GetEntry($"{language}/npcname.xml"));
2831
var npcNames = nameSerializer.Deserialize(reader) as StringMapping;
2932
Debug.Assert(npcNames != null);
3033
return npcNames.key.ToDictionary(key => int.Parse(key.id), key => key.name);
@@ -45,18 +48,18 @@ public Dictionary<int, string> ParseNpcNames() {
4548
}
4649
}
4750

48-
public IEnumerable<(int Id, string Name, NpcDataKR Data, List<EffectDummy> Dummy)> ParseKr() {
51+
public IEnumerable<(int Id, string Name, NpcDataNew Data, List<EffectDummy> Dummy)> ParseNew() {
4952
var npcNames = ParseNpcNames();
5053
foreach (PackFileEntry entry in xmlReader.Files.Where(entry => entry.Name.StartsWith("npcdata/"))) {
5154
var reader = XmlReader.Create(new StringReader(Sanitizer.SanitizeNpc(xmlReader.GetString(entry))));
52-
var rootKr = npcKrSerializer.Deserialize(reader) as NpcDataListKR;
55+
var rootKr = npcNewSerializer.Deserialize(reader) as NpcDataListNew;
5356
Debug.Assert(rootKr != null);
5457

55-
foreach (NpcDataRootKR item in rootKr.npcs) {
56-
NpcDataKR dataKr = item.environment;
57-
if (dataKr == null) continue;
58+
foreach (NpcDataRootNew item in rootKr.npcs) {
59+
NpcDataNew dataNew = item.environment;
60+
if (dataNew == null) continue;
5861

59-
yield return (item.id, npcNames.GetValueOrDefault(item.id, string.Empty), dataKr, dataKr.effectdummy);
62+
yield return (item.id, npcNames.GetValueOrDefault(item.id, string.Empty), dataNew, dataNew.effectdummy);
6063
}
6164
}
6265
}

0 commit comments

Comments
 (0)