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
17 changes: 17 additions & 0 deletions Maple2.File.Parser/AdditionalEffectParser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,13 @@ namespace Maple2.File.Parser;
public class AdditionalEffectParser {
private readonly M2dReader xmlReader;
private readonly XmlSerializer effectSerializer;
private readonly XmlSerializer effectNewSerializer;

public AdditionalEffectParser(M2dReader xmlReader) {
this.xmlReader = xmlReader;

effectSerializer = new XmlSerializer(typeof(AdditionalEffectLevelData));
effectNewSerializer = new XmlSerializer(typeof(AdditionalEffectDataRootNew));
}

public IEnumerable<(int Id, IList<AdditionalEffectData> Data)> Parse() {
Expand All @@ -27,4 +30,18 @@ public AdditionalEffectParser(M2dReader xmlReader) {
yield return (effectId, data);
}
}

public IEnumerable<(int Id, IList<AdditionalEffectDataNew> Data)> ParseNew() {
foreach (PackFileEntry entry in xmlReader.Files.Where(entry => entry.Name.StartsWith("additional/"))) {
var root = effectNewSerializer.Deserialize(xmlReader.GetXmlReader(entry)) as AdditionalEffectDataRootNew;

Debug.Assert(root != null);

foreach (AdditionalEffectLevelDataNew data in root.additional) {
//if (data.id != 10200201) continue;
if (data.level.Count == 0) continue;
yield return (data.id, data.level);
}
}
}
}
10 changes: 10 additions & 0 deletions Maple2.File.Parser/Enum/Locale.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
namespace Maple2.File.Parser.Enum;

public enum Locale {
KR,
NA,
TW,
TH,
JP,
CN,
}
40 changes: 26 additions & 14 deletions Maple2.File.Parser/ItemOptionParser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -89,25 +89,27 @@ public class ItemOptionParser {

private readonly M2dReader xmlReader;
private readonly XmlSerializer itemOptionConstantSerializer;
private readonly XmlSerializer itemOptionConstantKrSerializer;
private readonly XmlSerializer itemOptionConstantNewSerializer;
private readonly XmlSerializer itemOptionSerializer;
private readonly XmlSerializer itemOptionKrSerializer;
private readonly XmlSerializer itemMergeOptionKrSerializer;
private readonly XmlSerializer itemOptionNewSerializer;
private readonly XmlSerializer itemMergeOptionNewSerializer;
private readonly XmlSerializer itemMergeOptionSerializer;
private readonly XmlSerializer itemOptionPickSerializer;
private readonly XmlSerializer itemVariationSerializer;
private readonly XmlSerializer itemVariationNewSerializer;
private readonly XmlSerializer itemVariationIndexSerializer;

public ItemOptionParser(M2dReader xmlReader) {
this.xmlReader = xmlReader;
itemOptionConstantSerializer = new XmlSerializer(typeof(ItemOptionConstantRoot));
itemOptionConstantKrSerializer = new XmlSerializer(typeof(ItemOptionConstantRootKR));
itemOptionConstantNewSerializer = new XmlSerializer(typeof(ItemOptionConstantRootNew));
itemOptionSerializer = new XmlSerializer(typeof(ItemOptionRoot));
itemOptionKrSerializer = new XmlSerializer(typeof(ItemOptionRandomRootKR));
itemMergeOptionKrSerializer = new XmlSerializer(typeof(ItemMergeOptionRootKR));
itemOptionNewSerializer = new XmlSerializer(typeof(ItemOptionRandomRootNew));
itemMergeOptionNewSerializer = new XmlSerializer(typeof(ItemMergeOptionRootNew));
itemMergeOptionSerializer = new XmlSerializer(typeof(ItemMergeOptionRoot));
itemOptionPickSerializer = new XmlSerializer(typeof(ItemOptionPickRoot));
itemVariationSerializer = new XmlSerializer(typeof(ItemOptionVariation));
itemVariationNewSerializer = new XmlSerializer(typeof(ItemOptionVariationNewRoot));
itemVariationIndexSerializer = new XmlSerializer(typeof(ItemOptionVariationEquip));
}

Expand All @@ -127,11 +129,11 @@ public IEnumerable<ItemOptionConstantData> ParseConstant() {
}
}

public IEnumerable<ItemOptionConstant> ParseConstantKr() {
public IEnumerable<ItemOptionConstant> ParseConstantNew() {
string xml = Sanitizer.RemoveEmpty(xmlReader.GetString(xmlReader.GetEntry("table/itemoptionconstant.xml")));
xml = Sanitizer.RemoveUtf8Bom(xml);
var reader = XmlReader.Create(new StringReader(xml));
var root = itemOptionConstantKrSerializer.Deserialize(reader) as ItemOptionConstantRootKR;
var root = itemOptionConstantNewSerializer.Deserialize(reader) as ItemOptionConstantRootNew;
Debug.Assert(root != null);

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

public IEnumerable<ItemOptionRandomKR> ParseRandomKr() {
public IEnumerable<ItemOptionRandomNew> ParseRandomNew() {
string xml = Sanitizer.RemoveEmpty(xmlReader.GetString(xmlReader.GetEntry("table/itemoptionrandom.xml")));
xml = Sanitizer.RemoveUtf8Bom(xml);
var reader = XmlReader.Create(new StringReader(xml));
var root = itemOptionKrSerializer.Deserialize(reader) as ItemOptionRandomRootKR;
var root = itemOptionNewSerializer.Deserialize(reader) as ItemOptionRandomRootNew;
Debug.Assert(root != null);

foreach (ItemOptionRandomKR option in root.options) {
foreach (ItemOptionRandomNew option in root.options) {
if (option.code > 0) {
yield return option;
}
Expand All @@ -188,14 +190,14 @@ public IEnumerable<ItemOptionData> ParseStatic() {
}
}

public IEnumerable<MergeOptionKR> ParseMergeOptionBaseKr() {
public IEnumerable<MergeOptionNew> ParseMergeOptionBaseNew() {
string xml = Sanitizer.RemoveEmpty(xmlReader.GetString(xmlReader.GetEntry("table/itemmergeoptionbase.xml")));
xml = Sanitizer.RemoveUtf8Bom(xml);
var reader = XmlReader.Create(new StringReader(xml));
var root = itemMergeOptionKrSerializer.Deserialize(reader) as ItemMergeOptionRootKR;
var root = itemMergeOptionNewSerializer.Deserialize(reader) as ItemMergeOptionRootNew;
Debug.Assert(root != null);

foreach (MergeOptionKR option in root.mergeOption) {
foreach (MergeOptionNew option in root.mergeOption) {
yield return option;
}
}
Expand Down Expand Up @@ -242,6 +244,16 @@ public IEnumerable<ItemOptionPick> ParsePick() {
}
}

public IEnumerable<ItemOptionVariationNewRoot.Option> ParseVariationNew() {
XmlReader reader = xmlReader.GetXmlReader(xmlReader.GetEntry("table/itemoptionvariation.xml"));
var data = itemVariationNewSerializer.Deserialize(reader) as ItemOptionVariationNewRoot;
Debug.Assert(data != null);

foreach (ItemOptionVariationNewRoot.Option option in data.option) {
yield return option;
}
}

public IEnumerable<(string Type, List<ItemOptionVariationEquip.Option> Option)> ParseVariationEquip() {
foreach (string suffix in variationSuffix) {
string filename = $"table/itemoptionvariation_{suffix}.xml";
Expand Down
49 changes: 26 additions & 23 deletions Maple2.File.Parser/ItemParser.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
using System.Diagnostics;
using System.Xml;
using System.Xml.Serialization;
using M2dXmlGenerator;
using Maple2.File.IO;
using Maple2.File.IO.Crypto.Common;
using Maple2.File.Parser.Xml.Item;
Expand All @@ -13,40 +12,44 @@ public class ItemParser {
private readonly M2dReader xmlReader;
private readonly XmlSerializer nameSerializer;
private readonly XmlSerializer itemSerializer;
private readonly XmlSerializer itemNewSerializer;
private readonly string language;

public ItemParser(M2dReader xmlReader) {
public ItemParser(M2dReader xmlReader, string language) {
this.xmlReader = xmlReader;
this.language = language.ToLower();
nameSerializer = new XmlSerializer(typeof(StringMapping));
Type type = FeatureLocaleFilter.Locale is "KR" ? typeof(ItemDataKR) : typeof(ItemDataRoot);
itemSerializer = new XmlSerializer(type);

itemSerializer = new XmlSerializer(typeof(ItemDataRoot));
itemNewSerializer = new XmlSerializer(typeof(ItemDataNew));
}

public IEnumerable<(int Id, string Name, ItemData Data)> Parse<T>() where T : class {
public IEnumerable<(int Id, string Name, ItemData Data)> Parse() {
Dictionary<int, string> itemNames = ItemNames();
string folderName = "item/";
if (FeatureLocaleFilter.Locale == "KR") {
folderName = "itemdata/";
foreach (PackFileEntry entry in xmlReader.Files.Where(e => e.Name.StartsWith("item/"))) {
var xml = itemSerializer.Deserialize(xmlReader.GetXmlReader(entry)) as ItemDataRoot;
Debug.Assert(xml != null);

if (xml.environment == null) continue;
int itemId = int.Parse(Path.GetFileNameWithoutExtension(entry.Name));
yield return (itemId, itemNames.GetValueOrDefault(itemId, string.Empty), xml.environment);
}
foreach (PackFileEntry entry in xmlReader.Files.Where(e => e.Name.StartsWith(folderName))) {
var xml = itemSerializer.Deserialize(xmlReader.GetXmlReader(entry)) as T;
switch (xml) {
case ItemDataRoot root when root.environment != null:
int itemId = int.Parse(Path.GetFileNameWithoutExtension(entry.Name));
yield return (itemId, itemNames.GetValueOrDefault(itemId, string.Empty), root.environment);
break;
case ItemDataKR rootKr:
foreach (var dataRoot in rootKr.items) {
if (dataRoot.environment == null) continue;
yield return (dataRoot.id, itemNames.GetValueOrDefault(dataRoot.id, string.Empty), dataRoot.environment);
}
break;
}

public IEnumerable<(int Id, string Name, ItemData Data)> ParseNew() {
Dictionary<int, string> itemNames = ItemNames();
foreach (PackFileEntry entry in xmlReader.Files.Where(e => e.Name.StartsWith("itemdata/"))) {
var xml = itemNewSerializer.Deserialize(xmlReader.GetXmlReader(entry)) as ItemDataNew;
Debug.Assert(xml != null);

foreach (ItemDataRootNew dataRoot in xml.item) {
if (dataRoot.environment == null) continue;
yield return (dataRoot.id, itemNames.GetValueOrDefault(dataRoot.id, string.Empty), dataRoot.environment);
}
}
}

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

Expand Down
48 changes: 25 additions & 23 deletions Maple2.File.Parser/MapParser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
using M2dXmlGenerator;
using Maple2.File.IO;
using Maple2.File.IO.Crypto.Common;
using Maple2.File.Parser.Enum;
using Maple2.File.Parser.Tools;
using Maple2.File.Parser.Xml.Map;
using Maple2.File.Parser.Xml.String;
Expand All @@ -14,50 +15,51 @@ public class MapParser {
private readonly M2dReader xmlReader;
public readonly XmlSerializer NameSerializer;
public readonly XmlSerializer MapSerializer;
public readonly XmlSerializer MapNewSerializer;
private readonly string language;

public MapParser(M2dReader xmlReader) {
public MapParser(M2dReader xmlReader, string language) {
this.xmlReader = xmlReader;
this.language = language;
NameSerializer = new XmlSerializer(typeof(StringMapping));
Type type = FeatureLocaleFilter.Locale == "KR" ? typeof(MapDataRootKR) : typeof(MapDataRoot);
MapSerializer = new XmlSerializer(type);
MapSerializer = new XmlSerializer(typeof(MapDataRoot));
MapNewSerializer = new XmlSerializer(typeof(MapDataRootNew));
}

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

IEnumerable<PackFileEntry> entries;
if (FeatureLocaleFilter.Locale == "KR") {
entries = [xmlReader.GetEntry("table/fielddata.xml")];
} else {
entries = xmlReader.Files.Where(entry => entry.Name.StartsWith("map/"));
}

foreach (PackFileEntry entry in entries) {
foreach (PackFileEntry entry in xmlReader.Files.Where(entry => entry.Name.StartsWith("map/"))) {
XmlReader reader = XmlReader.Create(new StringReader(Sanitizer.SanitizeMap(xmlReader.GetString(entry))));
if (FeatureLocaleFilter.Locale == "KR") {
var rootKr = MapSerializer.Deserialize(reader) as MapDataRootKR;
Debug.Assert(rootKr != null);
foreach (MapDataRootKR item in rootKr.fieldData) {
if (item.environment == null) continue;
MapData dataKr = item.environment;
yield return (item.id, mapNames.GetValueOrDefault(item.id, string.Empty), dataKr);
}
continue;
}

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

MapData data = root.environment;
if (data == null) continue;

int mapId = int.Parse(Path.GetFileNameWithoutExtension(entry.Name));
yield return (mapId, mapNames.GetValueOrDefault(mapId, string.Empty), data);
}
}

public IEnumerable<(int Id, string Name, MapData Data)> ParseNew() {
Dictionary<int, string> mapNames = ParseMapNames();

string xml = Sanitizer.RemoveEmpty(xmlReader.GetString(xmlReader.GetEntry("table/fielddata.xml")));
xml = Sanitizer.SanitizeBool(xml);
var reader = XmlReader.Create(new StringReader(xml));
var data = MapNewSerializer.Deserialize(reader) as MapDataRootNew;
Debug.Assert(data != null);

foreach (MapDataRootNew item in data.fieldData) {
if (item.environment == null) continue;
MapData mapData = item.environment;
yield return (item.id, mapNames.GetValueOrDefault(item.id, string.Empty), mapData);
}
}

public Dictionary<int, string> ParseMapNames() {
var reader = xmlReader.GetXmlReader(xmlReader.GetEntry("en/mapname.xml"));
var reader = xmlReader.GetXmlReader(xmlReader.GetEntry($"{language}/mapname.xml"));
var mapping = NameSerializer.Deserialize(reader) as StringMapping;
Debug.Assert(mapping != null);

Expand Down
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.2.9</PackageVersion>
<PackageVersion>2.3.0</PackageVersion>
<TargetFramework>net8.0</TargetFramework>
<PackageReadmeFile>README.md</PackageReadmeFile>
<ImplicitUsings>enable</ImplicitUsings>
Expand Down
23 changes: 13 additions & 10 deletions Maple2.File.Parser/NpcParser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
using M2dXmlGenerator;
using Maple2.File.IO;
using Maple2.File.IO.Crypto.Common;
using Maple2.File.Parser.Enum;
using Maple2.File.Parser.Tools;
using Maple2.File.Parser.Xml.Npc;
using Maple2.File.Parser.Xml.String;
Expand All @@ -14,17 +15,19 @@ public class NpcParser {
private readonly M2dReader xmlReader;
private readonly XmlSerializer nameSerializer;
private readonly XmlSerializer npcSerializer;
private readonly XmlSerializer npcKrSerializer;
private readonly XmlSerializer npcNewSerializer;
private readonly string language;

public NpcParser(M2dReader xmlReader) {
public NpcParser(M2dReader xmlReader, string language) {
this.xmlReader = xmlReader;
this.language = language;
nameSerializer = new XmlSerializer(typeof(StringMapping));
npcSerializer = new XmlSerializer(typeof(NpcDataRoot));
npcKrSerializer = new XmlSerializer(typeof(NpcDataListKR));
npcNewSerializer = new XmlSerializer(typeof(NpcDataListNew));
}

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

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

foreach (NpcDataRootKR item in rootKr.npcs) {
NpcDataKR dataKr = item.environment;
if (dataKr == null) continue;
foreach (NpcDataRootNew item in rootKr.npcs) {
NpcDataNew dataNew = item.environment;
if (dataNew == null) continue;

yield return (item.id, npcNames.GetValueOrDefault(item.id, string.Empty), dataKr, dataKr.effectdummy);
yield return (item.id, npcNames.GetValueOrDefault(item.id, string.Empty), dataNew, dataNew.effectdummy);
}
}
}
Expand Down
Loading
Loading