From 67736bdddd88f91a4b0b84cb1b90cbc2a089dd57 Mon Sep 17 00:00:00 2001 From: Zin <62830952+Zintixx@users.noreply.github.com> Date: Thu, 29 May 2025 16:47:34 -0700 Subject: [PATCH 1/9] New Xml Adjustments --- Maple2.File.Parser/AdditionalEffectParser.cs | 20 ++++++- Maple2.File.Parser/ItemParser.cs | 50 ++++++++-------- .../Xml/AdditionalEffect/AdditionalEffect.cs | 47 ++++++++++++++- .../Xml/AdditionalEffect/BasicProperty.cs | 14 ++--- .../Xml/AdditionalEffect/StatusProperty.cs | 57 ++++++++++++++++++- Maple2.File.Parser/Xml/Item/Item.cs | 8 +-- Maple2.File.Parser/Xml/Item/Property.cs | 1 + .../AdditionalEffectParserTest.cs | 14 +++-- Maple2.File.Tests/FunctionCubeParserTest.cs | 4 +- Maple2.File.Tests/ItemOptionParserTest.cs | 12 ++-- Maple2.File.Tests/ItemParserTest.cs | 33 +++++------ Maple2.File.Tests/MapParserTest.cs | 8 +-- Maple2.File.Tests/NifParserTest.cs | 2 +- Maple2.File.Tests/NpcParserTest.cs | 8 +-- Maple2.File.Tests/QuestParserTest.cs | 8 +-- Maple2.File.Tests/RidingParserTest.cs | 4 +- Maple2.File.Tests/ScriptParserTest.cs | 8 +-- Maple2.File.Tests/SkillParserTest.cs | 8 +-- Maple2.File.Tests/TableParserKRTest.cs | 4 +- Maple2.File.Tests/TestUtils.cs | 44 -------------- Maple2.File.Tests/XBlockParserTest.cs | 4 +- 21 files changed, 217 insertions(+), 141 deletions(-) diff --git a/Maple2.File.Parser/AdditionalEffectParser.cs b/Maple2.File.Parser/AdditionalEffectParser.cs index 6938c33..c7f7494 100644 --- a/Maple2.File.Parser/AdditionalEffectParser.cs +++ b/Maple2.File.Parser/AdditionalEffectParser.cs @@ -1,7 +1,8 @@ -using System.Diagnostics; +using System.Diagnostics; using System.Xml.Serialization; using Maple2.File.IO; using Maple2.File.IO.Crypto.Common; +using Maple2.File.Parser.Tools; using Maple2.File.Parser.Xml.AdditionalEffect; namespace Maple2.File.Parser; @@ -9,10 +10,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 Data)> Parse() { @@ -27,4 +31,18 @@ public AdditionalEffectParser(M2dReader xmlReader) { yield return (effectId, data); } } + + public IEnumerable<(int Id, IList 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, null); + } + } + } } diff --git a/Maple2.File.Parser/ItemParser.cs b/Maple2.File.Parser/ItemParser.cs index 28df2ec..baf24a4 100644 --- a/Maple2.File.Parser/ItemParser.cs +++ b/Maple2.File.Parser/ItemParser.cs @@ -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; @@ -13,40 +12,45 @@ public class ItemParser { private readonly M2dReader xmlReader; private readonly XmlSerializer nameSerializer; private readonly XmlSerializer itemSerializer; + private readonly XmlSerializer itemNewSerializer; + private readonly bool newXml; + private readonly string locale; - public ItemParser(M2dReader xmlReader) { + public ItemParser(M2dReader xmlReader, string locale) { this.xmlReader = xmlReader; + this.locale = locale.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() where T : class { + public IEnumerable<(int Id, string Name, ItemData Data)> Parse() { Dictionary 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 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 ItemNames() { - XmlReader reader = xmlReader.GetXmlReader(xmlReader.GetEntry("en/itemname.xml")); + XmlReader reader = xmlReader.GetXmlReader(xmlReader.GetEntry($"{locale}/itemname.xml")); var mapping = nameSerializer.Deserialize(reader) as StringMapping; Debug.Assert(mapping != null); diff --git a/Maple2.File.Parser/Xml/AdditionalEffect/AdditionalEffect.cs b/Maple2.File.Parser/Xml/AdditionalEffect/AdditionalEffect.cs index 014b792..4ea4d33 100644 --- a/Maple2.File.Parser/Xml/AdditionalEffect/AdditionalEffect.cs +++ b/Maple2.File.Parser/Xml/AdditionalEffect/AdditionalEffect.cs @@ -1,4 +1,4 @@ -using System.Xml.Serialization; +using System.Xml.Serialization; using Maple2.File.Parser.Xml.Skill; using M2dXmlGenerator; @@ -39,3 +39,48 @@ public partial class AdditionalEffectData : IFeatureLocale { [XmlElement] public List splashSkill; [XmlElement] public List conditionSkill; } + +// ./data/xml/additional/%03d.xml +[XmlRoot("ms2")] +public partial class AdditionalEffectDataRootNew { + [XmlElement] public List additional; +} + +public partial class AdditionalEffectLevelDataNew { + [XmlAttribute] public int id; + //[XmlElement] public List level; + [M2dFeatureLocale] private IList _level; +} + +public partial class AdditionalEffectDataNew : IFeatureLocale { +// [M2dArray] public string[] stringParam = Array.Empty(); +// [XmlElement] public BeginCondition beginCondition; + [XmlElement] public BasicProperty BasicProperty; + /*[XmlElement] public MotionProperty MotionProperty; + [XmlElement] public CancelEffectProperty CancelEffectProperty; + [XmlElement] public ImmuneEffectProperty ImmuneEffectProperty; + [XmlElement] public ResetSkillCoolDownTimeProperty ResetSkillCoolDownTimeProperty; + [XmlElement] public ModifyEffectDurationProperty ModifyEffectDurationProperty; + [XmlElement] public ModifyOverlapCountProperty ModifyOverlapCountProperty; + [XmlElement] public StatusPropertyNew StatusProperty; + [XmlElement] public StatNew Stat; + [XmlElement] public SpecialAbilityNew SpecialAbility; + [XmlElement] public FinalStatusProperty FinalStatusProperty; + [XmlElement] public OffensiveProperty OffensiveProperty; + [XmlElement] public DefensiveProperty DefensiveProperty; + [XmlElement] public RecoveryProperty RecoveryProperty; + [XmlElement] public ExpProperty ExpProperty; + [XmlElement] public DotDamageProperty DotDamageProperty; + [XmlElement] public DotBuffProperty DotBuffProperty; + [XmlElement] public ConsumeProperty ConsumeProperty; + [XmlElement] public ReflectProperty ReflectProperty; + [XmlElement] public UIProperty UIProperty; + [XmlElement] public ShieldProperty ShieldProperty; + [XmlElement] public MesoGuardProperty MesoGuardProperty; + [XmlElement] public InvokeEffectProperty InvokeEffectProperty; + [XmlElement] public SpecialEffectProperty SpecialEffectProperty; + [XmlElement] public RideeProperty RideeProperty; + + [XmlElement] public List splashSkill; + [XmlElement] public List conditionSkill;*/ +} diff --git a/Maple2.File.Parser/Xml/AdditionalEffect/BasicProperty.cs b/Maple2.File.Parser/Xml/AdditionalEffect/BasicProperty.cs index 3778bad..5cb871b 100644 --- a/Maple2.File.Parser/Xml/AdditionalEffect/BasicProperty.cs +++ b/Maple2.File.Parser/Xml/AdditionalEffect/BasicProperty.cs @@ -1,4 +1,4 @@ -using System.Xml.Serialization; +using System.Xml.Serialization; using M2dXmlGenerator; namespace Maple2.File.Parser.Xml.AdditionalEffect; @@ -8,12 +8,12 @@ public partial class BasicProperty { [XmlAttribute] public int accountEffect; // 0 [XmlAttribute] public int group; [XmlAttribute] public int buffType = 1; // 1,2,3 - [XmlAttribute] public int buffSubType; // 0,1,2,4,6,8,16,32,64,128,256,512,1024 + [XmlAttribute] public int buffSubType = 0; // 0,1,2,4,6,8,16,32,64,128,256,512,1024 [XmlAttribute] public int buffCategory; // 0,1,2,4,6,7,8,9,99,1007,2001 [XmlAttribute] public int eventBuffType; // 0,1,2,3,4 [XmlAttribute] public bool useInGameTime; - [XmlAttribute] public int durationTick; - [XmlAttribute] public int intervalTick; + [XmlAttribute] public int durationTick = 0; + [XmlAttribute] public int intervalTick = 0; [XmlAttribute] public int delayTick; [XmlAttribute] public int keepCondition; // 0,1,5,99 [XmlAttribute] public int resetCondition; // 0,1,2,3 @@ -39,13 +39,13 @@ public partial class BasicProperty { [XmlAttribute] public int statSetID; // 0,10000006,10000007,10000008,10000009 [XmlAttribute] public bool disableRevivalHere; [XmlAttribute] public int attackPossibleEffectID; // 0,90000874 - [XmlAttribute] public int skillGroupType; // 0,1,2 + [XmlAttribute] public int skillGroupType = 0; // 0,1,2 [M2dArray] public int[] attackPossibleSkillIDs = Array.Empty(); [M2dArray] public int[] attackPossibleDotEffectIDs = Array.Empty(); [M2dArray] public int[] groupIDs = Array.Empty(); - [XmlAttribute] public bool immediateActiveRequireSkill; + [XmlAttribute] public bool immediateActiveRequireSkill = false; [M2dArray] public int[] itemSlotDisable = Array.Empty(); - [XmlAttribute] public int tailEffect; // 0,1001,1002 + [XmlAttribute] public int tailEffect = 0; // 0,1001,1002 [M2dArray] public int[] upgradeSkillLevelID = Array.Empty(); [M2dArray] public int[] upgradeSkillLevelValue = Array.Empty(); } diff --git a/Maple2.File.Parser/Xml/AdditionalEffect/StatusProperty.cs b/Maple2.File.Parser/Xml/AdditionalEffect/StatusProperty.cs index 879a422..c80f14e 100644 --- a/Maple2.File.Parser/Xml/AdditionalEffect/StatusProperty.cs +++ b/Maple2.File.Parser/Xml/AdditionalEffect/StatusProperty.cs @@ -25,7 +25,7 @@ public partial class StatusProperty { [XmlAttribute] public float resEvpR; [XmlAttribute] public float resPenR; [XmlAttribute] public float resAspR; - [XmlAttribute] public long deathResistanceHP; + [XmlAttribute] public bool deathResistanceHP; [M2dArray] public int[] compulsionEventTypes = Array.Empty(); [M2dArray] public float[] compulsionEventRate = Array.Empty(); @@ -41,6 +41,61 @@ public partial class StatusProperty { [XmlAttribute] public string rate = string.Empty; } +public partial class StatusPropertyNew { + [XmlAttribute] public int statChangeBase; + [XmlAttribute] public int statChangeResult; + [XmlAttribute] public float statChangeRate; + [XmlAttribute] public long finalCapV; + [XmlAttribute] public float finalCapR; + [XmlAttribute] public long finalAbpV; + [XmlAttribute] public float finalAbpR; + [XmlAttribute] public long finalAtpV; + [XmlAttribute] public float finalAtpR; + [XmlAttribute] public long finalEvpV; + [XmlAttribute] public float finalEvpR; + [XmlAttribute] public float itemCriticalRecoveryRate; + [XmlAttribute] public float itemRecoveryHPRate; + [XmlAttribute] public float healRecoveryHPRate; + [XmlAttribute] public float resWapR; + [XmlAttribute] public float resBapR; + [XmlAttribute] public float resCadR; + [XmlAttribute] public float resAtpR; + [XmlAttribute] public float resEvpR; + [XmlAttribute] public float resPenR; + [XmlAttribute] public float resAspR; + [XmlAttribute] public bool deathResistanceHP; + + [M2dArray] public int[] compulsionEventTypes = Array.Empty(); + [M2dArray] public float[] compulsionEventRate = Array.Empty(); + [M2dArray] public int[] compulsionEventSkillCodes = Array.Empty(); + + // Ignored by client. + [XmlAttribute] public string saValue = string.Empty; + [XmlAttribute] public string saRate = string.Empty; + [XmlAttribute] public string value = string.Empty; + [XmlAttribute] public string rate = string.Empty; +} + +public class StatNew { + [XmlElement] public List v; +} + +public class StatEntry { + [XmlAttribute] public string type = string.Empty; + [XmlAttribute] public float value; + [XmlAttribute] public bool isRate = false; +} + +public class SpecialAbilityNew { + [XmlElement] public List v; +} + +public class SpecialAbilityEntry { + [XmlAttribute] public string type = string.Empty; + [XmlAttribute] public float value; + [XmlAttribute] public bool isRate = false; +} + public class Stat { [XmlAttribute] public long strvalue; [XmlAttribute] public long dexvalue; diff --git a/Maple2.File.Parser/Xml/Item/Item.cs b/Maple2.File.Parser/Xml/Item/Item.cs index c296ac6..fdf0984 100644 --- a/Maple2.File.Parser/Xml/Item/Item.cs +++ b/Maple2.File.Parser/Xml/Item/Item.cs @@ -43,16 +43,16 @@ public partial class ItemData : IFeatureLocale { // ./data/xml/itemdata/%03d.xml [XmlRoot("ms2")] -public partial class ItemDataKR { - [XmlElement("item")] public List items; +public partial class ItemDataNew { + [XmlElement] public List item; } -public partial class ItemDataRootKR { +public partial class ItemDataRootNew { [XmlAttribute] public int id; [M2dFeatureLocale] private ItemData _environment; } -public partial class ItemDataKR : IFeatureLocale { +public partial class ItemDataNew : IFeatureLocale { [XmlElement] public Basic basic; [XmlElement] public Slots slots; [XmlElement] public Customize customize; diff --git a/Maple2.File.Parser/Xml/Item/Property.cs b/Maple2.File.Parser/Xml/Item/Property.cs index e9f5de3..5667e95 100644 --- a/Maple2.File.Parser/Xml/Item/Property.cs +++ b/Maple2.File.Parser/Xml/Item/Property.cs @@ -5,6 +5,7 @@ namespace Maple2.File.Parser.Xml.Item; public partial class Property { [XmlAttribute] public bool skin; + [XmlAttribute] public short rank = 1; [XmlAttribute] public int skinType; [XmlAttribute] public int slotMax = 1; // if > 99999, set to 99999 [XmlAttribute] public int type; diff --git a/Maple2.File.Tests/AdditionalEffectParserTest.cs b/Maple2.File.Tests/AdditionalEffectParserTest.cs index fd30f12..8f33da3 100644 --- a/Maple2.File.Tests/AdditionalEffectParserTest.cs +++ b/Maple2.File.Tests/AdditionalEffectParserTest.cs @@ -1,4 +1,4 @@ -using Maple2.File.Parser; +using Maple2.File.Parser; using Maple2.File.Parser.Tools; using Maple2.File.Parser.Xml.AdditionalEffect; using Microsoft.VisualStudio.TestTools.UnitTesting; @@ -9,7 +9,8 @@ namespace Maple2.File.Tests; public class AdditionalEffectParserTest { [TestMethod] public void TestAdditionalEffectParser() { - Filter.Load(TestUtils.XmlReader, "NA", "Live"); + string locale = "NA"; + Filter.Load(TestUtils.XmlReader, locale, "Live"); var parser = new AdditionalEffectParser(TestUtils.XmlReader); int count = 0; @@ -22,12 +23,13 @@ public void TestAdditionalEffectParser() { } [TestMethod] - public void TestAdditionalEffectParserKr() { - Filter.Load(TestUtilsKr.XmlReader, "KR", "Live"); - var parser = new AdditionalEffectParser(TestUtilsKr.XmlReader); + public void TestAdditionalEffectParserNew() { + string locale = "KR"; + Filter.Load(TestUtils.XmlReader, locale, "Live"); + var parser = new AdditionalEffectParser(TestUtils.XmlReader); int count = 0; - foreach ((int id, IList data) in parser.Parse()) { + foreach ((int id, IList data) in parser.ParseNew()) { Assert.IsTrue(id > 0); Assert.IsNotNull(data); count++; diff --git a/Maple2.File.Tests/FunctionCubeParserTest.cs b/Maple2.File.Tests/FunctionCubeParserTest.cs index c1f6fbf..4fd34f3 100644 --- a/Maple2.File.Tests/FunctionCubeParserTest.cs +++ b/Maple2.File.Tests/FunctionCubeParserTest.cs @@ -26,8 +26,8 @@ public void TestFunctionCubeParser() { [TestMethod] public void TestFunctionCubeParserKr() { - Filter.Load(TestUtilsKr.XmlReader, "KR", "Live"); - var parser = new FunctionCubeParser(TestUtilsKr.XmlReader); + Filter.Load(TestUtils.XmlReader, "KR", "Live"); + var parser = new FunctionCubeParser(TestUtils.XmlReader); int count = 0; foreach ((int id, FunctionCubeRoot data) in parser.Parse()) { diff --git a/Maple2.File.Tests/ItemOptionParserTest.cs b/Maple2.File.Tests/ItemOptionParserTest.cs index a3ed8b5..707fb22 100644 --- a/Maple2.File.Tests/ItemOptionParserTest.cs +++ b/Maple2.File.Tests/ItemOptionParserTest.cs @@ -60,8 +60,8 @@ public void TestItemOptionVariationParser() { [TestMethod] public void TestItemOptionParserKr() { - Filter.Load(TestUtilsKr.XmlReader, "KR", "Live"); - var parser = new ItemOptionParser(TestUtilsKr.XmlReader); + Filter.Load(TestUtils.XmlReader, "KR", "Live"); + var parser = new ItemOptionParser(TestUtils.XmlReader); int count = 0; foreach (var data in parser.ParseConstantKr()) { @@ -85,8 +85,8 @@ public void TestItemOptionParserKr() { [TestMethod] public void TestItemMergeOptionParserKr() { - Filter.Load(TestUtilsKr.XmlReader, "KR", "Live"); - var parser = new ItemOptionParser(TestUtilsKr.XmlReader); + Filter.Load(TestUtils.XmlReader, "KR", "Live"); + var parser = new ItemOptionParser(TestUtils.XmlReader); int count = 0; foreach (var data in parser.ParseMergeOptionBaseKr()) { @@ -107,8 +107,8 @@ public void TestItemMergeOptionParserKr() { [TestMethod] public void TestItemOptionVariationParserKr() { - Filter.Load(TestUtilsKr.XmlReader, "KR", "Live"); - var parser = new ItemOptionParser(TestUtilsKr.XmlReader); + Filter.Load(TestUtils.XmlReader, "KR", "Live"); + var parser = new ItemOptionParser(TestUtils.XmlReader); foreach (var data in parser.ParseVariation()) { Assert.IsNotNull(data); diff --git a/Maple2.File.Tests/ItemParserTest.cs b/Maple2.File.Tests/ItemParserTest.cs index 06da821..fb3253a 100644 --- a/Maple2.File.Tests/ItemParserTest.cs +++ b/Maple2.File.Tests/ItemParserTest.cs @@ -1,4 +1,5 @@ -using Maple2.File.Parser; +using M2dXmlGenerator; +using Maple2.File.Parser; using Maple2.File.Parser.Tools; using Maple2.File.Parser.Xml.Item; using Microsoft.VisualStudio.TestTools.UnitTesting; @@ -9,8 +10,9 @@ namespace Maple2.File.Tests; public class ItemParserTest { [TestMethod] public void TestItemParser() { - Filter.Load(TestUtils.XmlReader, "NA", "Live"); - var parser = new ItemParser(TestUtils.XmlReader); + string locale = "NA"; + Filter.Load(TestUtils.XmlReader, locale, "Live"); + var parser = new ItemParser(TestUtils.XmlReader, locale); // parser.NameSerializer.UnknownElement += TestUtils.UnknownElementHandler; // parser.NameSerializer.UnknownAttribute += TestUtils.UnknownAttributeHandler; @@ -18,7 +20,7 @@ public void TestItemParser() { // parser.ItemSerializer.UnknownAttribute += TestUtils.UnknownAttributeHandler; int count = 0; - foreach ((int id, string name, ItemData data) in parser.Parse()) { + foreach ((int id, string name, ItemData data) in parser.Parse()) { // Debug.WriteLine($"Parsing item: {id} ({name})"); Assert.IsTrue(id > 0); Assert.IsNotNull(data); @@ -29,9 +31,10 @@ public void TestItemParser() { } [TestMethod] - public void TestItemParserKr() { - Filter.Load(TestUtilsKr.XmlReader, "KR", "Live"); - var parser = new ItemParser(TestUtilsKr.XmlReader); + public void TestItemParserNew() { + string locale = "KR"; + Filter.Load(TestUtils.XmlReader, locale, "Live"); + var parser = new ItemParser(TestUtils.XmlReader, locale); // parser.NameSerializer.UnknownElement += TestUtils.UnknownElementHandler; // parser.NameSerializer.UnknownAttribute += TestUtils.UnknownAttributeHandler; @@ -39,7 +42,7 @@ public void TestItemParserKr() { // parser.ItemSerializer.UnknownAttribute += TestUtils.UnknownAttributeHandler; int count = 0; - foreach ((int id, string name, ItemData data) in parser.Parse()) { + foreach ((int id, string name, ItemData data) in parser.ParseNew()) { // Debug.WriteLine($"Parsing item: {id} ({name})"); Assert.IsTrue(id > 0); Assert.IsNotNull(data); @@ -50,20 +53,12 @@ public void TestItemParserKr() { [TestMethod] public void TestItemNames() { - Filter.Load(TestUtils.XmlReader, "NA", "Live"); - var parser = new ItemParser(TestUtils.XmlReader); + string locale = "NA"; + Filter.Load(TestUtils.XmlReader, locale, "Live"); + var parser = new ItemParser(TestUtils.XmlReader, locale); var itemNames = parser.ItemNames(); Assert.AreEqual(34038, itemNames.Count); } - - [TestMethod] - public void TestItemNamesKr() { - Filter.Load(TestUtilsKr.XmlReader, "KR", "Live"); - var parser = new ItemParser(TestUtilsKr.XmlReader); - var itemNames = parser.ItemNames(); - - Assert.AreEqual(34273, itemNames.Count); - } } diff --git a/Maple2.File.Tests/MapParserTest.cs b/Maple2.File.Tests/MapParserTest.cs index 24c4670..f4ed6ee 100644 --- a/Maple2.File.Tests/MapParserTest.cs +++ b/Maple2.File.Tests/MapParserTest.cs @@ -29,8 +29,8 @@ public void TestMapParser() { [TestMethod] public void TestMapParserKr() { - Filter.Load(TestUtilsKr.XmlReader, "KR", "Live"); - var parser = new MapParser(TestUtilsKr.XmlReader); + Filter.Load(TestUtils.XmlReader, "KR", "Live"); + var parser = new MapParser(TestUtils.XmlReader); // parser.NameSerializer.UnknownElement += TestUtils.UnknownElementHandler; // parser.NameSerializer.UnknownAttribute += TestUtils.UnknownAttributeHandler; @@ -58,8 +58,8 @@ public void TestMapNames() { [TestMethod] public void TestMapNamesKr() { - Filter.Load(TestUtilsKr.XmlReader, "KR", "Live"); - var parser = new MapParser(TestUtilsKr.XmlReader); + Filter.Load(TestUtils.XmlReader, "KR", "Live"); + var parser = new MapParser(TestUtils.XmlReader); var mapNames = parser.ParseMapNames(); Assert.AreEqual(1282, mapNames.Count); diff --git a/Maple2.File.Tests/NifParserTest.cs b/Maple2.File.Tests/NifParserTest.cs index a34cfba..358e213 100644 --- a/Maple2.File.Tests/NifParserTest.cs +++ b/Maple2.File.Tests/NifParserTest.cs @@ -26,7 +26,7 @@ public void TestNifParser() { [TestMethod] public void TestNifParserKr() { - var parser = new NifParser(TestUtilsKr.ModelM2dReaders); + var parser = new NifParser(TestUtils.ModelM2dReaders); ValidateNifMeshData(parser); } diff --git a/Maple2.File.Tests/NpcParserTest.cs b/Maple2.File.Tests/NpcParserTest.cs index 4732d65..0f0a40f 100644 --- a/Maple2.File.Tests/NpcParserTest.cs +++ b/Maple2.File.Tests/NpcParserTest.cs @@ -29,8 +29,8 @@ public void TestNpcParser() { [TestMethod] public void TestNpcParserKr() { - Filter.Load(TestUtilsKr.XmlReader, "KR", "Live"); - var parser = new NpcParser(TestUtilsKr.XmlReader); + Filter.Load(TestUtils.XmlReader, "KR", "Live"); + var parser = new NpcParser(TestUtils.XmlReader); // parser.NameSerializer.UnknownElement += TestUtils.UnknownElementHandler; // parser.NameSerializer.UnknownAttribute += TestUtils.UnknownAttributeHandler; @@ -64,8 +64,8 @@ public void TestNpcNameParser() { [TestMethod] public void TestNpcNameParserKr() { - Filter.Load(TestUtilsKr.XmlReader, "KR", "Live"); - var parser = new NpcParser(TestUtilsKr.XmlReader); + Filter.Load(TestUtils.XmlReader, "KR", "Live"); + var parser = new NpcParser(TestUtils.XmlReader); int count = 0; foreach ((int id, string name) in parser.ParseNpcNames()) { diff --git a/Maple2.File.Tests/QuestParserTest.cs b/Maple2.File.Tests/QuestParserTest.cs index 7cef7a5..becc148 100644 --- a/Maple2.File.Tests/QuestParserTest.cs +++ b/Maple2.File.Tests/QuestParserTest.cs @@ -29,8 +29,8 @@ public void TestQuestParser() { [TestMethod] public void TestQuestParserKr() { - Filter.Load(TestUtilsKr.XmlReader, "KR", "Live"); - var parser = new QuestParser(TestUtilsKr.XmlReader); + Filter.Load(TestUtils.XmlReader, "KR", "Live"); + var parser = new QuestParser(TestUtils.XmlReader); // parser.NameSerializer.UnknownElement += TestUtils.UnknownElementHandler; // parser.NameSerializer.UnknownAttribute += TestUtils.UnknownAttributeHandler; @@ -64,8 +64,8 @@ public void TestQuestDescriptionParser() { [TestMethod] public void TestQuestDescriptionParserKr() { - Filter.Load(TestUtilsKr.XmlReader, "KR", "Live"); - var parser = new QuestParser(TestUtilsKr.XmlReader); + Filter.Load(TestUtils.XmlReader, "KR", "Live"); + var parser = new QuestParser(TestUtils.XmlReader); int count = 0; foreach ((int id, string name) in parser.ParseQuestDescriptions()) { diff --git a/Maple2.File.Tests/RidingParserTest.cs b/Maple2.File.Tests/RidingParserTest.cs index ade75f2..c67bf9b 100644 --- a/Maple2.File.Tests/RidingParserTest.cs +++ b/Maple2.File.Tests/RidingParserTest.cs @@ -39,8 +39,8 @@ public void TestRidingPassengerParser() { [TestMethod] public void TestRidingParserKr() { - Filter.Load(TestUtilsKr.XmlReader, "KR", "Live"); - var parser = new RidingParser(TestUtilsKr.XmlReader); + Filter.Load(TestUtils.XmlReader, "KR", "Live"); + var parser = new RidingParser(TestUtils.XmlReader); int count = 0; foreach ((int id, RidingKR data) in parser.ParseKr()) { diff --git a/Maple2.File.Tests/ScriptParserTest.cs b/Maple2.File.Tests/ScriptParserTest.cs index 85529a2..1adc167 100644 --- a/Maple2.File.Tests/ScriptParserTest.cs +++ b/Maple2.File.Tests/ScriptParserTest.cs @@ -67,8 +67,8 @@ public void TestStringsParser() { [TestMethod] public void TestNpcScriptParserKr() { - Filter.Load(TestUtilsKr.XmlReader, "KR", "Live"); - var parser = new ScriptParser(TestUtilsKr.XmlReader); + Filter.Load(TestUtils.XmlReader, "KR", "Live"); + var parser = new ScriptParser(TestUtils.XmlReader); int count = 0; foreach ((int id, NpcScriptKR script) in parser.ParseNpcKr()) { @@ -81,8 +81,8 @@ public void TestNpcScriptParserKr() { [TestMethod] public void TestQuestScriptParserKr() { - Filter.Load(TestUtilsKr.XmlReader, "KR", "Live"); - var parser = new ScriptParser(TestUtilsKr.XmlReader); + Filter.Load(TestUtils.XmlReader, "KR", "Live"); + var parser = new ScriptParser(TestUtils.XmlReader); int count = 0; foreach ((int id, QuestScript script) in parser.ParseQuestKr()) { diff --git a/Maple2.File.Tests/SkillParserTest.cs b/Maple2.File.Tests/SkillParserTest.cs index 6024d8e..459e547 100644 --- a/Maple2.File.Tests/SkillParserTest.cs +++ b/Maple2.File.Tests/SkillParserTest.cs @@ -23,8 +23,8 @@ public void TestSkillParser() { [TestMethod] public void TestSkillParserKr() { - Filter.Load(TestUtilsKr.XmlReader, "KR", "Live"); - var parser = new SkillParser(TestUtilsKr.XmlReader); + Filter.Load(TestUtils.XmlReader, "KR", "Live"); + var parser = new SkillParser(TestUtils.XmlReader); int count = 0; foreach ((int id, string name, SkillKR data) in parser.ParseKr()) { @@ -47,8 +47,8 @@ public void TestSkillNames() { [TestMethod] public void TestSkillNamesKr() { - Filter.Load(TestUtilsKr.XmlReader, "KR", "Live"); - var parser = new SkillParser(TestUtilsKr.XmlReader); + Filter.Load(TestUtils.XmlReader, "KR", "Live"); + var parser = new SkillParser(TestUtils.XmlReader); Dictionary skillNames = parser.LoadSkillNames(); Assert.AreEqual(1421, skillNames.Count); diff --git a/Maple2.File.Tests/TableParserKRTest.cs b/Maple2.File.Tests/TableParserKRTest.cs index ff567f2..f249cb3 100644 --- a/Maple2.File.Tests/TableParserKRTest.cs +++ b/Maple2.File.Tests/TableParserKRTest.cs @@ -11,8 +11,8 @@ public class TableParserKrTest { [ClassInitialize] public static void ClassInit(TestContext context) { - Filter.Load(TestUtilsKr.XmlReader, "KR", "Live"); - _parser = new TableParser(TestUtilsKr.XmlReader); + Filter.Load(TestUtils.XmlReader, "KR", "Live"); + _parser = new TableParser(TestUtils.XmlReader); } [TestMethod] diff --git a/Maple2.File.Tests/TestUtils.cs b/Maple2.File.Tests/TestUtils.cs index 310907e..52aa579 100644 --- a/Maple2.File.Tests/TestUtils.cs +++ b/Maple2.File.Tests/TestUtils.cs @@ -51,47 +51,3 @@ public static void UnknownAttributeHandler(object? sender, XmlAttributeEventArgs } } -// We still want to load all files from the KR version, not only Xml.m2d -public static class TestUtilsKr { - public static readonly M2dReader XmlReader; - public static readonly M2dReader ServerReader; - public static readonly M2dReader ExportedReader; - public static readonly M2dReader AssetMetadataReader; - public static readonly AssetIndex AssetIndex; - public static readonly List ModelM2dReaders; - - static TestUtilsKr() { - DotEnv.Load(); - string? m2dPath = Environment.GetEnvironmentVariable("KMS2_DATA_FOLDER"); - if (string.IsNullOrEmpty(m2dPath)) { - throw new Exception("KMS2_DATA_FOLDER is not set"); - } - - XmlReader = new M2dReader(@$"{m2dPath}\Xml.m2d"); - ExportedReader = new M2dReader(@$"{m2dPath}\Resource\Exported.m2d"); - ServerReader = new M2dReader(@$"{m2dPath}\Server.m2d"); - AssetMetadataReader = new M2dReader(@$"{m2dPath}\Resource\asset-web-metadata.m2d"); - AssetIndex = new AssetIndex(AssetMetadataReader); - ModelM2dReaders = new List() { - new PrefixedM2dReader("/library/", $@"{m2dPath}\Resource\Library.m2d"), - new PrefixedM2dReader("/model/map/", $@"{m2dPath}\Resource\Model\Map.m2d"), - new PrefixedM2dReader("/model/effect/", $@"{m2dPath}\Resource\Model\Effect.m2d"), - new PrefixedM2dReader("/model/camera/", $@"{m2dPath}\Resource\Model\Camera.m2d"), - new PrefixedM2dReader("/model/tool/", $@"{m2dPath}\Resource\Model\Tool.m2d"), - new PrefixedM2dReader("/model/item/", $@"{m2dPath}\Resource\Model\Item.m2d"), - new PrefixedM2dReader("/model/npc/", $@"{m2dPath}\Resource\Model\Npc.m2d"), - new PrefixedM2dReader("/model/path/", $@"{m2dPath}\Resource\Model\Path.m2d"), - new PrefixedM2dReader("/model/character/", $@"{m2dPath}\Resource\Model\Character.m2d"), - new PrefixedM2dReader("/model/textures/", $@"{m2dPath}\Resource\Model\Textures.m2d"), - }; - } - - public static void UnknownElementHandler(object? sender, XmlElementEventArgs e) { - Debug.Print("Missing element {0}, expected [{1}]", e.Element.Name, e.ExpectedElements); - } - - public static void UnknownAttributeHandler(object? sender, XmlAttributeEventArgs e) { - Debug.Print("Missing attribute {0}, expected [{1}]", e.Attr.Name, e.ExpectedAttributes); - } -} - diff --git a/Maple2.File.Tests/XBlockParserTest.cs b/Maple2.File.Tests/XBlockParserTest.cs index aa76378..e8f3f21 100644 --- a/Maple2.File.Tests/XBlockParserTest.cs +++ b/Maple2.File.Tests/XBlockParserTest.cs @@ -37,8 +37,8 @@ public void TestXBlockParser() { [TestMethod] public void TestXBlockParserKr() { - var index = new FlatTypeIndex(TestUtilsKr.ExportedReader); - var parser = new XBlockParser(TestUtilsKr.ExportedReader, index); + var index = new FlatTypeIndex(TestUtils.ExportedReader); + var parser = new XBlockParser(TestUtils.ExportedReader, index); // Console.WriteLine(index.GetType("Portal_entrance").GetProperty("frontOffset")); parser.ParseMap("02000070_in", entities => { From 960bb49fa6692d8774f17b1ca11b0572cdd71964 Mon Sep 17 00:00:00 2001 From: Zin <62830952+Zintixx@users.noreply.github.com> Date: Thu, 29 May 2025 16:53:14 -0700 Subject: [PATCH 2/9] differentiate between locale and lang --- Maple2.File.Parser/ItemParser.cs | 8 ++++---- Maple2.File.Tests/ItemParserTest.cs | 15 ++++++--------- 2 files changed, 10 insertions(+), 13 deletions(-) diff --git a/Maple2.File.Parser/ItemParser.cs b/Maple2.File.Parser/ItemParser.cs index baf24a4..12844ae 100644 --- a/Maple2.File.Parser/ItemParser.cs +++ b/Maple2.File.Parser/ItemParser.cs @@ -14,11 +14,11 @@ public class ItemParser { private readonly XmlSerializer itemSerializer; private readonly XmlSerializer itemNewSerializer; private readonly bool newXml; - private readonly string locale; + private readonly string language; - public ItemParser(M2dReader xmlReader, string locale) { + public ItemParser(M2dReader xmlReader, string language) { this.xmlReader = xmlReader; - this.locale = locale.ToLower(); + this.language = language.ToLower(); nameSerializer = new XmlSerializer(typeof(StringMapping)); itemSerializer = new XmlSerializer(typeof(ItemDataRoot)); itemNewSerializer = new XmlSerializer(typeof(ItemDataNew)); @@ -50,7 +50,7 @@ public ItemParser(M2dReader xmlReader, string locale) { } public Dictionary ItemNames() { - XmlReader reader = xmlReader.GetXmlReader(xmlReader.GetEntry($"{locale}/itemname.xml")); + XmlReader reader = xmlReader.GetXmlReader(xmlReader.GetEntry($"{language}/itemname.xml")); var mapping = nameSerializer.Deserialize(reader) as StringMapping; Debug.Assert(mapping != null); diff --git a/Maple2.File.Tests/ItemParserTest.cs b/Maple2.File.Tests/ItemParserTest.cs index fb3253a..f90dd91 100644 --- a/Maple2.File.Tests/ItemParserTest.cs +++ b/Maple2.File.Tests/ItemParserTest.cs @@ -10,9 +10,8 @@ namespace Maple2.File.Tests; public class ItemParserTest { [TestMethod] public void TestItemParser() { - string locale = "NA"; - Filter.Load(TestUtils.XmlReader, locale, "Live"); - var parser = new ItemParser(TestUtils.XmlReader, locale); + Filter.Load(TestUtils.XmlReader, "NA", "Live"); + var parser = new ItemParser(TestUtils.XmlReader, "en"); // parser.NameSerializer.UnknownElement += TestUtils.UnknownElementHandler; // parser.NameSerializer.UnknownAttribute += TestUtils.UnknownAttributeHandler; @@ -32,9 +31,8 @@ public void TestItemParser() { [TestMethod] public void TestItemParserNew() { - string locale = "KR"; - Filter.Load(TestUtils.XmlReader, locale, "Live"); - var parser = new ItemParser(TestUtils.XmlReader, locale); + Filter.Load(TestUtils.XmlReader, "KR", "Live"); + var parser = new ItemParser(TestUtils.XmlReader, "kr"); // parser.NameSerializer.UnknownElement += TestUtils.UnknownElementHandler; // parser.NameSerializer.UnknownAttribute += TestUtils.UnknownAttributeHandler; @@ -53,9 +51,8 @@ public void TestItemParserNew() { [TestMethod] public void TestItemNames() { - string locale = "NA"; - Filter.Load(TestUtils.XmlReader, locale, "Live"); - var parser = new ItemParser(TestUtils.XmlReader, locale); + Filter.Load(TestUtils.XmlReader, "NA", "Live"); + var parser = new ItemParser(TestUtils.XmlReader, "en"); var itemNames = parser.ItemNames(); Assert.AreEqual(34038, itemNames.Count); From 8cce38ab3a5ab8e3efca977e6b1e13506a05e239 Mon Sep 17 00:00:00 2001 From: Zin <62830952+Zintixx@users.noreply.github.com> Date: Fri, 30 May 2025 22:33:22 -0700 Subject: [PATCH 3/9] More adjustments --- Maple2.File.Parser/AdditionalEffectParser.cs | 7 +- Maple2.File.Parser/Enum/Language.cs | 10 + Maple2.File.Parser/Enum/Locale.cs | 10 + Maple2.File.Parser/ItemOptionParser.cs | 26 +- Maple2.File.Parser/ItemParser.cs | 1 - Maple2.File.Parser/MapParser.cs | 48 +- Maple2.File.Parser/NpcParser.cs | 23 +- Maple2.File.Parser/QuestParser.cs | 18 +- Maple2.File.Parser/RidingParser.cs | 10 +- Maple2.File.Parser/ScriptParser.cs | 21 +- Maple2.File.Parser/SkillParser.cs | 19 +- Maple2.File.Parser/TableParser.cs | 49 +- .../Xml/AdditionalEffect/AdditionalEffect.cs | 176 ++++- .../Xml/AdditionalEffect/BasicProperty.cs | 3 + .../Xml/AdditionalEffect/DotProperty.cs | 2 +- .../AdditionalEffect/ModifySkillCooldown.cs | 9 + .../Xml/AdditionalEffect/MotionProperty.cs | 18 + .../AdditionalEffect/RemoveRechargingCount.cs | 9 + .../Xml/AdditionalEffect/Spread.cs | 10 + .../Xml/AdditionalEffect/StatusProperty.cs | 11 - .../{ItemOptionKR.cs => ItemOptionNew.cs} | 2 +- Maple2.File.Parser/Xml/Npc/Npc.cs | 10 +- Maple2.File.Parser/Xml/Quest/Quest.cs | 6 +- Maple2.File.Parser/Xml/Riding/Riding.cs | 6 +- Maple2.File.Parser/Xml/Script/NpcScript.cs | 6 +- Maple2.File.Parser/Xml/Skill/Basic.cs | 17 +- Maple2.File.Parser/Xml/Skill/ChangeSkill.cs | 12 + Maple2.File.Parser/Xml/Skill/Combo.cs | 11 + Maple2.File.Parser/Xml/Skill/Kinds.cs | 54 +- Maple2.File.Parser/Xml/Skill/MagicControl.cs | 7 + .../Xml/Skill/Property/DamageProperty.cs | 41 ++ Maple2.File.Parser/Xml/Skill/RegionSkill.cs | 28 + Maple2.File.Parser/Xml/Skill/Sensor.cs | 18 + Maple2.File.Parser/Xml/Skill/Skill.cs | 148 +++- .../Xml/Skill/StateAttribute.cs | 28 + .../Xml/Skill/SubConditionTarget.cs | 11 + Maple2.File.Parser/Xml/Skill/TriggerSkill.cs | 32 + .../Xml/Table/IndividualItemDrop.cs | 2 +- .../Xml/Table/ItemMergeOption.cs | 10 +- Maple2.File.Parser/Xml/Table/JobTable.cs | 10 +- Maple2.File.Parser/Xml/Table/SetItemOption.cs | 8 +- .../AdditionalEffectParserTest.cs | 13 +- Maple2.File.Tests/FunctionCubeParserTest.cs | 24 +- Maple2.File.Tests/ItemOptionParserTest.cs | 42 +- Maple2.File.Tests/ItemParserTest.cs | 12 +- Maple2.File.Tests/MapParserTest.cs | 39 +- Maple2.File.Tests/NifParserTest.cs | 6 - Maple2.File.Tests/NpcParserTest.cs | 45 +- Maple2.File.Tests/QuestParserTest.cs | 45 +- Maple2.File.Tests/RidingParserTest.cs | 12 +- Maple2.File.Tests/ScriptParserTest.cs | 39 +- Maple2.File.Tests/SkillParserTest.cs | 39 +- Maple2.File.Tests/TableParserKRTest.cs | 653 ------------------ Maple2.File.Tests/TableParserNewTest.cs | 79 +++ Maple2.File.Tests/TableParserTest.cs | 2 +- Maple2.File.Tests/XBlockParserTest.cs | 17 - 56 files changed, 961 insertions(+), 1053 deletions(-) create mode 100644 Maple2.File.Parser/Enum/Language.cs create mode 100644 Maple2.File.Parser/Enum/Locale.cs create mode 100644 Maple2.File.Parser/Xml/AdditionalEffect/ModifySkillCooldown.cs create mode 100644 Maple2.File.Parser/Xml/AdditionalEffect/RemoveRechargingCount.cs create mode 100644 Maple2.File.Parser/Xml/AdditionalEffect/Spread.cs rename Maple2.File.Parser/Xml/Common/{ItemOptionKR.cs => ItemOptionNew.cs} (99%) create mode 100644 Maple2.File.Parser/Xml/Skill/Sensor.cs delete mode 100644 Maple2.File.Tests/TableParserKRTest.cs create mode 100644 Maple2.File.Tests/TableParserNewTest.cs diff --git a/Maple2.File.Parser/AdditionalEffectParser.cs b/Maple2.File.Parser/AdditionalEffectParser.cs index c7f7494..3cd3c53 100644 --- a/Maple2.File.Parser/AdditionalEffectParser.cs +++ b/Maple2.File.Parser/AdditionalEffectParser.cs @@ -2,7 +2,6 @@ using System.Xml.Serialization; using Maple2.File.IO; using Maple2.File.IO.Crypto.Common; -using Maple2.File.Parser.Tools; using Maple2.File.Parser.Xml.AdditionalEffect; namespace Maple2.File.Parser; @@ -39,9 +38,9 @@ public AdditionalEffectParser(M2dReader xmlReader) { 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, null); + //if (data.id != 10200201) continue; + if (data.level.Count == 0) continue; + yield return (data.id, data.level); } } } diff --git a/Maple2.File.Parser/Enum/Language.cs b/Maple2.File.Parser/Enum/Language.cs new file mode 100644 index 0000000..f8b0f94 --- /dev/null +++ b/Maple2.File.Parser/Enum/Language.cs @@ -0,0 +1,10 @@ +namespace Maple2.File.Parser.Enum; + +public enum Language { + en, + kr, + jp, + de, + pt, + cn +} diff --git a/Maple2.File.Parser/Enum/Locale.cs b/Maple2.File.Parser/Enum/Locale.cs new file mode 100644 index 0000000..86f4d3a --- /dev/null +++ b/Maple2.File.Parser/Enum/Locale.cs @@ -0,0 +1,10 @@ +namespace Maple2.File.Parser.Enum; + +public enum Locale { + KR, + NA, + TW, + TH, + JP, + CN, +} diff --git a/Maple2.File.Parser/ItemOptionParser.cs b/Maple2.File.Parser/ItemOptionParser.cs index 217fd17..f1f3b55 100644 --- a/Maple2.File.Parser/ItemOptionParser.cs +++ b/Maple2.File.Parser/ItemOptionParser.cs @@ -89,10 +89,10 @@ 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; @@ -101,10 +101,10 @@ public class ItemOptionParser { public ItemOptionParser(M2dReader xmlReader) { this.xmlReader = xmlReader; itemOptionConstantSerializer = new XmlSerializer(typeof(ItemOptionConstantRoot)); - itemOptionConstantKrSerializer = new XmlSerializer(typeof(ItemOptionConstantRootKR)); + itemOptionConstantNewSerializer = new XmlSerializer(typeof(ItemOptionConstantRootKR)); itemOptionSerializer = new XmlSerializer(typeof(ItemOptionRoot)); - itemOptionKrSerializer = new XmlSerializer(typeof(ItemOptionRandomRootKR)); - itemMergeOptionKrSerializer = new XmlSerializer(typeof(ItemMergeOptionRootKR)); + itemOptionNewSerializer = new XmlSerializer(typeof(ItemOptionRandomRootKR)); + itemMergeOptionNewSerializer = new XmlSerializer(typeof(ItemMergeOptionRootNew)); itemMergeOptionSerializer = new XmlSerializer(typeof(ItemMergeOptionRoot)); itemOptionPickSerializer = new XmlSerializer(typeof(ItemOptionPickRoot)); itemVariationSerializer = new XmlSerializer(typeof(ItemOptionVariation)); @@ -127,11 +127,11 @@ public IEnumerable ParseConstant() { } } - public IEnumerable ParseConstantKr() { + public IEnumerable 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 ItemOptionConstantRootKR; Debug.Assert(root != null); foreach (ItemOptionConstant option in root.options) { @@ -157,11 +157,11 @@ public IEnumerable ParseRandom() { } } - public IEnumerable ParseRandomKr() { + public IEnumerable 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 ItemOptionRandomRootKR; Debug.Assert(root != null); foreach (ItemOptionRandomKR option in root.options) { @@ -188,14 +188,14 @@ public IEnumerable ParseStatic() { } } - public IEnumerable ParseMergeOptionBaseKr() { + public IEnumerable 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; } } diff --git a/Maple2.File.Parser/ItemParser.cs b/Maple2.File.Parser/ItemParser.cs index 12844ae..70913ca 100644 --- a/Maple2.File.Parser/ItemParser.cs +++ b/Maple2.File.Parser/ItemParser.cs @@ -13,7 +13,6 @@ public class ItemParser { private readonly XmlSerializer nameSerializer; private readonly XmlSerializer itemSerializer; private readonly XmlSerializer itemNewSerializer; - private readonly bool newXml; private readonly string language; public ItemParser(M2dReader xmlReader, string language) { diff --git a/Maple2.File.Parser/MapParser.cs b/Maple2.File.Parser/MapParser.cs index 4ffb36f..6c21cde 100644 --- a/Maple2.File.Parser/MapParser.cs +++ b/Maple2.File.Parser/MapParser.cs @@ -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; @@ -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 Language language; - public MapParser(M2dReader xmlReader) { + public MapParser(M2dReader xmlReader, Language 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(MapDataRootKR)); } public IEnumerable<(int Id, string Name, MapData Data)> Parse() { Dictionary mapNames = ParseMapNames(); - IEnumerable 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 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 MapDataRootKR; + Debug.Assert(data != null); + + foreach (MapDataRootKR 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 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); diff --git a/Maple2.File.Parser/NpcParser.cs b/Maple2.File.Parser/NpcParser.cs index b0dbacc..7061c43 100644 --- a/Maple2.File.Parser/NpcParser.cs +++ b/Maple2.File.Parser/NpcParser.cs @@ -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; @@ -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 Language language; - public NpcParser(M2dReader xmlReader) { + public NpcParser(M2dReader xmlReader, Language 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 ParseNpcNames() { - XmlReader reader = xmlReader.GetXmlReader(xmlReader.GetEntry("en/npcname.xml")); + XmlReader reader = xmlReader.GetXmlReader(xmlReader.GetEntry($"{language.ToString()}/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); @@ -45,18 +48,18 @@ public Dictionary ParseNpcNames() { } } - public IEnumerable<(int Id, string Name, NpcDataKR Data, List Dummy)> ParseKr() { + public IEnumerable<(int Id, string Name, NpcDataNew Data, List 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); } } } diff --git a/Maple2.File.Parser/QuestParser.cs b/Maple2.File.Parser/QuestParser.cs index 9ff0416..ee692e3 100644 --- a/Maple2.File.Parser/QuestParser.cs +++ b/Maple2.File.Parser/QuestParser.cs @@ -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.Quest; using Maple2.File.Parser.Xml.String; @@ -14,12 +15,15 @@ public class QuestParser { private readonly M2dReader xmlReader; private readonly XmlSerializer descriptionSerializer; private readonly XmlSerializer questSerializer; + private readonly XmlSerializer questNewSerializer; + private readonly Language language; - public QuestParser(M2dReader xmlReader) { + public QuestParser(M2dReader xmlReader, Language language) { this.xmlReader = xmlReader; + this.language = language; descriptionSerializer = new XmlSerializer(typeof(QuestDescriptionRoot)); - Type type = FeatureLocaleFilter.Locale == "KR" ? typeof(QuestDataRootKR) : typeof(QuestDataRootRoot); - questSerializer = new XmlSerializer(type); + questSerializer = new XmlSerializer(typeof(QuestDataRootRoot)); + questNewSerializer = new XmlSerializer(typeof(QuestDataRootNew)); } public IEnumerable<(int Id, string Name, QuestData Data)> Parse() { @@ -39,24 +43,24 @@ public QuestParser(M2dReader xmlReader) { } } - public IEnumerable<(int Id, string Name, QuestDataKR Data)> ParseKr() { + public IEnumerable<(int Id, string Name, QuestDataNew Data)> ParseNew() { Dictionary questNames = ParseQuestDescriptions(); PackFileEntry? entry = xmlReader.GetEntry("questdata.xml"); Debug.Assert(entry != null, "questdata.xml not found"); var reader = XmlReader.Create(new StringReader(Sanitizer.SanitizeQuest(xmlReader.GetString(entry)))); - var root = questSerializer.Deserialize(reader) as QuestDataRootKR; + var root = questNewSerializer.Deserialize(reader) as QuestDataRootNew; Debug.Assert(root != null); - foreach (QuestDataKR data in root.quests) { + foreach (QuestDataNew data in root.quests) { yield return (data.id, questNames.GetValueOrDefault(data.id, string.Empty), data); } } public Dictionary ParseQuestDescriptions() { Dictionary questNames = new(); - foreach (PackFileEntry entry in xmlReader.Files.Where(entry => entry.Name.StartsWith("string/en/questdescription"))) { + foreach (PackFileEntry entry in xmlReader.Files.Where(entry => entry.Name.StartsWith($"string/{language.ToString()}/questdescription"))) { // Match match = Regex.Match(entry.Name, "questdescription_event(\\w{2})\\.xml"); // if (match.Success && !filter.Locale.Equals(match.Groups[1].Value, StringComparison.OrdinalIgnoreCase)) { // Console.WriteLine($"Skipping {entry.Name}"); diff --git a/Maple2.File.Parser/RidingParser.cs b/Maple2.File.Parser/RidingParser.cs index 3a0ab7b..7cf6c06 100644 --- a/Maple2.File.Parser/RidingParser.cs +++ b/Maple2.File.Parser/RidingParser.cs @@ -12,13 +12,13 @@ public class RidingParser { private readonly M2dReader xmlReader; private readonly XmlSerializer ridingSerializer; private readonly XmlSerializer passengerRidingSerializer; - private readonly XmlSerializer ridingKRSerializer; + private readonly XmlSerializer ridingNewSerializer; public RidingParser(M2dReader xmlReader) { this.xmlReader = xmlReader; ridingSerializer = new XmlSerializer(typeof(RidingRoot)); passengerRidingSerializer = new XmlSerializer(typeof(PassengerRidingRoot)); - ridingKRSerializer = new XmlSerializer(typeof(RidingKRRoot)); + ridingNewSerializer = new XmlSerializer(typeof(RidingNewRoot)); } public IEnumerable<(int Id, Riding Data)> Parse() { @@ -51,14 +51,14 @@ public RidingParser(M2dReader xmlReader) { } } - public IEnumerable<(int Id, RidingKR Data)> ParseKr() { + public IEnumerable<(int Id, RidingNew Data)> ParseNew() { foreach (PackFileEntry entry in xmlReader.Files.Where(entry => entry.Name.StartsWith("riding/"))) { var reader = XmlReader.Create(new StringReader(Sanitizer.RemoveEmpty(xmlReader.GetString(entry)))); - var root = ridingKRSerializer.Deserialize(reader) as RidingKRRoot; + var root = ridingNewSerializer.Deserialize(reader) as RidingNewRoot; Debug.Assert(root != null); - RidingKR data = root.riding; + RidingNew data = root.riding; if (data == null || data.basic == null) continue; yield return (data.basic.id, data); diff --git a/Maple2.File.Parser/ScriptParser.cs b/Maple2.File.Parser/ScriptParser.cs index 282747b..4629580 100644 --- a/Maple2.File.Parser/ScriptParser.cs +++ b/Maple2.File.Parser/ScriptParser.cs @@ -3,6 +3,7 @@ using M2dXmlGenerator; using Maple2.File.IO; using Maple2.File.IO.Crypto.Common; +using Maple2.File.Parser.Enum; using Maple2.File.Parser.Xml.Script; using Maple2.File.Parser.Xml.String; @@ -11,12 +12,16 @@ namespace Maple2.File.Parser; public class ScriptParser { private readonly M2dReader xmlReader; private readonly XmlSerializer npcScriptSerializer; + private readonly XmlSerializer npcScriptNewSerializer; private readonly XmlSerializer questScriptSerializer; private readonly XmlSerializer scriptStringSerializer; + private readonly Language language; - public ScriptParser(M2dReader xmlReader) { + public ScriptParser(M2dReader xmlReader, Language language) { this.xmlReader = xmlReader; - npcScriptSerializer = new XmlSerializer(FeatureLocaleFilter.Locale == "KR" ? typeof(NpcScriptListKr) : typeof(NpcScript)); + this.language = language; + npcScriptSerializer = new XmlSerializer(typeof(NpcScript)); + npcScriptNewSerializer = new XmlSerializer(typeof(NpcScriptListNew)); questScriptSerializer = new XmlSerializer(typeof(QuestScriptRoot)); scriptStringSerializer = new XmlSerializer(typeof(StringMapping)); } @@ -31,13 +36,13 @@ public ScriptParser(M2dReader xmlReader) { } } - public IEnumerable<(int Id, NpcScriptKR Script)> ParseNpcKr() { + public IEnumerable<(int Id, NpcScriptNew Script)> ParseNpcNew() { var entry = xmlReader.GetEntry("npcscript_final.xml"); Debug.Assert(entry != null); - var root = npcScriptSerializer.Deserialize(xmlReader.GetXmlReader(entry)) as NpcScriptListKr; + var root = npcScriptNewSerializer.Deserialize(xmlReader.GetXmlReader(entry)) as NpcScriptListNew; Debug.Assert(root != null); - foreach (NpcScriptKR npc in root.npcs) { + foreach (NpcScriptNew npc in root.npcs) { yield return (npc.id, npc); } } @@ -53,7 +58,7 @@ public ScriptParser(M2dReader xmlReader) { } } - public IEnumerable<(int Id, QuestScript Script)> ParseQuestKr() { + public IEnumerable<(int Id, QuestScript Script)> ParseQuestNew() { var entry = xmlReader.GetEntry("questscript_final.xml"); Debug.Assert(entry != null); var root = questScriptSerializer.Deserialize(xmlReader.GetXmlReader(entry)) as QuestScriptRoot; @@ -64,9 +69,9 @@ public ScriptParser(M2dReader xmlReader) { } } - public IDictionary ParseStrings(string language = "en") { + public IDictionary ParseStrings() { var result = new Dictionary(); - string prefix = $"string/{language}/scriptnpc"; + string prefix = $"string/{language.ToString()}/scriptnpc"; foreach (PackFileEntry entry in xmlReader.Files.Where(entry => entry.Name.StartsWith(prefix))) { var mapping = scriptStringSerializer.Deserialize(xmlReader.GetXmlReader(entry)) as StringMapping; Debug.Assert(mapping != null); diff --git a/Maple2.File.Parser/SkillParser.cs b/Maple2.File.Parser/SkillParser.cs index 1f51d4f..449f95f 100644 --- a/Maple2.File.Parser/SkillParser.cs +++ b/Maple2.File.Parser/SkillParser.cs @@ -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.Xml.Skill; using Maple2.File.Parser.Xml.String; @@ -13,12 +14,15 @@ public class SkillParser { private readonly M2dReader xmlReader; private readonly XmlSerializer nameSerializer; private readonly XmlSerializer skillSerializer; + private readonly XmlSerializer skillNewSerializer; + private readonly Language language; - public SkillParser(M2dReader xmlReader) { + public SkillParser(M2dReader xmlReader, Language language) { this.xmlReader = xmlReader; + this.language = language; nameSerializer = new XmlSerializer(typeof(StringMapping)); - Type type = FeatureLocaleFilter.Locale is "KR" ? typeof(SkillDataKR) : typeof(SkillData); - skillSerializer = new XmlSerializer(type); + skillSerializer = new XmlSerializer(typeof(SkillData)); + skillNewSerializer = new XmlSerializer(typeof(SkillDataNew)); } public IEnumerable<(int Id, string Name, SkillData Data)> Parse() { @@ -35,16 +39,17 @@ public SkillParser(M2dReader xmlReader) { } } - public IEnumerable<(int Id, string Name, SkillKR Data)> ParseKr() { + public IEnumerable<(int Id, string Name, SkillNew Data)> ParseNew() { Dictionary skillNames = LoadSkillNames(); foreach (PackFileEntry entry in xmlReader.Files.Where(entry => entry.Name.StartsWith("skilldata/"))) { - var data = skillSerializer.Deserialize(xmlReader.GetXmlReader(entry)) as SkillDataKR; + var data = skillNewSerializer.Deserialize(xmlReader.GetXmlReader(entry)) as SkillDataNew; Debug.Assert(data != null); if (data.FeatureLocale() == null) continue; - foreach (SkillKR skill in data.Skills) { + foreach (SkillNew skill in data.Skills) { + // if (skill.id == 10900178) Console.WriteLine(skill); yield return (skill.id, skillNames.GetValueOrDefault(skill.id, string.Empty), skill); } } @@ -52,7 +57,7 @@ public SkillParser(M2dReader xmlReader) { public Dictionary LoadSkillNames() { Dictionary skillNames = new(); - foreach (PackFileEntry entry in xmlReader.Files.Where(entry => entry.Name.StartsWith("string/en/skillname"))) { + foreach (PackFileEntry entry in xmlReader.Files.Where(entry => entry.Name.StartsWith($"string/{language.ToString()}/skillname"))) { XmlReader reader = xmlReader.GetXmlReader(entry); var mapping = nameSerializer.Deserialize(reader) as StringMapping; Debug.Assert(mapping != null); diff --git a/Maple2.File.Parser/TableParser.cs b/Maple2.File.Parser/TableParser.cs index 04e3b86..11f1299 100644 --- a/Maple2.File.Parser/TableParser.cs +++ b/Maple2.File.Parser/TableParser.cs @@ -102,8 +102,9 @@ public class TableParser { private readonly XmlSerializer seasonDataSerializer; private readonly string locale; + private readonly string language; - public TableParser(M2dReader xmlReader) { + public TableParser(M2dReader xmlReader, string language) { this.xmlReader = xmlReader; nameSerializer = new XmlSerializer(typeof(StringMapping)); bankTypeSerializer = new XmlSerializer(typeof(BankTypeRoot)); @@ -139,7 +140,7 @@ public TableParser(M2dReader xmlReader) { itemSocketSerializer = new XmlSerializer(typeof(ItemSocketRoot)); itemSocketScrollSerializer = new XmlSerializer(typeof(ItemSocketScrollRoot)); jobSerializer = new XmlSerializer(typeof(JobRoot)); - jobKRSerializer = new XmlSerializer(typeof(JobRootKR)); + jobKRSerializer = new XmlSerializer(typeof(JobRootNew)); magicPathSerializer = new XmlSerializer(typeof(MagicPath)); mapSpawnTagSerializer = new XmlSerializer(typeof(MapSpawnTag)); masteryRecipeSerializer = new XmlSerializer(typeof(MasteryRecipeRoot)); @@ -153,10 +154,10 @@ public TableParser(M2dReader xmlReader) { premiumClubPackageSerializer = new XmlSerializer(typeof(PremiumClubPackageRoot)); setItemInfoSerializer = new XmlSerializer(typeof(SetItemInfoRoot)); setItemOptionSerializer = new XmlSerializer(typeof(SetItemOptionRoot)); - setItemOptionKRSerializer = new XmlSerializer(typeof(SetItemOptionRootKR)); + setItemOptionKRSerializer = new XmlSerializer(typeof(SetItemOptionRootNew)); titleTagSerializer = new XmlSerializer(typeof(TitleTagRoot)); individualItemDropSerializer = new XmlSerializer(typeof(IndividualItemDropRoot)); - individualItemDropKRSerializer = new XmlSerializer(typeof(IndividualItemDropRootKR)); + individualItemDropKRSerializer = new XmlSerializer(typeof(IndividualItemDropRootNew)); gachaInfoSerializer = new XmlSerializer(typeof(GachaInfoRoot)); shopBeautyCouponSerializer = new XmlSerializer(typeof(ShopBeautyCouponRoot)); shopFurnishingSerializer = new XmlSerializer(typeof(ShopFurnishingRoot)); @@ -195,6 +196,7 @@ public TableParser(M2dReader xmlReader) { seasonDataSerializer = new XmlSerializer(typeof(SeasonDataRoot)); locale = FeatureLocaleFilter.Locale.ToLower(); + this.language = language.ToLower(); // var seen = new HashSet(); // this.bankTypeSerializer.UnknownAttribute += (sender, args) => { @@ -236,7 +238,7 @@ public TableParser(M2dReader xmlReader) { } public IEnumerable<(int Id, ColorPalette Palette)> ParseColorPaletteAchieve() { - XmlReader reader = xmlReader.GetXmlReader(xmlReader.GetEntry("table/na/colorpalette_achieve.xml")); + XmlReader reader = xmlReader.GetXmlReader(xmlReader.GetEntry($"table/{locale}/colorpalette_achieve.xml")); var data = paletteSerializer.Deserialize(reader) as ColorPaletteRoot; Debug.Assert(data != null); @@ -258,8 +260,8 @@ public TableParser(M2dReader xmlReader) { } public IEnumerable<(int Id, DungeonRoom Dungeon)> ParseDungeonRoom() { - string filename = "table/na/dungeonroom.xml"; - if (locale == "kr") { + string filename = $"table/{locale}/dungeonroom.xml"; + if (xmlReader.Files.All(f => f.Name != filename)) { filename = "table/dungeonroom.xml"; } XmlReader reader = xmlReader.GetXmlReader(xmlReader.GetEntry(filename)); @@ -342,7 +344,7 @@ public IEnumerable ParseUnitedWeeklyReward() { } public IEnumerable<(int Id, string Name, Fish Fish)> ParseFish() { - XmlReader nameReader = xmlReader.GetXmlReader(xmlReader.GetEntry("en/stringfishname.xml")); + XmlReader nameReader = xmlReader.GetXmlReader(xmlReader.GetEntry($"{language}/stringfishname.xml")); var mapping = nameSerializer.Deserialize(nameReader) as StringMapping; Debug.Assert(mapping != null); @@ -480,7 +482,7 @@ public IEnumerable ParseUnitedWeeklyReward() { } public IEnumerable<(int Id, string Name, InteractObject Info)> ParseInteractObject() { - XmlReader nameReader = xmlReader.GetXmlReader(xmlReader.GetEntry("en/setitemname.xml")); + XmlReader nameReader = xmlReader.GetXmlReader(xmlReader.GetEntry($"{language}/interactname.xml")); var mapping = nameSerializer.Deserialize(nameReader) as StringMapping; Debug.Assert(mapping != null); @@ -530,11 +532,12 @@ public IEnumerable ParseUnitedWeeklyReward() { } public IEnumerable<(int Id, ItemExtraction Extraction)> ParseItemExtraction() { - string filename = "table/na/itemextraction.xml"; - if (locale == "kr") { - filename = "table/itemextraction.xml"; + string fileName = $"table/{locale}/itemextraction.xml"; + if (xmlReader.Files.All(f => f.Name != fileName)) { + fileName = "table/itemextraction.xml"; } - string xml = Sanitizer.RemoveEmpty(xmlReader.GetString(xmlReader.GetEntry(filename))); + + string xml = Sanitizer.RemoveEmpty(xmlReader.GetString(xmlReader.GetEntry(fileName))); var reader = XmlReader.Create(new StringReader(xml)); var data = itemExtractionSerializer.Deserialize(reader) as ItemExtractionRoot; Debug.Assert(data != null); @@ -617,13 +620,13 @@ public IEnumerable ParseJobTable() { } } - public IEnumerable ParseJobTableKR() { + public IEnumerable ParseJobTableNew() { string xml = Sanitizer.RemoveEmpty(xmlReader.GetString(xmlReader.GetEntry("table/job.xml"))); var reader = XmlReader.Create(new StringReader(xml)); - var data = jobKRSerializer.Deserialize(reader) as JobRootKR; + var data = jobKRSerializer.Deserialize(reader) as JobRootNew; Debug.Assert(data != null); - foreach (JobTableKR job in data.job) { + foreach (JobTableNew job in data.job) { yield return job; } } @@ -729,7 +732,7 @@ public IEnumerable ParseJobTableKR() { } public IEnumerable<(int Id, string Name, SetItemInfo Info)> ParseSetItemInfo() { - XmlReader reader = xmlReader.GetXmlReader(xmlReader.GetEntry("en/setitemname.xml")); + XmlReader reader = xmlReader.GetXmlReader(xmlReader.GetEntry($"{language}/setitemname.xml")); var mapping = nameSerializer.Deserialize(reader) as StringMapping; Debug.Assert(mapping != null); @@ -754,14 +757,14 @@ public IEnumerable ParseJobTableKR() { } } - public IEnumerable<(int Id, SetItemOptionKR Option)> ParseSetItemOptionKR() { + public IEnumerable<(int Id, SetItemOptionNew Option)> ParseSetItemOptionNew() { IO.Crypto.Common.PackFileEntry entry = xmlReader.GetEntry("table/setiteminfo.xml"); var strinte = xmlReader.GetString(entry); XmlReader reader = xmlReader.GetXmlReader(entry); - var data = setItemOptionKRSerializer.Deserialize(reader) as SetItemOptionRootKR; + var data = setItemOptionKRSerializer.Deserialize(reader) as SetItemOptionRootNew; Debug.Assert(data != null); - foreach (SetItemOptionKR option in data.option) { + foreach (SetItemOptionNew option in data.option) { yield return (option.id, option); } } @@ -798,12 +801,12 @@ public IEnumerable ParseJobTableKR() { } } - public IEnumerable<(int Id, IDictionary>)> ParseIndividualItemDropKR() { + public IEnumerable<(int Id, IDictionary>)> ParseIndividualItemDropFinal() { string xml = Sanitizer.RemoveEmpty(xmlReader.GetString(xmlReader.GetEntry("table/individualitemdrop_final.xml"))); xml = Sanitizer.SanitizeBool(xml); xml = Sanitizer.RemoveUtf8Bom(xml); var reader = XmlReader.Create(new StringReader(xml)); - var data = individualItemDropKRSerializer.Deserialize(reader) as IndividualItemDropRootKR; + var data = individualItemDropKRSerializer.Deserialize(reader) as IndividualItemDropRootNew; Debug.Assert(data != null); foreach (IndividualItemDropBox dropBox in data.DropBoxes) { @@ -1261,7 +1264,7 @@ public IEnumerable ParseJobTableKR() { } public IEnumerable<(int Level, SurvivalLevelReward Reward)> ParseSurvivalLevelReward() { - string xml = Sanitizer.RemoveEmpty(xmlReader.GetString(xmlReader.GetEntry("table/na/survivallevelreward.xml"))); + string xml = Sanitizer.RemoveEmpty(xmlReader.GetString(xmlReader.GetEntry($"table/{locale}/survivallevelreward.xml"))); var reader = XmlReader.Create(new StringReader(xml)); var data = survivalLevelRewardSerializer.Deserialize(reader) as SurvivalLevelRewardRoot; diff --git a/Maple2.File.Parser/Xml/AdditionalEffect/AdditionalEffect.cs b/Maple2.File.Parser/Xml/AdditionalEffect/AdditionalEffect.cs index 4ea4d33..4463f7a 100644 --- a/Maple2.File.Parser/Xml/AdditionalEffect/AdditionalEffect.cs +++ b/Maple2.File.Parser/Xml/AdditionalEffect/AdditionalEffect.cs @@ -48,39 +48,155 @@ public partial class AdditionalEffectDataRootNew { public partial class AdditionalEffectLevelDataNew { [XmlAttribute] public int id; - //[XmlElement] public List level; - [M2dFeatureLocale] private IList _level; + [XmlAttribute] public int skillGroupType = 0; + [XmlAttribute] public int mainType = 0; + [XmlAttribute] public bool isDebuff = false; + [XmlAttribute] public int category; + [M2dFeatureLocale(Selector = "level")] private IList _level; } public partial class AdditionalEffectDataNew : IFeatureLocale { -// [M2dArray] public string[] stringParam = Array.Empty(); -// [XmlElement] public BeginCondition beginCondition; - [XmlElement] public BasicProperty BasicProperty; - /*[XmlElement] public MotionProperty MotionProperty; - [XmlElement] public CancelEffectProperty CancelEffectProperty; - [XmlElement] public ImmuneEffectProperty ImmuneEffectProperty; - [XmlElement] public ResetSkillCoolDownTimeProperty ResetSkillCoolDownTimeProperty; - [XmlElement] public ModifyEffectDurationProperty ModifyEffectDurationProperty; - [XmlElement] public ModifyOverlapCountProperty ModifyOverlapCountProperty; - [XmlElement] public StatusPropertyNew StatusProperty; - [XmlElement] public StatNew Stat; + [XmlAttribute] public short level = 1; + [M2dArray] public string[] stringParam = Array.Empty(); + [XmlElement] public Condition Condition; + [XmlElement] public BasicProperty Basic; + [XmlElement] public ModifySkillCooldown ModifySkillCooldown; + [XmlElement] public MotionProperty Motion; + [XmlElement] public CancelEffectProperty CancelEffect; + [XmlElement] public ImmuneEffectProperty ImmuneEffect; + [XmlElement] public ResetSkillCoolDownTimeProperty ResetSkillCoolDownTime; + [XmlElement] public ModifyEffectDurationProperty ModifyEffectDuration; + [XmlElement] public ModifyOverlapCountProperty ModifyOverlapCount; + [XmlElement] public StatusPropertyNew Status; [XmlElement] public SpecialAbilityNew SpecialAbility; - [XmlElement] public FinalStatusProperty FinalStatusProperty; - [XmlElement] public OffensiveProperty OffensiveProperty; - [XmlElement] public DefensiveProperty DefensiveProperty; - [XmlElement] public RecoveryProperty RecoveryProperty; - [XmlElement] public ExpProperty ExpProperty; - [XmlElement] public DotDamageProperty DotDamageProperty; - [XmlElement] public DotBuffProperty DotBuffProperty; - [XmlElement] public ConsumeProperty ConsumeProperty; - [XmlElement] public ReflectProperty ReflectProperty; - [XmlElement] public UIProperty UIProperty; - [XmlElement] public ShieldProperty ShieldProperty; - [XmlElement] public MesoGuardProperty MesoGuardProperty; - [XmlElement] public InvokeEffectProperty InvokeEffectProperty; - [XmlElement] public SpecialEffectProperty SpecialEffectProperty; - [XmlElement] public RideeProperty RideeProperty; + [XmlElement] public FinalStatusProperty FinalStatus; + [XmlElement] public OffensiveProperty Offensive; + [XmlElement] public DefensiveProperty Defensive; + [XmlElement] public RecoveryProperty Recovery; + [XmlElement] public ExpProperty Exp; + [XmlElement] public DotDamageProperty DotDamage; + [XmlElement] public DotBuffProperty DotBuff; + [XmlElement] public ConsumeProperty Consume; + [XmlElement] public ReflectProperty Reflect; + [XmlElement] public UIProperty UI; + [XmlElement] public RemoveRechargingCount RemoveRechargingCount; + [XmlElement] public ShieldProperty Shield; + [XmlElement] public MesoGuardProperty MesoGuard; + [XmlElement] public InvokeEffectProperty InvokeEffect; + [XmlElement] public SpecialEffectProperty SpecialEffect; + [XmlElement] public RideeProperty Ridee; + [XmlElement] public Spread Spread; - [XmlElement] public List splashSkill; - [XmlElement] public List conditionSkill;*/ + [XmlElement] public List Skill; + [XmlElement] public List Additional; +} + +public partial class Additional { + [M2dArray] public int[] skillID = Array.Empty(); + [M2dArray] public short[] level = Array.Empty(); + [XmlAttribute] public int randomCast; + [XmlAttribute] public int skillTarget; + [XmlAttribute] public int ownerEvent; + [XmlAttribute] public float probability; + [XmlAttribute] public int ownerAdditionalID; + [XmlAttribute] public int ownerAdditionalLevel; + [XmlAttribute] public int ownerAdditionalCount; + [M2dArray] public int[] ownerEventSkillID = Array.Empty(); + [XmlAttribute] public bool ownerEventIgnore; + [XmlAttribute] public bool activeByIntervalTick; + [XmlAttribute] public bool ownerAdditionalMine; + [XmlAttribute] public float targetHpLess; + [XmlAttribute] public float ownerHpLess; + [XmlAttribute] public float ownerSpLess; + [XmlAttribute] public int ownerNoAdditionalID; + [M2dArray] public int[] ownerEventAdditionalID = Array.Empty(); + [XmlAttribute] public float ownerHpOver; + [XmlAttribute] public int casterAdditionalID; + [XmlAttribute] public int skillOwner; + [XmlAttribute] public int targetAdditionalID; + [XmlAttribute] public bool targetAdditionalMine; + [XmlAttribute] public int targetNoAdditionalID; + [XmlAttribute] public bool targetNpcOnly; + [M2dArray] public int[] linkSkillID = Array.Empty(); + [XmlAttribute] public bool isAllowDead; + [XmlAttribute] public int ownerRange; + [XmlAttribute] public int ownerRangeCountOver; + [XmlAttribute] public int ownerRangeCountLess; + [M2dArray] public int[] targetNpcIDs = Array.Empty(); + [XmlAttribute] public int ownerEventNoSkillID; + [XmlAttribute] public int casterEvent; + [XmlAttribute] public int casterAdditionalCount; +} + +public partial class Condition { + [XmlAttribute] public bool onlyShadowWorld; + [XmlAttribute] public bool allowBattleRidingState; + [XmlAttribute] public bool onlyBattleRidingState; + + // Additional Effect ONLY + [XmlAttribute] public int eventCondition; + [XmlAttribute] public int equipHandR; + [XmlAttribute] public int equipHandL; + [XmlAttribute] public bool allowDeadState; + [XmlAttribute] public int applyPvPZoneType; + [XmlAttribute] public int hasNotBuffID; + [XmlAttribute] public int hasBuffID; + [XmlAttribute] public int hasBuffCount; + [XmlAttribute] public bool checkActivateBuff; + [XmlAttribute] public int hasBuffLevel; + [M2dArray] public int[] usedSkillIDs = Array.Empty(); + [M2dArray] public int[] fieldIDs = Array.Empty(); + [M2dArray] public string[] requireStates = Array.Empty(); + [M2dArray] public string[] requireSubStates = Array.Empty(); + [M2dArray] public string[] requireMasteryTypes = Array.Empty(); + [M2dArray] public int[] requireMasteryValues = Array.Empty(); + [XmlAttribute] public int mapCategory; + [XmlAttribute] public int mapContinent; + [XmlAttribute] public string dungeonGroupType = string.Empty; + [XmlAttribute] public float requireDurationWithoutMove; + [XmlAttribute] public int jobCode; + [XmlAttribute] public int targetAdditionalID; + [XmlAttribute] public int targetCheckRange; + [XmlAttribute] public int targetCheckMinRange; + [XmlAttribute] public int targetFriendly; + [XmlAttribute] public int targetInRangeCount; + [XmlAttribute] public string targetCountSign = string.Empty; + [XmlAttribute] public float casterHpRate; + [XmlAttribute] public string casterHpOp = string.Empty; + [XmlAttribute] public int casterAdditionalCount; + [XmlAttribute] public int casterAdditionalID; + [XmlElement] public HasNotAdditionalEffectGroup hasNotAdditionalEffectGroup; + [XmlElement("owner")] public SubConditionTargetNew owner; + + // Skill ONLY + [XmlAttribute] public int sp; + [XmlAttribute] public bool useCoolDownShowUI; + [XmlAttribute] public bool hasNotBuffOwner; + [XmlAttribute] public bool invokeEffectFactor = true; + [XmlElement] public List weapon; + [XmlElement] public List requireMapCodes; + [XmlAttribute] public float defaultRechargingCooldownTime; + [XmlAttribute] public bool onlyFlyableMap; + [XmlAttribute] public float probability; + [XmlAttribute] public int useTargetCountFactor; + [XmlElement] public RequireEffect requireEffect; + [XmlElement("caster")] public SubConditionTargetNew caster; + [XmlElement("target")] public SubConditionTargetNew target; + + public class HasNotAdditionalEffectGroup { + [XmlAttribute] public int id; + } + + public class RequireEffect { + [XmlAttribute] public int code; + } + + public class WeaponNew { + [XmlAttribute] public int lh; + [XmlAttribute] public int rh; + } + + public class MapCodes { + [XmlAttribute] public int code; + } } diff --git a/Maple2.File.Parser/Xml/AdditionalEffect/BasicProperty.cs b/Maple2.File.Parser/Xml/AdditionalEffect/BasicProperty.cs index 5cb871b..df329ba 100644 --- a/Maple2.File.Parser/Xml/AdditionalEffect/BasicProperty.cs +++ b/Maple2.File.Parser/Xml/AdditionalEffect/BasicProperty.cs @@ -48,4 +48,7 @@ public partial class BasicProperty { [XmlAttribute] public int tailEffect = 0; // 0,1001,1002 [M2dArray] public int[] upgradeSkillLevelID = Array.Empty(); [M2dArray] public int[] upgradeSkillLevelValue = Array.Empty(); + + // only on new xml + [XmlAttribute] public int attackPossibleIndividualEffectID; } diff --git a/Maple2.File.Parser/Xml/AdditionalEffect/DotProperty.cs b/Maple2.File.Parser/Xml/AdditionalEffect/DotProperty.cs index 52ec44e..68f8231 100644 --- a/Maple2.File.Parser/Xml/AdditionalEffect/DotProperty.cs +++ b/Maple2.File.Parser/Xml/AdditionalEffect/DotProperty.cs @@ -5,7 +5,7 @@ namespace Maple2.File.Parser.Xml.AdditionalEffect; public class DotDamageProperty { [XmlAttribute] public int type; // 0,1,2,3,6 [XmlAttribute] public bool useGrade; - [XmlAttribute] public int value; + [XmlAttribute] public long value; [XmlAttribute] public float rate; [XmlAttribute] public int spValue; [XmlAttribute] public int epValue; diff --git a/Maple2.File.Parser/Xml/AdditionalEffect/ModifySkillCooldown.cs b/Maple2.File.Parser/Xml/AdditionalEffect/ModifySkillCooldown.cs new file mode 100644 index 0000000..fa8e70a --- /dev/null +++ b/Maple2.File.Parser/Xml/AdditionalEffect/ModifySkillCooldown.cs @@ -0,0 +1,9 @@ +using System.Xml.Serialization; +using M2dXmlGenerator; + +namespace Maple2.File.Parser.Xml.AdditionalEffect; + +public partial class ModifySkillCooldown { + [M2dArray] public int[] skillIDs = Array.Empty(); + [M2dArray] public float[] values = Array.Empty(); +} diff --git a/Maple2.File.Parser/Xml/AdditionalEffect/MotionProperty.cs b/Maple2.File.Parser/Xml/AdditionalEffect/MotionProperty.cs index 836adc2..d4bc815 100644 --- a/Maple2.File.Parser/Xml/AdditionalEffect/MotionProperty.cs +++ b/Maple2.File.Parser/Xml/AdditionalEffect/MotionProperty.cs @@ -36,8 +36,26 @@ public partial class MotionProperty { [XmlAttribute] public float fixedZRotation; [M2dArray] public int[] skillUseDisableIDs = Array.Empty(); + // only on New Xml + [XmlElement] public OverlapKeepEffectProperty OverlapKeepEffectProperty; + // Ignored by client. // [XmlAttribute] public int confusion; // 0 // [XmlAttribute] public int chaosMode; // 0 // [XmlAttribute] public string materialEffect = string.Empty; } + +public class OverlapKeepEffectProperty { + [XmlElement] public OverlapData start; + [XmlElement] public OverlapData keep; + [XmlElement] public OverlapData end; +} + +public class OverlapData { + [XmlElement] public List overlap = []; +} + +public class Overlap { + [XmlAttribute] public int count; + [XmlAttribute] public string effect = string.Empty; +} diff --git a/Maple2.File.Parser/Xml/AdditionalEffect/RemoveRechargingCount.cs b/Maple2.File.Parser/Xml/AdditionalEffect/RemoveRechargingCount.cs new file mode 100644 index 0000000..8103a5f --- /dev/null +++ b/Maple2.File.Parser/Xml/AdditionalEffect/RemoveRechargingCount.cs @@ -0,0 +1,9 @@ +using System.Xml.Serialization; +using M2dXmlGenerator; + +namespace Maple2.File.Parser.Xml.AdditionalEffect; + +public partial class RemoveRechargingCount { + [XmlAttribute] public int skillID; + [XmlAttribute] public int count; +} diff --git a/Maple2.File.Parser/Xml/AdditionalEffect/Spread.cs b/Maple2.File.Parser/Xml/AdditionalEffect/Spread.cs new file mode 100644 index 0000000..d5da562 --- /dev/null +++ b/Maple2.File.Parser/Xml/AdditionalEffect/Spread.cs @@ -0,0 +1,10 @@ +using System.Xml.Serialization; +using Maple2.File.Parser.Xml.Skill; + +namespace Maple2.File.Parser.Xml.AdditionalEffect; + +public class Spread { + [XmlAttribute] public int type; + [XmlAttribute] public int count; + [XmlElement] public RegionSkill rangeProperty; +} diff --git a/Maple2.File.Parser/Xml/AdditionalEffect/StatusProperty.cs b/Maple2.File.Parser/Xml/AdditionalEffect/StatusProperty.cs index c80f14e..cce6015 100644 --- a/Maple2.File.Parser/Xml/AdditionalEffect/StatusProperty.cs +++ b/Maple2.File.Parser/Xml/AdditionalEffect/StatusProperty.cs @@ -76,16 +76,6 @@ public partial class StatusPropertyNew { [XmlAttribute] public string rate = string.Empty; } -public class StatNew { - [XmlElement] public List v; -} - -public class StatEntry { - [XmlAttribute] public string type = string.Empty; - [XmlAttribute] public float value; - [XmlAttribute] public bool isRate = false; -} - public class SpecialAbilityNew { [XmlElement] public List v; } @@ -93,7 +83,6 @@ public class SpecialAbilityNew { public class SpecialAbilityEntry { [XmlAttribute] public string type = string.Empty; [XmlAttribute] public float value; - [XmlAttribute] public bool isRate = false; } public class Stat { diff --git a/Maple2.File.Parser/Xml/Common/ItemOptionKR.cs b/Maple2.File.Parser/Xml/Common/ItemOptionNew.cs similarity index 99% rename from Maple2.File.Parser/Xml/Common/ItemOptionKR.cs rename to Maple2.File.Parser/Xml/Common/ItemOptionNew.cs index 05f9cda..d809a08 100644 --- a/Maple2.File.Parser/Xml/Common/ItemOptionKR.cs +++ b/Maple2.File.Parser/Xml/Common/ItemOptionNew.cs @@ -3,7 +3,7 @@ namespace Maple2.File.Parser.Xml.Common; [XmlType(Namespace = "Common")] -public class ItemOptionKR { +public class ItemOptionNew { #region StatValue [XmlAttribute("str")] public int str_value_base; [XmlAttribute("dex")] public int dex_value_base; diff --git a/Maple2.File.Parser/Xml/Npc/Npc.cs b/Maple2.File.Parser/Xml/Npc/Npc.cs index fe07129..a01cf7d 100644 --- a/Maple2.File.Parser/Xml/Npc/Npc.cs +++ b/Maple2.File.Parser/Xml/Npc/Npc.cs @@ -40,15 +40,15 @@ public partial class NpcData : IFeatureLocale { } [XmlRoot("ms2")] -public partial class NpcDataListKR { - [XmlElement("npc")] public List npcs; +public partial class NpcDataListNew { + [XmlElement("npc")] public List npcs; } -public partial class NpcDataRootKR { +public partial class NpcDataRootNew { [XmlAttribute] public int id; - [XmlElement] public NpcDataKR environment; + [XmlElement] public NpcDataNew environment; } -public partial class NpcDataKR : NpcData { +public partial class NpcDataNew : NpcData { [XmlElement] public List effectdummy; } diff --git a/Maple2.File.Parser/Xml/Quest/Quest.cs b/Maple2.File.Parser/Xml/Quest/Quest.cs index e95fa5a..bf096d0 100644 --- a/Maple2.File.Parser/Xml/Quest/Quest.cs +++ b/Maple2.File.Parser/Xml/Quest/Quest.cs @@ -55,10 +55,10 @@ public partial class Complete { [XmlRoot("ms2")] -public partial class QuestDataRootKR { - [XmlElement("quest")] public List quests; +public partial class QuestDataRootNew { + [XmlElement("quest")] public List quests; } -public partial class QuestDataKR : QuestData, IFeatureLocale { +public partial class QuestDataNew : QuestData, IFeatureLocale { [XmlAttribute] public int id; } diff --git a/Maple2.File.Parser/Xml/Riding/Riding.cs b/Maple2.File.Parser/Xml/Riding/Riding.cs index 4d34f52..7ad01c5 100644 --- a/Maple2.File.Parser/Xml/Riding/Riding.cs +++ b/Maple2.File.Parser/Xml/Riding/Riding.cs @@ -21,11 +21,11 @@ public partial class Riding : IFeatureLocale { // KMS2: ./data/xml/riding/%08d.xml [XmlRoot("ms2")] -public class RidingKRRoot { - [XmlElement("riding")] public RidingKR riding; +public class RidingNewRoot { + [XmlElement("riding")] public RidingNew riding; } -public class RidingKR : Riding { +public class RidingNew : Riding { [XmlElement("passengers")] public List passengers; } diff --git a/Maple2.File.Parser/Xml/Script/NpcScript.cs b/Maple2.File.Parser/Xml/Script/NpcScript.cs index f871c7d..dc6312b 100644 --- a/Maple2.File.Parser/Xml/Script/NpcScript.cs +++ b/Maple2.File.Parser/Xml/Script/NpcScript.cs @@ -13,10 +13,10 @@ public partial class NpcScript { } [XmlRoot("ms2")] -public partial class NpcScriptListKr { - [XmlElement("npc")] public List npcs; +public partial class NpcScriptListNew { + [XmlElement("npc")] public List npcs; } -public partial class NpcScriptKR : NpcScript { +public partial class NpcScriptNew : NpcScript { [XmlAttribute("id")] public int id; } diff --git a/Maple2.File.Parser/Xml/Skill/Basic.cs b/Maple2.File.Parser/Xml/Skill/Basic.cs index d0d36a7..00cf7ab 100644 --- a/Maple2.File.Parser/Xml/Skill/Basic.cs +++ b/Maple2.File.Parser/Xml/Skill/Basic.cs @@ -1,5 +1,6 @@ using System.Xml.Serialization; using M2dXmlGenerator; +using Maple2.File.Parser.Xml.AdditionalEffect; namespace Maple2.File.Parser.Xml.Skill; @@ -9,8 +10,18 @@ public partial class Basic : IFeatureLocale { [XmlElement] public StateAttribute stateAttr; } -public partial class BasicKR : IFeatureLocale { +public partial class BasicNew : IFeatureLocale { + [XmlAttribute] public int mainType; + [XmlAttribute] public string paramStr = string.Empty; + [XmlAttribute] public int param1; [XmlElement] public UI ui; - [XmlElement] public KindsKR kinds; - [XmlElement] public StateAttribute stateAttr; + [XmlElement] public KindsNew kinds; + [XmlElement] public ComboNew combo; + [XmlElement] public ChangeSkillNew changeSkill; + [XmlElement] public AutoTargeting autoTargeting; + [XmlElement] public Push push; + [XmlElement] public StateAttributeNew stateAttr; + [XmlElement] public Sensor sensor; + [XmlElement] public MagicControlNew magicControl; + [XmlElement] public Condition condition; } diff --git a/Maple2.File.Parser/Xml/Skill/ChangeSkill.cs b/Maple2.File.Parser/Xml/Skill/ChangeSkill.cs index 1d75c16..ba17033 100644 --- a/Maple2.File.Parser/Xml/Skill/ChangeSkill.cs +++ b/Maple2.File.Parser/Xml/Skill/ChangeSkill.cs @@ -13,3 +13,15 @@ public partial class ChangeSkill { [XmlAttribute] public short originSkillLevel = 1; [XmlAttribute] public int autoChange; // 0,1,2 } + +public partial class ChangeSkillNew { + [M2dArray] public int[] changeSkillCheckEffectID = Array.Empty(); + [M2dArray] public int[] changeSkillCheckEffectLevel = Array.Empty(); + [M2dArray] public int[] changeSkillCheckEffectOverlapCount = Array.Empty(); + [M2dArray] public int[] changeSkillID = Array.Empty(); + // [M2dArray] public int[] changeSkillLevel = Array.Empty(); + // [XmlAttribute] public int originSkillID; + // [XmlAttribute] public short originSkillLevel = 1; + [XmlAttribute] public int autoChange; // 0,1,2 + [M2dArray] public string[] changeSkillCheckEffectCompareFunc = Array.Empty(); +} diff --git a/Maple2.File.Parser/Xml/Skill/Combo.cs b/Maple2.File.Parser/Xml/Skill/Combo.cs index e71afb0..d695f22 100644 --- a/Maple2.File.Parser/Xml/Skill/Combo.cs +++ b/Maple2.File.Parser/Xml/Skill/Combo.cs @@ -13,3 +13,14 @@ public partial class Combo { [M2dArray] public int[] inputSkill = Array.Empty(); [M2dArray] public int[] outputSkill = Array.Empty(); } + +public partial class ComboNew { + [XmlAttribute] public int comboSkill; + [XmlAttribute] public int chargingSkill; + // [XmlAttribute] public int comboOriginSkill; + // [XmlAttribute] public int npcComboSkillID; + // [XmlAttribute] public short npcComboSkillLevel = 1; + [XmlAttribute] public bool disableChargingAttackSkipFrame; + [M2dArray] public int[] inputSkill = Array.Empty(); + [M2dArray] public int[] outputSkill = Array.Empty(); +} diff --git a/Maple2.File.Parser/Xml/Skill/Kinds.cs b/Maple2.File.Parser/Xml/Skill/Kinds.cs index f4070c5..c0582e1 100644 --- a/Maple2.File.Parser/Xml/Skill/Kinds.cs +++ b/Maple2.File.Parser/Xml/Skill/Kinds.cs @@ -35,34 +35,36 @@ public partial class Kinds { [XmlAttribute] public bool unrideOnHit; } -public partial class KindsKR { - [XmlAttribute] public int type; // 0,1,2,3 - [XmlAttribute] public int subType; // 0,1,2,3,4,5,6,7,8,9 +public partial class KindsNew { + //[XmlAttribute] public int type; // 0,1,2,3 + //[XmlAttribute] public int subType; // 0,1,2,3,4,5,6,7,8,9 [XmlAttribute] public int rangeType; // 0,1,2,3 [XmlAttribute] public int groupType; // 0,2 [XmlAttribute] public int jump; // SkillId - [XmlAttribute] public string state = string.Empty; // gos* - [XmlAttribute("continue")] public bool continueSkill; - [XmlAttribute] public bool spRecoverySkill; - [XmlAttribute] public int element; // 0,1,2,3,4,5,6,7 - [XmlAttribute] public int motionType; // 0 - [XmlAttribute] public string emotion = string.Empty; - [XmlAttribute] public float offsetNameTag; - [XmlAttribute] public float offsetHPBar; - [XmlAttribute] public int immediateActive; // 0,1,2 - [XmlAttribute] public bool weaponDependency; - [XmlAttribute] public bool unrideOnUse; - [XmlAttribute] public bool releaseObjectWeapon = true; - [XmlAttribute] public bool releaseStunState; - [XmlAttribute] public bool disableWater; - [XmlAttribute] public bool holdAttack; - [M2dArray] public int[] groupIDs = Array.Empty(); + // [XmlAttribute] public string state = string.Empty; // gos* + [XmlAttribute("continue")] public bool continueSkill; + // [XmlAttribute] public bool spRecoverySkill; + [XmlAttribute] public int element; // 0,1,2,3,4,5,6,7 + // [XmlAttribute] public int motionType; // 0 + // [XmlAttribute] public string emotion = string.Empty; + [XmlAttribute] public float offsetNameTag; + // [XmlAttribute] public float offsetHPBar; + [XmlAttribute] public int immediateActive; + // [XmlAttribute] public bool weaponDependency; + [XmlAttribute] public bool unrideOnUse; + [XmlAttribute] public bool releaseObjectWeapon = true; + // [XmlAttribute] public bool releaseStunState; + [XmlAttribute] public bool disableWater; + [XmlAttribute] public bool holdAttack; + [M2dArray] public int[] groupIDs = Array.Empty(); - // Ignored by client. - [XmlAttribute] public int emotionNameTagOffset; // 0 - [XmlAttribute] public string changeSkillCheckEffectID = string.Empty; // int[] - [XmlAttribute] public string changeSkillCheckEffectLevel = string.Empty; // int[] - [XmlAttribute] public string changeSkillID = string.Empty; // int[] - [XmlAttribute] public int emotionType; // 0,1,2 - [XmlAttribute] public bool unrideOnHit; + [XmlAttribute] public bool superArmorApplyFieldType; + // + // // Ignored by client. + // [XmlAttribute] public int emotionNameTagOffset; // 0 + // [XmlAttribute] public string changeSkillCheckEffectID = string.Empty; // int[] + // [XmlAttribute] public string changeSkillCheckEffectLevel = string.Empty; // int[] + // [XmlAttribute] public string changeSkillID = string.Empty; // int[] + // [XmlAttribute] public int emotionType; // 0,1,2 + // [XmlAttribute] public bool unrideOnHit; } diff --git a/Maple2.File.Parser/Xml/Skill/MagicControl.cs b/Maple2.File.Parser/Xml/Skill/MagicControl.cs index 5517211..9550922 100644 --- a/Maple2.File.Parser/Xml/Skill/MagicControl.cs +++ b/Maple2.File.Parser/Xml/Skill/MagicControl.cs @@ -8,3 +8,10 @@ public class MagicControl { [XmlAttribute] public float duration; [XmlAttribute] public float maxDistance; } + +public class MagicControlNew { + [XmlAttribute] public int enable; + [XmlAttribute] public float moveSpeed; // * 0.0099999998 + [XmlAttribute] public float duration; + [XmlAttribute] public float maxDistance; +} diff --git a/Maple2.File.Parser/Xml/Skill/Property/DamageProperty.cs b/Maple2.File.Parser/Xml/Skill/Property/DamageProperty.cs index a4aa5b1..ebcda1f 100644 --- a/Maple2.File.Parser/Xml/Skill/Property/DamageProperty.cs +++ b/Maple2.File.Parser/Xml/Skill/Property/DamageProperty.cs @@ -1,4 +1,5 @@ using System.Xml.Serialization; +using M2dXmlGenerator; namespace Maple2.File.Parser.Xml.Skill.Property; @@ -39,3 +40,43 @@ public class DamageProperty { [XmlAttribute] public long damageRefWap; [XmlAttribute] public long damageRefTap; } + +public partial class DamagePropertyNew { + [XmlAttribute] public int count = 1; + // [XmlAttribute] public int hand; // 0,1,2 + [XmlAttribute] public float rate; + [XmlAttribute] public float hitSpeedRate = 1.0f; + [XmlAttribute] public float hitPauseTime; + [XmlAttribute] public float damagedVibrateRatio = 1.0f; + [XmlAttribute] public long value; + [XmlAttribute] public int isConstDamageValue; + [XmlAttribute] public float damageByTargetMaxHP; + [XmlAttribute] public long constDamageByTargetHP; + [XmlAttribute] public long constDamageByTargetSP; + [XmlAttribute] public string effectHit = string.Empty; + [XmlAttribute] public string effectRemain = string.Empty; + [XmlAttribute] public bool IgnoreOptimalHideDamageHitEffect; + [XmlAttribute] public bool IgnoreOptimalHideDamageRemainEffect; + [XmlAttribute] public int push; // -1,0,1,2,3,4,5 + [XmlAttribute] public float pushdistance; + [XmlAttribute] public float pushduration; + [XmlAttribute] public float pushprob = 1.0f; + [XmlAttribute] public int pushEaseType; // if n < 0 || n > 2, set to 0; 0,1,2 + [XmlAttribute] public int pushApplyField; // 0,1,2 + [XmlAttribute] public int pushDown; // 0,1,150 + [XmlAttribute] public bool pushFall; + [XmlAttribute] public int pushPriority; // 0,1,2,3,4,5,10,15,50,99 + [XmlAttribute] public int pushPriorityHitImmune; // 0,1,150,200,300,1600 + [XmlAttribute] public string pushAnimation = string.Empty; + [XmlAttribute] public float pushUpDistance; + [XmlAttribute] public int attackMaterial; // 0,1,2,3,4,5,6,7,8,9,11,100,101,102,103,104,105,106,1000,1103 + [XmlAttribute] public bool jumpHitIgnore; + [XmlAttribute] public bool superArmorBreak; + [XmlAttribute] public bool invokeEffectDisable; + [XmlAttribute] public int damageEventDisable; + [XmlAttribute] public int stateHitIgnore; + [M2dArray] public int[] stateHitOnly = Array.Empty(); + [XmlAttribute] public long damageRefBap; + [XmlAttribute] public long damageRefWap; + [XmlAttribute] public long damageRefTap; +} diff --git a/Maple2.File.Parser/Xml/Skill/RegionSkill.cs b/Maple2.File.Parser/Xml/Skill/RegionSkill.cs index 44d7db4..bea013f 100644 --- a/Maple2.File.Parser/Xml/Skill/RegionSkill.cs +++ b/Maple2.File.Parser/Xml/Skill/RegionSkill.cs @@ -36,3 +36,31 @@ public partial class RegionSkill { [XmlAttribute] public bool targetSelectHasBuffType; // 0 [XmlAttribute] public bool onlyTargetSelectHasBuff; // 0 } + +public partial class RegionSkillNew { + [XmlAttribute] public int includeCaster; // 0,1,2 + [XmlAttribute] public string rangeType = string.Empty; // box, cylinder, frustum, hole_cylinder + [XmlAttribute] public float distance; + [M2dVector3] public Vector3 rangeAdd; + [M2dVector3] public Vector3 rangeOffset; + [XmlAttribute] public float rangeZRotateDegree; + [XmlAttribute] public float height; + [XmlAttribute] public float width; + [XmlAttribute] public float endWidth; + [XmlAttribute] public int applyTarget; // 0,1,2,3,5,6,7,8 + [XmlAttribute] public int castTarget; // 0,1,2,3,5,7 + [XmlAttribute] public int targetHasBuffID; + [XmlAttribute] public int targetHasBuffOverlapCount; // 0 + [XmlAttribute] public int targetHasNotBuffID; + [XmlAttribute] public bool targetHasBuffOwner; + [XmlAttribute] public int targetSelectType; // 0,1,2,3 + [XmlAttribute] public bool targetSelectParty; + [XmlAttribute] public bool targetSelectGuild; + [XmlAttribute] public int targetStatCompare; // 0,4 + [XmlAttribute] public int targetStatCompareFunction; // 0,1,3 + [M2dArray] public int[] applyTargetIgnoreNpcRanks = Array.Empty(); + + // Ignored by client. + [XmlAttribute] public bool targetSelectHasBuffType; // 0 + [XmlAttribute] public bool onlyTargetSelectHasBuff; // 0 +} diff --git a/Maple2.File.Parser/Xml/Skill/Sensor.cs b/Maple2.File.Parser/Xml/Skill/Sensor.cs new file mode 100644 index 0000000..89d4f1f --- /dev/null +++ b/Maple2.File.Parser/Xml/Skill/Sensor.cs @@ -0,0 +1,18 @@ +using System.Numerics; +using System.Xml.Serialization; +using M2dXmlGenerator; + +namespace Maple2.File.Parser.Xml.Skill; + +public partial class Sensor { + [XmlAttribute] public string rangeType = string.Empty; + [XmlAttribute] public int distance; + [XmlAttribute] public int height; + [M2dVector3] public Vector3 rangeAdd; + [XmlAttribute] public int sensorStartDelay; + [XmlAttribute] public int sensorSplashStartDelay; + [XmlAttribute] public bool sensorForceInvokeByInterval; + [XmlAttribute] public int targetHasBuffID; + [XmlAttribute] public bool targetHasBuffOwner; // 0 + [XmlAttribute] public int targetHasNotBuffID; +} diff --git a/Maple2.File.Parser/Xml/Skill/Skill.cs b/Maple2.File.Parser/Xml/Skill/Skill.cs index ca95276..6754c14 100644 --- a/Maple2.File.Parser/Xml/Skill/Skill.cs +++ b/Maple2.File.Parser/Xml/Skill/Skill.cs @@ -1,4 +1,5 @@ -using System.Xml.Serialization; +using System.ComponentModel; +using System.Xml.Serialization; using M2dXmlGenerator; using Maple2.File.Parser.Xml.Skill.Property; // ReSharper disable InconsistentNaming @@ -137,41 +138,134 @@ public partial class SkillAttackData { [XmlAttribute] public string compulsionHit = string.Empty; } +public partial class SkillAttackDataNew { + [XmlAttribute] public string point = string.Empty; + [XmlAttribute] public int pointGroupID; + [XmlAttribute] public int targetCount; // 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,20,21,22,26,30,50,52,80,99,100,200,9999 + [XmlAttribute] public int magicPathID; + [XmlAttribute] public int cubeMagicPathID; + [XmlAttribute] public int direction = 3; // 0,1,2,3,4 + [XmlAttribute] public int sequence; + [XmlAttribute] public int attacktype; // 0,1,2,3 + [XmlAttribute] public int attackMethodType; // 0,1 + [XmlAttribute] public int hitImmuneBreak; // 0,1,2,3,5,99 + [XmlAttribute] public float brokenForce; + [XmlAttribute] public int brokenOffence; // 0,1,2,3,4,5,10,25,50,53,55,60,61,63,65,66,67,70,71,75,76,80,81,85,86,88,90,91,92,93,95,96,97,99 + [XmlAttribute] public int unrideOnHit; // 0,1,2,5 + [XmlAttribute] public int releaseObjectWeaponOnHit = 1; // 0,1,2,3,5 + [M2dArray] public int[] compulsionType = Array.Empty(); + [XmlAttribute] public int grabTargetType; // 0,1,2,3 + [M2dArray] public string[] grabNodeCategory = Array.Empty(); + [XmlAttribute] public int splashActiveSkillID; + + /*[XmlElement] public PetTamingProperty petTamingProperty; + [XmlElement] public SplashManualActiveProperty splashManualActiveProperty; + [XmlElement] public PauseProperty pauseProperty; + [XmlElement] public RegionSkill rangeProperty; + [XmlElement] public ChainProperty chainProperty; + [XmlElement] public ArrowProperty arrowProperty; + [XmlElement] public DamageProperty damageProperty;*/ + [XmlElement] public PauseProperty pause; + [XmlElement] public RegionSkillNew range; + [XmlElement] public ChainProperty chain; + [XmlElement] public ArrowProperty arrow; + [XmlElement] public DamagePropertyNew damage; + [XmlElement] public List actionAdditional; + [XmlElement] public List actionSkill; + + // Ignored by client. + [XmlAttribute] public string compulsionHit = string.Empty; +} + // KR version: ./data/xml/skilldata/%04d.xml [XmlRoot("ms2")] -public partial class SkillDataKR : IFeatureLocale { - [XmlElement("skill")] - public List Skills; +public partial class SkillDataNew : IFeatureLocale { + [XmlElement("skill")] public List Skills; } -public class SkillKR { - [XmlAttribute] - public int id; +public partial class SkillNew { + [XmlAttribute] public int id; + [XmlAttribute] public int originID = 0; + [XmlAttribute] public string comment = string.Empty; + [XmlElement("basic")] public BasicNew basic; + [M2dFeatureLocale(Selector = "value")] private IList _level; +} - [XmlAttribute] - public int originId = 0; +public partial class SkillLevelDataNew : IFeatureLocale { + [XmlAttribute] public short value; - [XmlAttribute] - public string comment = string.Empty; + [XmlAttribute] public int sp = 0; + [XmlAttribute] public int ep = 0; + [XmlAttribute] public float hpRate; + [XmlAttribute] public int cooldown = 0; + [XmlAttribute] public int meso; + [XmlAttribute] public float stanceDamageRate; + [XmlAttribute] public string stringParam = string.Empty; - [XmlElement("basic")] - public BasicKR basic; - [XmlElement("level")] - public List levels; + // [XmlElement] public BeginCondition beginCondition; + /*[XmlElement] public ChangeSkill changeSkill; + [XmlElement] public MagicControl magicControl; + [XmlElement] public AutoTargeting autoTargeting; + [XmlElement] public Push push; + [XmlElement] public Consume consume; + [XmlElement] public TargetItem targetItem; + [XmlElement] public Upgrade upgrade; + [XmlElement] public RegionSkill detectProperty; + [XmlElement] public RegionSkill sensorProperty; + [XmlElement] public SplashManualActiveProperty splashManualActiveProperty; + [XmlElement] public SkillGlideData glideProperty; + [XmlElement] public Combo combo; + [XmlElement] public RecoveryProperty recoveryProperty; + [XmlElement] public List conditionSkill;*/ + [XmlElement] public RegionSkillNew detectProperty; + [XmlElement] public List actionAdditional; + [XmlElement] public List motion; } -public class SkillLevelKR : SkillLevelData { - [XmlAttribute] - public int sp = 0; - - [XmlAttribute] - public int ep = 0; - - [XmlAttribute] - public int cooldown = 0; - - [XmlAttribute] - public string stringParam = string.Empty; +public partial class SkillMotionDataNew { + [XmlAttribute] public string sequenceName = string.Empty; + [XmlAttribute] public string motionEffect = string.Empty; + [XmlAttribute] public string loopEffect = string.Empty; + [XmlAttribute] public string endEffect = string.Empty; + [XmlAttribute] public string splashInvokeEffect = string.Empty; + [XmlAttribute] public string splashEndEffect = string.Empty; + [M2dArray] public string[] strTagEffects = Array.Empty(); + [XmlAttribute] public string selfInputCombo = string.Empty; + [XmlAttribute] public string weaponSequenceName = string.Empty; + [XmlAttribute] public string loopKeepEffect = string.Empty; + [XmlAttribute] public string loopEndEffect = string.Empty; + [XmlAttribute] public string splashDurationCastEffect = string.Empty; + [XmlAttribute] public bool IgnoreOptimalHideCastEffect; + // [XmlAttribute] public bool IgnoreOptimalHideEndEffect; + // [XmlAttribute] public bool IgnoreOptimalHideSplashInvokeEffect; + // [XmlAttribute] public bool IgnoreOptimalHideSplashEndEffect; + [XmlAttribute] public bool splashCastEffectStartDelay; + [XmlAttribute] public int splashLifeTick; // 0,6000,8000,10000,12000,14000,16000,18000,20000,22000,24000,26000,28000 + [XmlAttribute] public int splashInvokeCoolTick; // 0,100 + [XmlAttribute] public float sequenceSpeed; + [XmlAttribute] public float keyMove; + [XmlAttribute] public int movetype; // 0,3 + [XmlAttribute] public float moveangle; + // [XmlAttribute] public float movevangle; + [XmlAttribute] public float movedistance; + [XmlAttribute] public int moveEaseType; // 0,1,2 + // [XmlAttribute] public float moveMid; + // [XmlAttribute] public float moveHeight; + // [XmlAttribute] public int hide; // 0 + [XmlAttribute] public int ignoreCollisionGroups; // 0,4,16,20 + [XmlAttribute] public bool holdWeapon; + [XmlAttribute] public int loopCount; + [XmlAttribute] public bool faceTarget; + [XmlAttribute] public bool doesPlayIdleOnSkillEnd; + [XmlAttribute] public bool startNoneBlendDelay; + // [XmlAttribute] public bool ignoreASP; + [XmlAttribute] public float pushCylinderVelH; + [XmlAttribute] public float pushCylinderVelV; + [XmlAttribute] public float pushCylinderOuter; + [XmlAttribute] public float pushCylinderInner; + [XmlAttribute] public float pushCylinderHeight; + [XmlAttribute] public float aniSkipTime; + [XmlElement] public List attack; } diff --git a/Maple2.File.Parser/Xml/Skill/StateAttribute.cs b/Maple2.File.Parser/Xml/Skill/StateAttribute.cs index 463e666..88a337d 100644 --- a/Maple2.File.Parser/Xml/Skill/StateAttribute.cs +++ b/Maple2.File.Parser/Xml/Skill/StateAttribute.cs @@ -30,3 +30,31 @@ public class StateAttribute { [XmlAttribute] public float autoTargetingMaxHeight; [XmlAttribute] public int autoTargetUseMove; } + +public class StateAttributeNew { + [XmlAttribute] public int battle; + [XmlAttribute] public int superArmor; + [XmlAttribute] public int superArmorApplyFieldType; + [XmlAttribute] public int autoTargeting; + + [XmlAttribute] public int autoTargetingType; + [XmlAttribute] public int useDefaultSkill; + [XmlAttribute] public int moveType; + [XmlAttribute] public int notKeepEffect; + + [XmlAttribute] public int keyIsDown; + + [XmlAttribute] public int useDefaultSkillID; + [XmlAttribute] public int useInGameTime; + [XmlAttribute] public int cooldownGroupID; + [XmlAttribute] public int clearCooldownFromPVPZone; + [XmlAttribute] public int ignoreReduceCooldown; + [XmlAttribute] public int rechargeMaxCount; + + [XmlAttribute] public int movingInMovekey; + [XmlAttribute] public int splashMaxCount; + + [XmlAttribute] public bool rechargeShareOrigin; + + +} diff --git a/Maple2.File.Parser/Xml/Skill/SubConditionTarget.cs b/Maple2.File.Parser/Xml/Skill/SubConditionTarget.cs index ed674d9..19e25da 100644 --- a/Maple2.File.Parser/Xml/Skill/SubConditionTarget.cs +++ b/Maple2.File.Parser/Xml/Skill/SubConditionTarget.cs @@ -33,3 +33,14 @@ public partial class SubConditionTarget { [XmlElement] public List compareStat; } + +public partial class SubConditionTargetNew { + [M2dArray] public int[] hasBuffID = Array.Empty(); + [M2dArray] public bool[] hasBuffOwner = Array.Empty(); + [M2dArray] public int[] hasBuffCount = Array.Empty(); // csv map? + [M2dArray] public int[] hasNotBuffID = Array.Empty(); + [M2dArray] public bool[] hasNotBuffOwner = Array.Empty(); + + [XmlElement] public List compareStat; + +} diff --git a/Maple2.File.Parser/Xml/Skill/TriggerSkill.cs b/Maple2.File.Parser/Xml/Skill/TriggerSkill.cs index 56f0349..610b6ea 100644 --- a/Maple2.File.Parser/Xml/Skill/TriggerSkill.cs +++ b/Maple2.File.Parser/Xml/Skill/TriggerSkill.cs @@ -1,6 +1,7 @@ using System.ComponentModel; using System.Xml.Serialization; using M2dXmlGenerator; +using Maple2.File.Parser.Xml.AdditionalEffect; namespace Maple2.File.Parser.Xml.Skill; @@ -30,3 +31,34 @@ public partial class TriggerSkill { [XmlElement] public BeginCondition beginCondition; } + +public partial class ActionSkill { + [XmlAttribute] public int skillID; + [XmlAttribute] public short level; + [XmlAttribute] public uint delay; + [XmlAttribute] public int removeDelay; // 0,1500 + [XmlAttribute] public int interval; // 0,1,100,300,400,500,1000,2000,2500 + [XmlAttribute] public bool immediateActive; + [XmlAttribute] public int fireCount = 1; // 1,4,10,40,120,160,600 + [XmlAttribute] public bool nonTargetActive; + [XmlAttribute] public bool useDirection; + [XmlAttribute] public bool onlySensingActive; + [XmlAttribute] public bool dependOnCasterState; + [XmlAttribute] public bool independent; + [XmlAttribute] public bool chain; + [XmlAttribute, DefaultValue(150.0f)] public float chainDistance = 150.0f; // default to 150.0 if not float + [M2dArray] public int[] linkSkillID = Array.Empty(); + +} + +public partial class ActionAdditional { + [XmlAttribute] public int additionalID; + [XmlAttribute] public short level; + [XmlAttribute] public int skillTarget; + [XmlAttribute, DefaultValue(1)] public int skillOwner = 1; // if 0 then 1?; 0,1,2,3,5 + [XmlAttribute] public bool dependOnDamageCount; + [XmlAttribute] public int overlapCount = 1; // 1 + [M2dArray] public int[] linkSkillID = Array.Empty(); + + [XmlElement] public Condition beginCondition; +} diff --git a/Maple2.File.Parser/Xml/Table/IndividualItemDrop.cs b/Maple2.File.Parser/Xml/Table/IndividualItemDrop.cs index edfcdda..bc0f0a7 100644 --- a/Maple2.File.Parser/Xml/Table/IndividualItemDrop.cs +++ b/Maple2.File.Parser/Xml/Table/IndividualItemDrop.cs @@ -66,7 +66,7 @@ public partial class IndividualItemDrop : IFeatureLocale { // ./data/xml/table/individualitemdrop_final.xml [XmlRoot("ms2")] -public partial class IndividualItemDropRootKR { +public partial class IndividualItemDropRootNew { [XmlElement("dropBox")] public List DropBoxes = []; } diff --git a/Maple2.File.Parser/Xml/Table/ItemMergeOption.cs b/Maple2.File.Parser/Xml/Table/ItemMergeOption.cs index 85228df..deda032 100644 --- a/Maple2.File.Parser/Xml/Table/ItemMergeOption.cs +++ b/Maple2.File.Parser/Xml/Table/ItemMergeOption.cs @@ -69,11 +69,11 @@ public partial class Option { // ./data/xml/table/itemmergeoptionbase.xml [XmlRoot("ms2")] -public class ItemMergeOptionRootKR { - [XmlElement] public List mergeOption = []; +public class ItemMergeOptionRootNew { + [XmlElement] public List mergeOption = []; } -public partial class MergeOptionKR : IFeatureLocale { +public partial class MergeOptionNew : IFeatureLocale { [XmlAttribute] public int id; [XmlElement] public List slot = []; @@ -83,10 +83,10 @@ public partial class Slot { [XmlAttribute] public int part = 1; [M2dArray] public int[] partLimit = []; - [XmlElement] public List option = []; + [XmlElement] public List option = []; } -public partial class OptionKR { +public partial class OptionNew { [XmlAttribute] public string optionName = string.Empty; [XmlAttribute] public int min; diff --git a/Maple2.File.Parser/Xml/Table/JobTable.cs b/Maple2.File.Parser/Xml/Table/JobTable.cs index 67e1838..523cadd 100644 --- a/Maple2.File.Parser/Xml/Table/JobTable.cs +++ b/Maple2.File.Parser/Xml/Table/JobTable.cs @@ -69,11 +69,11 @@ public partial class LearnSkill : IFeatureLocale { [XmlRoot("ms2")] -public partial class JobRootKR { - [M2dFeatureLocale(Selector = "jobGroupID")] private IList _job; +public partial class JobRootNew { + [M2dFeatureLocale(Selector = "jobGroupID")] private IList _job; } -public partial class JobTableKR : IFeatureLocale { +public partial class JobTableNew : IFeatureLocale { [XmlAttribute] public int jobGroupID = 1; [XmlAttribute] public int subJob1 = 1; [XmlAttribute] public int subJob2 = 1; @@ -84,10 +84,10 @@ public partial class JobTableKR : IFeatureLocale { [M2dArray] public int[] startItems = Array.Empty(); - [XmlElement("skills")] public SkillsKR skills; + [XmlElement("skills")] public SkillsNew skills; } -public partial class SkillsKR { +public partial class SkillsNew { [XmlElement("v")] public List skills; public partial class Skill : IFeatureLocale { diff --git a/Maple2.File.Parser/Xml/Table/SetItemOption.cs b/Maple2.File.Parser/Xml/Table/SetItemOption.cs index 8a1b1b3..2966149 100644 --- a/Maple2.File.Parser/Xml/Table/SetItemOption.cs +++ b/Maple2.File.Parser/Xml/Table/SetItemOption.cs @@ -30,18 +30,18 @@ public partial class Part : ItemOption, IFeatureLocale { // ./data/xml/table/setiteminfo.xml [XmlRoot("ms2")] -public partial class SetItemOptionRootKR { - [XmlElement("set")] public List option; +public partial class SetItemOptionRootNew { + [XmlElement("set")] public List option; } -public partial class SetItemOptionKR : IFeatureLocale { +public partial class SetItemOptionNew : IFeatureLocale { [XmlAttribute] public int id; [XmlAttribute] public int optionID; [M2dArray] public int[] itemIDs = []; [XmlElement("part")] public List part; - public partial class Part : ItemOptionKR, IFeatureLocale { + public partial class Part : ItemOptionNew, IFeatureLocale { [XmlAttribute] public int count; [M2dArray] public int[] additionalEffectID; [M2dArray] public short[] additionalEffectLevel; diff --git a/Maple2.File.Tests/AdditionalEffectParserTest.cs b/Maple2.File.Tests/AdditionalEffectParserTest.cs index 8f33da3..a0ade8a 100644 --- a/Maple2.File.Tests/AdditionalEffectParserTest.cs +++ b/Maple2.File.Tests/AdditionalEffectParserTest.cs @@ -1,5 +1,6 @@ using Maple2.File.Parser; -using Maple2.File.Parser.Tools; + using Maple2.File.Parser.Enum; + using Maple2.File.Parser.Tools; using Maple2.File.Parser.Xml.AdditionalEffect; using Microsoft.VisualStudio.TestTools.UnitTesting; @@ -9,8 +10,8 @@ namespace Maple2.File.Tests; public class AdditionalEffectParserTest { [TestMethod] public void TestAdditionalEffectParser() { - string locale = "NA"; - Filter.Load(TestUtils.XmlReader, locale, "Live"); + var locale = Locale.NA; + Filter.Load(TestUtils.XmlReader, locale.ToString(), "Live"); var parser = new AdditionalEffectParser(TestUtils.XmlReader); int count = 0; @@ -24,8 +25,8 @@ public void TestAdditionalEffectParser() { [TestMethod] public void TestAdditionalEffectParserNew() { - string locale = "KR"; - Filter.Load(TestUtils.XmlReader, locale, "Live"); + var locale = Locale.KR; + Filter.Load(TestUtils.XmlReader, locale.ToString(), "Live"); var parser = new AdditionalEffectParser(TestUtils.XmlReader); int count = 0; @@ -34,7 +35,7 @@ public void TestAdditionalEffectParserNew() { Assert.IsNotNull(data); count++; } - Assert.AreEqual(6070, count); + Assert.AreEqual(5881, count); } } diff --git a/Maple2.File.Tests/FunctionCubeParserTest.cs b/Maple2.File.Tests/FunctionCubeParserTest.cs index 4fd34f3..cc845cd 100644 --- a/Maple2.File.Tests/FunctionCubeParserTest.cs +++ b/Maple2.File.Tests/FunctionCubeParserTest.cs @@ -1,4 +1,5 @@ using Maple2.File.Parser; +using Maple2.File.Parser.Enum; using Maple2.File.Parser.Tools; using Maple2.File.Parser.Xml.Object; using Microsoft.VisualStudio.TestTools.UnitTesting; @@ -9,7 +10,8 @@ namespace Maple2.File.Tests; public class FunctionCubeParserTest { [TestMethod] public void TestFunctionCubeParser() { - Filter.Load(TestUtils.XmlReader, "NA", "Live"); + var locale = Locale.NA; + Filter.Load(TestUtils.XmlReader, locale.ToString(), "Live"); var parser = new FunctionCubeParser(TestUtils.XmlReader); // parser.FunctionCubeSerializer.UnknownElement += TestUtils.UnknownElementHandler; @@ -21,21 +23,15 @@ public void TestFunctionCubeParser() { Assert.IsNotNull(data); count++; } - Assert.AreEqual(427, count); - } - [TestMethod] - public void TestFunctionCubeParserKr() { - Filter.Load(TestUtils.XmlReader, "KR", "Live"); - var parser = new FunctionCubeParser(TestUtils.XmlReader); - - int count = 0; - foreach ((int id, FunctionCubeRoot data) in parser.Parse()) { - Assert.IsTrue(id >= 0); - Assert.IsNotNull(data); - count++; + switch (locale) { + case Locale.NA: + Assert.AreEqual(427, count); + break; + case Locale.KR: + Assert.AreEqual(433, count); + break; } - Assert.AreEqual(433, count); } } diff --git a/Maple2.File.Tests/ItemOptionParserTest.cs b/Maple2.File.Tests/ItemOptionParserTest.cs index 707fb22..3fbd6cf 100644 --- a/Maple2.File.Tests/ItemOptionParserTest.cs +++ b/Maple2.File.Tests/ItemOptionParserTest.cs @@ -1,4 +1,5 @@ using Maple2.File.Parser; +using Maple2.File.Parser.Enum; using Maple2.File.Parser.Tools; using Microsoft.VisualStudio.TestTools.UnitTesting; @@ -8,7 +9,8 @@ namespace Maple2.File.Tests; public class ItemOptionParserTest { [TestMethod] public void TestItemOptionParser() { - Filter.Load(TestUtils.XmlReader, "NA", "Live"); + var locale = Locale.NA; + Filter.Load(TestUtils.XmlReader, locale.ToString(), "Live"); var parser = new ItemOptionParser(TestUtils.XmlReader); foreach (var data in parser.ParseConstant()) { @@ -24,7 +26,8 @@ public void TestItemOptionParser() { [TestMethod] public void TestItemMergeOptionParser() { - Filter.Load(TestUtils.XmlReader, "NA", "Live"); + var locale = Locale.NA; + Filter.Load(TestUtils.XmlReader, locale.ToString(), "Live"); var parser = new ItemOptionParser(TestUtils.XmlReader); foreach (var data in parser.ParseMergeOptionBase()) { @@ -37,7 +40,8 @@ public void TestItemMergeOptionParser() { [TestMethod] public void TestItemOptionPickParser() { - Filter.Load(TestUtils.XmlReader, "NA", "Live"); + var locale = Locale.NA; + Filter.Load(TestUtils.XmlReader, locale.ToString(), "Live"); var parser = new ItemOptionParser(TestUtils.XmlReader); foreach (var data in parser.ParsePick()) { @@ -47,7 +51,8 @@ public void TestItemOptionPickParser() { [TestMethod] public void TestItemOptionVariationParser() { - Filter.Load(TestUtils.XmlReader, "NA", "Live"); + var locale = Locale.NA; + Filter.Load(TestUtils.XmlReader, locale.ToString(), "Live"); var parser = new ItemOptionParser(TestUtils.XmlReader); foreach (var data in parser.ParseVariation()) { @@ -59,19 +64,20 @@ public void TestItemOptionVariationParser() { } [TestMethod] - public void TestItemOptionParserKr() { - Filter.Load(TestUtils.XmlReader, "KR", "Live"); + public void TestItemOptionParserNew() { + var locale = Locale.KR; + Filter.Load(TestUtils.XmlReader, locale.ToString(), "Live"); var parser = new ItemOptionParser(TestUtils.XmlReader); int count = 0; - foreach (var data in parser.ParseConstantKr()) { + foreach (var data in parser.ParseConstantNew()) { Assert.IsNotNull(data); count++; } Assert.AreEqual(4013, count); count = 0; - foreach (var data in parser.ParseRandomKr()) { + foreach (var data in parser.ParseRandomNew()) { Assert.IsNotNull(data); count++; } @@ -84,12 +90,13 @@ public void TestItemOptionParserKr() { } [TestMethod] - public void TestItemMergeOptionParserKr() { - Filter.Load(TestUtils.XmlReader, "KR", "Live"); + public void TestItemMergeOptionParserNew() { + var locale = Locale.KR; + Filter.Load(TestUtils.XmlReader, locale.ToString(), "Live"); var parser = new ItemOptionParser(TestUtils.XmlReader); int count = 0; - foreach (var data in parser.ParseMergeOptionBaseKr()) { + foreach (var data in parser.ParseMergeOptionBaseNew()) { Assert.IsNotNull(data); count++; } @@ -104,18 +111,5 @@ public void TestItemMergeOptionParserKr() { // Assert.IsNotNull(data); // } // } - - [TestMethod] - public void TestItemOptionVariationParserKr() { - Filter.Load(TestUtils.XmlReader, "KR", "Live"); - var parser = new ItemOptionParser(TestUtils.XmlReader); - - foreach (var data in parser.ParseVariation()) { - Assert.IsNotNull(data); - } - foreach (var data in parser.ParseVariationEquip()) { - Assert.IsNotNull(data.Option); - } - } } diff --git a/Maple2.File.Tests/ItemParserTest.cs b/Maple2.File.Tests/ItemParserTest.cs index f90dd91..e3f3fa0 100644 --- a/Maple2.File.Tests/ItemParserTest.cs +++ b/Maple2.File.Tests/ItemParserTest.cs @@ -1,5 +1,6 @@ using M2dXmlGenerator; using Maple2.File.Parser; +using Maple2.File.Parser.Enum; using Maple2.File.Parser.Tools; using Maple2.File.Parser.Xml.Item; using Microsoft.VisualStudio.TestTools.UnitTesting; @@ -10,7 +11,8 @@ namespace Maple2.File.Tests; public class ItemParserTest { [TestMethod] public void TestItemParser() { - Filter.Load(TestUtils.XmlReader, "NA", "Live"); + var locale = Locale.NA; + Filter.Load(TestUtils.XmlReader, locale.ToString(), "Live"); var parser = new ItemParser(TestUtils.XmlReader, "en"); // parser.NameSerializer.UnknownElement += TestUtils.UnknownElementHandler; @@ -31,12 +33,13 @@ public void TestItemParser() { [TestMethod] public void TestItemParserNew() { - Filter.Load(TestUtils.XmlReader, "KR", "Live"); + var locale = Locale.KR; + Filter.Load(TestUtils.XmlReader, locale.ToString(), "Live"); var parser = new ItemParser(TestUtils.XmlReader, "kr"); // parser.NameSerializer.UnknownElement += TestUtils.UnknownElementHandler; // parser.NameSerializer.UnknownAttribute += TestUtils.UnknownAttributeHandler; - // parser.ItemSerializer.UnknownElement += TestUtils.UnknownElementHandler; + //parser.ItemSerializer.UnknownElement += TestUtils.UnknownElementHandler; // parser.ItemSerializer.UnknownAttribute += TestUtils.UnknownAttributeHandler; int count = 0; @@ -51,7 +54,8 @@ public void TestItemParserNew() { [TestMethod] public void TestItemNames() { - Filter.Load(TestUtils.XmlReader, "NA", "Live"); + var locale = Locale.NA; + Filter.Load(TestUtils.XmlReader, locale.ToString(), "Live"); var parser = new ItemParser(TestUtils.XmlReader, "en"); var itemNames = parser.ItemNames(); diff --git a/Maple2.File.Tests/MapParserTest.cs b/Maple2.File.Tests/MapParserTest.cs index f4ed6ee..08ecef0 100644 --- a/Maple2.File.Tests/MapParserTest.cs +++ b/Maple2.File.Tests/MapParserTest.cs @@ -1,4 +1,5 @@ using Maple2.File.Parser; +using Maple2.File.Parser.Enum; using Maple2.File.Parser.Tools; using Maple2.File.Parser.Xml.Map; using Microsoft.VisualStudio.TestTools.UnitTesting; @@ -9,8 +10,9 @@ namespace Maple2.File.Tests; public class MapParserTest { [TestMethod] public void TestMapParser() { - Filter.Load(TestUtils.XmlReader, "NA", "Live"); - var parser = new MapParser(TestUtils.XmlReader); + var locale = Locale.NA; + Filter.Load(TestUtils.XmlReader, locale.ToString(), "Live"); + var parser = new MapParser(TestUtils.XmlReader, Language.en); // parser.NameSerializer.UnknownElement += TestUtils.UnknownElementHandler; // parser.NameSerializer.UnknownAttribute += TestUtils.UnknownAttributeHandler; @@ -28,9 +30,10 @@ public void TestMapParser() { } [TestMethod] - public void TestMapParserKr() { - Filter.Load(TestUtils.XmlReader, "KR", "Live"); - var parser = new MapParser(TestUtils.XmlReader); + public void TestMapParserNew() { + var locale = Locale.KR; + Filter.Load(TestUtils.XmlReader, locale.ToString(), "Live"); + var parser = new MapParser(TestUtils.XmlReader, Language.kr); // parser.NameSerializer.UnknownElement += TestUtils.UnknownElementHandler; // parser.NameSerializer.UnknownAttribute += TestUtils.UnknownAttributeHandler; @@ -38,7 +41,7 @@ public void TestMapParserKr() { // parser.MapSerializer.UnknownAttribute += TestUtils.UnknownAttributeHandler; int count = 0; - foreach ((int id, string name, MapData data) in parser.Parse()) { + foreach ((int id, string name, MapData data) in parser.ParseNew()) { // Debug.WriteLine($"Parsing Map: {id} ({name})"); Assert.IsTrue(id > 0); Assert.IsNotNull(data); @@ -49,20 +52,20 @@ public void TestMapParserKr() { [TestMethod] public void TestMapNames() { - Filter.Load(TestUtils.XmlReader, "NA", "Live"); - var parser = new MapParser(TestUtils.XmlReader); + var locale = Locale.NA; + var language = Language.en; + Filter.Load(TestUtils.XmlReader, locale.ToString(), "Live"); + var parser = new MapParser(TestUtils.XmlReader, language); var mapNames = parser.ParseMapNames(); - Assert.AreEqual(1152, mapNames.Count); - } - - [TestMethod] - public void TestMapNamesKr() { - Filter.Load(TestUtils.XmlReader, "KR", "Live"); - var parser = new MapParser(TestUtils.XmlReader); - var mapNames = parser.ParseMapNames(); - - Assert.AreEqual(1282, mapNames.Count); + switch (language) { + case Language.en: + Assert.AreEqual(1152, mapNames.Count); + break; + case Language.kr: + Assert.AreEqual(1282, mapNames.Count); + break; + } } } diff --git a/Maple2.File.Tests/NifParserTest.cs b/Maple2.File.Tests/NifParserTest.cs index 358e213..1702e66 100644 --- a/Maple2.File.Tests/NifParserTest.cs +++ b/Maple2.File.Tests/NifParserTest.cs @@ -24,12 +24,6 @@ public void TestNifParser() { ValidateNifMeshData(parser); } - [TestMethod] - public void TestNifParserKr() { - var parser = new NifParser(TestUtils.ModelM2dReaders); - ValidateNifMeshData(parser); - } - private static void ValidateNifMeshData(NifParser parser) { foreach ((uint llid, string relpath, NifDocument document) in parser.Parse()) { try { diff --git a/Maple2.File.Tests/NpcParserTest.cs b/Maple2.File.Tests/NpcParserTest.cs index 0f0a40f..345d628 100644 --- a/Maple2.File.Tests/NpcParserTest.cs +++ b/Maple2.File.Tests/NpcParserTest.cs @@ -1,4 +1,5 @@ using Maple2.File.Parser; +using Maple2.File.Parser.Enum; using Maple2.File.Parser.Tools; using Maple2.File.Parser.Xml.Npc; using Microsoft.VisualStudio.TestTools.UnitTesting; @@ -9,8 +10,10 @@ namespace Maple2.File.Tests; public class NpcParserTest { [TestMethod] public void TestNpcParser() { - Filter.Load(TestUtils.XmlReader, "NA", "Live"); - var parser = new NpcParser(TestUtils.XmlReader); + var locale = Locale.NA; + var language = Language.en; + Filter.Load(TestUtils.XmlReader, locale.ToString(), "Live"); + var parser = new NpcParser(TestUtils.XmlReader, language); // parser.NameSerializer.UnknownElement += TestUtils.UnknownElementHandler; // parser.NameSerializer.UnknownAttribute += TestUtils.UnknownAttributeHandler; @@ -28,9 +31,11 @@ public void TestNpcParser() { } [TestMethod] - public void TestNpcParserKr() { - Filter.Load(TestUtils.XmlReader, "KR", "Live"); - var parser = new NpcParser(TestUtils.XmlReader); + public void TestNpcParserNew() { + var locale = Locale.KR; + var language = Language.kr; + Filter.Load(TestUtils.XmlReader, locale.ToString(), "Live"); + var parser = new NpcParser(TestUtils.XmlReader, language); // parser.NameSerializer.UnknownElement += TestUtils.UnknownElementHandler; // parser.NameSerializer.UnknownAttribute += TestUtils.UnknownAttributeHandler; @@ -38,7 +43,7 @@ public void TestNpcParserKr() { // parser.NpcSerializer.UnknownAttribute += TestUtils.UnknownAttributeHandler; int count = 0; - foreach ((int id, string name, NpcDataKR data, List dummy) in parser.ParseKr()) { + foreach ((int id, string name, NpcDataNew data, List dummy) in parser.ParseNew()) { // Debug.WriteLine($"Parsing Npc: {id} ({name})"); Assert.IsTrue(id > 0); Assert.IsNotNull(data); @@ -49,8 +54,10 @@ public void TestNpcParserKr() { [TestMethod] public void TestNpcNameParser() { - Filter.Load(TestUtils.XmlReader, "NA", "Live"); - var parser = new NpcParser(TestUtils.XmlReader); + var locale = Locale.NA; + var language = Language.en; + Filter.Load(TestUtils.XmlReader, locale.ToString(), "Live"); + var parser = new NpcParser(TestUtils.XmlReader, language); int count = 0; foreach ((int id, string name) in parser.ParseNpcNames()) { @@ -59,22 +66,14 @@ public void TestNpcNameParser() { Assert.IsNotNull(name); count++; } - Assert.AreEqual(7114, count); - } - - [TestMethod] - public void TestNpcNameParserKr() { - Filter.Load(TestUtils.XmlReader, "KR", "Live"); - var parser = new NpcParser(TestUtils.XmlReader); - - int count = 0; - foreach ((int id, string name) in parser.ParseNpcNames()) { - // Debug.WriteLine($"Parsing Npc Name: {id} ({name})"); - Assert.IsTrue(id > 0); - Assert.IsNotNull(name); - count++; + switch (locale) { + case Locale.NA: + Assert.AreEqual(7114, count); + break; + case Locale.KR: + Assert.AreEqual(7850, count); + break; } - Assert.AreEqual(7850, count); } } diff --git a/Maple2.File.Tests/QuestParserTest.cs b/Maple2.File.Tests/QuestParserTest.cs index becc148..4590c3d 100644 --- a/Maple2.File.Tests/QuestParserTest.cs +++ b/Maple2.File.Tests/QuestParserTest.cs @@ -1,4 +1,5 @@ using Maple2.File.Parser; +using Maple2.File.Parser.Enum; using Maple2.File.Parser.Tools; using Maple2.File.Parser.Xml.Quest; using Microsoft.VisualStudio.TestTools.UnitTesting; @@ -9,8 +10,10 @@ namespace Maple2.File.Tests; public class QuestParserTest { [TestMethod] public void TestQuestParser() { - Filter.Load(TestUtils.XmlReader, "NA", "Live"); - var parser = new QuestParser(TestUtils.XmlReader); + var locale = Locale.NA; + var language = Language.en; + Filter.Load(TestUtils.XmlReader, locale.ToString(), "Live"); + var parser = new QuestParser(TestUtils.XmlReader, language); // parser.NameSerializer.UnknownElement += TestUtils.UnknownElementHandler; // parser.NameSerializer.UnknownAttribute += TestUtils.UnknownAttributeHandler; @@ -28,9 +31,11 @@ public void TestQuestParser() { } [TestMethod] - public void TestQuestParserKr() { - Filter.Load(TestUtils.XmlReader, "KR", "Live"); - var parser = new QuestParser(TestUtils.XmlReader); + public void TestQuestParserNew() { + var locale = Locale.KR; + var language = Language.kr; + Filter.Load(TestUtils.XmlReader, locale.ToString(), "Live"); + var parser = new QuestParser(TestUtils.XmlReader, language); // parser.NameSerializer.UnknownElement += TestUtils.UnknownElementHandler; // parser.NameSerializer.UnknownAttribute += TestUtils.UnknownAttributeHandler; @@ -38,7 +43,7 @@ public void TestQuestParserKr() { // parser.QuestSerializer.UnknownAttribute += TestUtils.UnknownAttributeHandler; int count = 0; - foreach ((int id, string name, QuestDataKR data) in parser.ParseKr()) { + foreach ((int id, string name, QuestDataNew data) in parser.ParseNew()) { // Debug.WriteLine($"Parsing Quest: {id} ({name})"); Assert.IsTrue(id > 0); Assert.IsNotNull(data); @@ -49,8 +54,10 @@ public void TestQuestParserKr() { [TestMethod] public void TestQuestDescriptionParser() { - Filter.Load(TestUtils.XmlReader, "NA", "Live"); - var parser = new QuestParser(TestUtils.XmlReader); + var locale = Locale.NA; + var language = Language.en; + Filter.Load(TestUtils.XmlReader, locale.ToString(), "Live"); + var parser = new QuestParser(TestUtils.XmlReader, language); int count = 0; foreach ((int id, string name) in parser.ParseQuestDescriptions()) { @@ -59,22 +66,14 @@ public void TestQuestDescriptionParser() { Assert.IsNotNull(name); count++; } - Assert.AreEqual(5612, count); - } - - [TestMethod] - public void TestQuestDescriptionParserKr() { - Filter.Load(TestUtils.XmlReader, "KR", "Live"); - var parser = new QuestParser(TestUtils.XmlReader); - - int count = 0; - foreach ((int id, string name) in parser.ParseQuestDescriptions()) { - // Debug.WriteLine($"Parsing Quest Description: {id} ({name})"); - Assert.IsTrue(id > 0); - Assert.IsNotNull(name); - count++; + switch (language) { + case Language.en: + Assert.AreEqual(5612, count); + break; + case Language.kr: + Assert.AreEqual(5793, count); + break; } - Assert.AreEqual(5793, count); } } diff --git a/Maple2.File.Tests/RidingParserTest.cs b/Maple2.File.Tests/RidingParserTest.cs index c67bf9b..df30dba 100644 --- a/Maple2.File.Tests/RidingParserTest.cs +++ b/Maple2.File.Tests/RidingParserTest.cs @@ -1,4 +1,5 @@ using Maple2.File.Parser; +using Maple2.File.Parser.Enum; using Maple2.File.Parser.Tools; using Maple2.File.Parser.Xml.Riding; using Microsoft.VisualStudio.TestTools.UnitTesting; @@ -9,7 +10,8 @@ namespace Maple2.File.Tests; public class RidingParserTest { [TestMethod] public void TestRidingParser() { - Filter.Load(TestUtils.XmlReader, "NA", "Live"); + var locale = Locale.NA; + Filter.Load(TestUtils.XmlReader, locale.ToString(), "Live"); var parser = new RidingParser(TestUtils.XmlReader); int count = 0; @@ -24,7 +26,8 @@ public void TestRidingParser() { [TestMethod] public void TestRidingPassengerParser() { - Filter.Load(TestUtils.XmlReader, "NA", "Live"); + var locale = Locale.NA; + Filter.Load(TestUtils.XmlReader, locale.ToString(), "Live"); var parser = new RidingParser(TestUtils.XmlReader); int count = 0; @@ -39,11 +42,12 @@ public void TestRidingPassengerParser() { [TestMethod] public void TestRidingParserKr() { - Filter.Load(TestUtils.XmlReader, "KR", "Live"); + var locale = Locale.KR; + Filter.Load(TestUtils.XmlReader, locale.ToString(), "Live"); var parser = new RidingParser(TestUtils.XmlReader); int count = 0; - foreach ((int id, RidingKR data) in parser.ParseKr()) { + foreach ((int id, RidingNew data) in parser.ParseNew()) { // Debug.WriteLine($"Parsing Riding: {id}"); Assert.IsTrue(id >= 0); Assert.IsNotNull(data); diff --git a/Maple2.File.Tests/ScriptParserTest.cs b/Maple2.File.Tests/ScriptParserTest.cs index 1adc167..b75f173 100644 --- a/Maple2.File.Tests/ScriptParserTest.cs +++ b/Maple2.File.Tests/ScriptParserTest.cs @@ -1,4 +1,5 @@ using Maple2.File.Parser; +using Maple2.File.Parser.Enum; using Maple2.File.Parser.Tools; using Maple2.File.Parser.Xml.Script; using Microsoft.VisualStudio.TestTools.UnitTesting; @@ -9,8 +10,10 @@ namespace Maple2.File.Tests; public class ScriptParserTest { [TestMethod] public void TestNpcScriptParser() { - Filter.Load(TestUtils.XmlReader, "NA", "Live"); - var parser = new ScriptParser(TestUtils.XmlReader); + var locale = Locale.NA; + var language = Language.en; + Filter.Load(TestUtils.XmlReader, locale.ToString(), "Live"); + var parser = new ScriptParser(TestUtils.XmlReader, language); // parser.scriptStringSerializer.UnknownElement += TestUtils.UnknownElementHandler; // parser.scriptStringSerializer.UnknownAttribute += TestUtils.UnknownAttributeHandler; @@ -28,8 +31,10 @@ public void TestNpcScriptParser() { [TestMethod] public void TestQuestScriptParser() { - Filter.Load(TestUtils.XmlReader, "NA", "Live"); - var parser = new ScriptParser(TestUtils.XmlReader); + var locale = Locale.NA; + var language = Language.en; + Filter.Load(TestUtils.XmlReader, locale.ToString(), "Live"); + var parser = new ScriptParser(TestUtils.XmlReader, language); // parser.scriptStringSerializer.UnknownElement += TestUtils.UnknownElementHandler; // parser.scriptStringSerializer.UnknownAttribute += TestUtils.UnknownAttributeHandler; @@ -47,8 +52,10 @@ public void TestQuestScriptParser() { [TestMethod] public void TestStringsParser() { - Filter.Load(TestUtils.XmlReader, "NA", "Live"); - var parser = new ScriptParser(TestUtils.XmlReader); + var locale = Locale.NA; + var language = Language.en; + Filter.Load(TestUtils.XmlReader, locale.ToString(), "Live"); + var parser = new ScriptParser(TestUtils.XmlReader, language); // parser.NameSerializer.UnknownElement += TestUtils.UnknownElementHandler; // parser.NameSerializer.UnknownAttribute += TestUtils.UnknownAttributeHandler; @@ -66,12 +73,14 @@ public void TestStringsParser() { [TestMethod] - public void TestNpcScriptParserKr() { - Filter.Load(TestUtils.XmlReader, "KR", "Live"); - var parser = new ScriptParser(TestUtils.XmlReader); + public void TestNpcScriptParserNew() { + var locale = Locale.KR; + var language = Language.kr; + Filter.Load(TestUtils.XmlReader, locale.ToString(), "Live"); + var parser = new ScriptParser(TestUtils.XmlReader, language); int count = 0; - foreach ((int id, NpcScriptKR script) in parser.ParseNpcKr()) { + foreach ((int id, NpcScriptNew script) in parser.ParseNpcNew()) { Assert.IsTrue(id > 0); Assert.IsNotNull(script); count++; @@ -80,12 +89,14 @@ public void TestNpcScriptParserKr() { } [TestMethod] - public void TestQuestScriptParserKr() { - Filter.Load(TestUtils.XmlReader, "KR", "Live"); - var parser = new ScriptParser(TestUtils.XmlReader); + public void TestQuestScriptParserNew() { + var locale = Locale.KR; + var language = Language.kr; + Filter.Load(TestUtils.XmlReader, locale.ToString(), "Live"); + var parser = new ScriptParser(TestUtils.XmlReader, language); int count = 0; - foreach ((int id, QuestScript script) in parser.ParseQuestKr()) { + foreach ((int id, QuestScript script) in parser.ParseQuestNew()) { Assert.IsTrue(id > 0); Assert.IsNotNull(script); count++; diff --git a/Maple2.File.Tests/SkillParserTest.cs b/Maple2.File.Tests/SkillParserTest.cs index 459e547..ad0b66b 100644 --- a/Maple2.File.Tests/SkillParserTest.cs +++ b/Maple2.File.Tests/SkillParserTest.cs @@ -1,4 +1,5 @@ using Maple2.File.Parser; +using Maple2.File.Parser.Enum; using Maple2.File.Parser.Tools; using Maple2.File.Parser.Xml.Skill; using Microsoft.VisualStudio.TestTools.UnitTesting; @@ -9,8 +10,9 @@ namespace Maple2.File.Tests; public class SkillParserTest { [TestMethod] public void TestSkillParser() { - Filter.Load(TestUtils.XmlReader, "NA", "Live"); - var parser = new SkillParser(TestUtils.XmlReader); + var locale = Locale.NA; + Filter.Load(TestUtils.XmlReader, locale.ToString(), "Live"); + var parser = new SkillParser(TestUtils.XmlReader, Language.en); int count = 0; foreach ((int id, string name, SkillData data) in parser.Parse()) { @@ -22,12 +24,17 @@ public void TestSkillParser() { } [TestMethod] - public void TestSkillParserKr() { - Filter.Load(TestUtils.XmlReader, "KR", "Live"); - var parser = new SkillParser(TestUtils.XmlReader); + public void TestSkillParserNew() { + var locale = Locale.KR; + Filter.Load(TestUtils.XmlReader, locale.ToString(), "Live"); + var parser = new SkillParser(TestUtils.XmlReader, Language.kr); + + // parser.skillNewSerializer.UnknownElement += TestUtils.UnknownElementHandler; + //parser.skillNewSerializer.UnknownAttribute += TestUtils.UnknownAttributeHandler; + int count = 0; - foreach ((int id, string name, SkillKR data) in parser.ParseKr()) { + foreach ((int id, string name, SkillNew data) in parser.ParseNew()) { Assert.IsTrue(id > 0); Assert.IsNotNull(data); count++; @@ -38,20 +45,18 @@ public void TestSkillParserKr() { [TestMethod] public void TestSkillNames() { - Filter.Load(TestUtils.XmlReader, "NA", "Live"); - var parser = new SkillParser(TestUtils.XmlReader); + var locale = Locale.NA; + Filter.Load(TestUtils.XmlReader, locale.ToString(), "Live"); + var parser = new SkillParser(TestUtils.XmlReader, Language.en); Dictionary skillNames = parser.LoadSkillNames(); + switch (locale) { + case Locale.NA: + break; + case Locale.KR: + break; + } Assert.AreEqual(1392, skillNames.Count); } - - [TestMethod] - public void TestSkillNamesKr() { - Filter.Load(TestUtils.XmlReader, "KR", "Live"); - var parser = new SkillParser(TestUtils.XmlReader); - Dictionary skillNames = parser.LoadSkillNames(); - - Assert.AreEqual(1421, skillNames.Count); - } } diff --git a/Maple2.File.Tests/TableParserKRTest.cs b/Maple2.File.Tests/TableParserKRTest.cs deleted file mode 100644 index f249cb3..0000000 --- a/Maple2.File.Tests/TableParserKRTest.cs +++ /dev/null @@ -1,653 +0,0 @@ -using Maple2.File.Parser; -using Maple2.File.Parser.Tools; -using Maple2.File.Parser.Xml.Table; -using Microsoft.VisualStudio.TestTools.UnitTesting; - -namespace Maple2.File.Tests; - -[TestClass] -public class TableParserKrTest { - private static TableParser _parser = null!; - - [ClassInitialize] - public static void ClassInit(TestContext context) { - Filter.Load(TestUtils.XmlReader, "KR", "Live"); - _parser = new TableParser(TestUtils.XmlReader); - } - - [TestMethod] - public void TestColorPaletteParserKr() { - foreach ((_, _) in _parser.ParseColorPalette()) { - continue; - } - } - - [TestMethod] - public void TestParseScrollKr() { - foreach ((_, _) in _parser.ParseEnchantScroll()) { - continue; - } - foreach ((_, _) in _parser.ParseItemRemakeScroll()) { - continue; - } - foreach ((_, _) in _parser.ParseItemRepackingScroll()) { - continue; - } - foreach ((_, _) in _parser.ParseItemSocketScroll()) { - continue; - } - } - - [TestMethod] - public void TestBankTypeKr() { - foreach ((_, _) in _parser.ParseBankType()) { - continue; - } - } - - [TestMethod] - public void TestChatStickerKr() { - foreach ((_, _) in _parser.ParseChatSticker()) { - continue; - } - } - - [TestMethod] - public void TestParseDefaultItemsKr() { - foreach ((_, _, _) in _parser.ParseDefaultItems()) { - continue; - } - } - - [TestMethod] - public void TestParseDungeonRoomKr() { - foreach ((_, _) in _parser.ParseDungeonRoom()) { - continue; - } - } - - [TestMethod] - public void TestDungeonRoundDataKr() { - foreach ((_, _) in _parser.ParseDungeonRoundData()) { - continue; - } - } - - [TestMethod] - public void TestDungeonRankRewardKr() { - foreach ((_, _) in _parser.ParseDungeonRankReward()) { - continue; - } - } - - [TestMethod] - public void TestDungeonMissionKr() { - foreach ((_, _) in _parser.ParseDungeonMission()) { - continue; - } - } - - [TestMethod] - public void TestDungeonConfigKr() { - foreach (var _ in _parser.ParseDungeonConfig()) { - continue; - } - } - - [TestMethod] - public void TestReverseRaidConfigKr() { - foreach (var _ in _parser.ParseReverseRaidConfig()) { - continue; - } - } - - [TestMethod] - public void TestUnitedWeeklyRewardKr() { - foreach (var _ in _parser.ParseUnitedWeeklyReward()) { - continue; - } - } - - [TestMethod] - public void TestFishKr() { - foreach ((_, _, _) in _parser.ParseFish()) { - continue; - } - } - - [TestMethod] - public void TestFishHabitatKr() { - foreach ((_, _) in _parser.ParseFishHabitat()) { - continue; - } - } - - [TestMethod] - public void TestFishingRodKr() { - foreach ((_, _) in _parser.ParseFishingRod()) { - continue; - } - } - - [TestMethod] - public void TestFishingSpotKr() { - foreach ((_, _) in _parser.ParseFishingSpot()) { - continue; - } - } - - [TestMethod] - public void TestGuildBuffKr() { - foreach ((_, _) in _parser.ParseGuildBuff()) { - continue; - } - } - - [TestMethod] - public void TestGuildContributionKr() { - foreach ((_, _) in _parser.ParseGuildContribution()) { - continue; - } - } - - [TestMethod] - public void TestGuildEventKr() { - foreach ((_, _) in _parser.ParseGuildEvent()) { - continue; - } - } - - [Ignore] // Removed from KMS2? - public void TestGuildExpKr() { - foreach ((_, _) in _parser.ParseGuildExp()) { - continue; - } - } - - [TestMethod] - public void TestGuildHouseKr() { - foreach ((_, _) in _parser.ParseGuildHouse()) { - continue; - } - } - - [TestMethod] - public void TestGuildNpcKr() { - foreach ((_, _) in _parser.ParseGuildNpc()) { - continue; - } - } - - [TestMethod] - public void TestGuildPropertyKr() { - foreach ((_, _) in _parser.ParseGuildProperty()) { - continue; - } - } - - [TestMethod] - public void TestParseInstrumentCategoryInfoKr() { - foreach ((_, _) in _parser.ParseInstrumentCategoryInfo()) { - continue; - } - } - - [TestMethod] - public void TestParseInstrumentInfoKr() { - foreach ((_, _) in _parser.ParseInstrumentInfo()) { - continue; - } - } - - [TestMethod] - public void TestParseInteractObjectInfoKr() { - foreach ((_, _, _) in _parser.ParseInteractObject()) { - continue; - } - foreach ((_, _) in _parser.ParseInteractObjectMastery()) { - continue; - } - } - - [TestMethod] - public void TestParseItemBreakIngredientKr() { - foreach ((_, _) in _parser.ParseItemBreakIngredient()) { - continue; - } - } - - [TestMethod] - public void TestParseItemExchangeScrollKr() { - foreach ((_, _) in _parser.ParseItemExchangeScroll()) { - continue; - } - } - - [TestMethod] - public void TestItemExtractionKr() { - foreach ((_, _) in _parser.ParseItemExtraction()) { - continue; - } - } - - [TestMethod] - public void TestParseItemGemstoneUpgradeKr() { - foreach ((_, _) in _parser.ParseItemGemstoneUpgrade()) { - continue; - } - } - - [TestMethod] - public void TestParseItemLapenshardUpgradeKr() { - foreach ((_, _) in _parser.ParseItemLapenshardUpgrade()) { - continue; - } - } - - [TestMethod] - public void TestParseItemSocketKr() { - foreach ((_, _) in _parser.ParseItemSocket()) { - continue; - } - } - - [TestMethod] - public void TestParseJobTableKr() { - Dictionary> results = _parser.ParseJobTableKR() - .GroupBy(result => result.jobGroupID) - .ToDictionary(group => group.Key, group => group.ToList()); - - var expected = new Dictionary { - {1, ("", 1)}, - {10, ("", 2)}, - {20, ("", 1)}, - {30, ("", 1)}, - {40, ("", 2)}, - {50, ("", 1)}, - {60, ("", 1)}, - {70, ("", 2)}, - {80, ("", 2)}, - {90, ("", 1)}, - {100, ("", 1)}, - {110, ("", 1)}, - }; - foreach ((int jobCode, (string feature, int itemCount)) in expected) { - Assert.IsTrue(results.TryGetValue(jobCode, out List? job)); - Assert.IsNotNull(job); - // Ensure that FeatureLocale was filtered properly - Assert.AreEqual(1, job.Count); - Assert.AreEqual(job[0].Feature, feature); - // Ensure that some value was parsed - Assert.IsTrue(job[0].skills.skills.Count > 0); - // Assert.IsTrue(job[0].learn.Count > 0); - // // Ensure the right amount of items are parsed - // Assert.AreEqual(job[0].startInvenItem.item.Count, itemCount); - // Assert.AreEqual(job[0].reward.item.Count, itemCount); - } - } - - [TestMethod] - public void TestParseMagicPathKr() { - foreach ((_, _) in _parser.ParseMagicPath()) { - continue; - } - } - - [TestMethod] - public void TestParseMapSpawnTagKr() { - foreach ((_, _) in _parser.ParseMapSpawnTag()) { - continue; - } - } - - [TestMethod] - public void TestMasteryRecipeKr() { - foreach ((_, _) in _parser.ParseMasteryRecipe()) { - continue; - } - } - - [TestMethod] - public void TestMasteryRewardKr() { - foreach ((_, _) in _parser.ParseMasteryReward()) { - continue; - } - } - - [TestMethod] - public void TestParsePetTableKr() { - foreach ((_, _) in _parser.ParsePetExp()) { - continue; - } - foreach ((_, _) in _parser.ParsePetProperty()) { - continue; - } - foreach ((_, _) in _parser.ParsePetSpawnInfo()) { - continue; - } - } - - [TestMethod] - public void TestParsePremiumClubEffectKr() { - foreach ((_, _) in _parser.ParsePremiumClubEffect()) { - continue; - } - } - - [TestMethod] - public void TestParsePremiumClubItemKr() { - foreach ((_, _) in _parser.ParsePremiumClubItem()) { - continue; - } - } - - [TestMethod] - public void TestParsePremiumClubPackageKr() { - foreach ((_, _) in _parser.ParsePremiumClubPackage()) { - continue; - } - } - - [TestMethod] - public void TestParseSetItemInfoKr() { - foreach ((_, _, _) in _parser.ParseSetItemInfo()) { - continue; - } - } - - [TestMethod] - public void TestParseSetItemOptionKr() { - int count = 0; - foreach (var (Id, option) in _parser.ParseSetItemOptionKR()) { - if (Id == 15123101) { - Assert.AreEqual(2, option.part[0].count); - Assert.AreEqual(9, option.part[0].str_value_base); - Assert.AreEqual(4, option.part[1].count); - Assert.AreEqual(6, option.part[1].pap_value_base); - Assert.AreEqual(5, option.part[2].count); - Assert.AreEqual(20, option.part[2].pen_rate_base); - } - count++; - } - Assert.AreEqual(1039, count); - } - - [TestMethod] - public void TestParseTitleTagKr() { - foreach ((_, _, _) in _parser.ParseTitleTag()) { - continue; - } - } - - [TestMethod] - public void TestIndividualItemDropKr() { - int count = 0; - foreach ((_, _) in _parser.ParseIndividualItemDropKR()) { - count++; - } - Assert.AreEqual(4625, count); - } - - [TestMethod] - public void TestGachaInfoKr() { - foreach ((_, _) in _parser.ParseGachaInfo()) { - continue; - } - } - - [TestMethod] - public void TestShopBeautyCouponKr() { - foreach ((_, _) in _parser.ParseShopBeautyCoupon()) { - continue; - } - } - - [TestMethod] - public void TestShopFurnishingUgcAllKr() { - foreach ((_, _) in _parser.ParseFurnishingShopUgcAll()) { - continue; - } - } - - [TestMethod] - public void TestShopFurnishingMaidKr() { - foreach ((_, _) in _parser.ParseFurnishingShopMaid()) { - continue; - } - } - - [TestMethod] - public void TestMeretMarketCategoryKr() { - foreach ((_, _) in _parser.ParseMeretMarketCategory()) { - continue; - } - } - - [TestMethod] - public void TestExpBaseTableKr() { - foreach ((_, _) in _parser.ParseExpBaseTable()) { - continue; - } - } - - [TestMethod] - public void TestNextExpKr() { - foreach ((_, _) in _parser.ParseNextExp()) { - continue; - } - } - - [TestMethod] - public void TestAdventureLevelAbilityKr() { - foreach ((_, _) in _parser.ParseAdventureLevelAbility()) { - continue; - } - } - - [TestMethod] - public void TestAdventureLevelMissionKr() { - foreach ((_, _) in _parser.ParseAdventureLevelMission()) { - continue; - } - } - - [TestMethod] - public void TestAdventureLevelRewardKr() { - foreach ((_, _) in _parser.ParseAdventureLevelReward()) { - continue; - } - } - - [TestMethod] - public void TestUgcDesignKr() { - foreach ((_, _) in _parser.ParseUgcDesign()) { - continue; - } - } - - [TestMethod] - public void TestMasteryUgcHousingKr() { - foreach ((_, _) in _parser.ParseMasteryUgcHousing()) { - continue; - } - } - - [TestMethod] - public void TestUgcHousingPointRewardKr() { - foreach ((_, _) in _parser.ParseUgcHousingPointReward()) { - continue; - } - } - - [TestMethod] - public void TestBannerKr() { - foreach ((_, _) in _parser.ParseBanner()) { - continue; - } - } - - [TestMethod] - public void TestNameTagSymbolKr() { - foreach ((_, _) in _parser.ParseNameTagSymbol()) { - continue; - } - } - - [TestMethod] - public void TestCommonExpKr() { - foreach ((_, _) in _parser.ParseCommonExp()) { - continue; - } - } - - [TestMethod] - public void TestChapterBookKr() { - foreach ((_, _) in _parser.ParseChapterBook()) { - continue; - } - } - - [TestMethod] - public void TestLearningQuestKr() { - foreach ((_, _) in _parser.ParseLearningQuest()) { - continue; - } - } - - [TestMethod] - public void TestMasteryDifferentialFactorKr() { - foreach ((_, _) in _parser.ParseMasteryDifferentialFactor()) { - continue; - } - } - - [TestMethod] - public void TestRewardContentKr() { - foreach ((_, _) in _parser.ParseRewardContent()) { - continue; - } - } - - [TestMethod] - public void TestRewardContentItemKr() { - foreach ((_, _) in _parser.ParseRewardContentItem()) { - continue; - } - } - - [TestMethod] - public void TestRewardContentExpStaticKr() { - foreach ((_, _) in _parser.ParseRewardContentExpStatic()) { - continue; - } - } - - [TestMethod] - public void TestRewardContentMesoKr() { - foreach ((_, _) in _parser.ParseRewardContentMeso()) { - continue; - } - } - - [TestMethod] - public void TestRewardContentMesoStaticKr() { - foreach ((_, _) in _parser.ParseRewardContentMesoStatic()) { - continue; - } - } - - [Ignore] // Removed from KMS2 - public void TestSurvivalLevelKr() { - foreach ((_, _) in _parser.ParseSurvivalLevel()) { - continue; - } - } - - [Ignore] // Removed from KMS2 - public void TestSurvivalLevelRewardKr() { - foreach ((_, _) in _parser.ParseSurvivalLevelReward()) { - continue; - } - } - - [TestMethod] - public void TestBlackMarketStatTableKr() { - foreach ((_, _) in _parser.ParseBlackMarketStatTable()) { - continue; - } - } - - [TestMethod] - public void TestBlackMarketOptionKr() { - (_, _) = _parser.ParseBlackMarketOption(); - } - - [TestMethod] - public void TestBlackMarketCategoryKr() { - (_, _) = _parser.ParseBlackMarketCategory(); - } - - [TestMethod] - public void TestChangeJobKr() { - foreach ((_, _) in _parser.ParseChangeJob()) { - continue; - } - } - - [TestMethod] - public void TestFieldMissionKr() { - foreach ((_, _) in _parser.ParseFieldMission()) { - continue; - } - } - - [TestMethod] - public void TestWorldMapKr() { - foreach ((_, _) in _parser.ParseWorldMap()) { - continue; - } - } - - [Ignore] // Removed from KMS2 - public void TestMapleSurvivalSkinInfoKr() { - foreach ((_, _) in _parser.ParseMapleSurvivalSkinInfo()) { - continue; - } - } - - [TestMethod] - public void TestWeddingExpKr() { - foreach ((_, _) in _parser.ParseWeddingExp()) { - continue; - } - } - - [TestMethod] - public void TestWeddingPackageKr() { - foreach ((_, _) in _parser.ParseWeddingPackage()) { - continue; - } - } - - [TestMethod] - public void TestWeddingSkillKr() { - foreach ((_, _) in _parser.ParseWeddingSkill()) { - continue; - } - } - - [TestMethod] - public void TestWeddingRewardKr() { - foreach ((_, _) in _parser.ParseWeddingReward()) { - continue; - } - } - - [TestMethod] - public void TestSmartPushKr() { - foreach ((_, _) in _parser.ParseSmartPush()) { - continue; - } - } -} - diff --git a/Maple2.File.Tests/TableParserNewTest.cs b/Maple2.File.Tests/TableParserNewTest.cs new file mode 100644 index 0000000..e657772 --- /dev/null +++ b/Maple2.File.Tests/TableParserNewTest.cs @@ -0,0 +1,79 @@ +using Maple2.File.Parser; +using Maple2.File.Parser.Tools; +using Maple2.File.Parser.Xml.Table; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace Maple2.File.Tests; + +[TestClass] +public class TableParserNewTest { + private static TableParser _parser = null!; + + [ClassInitialize] + public static void ClassInit(TestContext context) { + Filter.Load(TestUtils.XmlReader, "KR", "Live"); + _parser = new TableParser(TestUtils.XmlReader, "kr"); + } + + [TestMethod] + public void TestParseJobTableNew() { + Dictionary> results = _parser.ParseJobTableNew() + .GroupBy(result => result.jobGroupID) + .ToDictionary(group => group.Key, group => group.ToList()); + + var expected = new Dictionary { + {1, ("", 1)}, + {10, ("", 2)}, + {20, ("", 1)}, + {30, ("", 1)}, + {40, ("", 2)}, + {50, ("", 1)}, + {60, ("", 1)}, + {70, ("", 2)}, + {80, ("", 2)}, + {90, ("", 1)}, + {100, ("", 1)}, + {110, ("", 1)}, + }; + foreach ((int jobCode, (string feature, int itemCount)) in expected) { + Assert.IsTrue(results.TryGetValue(jobCode, out List? job)); + Assert.IsNotNull(job); + // Ensure that FeatureLocale was filtered properly + Assert.AreEqual(1, job.Count); + Assert.AreEqual(job[0].Feature, feature); + // Ensure that some value was parsed + Assert.IsTrue(job[0].skills.skills.Count > 0); + // Assert.IsTrue(job[0].learn.Count > 0); + // // Ensure the right amount of items are parsed + // Assert.AreEqual(job[0].startInvenItem.item.Count, itemCount); + // Assert.AreEqual(job[0].reward.item.Count, itemCount); + } + } + + [TestMethod] + public void TestParseSetItemOptionNew() { + int count = 0; + foreach (var (Id, option) in _parser.ParseSetItemOptionNew()) { + if (Id == 15123101) { + Assert.AreEqual(2, option.part[0].count); + Assert.AreEqual(9, option.part[0].str_value_base); + Assert.AreEqual(4, option.part[1].count); + Assert.AreEqual(6, option.part[1].pap_value_base); + Assert.AreEqual(5, option.part[2].count); + Assert.AreEqual(20, option.part[2].pen_rate_base); + } + count++; + } + Assert.AreEqual(1039, count); + } + + [TestMethod] + public void TestIndividualItemDropFinal() { + int count = 0; + foreach ((_, _) in _parser.ParseIndividualItemDropFinal()) { + count++; + } + Assert.AreEqual(4625, count); + } +} + diff --git a/Maple2.File.Tests/TableParserTest.cs b/Maple2.File.Tests/TableParserTest.cs index c82263d..586d562 100644 --- a/Maple2.File.Tests/TableParserTest.cs +++ b/Maple2.File.Tests/TableParserTest.cs @@ -12,7 +12,7 @@ public class TableParserTest { [ClassInitialize] public static void ClassInit(TestContext context) { Filter.Load(TestUtils.XmlReader, "NA", "Live"); - _parser = new TableParser(TestUtils.XmlReader); + _parser = new TableParser(TestUtils.XmlReader, "en"); } diff --git a/Maple2.File.Tests/XBlockParserTest.cs b/Maple2.File.Tests/XBlockParserTest.cs index e8f3f21..516a2b4 100644 --- a/Maple2.File.Tests/XBlockParserTest.cs +++ b/Maple2.File.Tests/XBlockParserTest.cs @@ -35,23 +35,6 @@ public void TestXBlockParser() { }); } - [TestMethod] - public void TestXBlockParserKr() { - var index = new FlatTypeIndex(TestUtils.ExportedReader); - var parser = new XBlockParser(TestUtils.ExportedReader, index); - // Console.WriteLine(index.GetType("Portal_entrance").GetProperty("frontOffset")); - - parser.ParseMap("02000070_in", entities => { - foreach (IMapEntity? entity in entities) { - if (entity is IPortal portal) { - Console.WriteLine(entity.EntityName); - Console.WriteLine(portal.ModelName); - Console.WriteLine(portal.frontOffset); - } - } - }); - } - [Ignore] public void TestXBlockParserAll() { var sw = new Stopwatch(); From 301cb5f7507c87ced67c74becff801c2182952a6 Mon Sep 17 00:00:00 2001 From: Zin <62830952+Zintixx@users.noreply.github.com> Date: Fri, 30 May 2025 22:55:59 -0700 Subject: [PATCH 4/9] formatting --- Maple2.File.Parser/AdditionalEffectParser.cs | 2 +- Maple2.File.Parser/Maple2.File.Parser.csproj | 2 +- Maple2.File.Parser/SkillParser.cs | 2 +- .../Xml/AdditionalEffect/AdditionalEffect.cs | 4 +- .../Xml/AdditionalEffect/BasicProperty.cs | 2 +- Maple2.File.Parser/Xml/Skill/ChangeSkill.cs | 12 +-- Maple2.File.Parser/Xml/Skill/Combo.cs | 6 +- Maple2.File.Parser/Xml/Skill/Kinds.cs | 42 +++++----- .../Xml/Skill/Property/DamageProperty.cs | 72 ++++++++--------- Maple2.File.Parser/Xml/Skill/RegionSkill.cs | 50 ++++++------ Maple2.File.Parser/Xml/Skill/Skill.cs | 78 +++++++++---------- .../AdditionalEffectParserTest.cs | 6 +- Maple2.File.Tests/ItemParserTest.cs | 2 +- Maple2.File.Tests/SkillParserTest.cs | 2 +- 14 files changed, 141 insertions(+), 141 deletions(-) diff --git a/Maple2.File.Parser/AdditionalEffectParser.cs b/Maple2.File.Parser/AdditionalEffectParser.cs index 3cd3c53..587537c 100644 --- a/Maple2.File.Parser/AdditionalEffectParser.cs +++ b/Maple2.File.Parser/AdditionalEffectParser.cs @@ -1,4 +1,4 @@ -using System.Diagnostics; +using System.Diagnostics; using System.Xml.Serialization; using Maple2.File.IO; using Maple2.File.IO.Crypto.Common; diff --git a/Maple2.File.Parser/Maple2.File.Parser.csproj b/Maple2.File.Parser/Maple2.File.Parser.csproj index ddfa4a9..25e1afe 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.2.9 + 2.3.0 net8.0 README.md enable diff --git a/Maple2.File.Parser/SkillParser.cs b/Maple2.File.Parser/SkillParser.cs index 449f95f..695bd29 100644 --- a/Maple2.File.Parser/SkillParser.cs +++ b/Maple2.File.Parser/SkillParser.cs @@ -49,7 +49,7 @@ public SkillParser(M2dReader xmlReader, Language language) { if (data.FeatureLocale() == null) continue; foreach (SkillNew skill in data.Skills) { - // if (skill.id == 10900178) Console.WriteLine(skill); + // if (skill.id == 10900178) Console.WriteLine(skill); yield return (skill.id, skillNames.GetValueOrDefault(skill.id, string.Empty), skill); } } diff --git a/Maple2.File.Parser/Xml/AdditionalEffect/AdditionalEffect.cs b/Maple2.File.Parser/Xml/AdditionalEffect/AdditionalEffect.cs index 4463f7a..ed69916 100644 --- a/Maple2.File.Parser/Xml/AdditionalEffect/AdditionalEffect.cs +++ b/Maple2.File.Parser/Xml/AdditionalEffect/AdditionalEffect.cs @@ -1,4 +1,4 @@ -using System.Xml.Serialization; +using System.Xml.Serialization; using Maple2.File.Parser.Xml.Skill; using M2dXmlGenerator; @@ -148,7 +148,7 @@ public partial class Condition { [M2dArray] public int[] fieldIDs = Array.Empty(); [M2dArray] public string[] requireStates = Array.Empty(); [M2dArray] public string[] requireSubStates = Array.Empty(); - [M2dArray] public string[] requireMasteryTypes = Array.Empty(); + [M2dArray] public string[] requireMasteryTypes = Array.Empty(); [M2dArray] public int[] requireMasteryValues = Array.Empty(); [XmlAttribute] public int mapCategory; [XmlAttribute] public int mapContinent; diff --git a/Maple2.File.Parser/Xml/AdditionalEffect/BasicProperty.cs b/Maple2.File.Parser/Xml/AdditionalEffect/BasicProperty.cs index df329ba..6b80bee 100644 --- a/Maple2.File.Parser/Xml/AdditionalEffect/BasicProperty.cs +++ b/Maple2.File.Parser/Xml/AdditionalEffect/BasicProperty.cs @@ -1,4 +1,4 @@ -using System.Xml.Serialization; +using System.Xml.Serialization; using M2dXmlGenerator; namespace Maple2.File.Parser.Xml.AdditionalEffect; diff --git a/Maple2.File.Parser/Xml/Skill/ChangeSkill.cs b/Maple2.File.Parser/Xml/Skill/ChangeSkill.cs index ba17033..38a5bd9 100644 --- a/Maple2.File.Parser/Xml/Skill/ChangeSkill.cs +++ b/Maple2.File.Parser/Xml/Skill/ChangeSkill.cs @@ -15,13 +15,13 @@ public partial class ChangeSkill { } public partial class ChangeSkillNew { - [M2dArray] public int[] changeSkillCheckEffectID = Array.Empty(); - [M2dArray] public int[] changeSkillCheckEffectLevel = Array.Empty(); - [M2dArray] public int[] changeSkillCheckEffectOverlapCount = Array.Empty(); - [M2dArray] public int[] changeSkillID = Array.Empty(); + [M2dArray] public int[] changeSkillCheckEffectID = Array.Empty(); + [M2dArray] public int[] changeSkillCheckEffectLevel = Array.Empty(); + [M2dArray] public int[] changeSkillCheckEffectOverlapCount = Array.Empty(); + [M2dArray] public int[] changeSkillID = Array.Empty(); // [M2dArray] public int[] changeSkillLevel = Array.Empty(); // [XmlAttribute] public int originSkillID; // [XmlAttribute] public short originSkillLevel = 1; - [XmlAttribute] public int autoChange; // 0,1,2 - [M2dArray] public string[] changeSkillCheckEffectCompareFunc = Array.Empty(); + [XmlAttribute] public int autoChange; // 0,1,2 + [M2dArray] public string[] changeSkillCheckEffectCompareFunc = Array.Empty(); } diff --git a/Maple2.File.Parser/Xml/Skill/Combo.cs b/Maple2.File.Parser/Xml/Skill/Combo.cs index d695f22..95632d7 100644 --- a/Maple2.File.Parser/Xml/Skill/Combo.cs +++ b/Maple2.File.Parser/Xml/Skill/Combo.cs @@ -15,12 +15,12 @@ public partial class Combo { } public partial class ComboNew { - [XmlAttribute] public int comboSkill; - [XmlAttribute] public int chargingSkill; + [XmlAttribute] public int comboSkill; + [XmlAttribute] public int chargingSkill; // [XmlAttribute] public int comboOriginSkill; // [XmlAttribute] public int npcComboSkillID; // [XmlAttribute] public short npcComboSkillLevel = 1; - [XmlAttribute] public bool disableChargingAttackSkipFrame; + [XmlAttribute] public bool disableChargingAttackSkipFrame; [M2dArray] public int[] inputSkill = Array.Empty(); [M2dArray] public int[] outputSkill = Array.Empty(); } diff --git a/Maple2.File.Parser/Xml/Skill/Kinds.cs b/Maple2.File.Parser/Xml/Skill/Kinds.cs index c0582e1..be3beee 100644 --- a/Maple2.File.Parser/Xml/Skill/Kinds.cs +++ b/Maple2.File.Parser/Xml/Skill/Kinds.cs @@ -41,30 +41,30 @@ public partial class KindsNew { [XmlAttribute] public int rangeType; // 0,1,2,3 [XmlAttribute] public int groupType; // 0,2 [XmlAttribute] public int jump; // SkillId - // [XmlAttribute] public string state = string.Empty; // gos* - [XmlAttribute("continue")] public bool continueSkill; + // [XmlAttribute] public string state = string.Empty; // gos* + [XmlAttribute("continue")] public bool continueSkill; // [XmlAttribute] public bool spRecoverySkill; - [XmlAttribute] public int element; // 0,1,2,3,4,5,6,7 - // [XmlAttribute] public int motionType; // 0 - // [XmlAttribute] public string emotion = string.Empty; - [XmlAttribute] public float offsetNameTag; + [XmlAttribute] public int element; // 0,1,2,3,4,5,6,7 + // [XmlAttribute] public int motionType; // 0 + // [XmlAttribute] public string emotion = string.Empty; + [XmlAttribute] public float offsetNameTag; // [XmlAttribute] public float offsetHPBar; - [XmlAttribute] public int immediateActive; + [XmlAttribute] public int immediateActive; // [XmlAttribute] public bool weaponDependency; - [XmlAttribute] public bool unrideOnUse; - [XmlAttribute] public bool releaseObjectWeapon = true; + [XmlAttribute] public bool unrideOnUse; + [XmlAttribute] public bool releaseObjectWeapon = true; // [XmlAttribute] public bool releaseStunState; - [XmlAttribute] public bool disableWater; - [XmlAttribute] public bool holdAttack; - [M2dArray] public int[] groupIDs = Array.Empty(); + [XmlAttribute] public bool disableWater; + [XmlAttribute] public bool holdAttack; + [M2dArray] public int[] groupIDs = Array.Empty(); - [XmlAttribute] public bool superArmorApplyFieldType; - // - // // Ignored by client. - // [XmlAttribute] public int emotionNameTagOffset; // 0 - // [XmlAttribute] public string changeSkillCheckEffectID = string.Empty; // int[] - // [XmlAttribute] public string changeSkillCheckEffectLevel = string.Empty; // int[] - // [XmlAttribute] public string changeSkillID = string.Empty; // int[] - // [XmlAttribute] public int emotionType; // 0,1,2 - // [XmlAttribute] public bool unrideOnHit; + [XmlAttribute] public bool superArmorApplyFieldType; + // + // // Ignored by client. + // [XmlAttribute] public int emotionNameTagOffset; // 0 + // [XmlAttribute] public string changeSkillCheckEffectID = string.Empty; // int[] + // [XmlAttribute] public string changeSkillCheckEffectLevel = string.Empty; // int[] + // [XmlAttribute] public string changeSkillID = string.Empty; // int[] + // [XmlAttribute] public int emotionType; // 0,1,2 + // [XmlAttribute] public bool unrideOnHit; } diff --git a/Maple2.File.Parser/Xml/Skill/Property/DamageProperty.cs b/Maple2.File.Parser/Xml/Skill/Property/DamageProperty.cs index ebcda1f..3aabc11 100644 --- a/Maple2.File.Parser/Xml/Skill/Property/DamageProperty.cs +++ b/Maple2.File.Parser/Xml/Skill/Property/DamageProperty.cs @@ -42,41 +42,41 @@ public class DamageProperty { } public partial class DamagePropertyNew { - [XmlAttribute] public int count = 1; + [XmlAttribute] public int count = 1; // [XmlAttribute] public int hand; // 0,1,2 - [XmlAttribute] public float rate; - [XmlAttribute] public float hitSpeedRate = 1.0f; - [XmlAttribute] public float hitPauseTime; - [XmlAttribute] public float damagedVibrateRatio = 1.0f; - [XmlAttribute] public long value; - [XmlAttribute] public int isConstDamageValue; - [XmlAttribute] public float damageByTargetMaxHP; - [XmlAttribute] public long constDamageByTargetHP; - [XmlAttribute] public long constDamageByTargetSP; - [XmlAttribute] public string effectHit = string.Empty; - [XmlAttribute] public string effectRemain = string.Empty; - [XmlAttribute] public bool IgnoreOptimalHideDamageHitEffect; - [XmlAttribute] public bool IgnoreOptimalHideDamageRemainEffect; - [XmlAttribute] public int push; // -1,0,1,2,3,4,5 - [XmlAttribute] public float pushdistance; - [XmlAttribute] public float pushduration; - [XmlAttribute] public float pushprob = 1.0f; - [XmlAttribute] public int pushEaseType; // if n < 0 || n > 2, set to 0; 0,1,2 - [XmlAttribute] public int pushApplyField; // 0,1,2 - [XmlAttribute] public int pushDown; // 0,1,150 - [XmlAttribute] public bool pushFall; - [XmlAttribute] public int pushPriority; // 0,1,2,3,4,5,10,15,50,99 - [XmlAttribute] public int pushPriorityHitImmune; // 0,1,150,200,300,1600 - [XmlAttribute] public string pushAnimation = string.Empty; - [XmlAttribute] public float pushUpDistance; - [XmlAttribute] public int attackMaterial; // 0,1,2,3,4,5,6,7,8,9,11,100,101,102,103,104,105,106,1000,1103 - [XmlAttribute] public bool jumpHitIgnore; - [XmlAttribute] public bool superArmorBreak; - [XmlAttribute] public bool invokeEffectDisable; - [XmlAttribute] public int damageEventDisable; - [XmlAttribute] public int stateHitIgnore; - [M2dArray] public int[] stateHitOnly = Array.Empty(); - [XmlAttribute] public long damageRefBap; - [XmlAttribute] public long damageRefWap; - [XmlAttribute] public long damageRefTap; + [XmlAttribute] public float rate; + [XmlAttribute] public float hitSpeedRate = 1.0f; + [XmlAttribute] public float hitPauseTime; + [XmlAttribute] public float damagedVibrateRatio = 1.0f; + [XmlAttribute] public long value; + [XmlAttribute] public int isConstDamageValue; + [XmlAttribute] public float damageByTargetMaxHP; + [XmlAttribute] public long constDamageByTargetHP; + [XmlAttribute] public long constDamageByTargetSP; + [XmlAttribute] public string effectHit = string.Empty; + [XmlAttribute] public string effectRemain = string.Empty; + [XmlAttribute] public bool IgnoreOptimalHideDamageHitEffect; + [XmlAttribute] public bool IgnoreOptimalHideDamageRemainEffect; + [XmlAttribute] public int push; // -1,0,1,2,3,4,5 + [XmlAttribute] public float pushdistance; + [XmlAttribute] public float pushduration; + [XmlAttribute] public float pushprob = 1.0f; + [XmlAttribute] public int pushEaseType; // if n < 0 || n > 2, set to 0; 0,1,2 + [XmlAttribute] public int pushApplyField; // 0,1,2 + [XmlAttribute] public int pushDown; // 0,1,150 + [XmlAttribute] public bool pushFall; + [XmlAttribute] public int pushPriority; // 0,1,2,3,4,5,10,15,50,99 + [XmlAttribute] public int pushPriorityHitImmune; // 0,1,150,200,300,1600 + [XmlAttribute] public string pushAnimation = string.Empty; + [XmlAttribute] public float pushUpDistance; + [XmlAttribute] public int attackMaterial; // 0,1,2,3,4,5,6,7,8,9,11,100,101,102,103,104,105,106,1000,1103 + [XmlAttribute] public bool jumpHitIgnore; + [XmlAttribute] public bool superArmorBreak; + [XmlAttribute] public bool invokeEffectDisable; + [XmlAttribute] public int damageEventDisable; + [XmlAttribute] public int stateHitIgnore; + [M2dArray] public int[] stateHitOnly = Array.Empty(); + [XmlAttribute] public long damageRefBap; + [XmlAttribute] public long damageRefWap; + [XmlAttribute] public long damageRefTap; } diff --git a/Maple2.File.Parser/Xml/Skill/RegionSkill.cs b/Maple2.File.Parser/Xml/Skill/RegionSkill.cs index bea013f..1ae6dc0 100644 --- a/Maple2.File.Parser/Xml/Skill/RegionSkill.cs +++ b/Maple2.File.Parser/Xml/Skill/RegionSkill.cs @@ -38,29 +38,29 @@ public partial class RegionSkill { } public partial class RegionSkillNew { - [XmlAttribute] public int includeCaster; // 0,1,2 - [XmlAttribute] public string rangeType = string.Empty; // box, cylinder, frustum, hole_cylinder - [XmlAttribute] public float distance; - [M2dVector3] public Vector3 rangeAdd; - [M2dVector3] public Vector3 rangeOffset; - [XmlAttribute] public float rangeZRotateDegree; - [XmlAttribute] public float height; - [XmlAttribute] public float width; - [XmlAttribute] public float endWidth; - [XmlAttribute] public int applyTarget; // 0,1,2,3,5,6,7,8 - [XmlAttribute] public int castTarget; // 0,1,2,3,5,7 - [XmlAttribute] public int targetHasBuffID; - [XmlAttribute] public int targetHasBuffOverlapCount; // 0 - [XmlAttribute] public int targetHasNotBuffID; - [XmlAttribute] public bool targetHasBuffOwner; - [XmlAttribute] public int targetSelectType; // 0,1,2,3 - [XmlAttribute] public bool targetSelectParty; - [XmlAttribute] public bool targetSelectGuild; - [XmlAttribute] public int targetStatCompare; // 0,4 - [XmlAttribute] public int targetStatCompareFunction; // 0,1,3 - [M2dArray] public int[] applyTargetIgnoreNpcRanks = Array.Empty(); - - // Ignored by client. - [XmlAttribute] public bool targetSelectHasBuffType; // 0 - [XmlAttribute] public bool onlyTargetSelectHasBuff; // 0 + [XmlAttribute] public int includeCaster; // 0,1,2 + [XmlAttribute] public string rangeType = string.Empty; // box, cylinder, frustum, hole_cylinder + [XmlAttribute] public float distance; + [M2dVector3] public Vector3 rangeAdd; + [M2dVector3] public Vector3 rangeOffset; + [XmlAttribute] public float rangeZRotateDegree; + [XmlAttribute] public float height; + [XmlAttribute] public float width; + [XmlAttribute] public float endWidth; + [XmlAttribute] public int applyTarget; // 0,1,2,3,5,6,7,8 + [XmlAttribute] public int castTarget; // 0,1,2,3,5,7 + [XmlAttribute] public int targetHasBuffID; + [XmlAttribute] public int targetHasBuffOverlapCount; // 0 + [XmlAttribute] public int targetHasNotBuffID; + [XmlAttribute] public bool targetHasBuffOwner; + [XmlAttribute] public int targetSelectType; // 0,1,2,3 + [XmlAttribute] public bool targetSelectParty; + [XmlAttribute] public bool targetSelectGuild; + [XmlAttribute] public int targetStatCompare; // 0,4 + [XmlAttribute] public int targetStatCompareFunction; // 0,1,3 + [M2dArray] public int[] applyTargetIgnoreNpcRanks = Array.Empty(); + + // Ignored by client. + [XmlAttribute] public bool targetSelectHasBuffType; // 0 + [XmlAttribute] public bool onlyTargetSelectHasBuff; // 0 } diff --git a/Maple2.File.Parser/Xml/Skill/Skill.cs b/Maple2.File.Parser/Xml/Skill/Skill.cs index 6754c14..8e91be9 100644 --- a/Maple2.File.Parser/Xml/Skill/Skill.cs +++ b/Maple2.File.Parser/Xml/Skill/Skill.cs @@ -204,7 +204,7 @@ public partial class SkillLevelDataNew : IFeatureLocale { [XmlAttribute] public string stringParam = string.Empty; - // [XmlElement] public BeginCondition beginCondition; + // [XmlElement] public BeginCondition beginCondition; /*[XmlElement] public ChangeSkill changeSkill; [XmlElement] public MagicControl magicControl; [XmlElement] public AutoTargeting autoTargeting; @@ -225,47 +225,47 @@ public partial class SkillLevelDataNew : IFeatureLocale { } public partial class SkillMotionDataNew { - [XmlAttribute] public string sequenceName = string.Empty; - [XmlAttribute] public string motionEffect = string.Empty; - [XmlAttribute] public string loopEffect = string.Empty; - [XmlAttribute] public string endEffect = string.Empty; - [XmlAttribute] public string splashInvokeEffect = string.Empty; - [XmlAttribute] public string splashEndEffect = string.Empty; - [M2dArray] public string[] strTagEffects = Array.Empty(); - [XmlAttribute] public string selfInputCombo = string.Empty; - [XmlAttribute] public string weaponSequenceName = string.Empty; - [XmlAttribute] public string loopKeepEffect = string.Empty; - [XmlAttribute] public string loopEndEffect = string.Empty; - [XmlAttribute] public string splashDurationCastEffect = string.Empty; - [XmlAttribute] public bool IgnoreOptimalHideCastEffect; + [XmlAttribute] public string sequenceName = string.Empty; + [XmlAttribute] public string motionEffect = string.Empty; + [XmlAttribute] public string loopEffect = string.Empty; + [XmlAttribute] public string endEffect = string.Empty; + [XmlAttribute] public string splashInvokeEffect = string.Empty; + [XmlAttribute] public string splashEndEffect = string.Empty; + [M2dArray] public string[] strTagEffects = Array.Empty(); + [XmlAttribute] public string selfInputCombo = string.Empty; + [XmlAttribute] public string weaponSequenceName = string.Empty; + [XmlAttribute] public string loopKeepEffect = string.Empty; + [XmlAttribute] public string loopEndEffect = string.Empty; + [XmlAttribute] public string splashDurationCastEffect = string.Empty; + [XmlAttribute] public bool IgnoreOptimalHideCastEffect; // [XmlAttribute] public bool IgnoreOptimalHideEndEffect; // [XmlAttribute] public bool IgnoreOptimalHideSplashInvokeEffect; // [XmlAttribute] public bool IgnoreOptimalHideSplashEndEffect; - [XmlAttribute] public bool splashCastEffectStartDelay; - [XmlAttribute] public int splashLifeTick; // 0,6000,8000,10000,12000,14000,16000,18000,20000,22000,24000,26000,28000 - [XmlAttribute] public int splashInvokeCoolTick; // 0,100 - [XmlAttribute] public float sequenceSpeed; - [XmlAttribute] public float keyMove; - [XmlAttribute] public int movetype; // 0,3 - [XmlAttribute] public float moveangle; + [XmlAttribute] public bool splashCastEffectStartDelay; + [XmlAttribute] public int splashLifeTick; // 0,6000,8000,10000,12000,14000,16000,18000,20000,22000,24000,26000,28000 + [XmlAttribute] public int splashInvokeCoolTick; // 0,100 + [XmlAttribute] public float sequenceSpeed; + [XmlAttribute] public float keyMove; + [XmlAttribute] public int movetype; // 0,3 + [XmlAttribute] public float moveangle; // [XmlAttribute] public float movevangle; - [XmlAttribute] public float movedistance; - [XmlAttribute] public int moveEaseType; // 0,1,2 - // [XmlAttribute] public float moveMid; - // [XmlAttribute] public float moveHeight; - // [XmlAttribute] public int hide; // 0 - [XmlAttribute] public int ignoreCollisionGroups; // 0,4,16,20 - [XmlAttribute] public bool holdWeapon; - [XmlAttribute] public int loopCount; - [XmlAttribute] public bool faceTarget; - [XmlAttribute] public bool doesPlayIdleOnSkillEnd; - [XmlAttribute] public bool startNoneBlendDelay; + [XmlAttribute] public float movedistance; + [XmlAttribute] public int moveEaseType; // 0,1,2 + // [XmlAttribute] public float moveMid; + // [XmlAttribute] public float moveHeight; + // [XmlAttribute] public int hide; // 0 + [XmlAttribute] public int ignoreCollisionGroups; // 0,4,16,20 + [XmlAttribute] public bool holdWeapon; + [XmlAttribute] public int loopCount; + [XmlAttribute] public bool faceTarget; + [XmlAttribute] public bool doesPlayIdleOnSkillEnd; + [XmlAttribute] public bool startNoneBlendDelay; // [XmlAttribute] public bool ignoreASP; - [XmlAttribute] public float pushCylinderVelH; - [XmlAttribute] public float pushCylinderVelV; - [XmlAttribute] public float pushCylinderOuter; - [XmlAttribute] public float pushCylinderInner; - [XmlAttribute] public float pushCylinderHeight; - [XmlAttribute] public float aniSkipTime; - [XmlElement] public List attack; + [XmlAttribute] public float pushCylinderVelH; + [XmlAttribute] public float pushCylinderVelV; + [XmlAttribute] public float pushCylinderOuter; + [XmlAttribute] public float pushCylinderInner; + [XmlAttribute] public float pushCylinderHeight; + [XmlAttribute] public float aniSkipTime; + [XmlElement] public List attack; } diff --git a/Maple2.File.Tests/AdditionalEffectParserTest.cs b/Maple2.File.Tests/AdditionalEffectParserTest.cs index a0ade8a..c5a4f53 100644 --- a/Maple2.File.Tests/AdditionalEffectParserTest.cs +++ b/Maple2.File.Tests/AdditionalEffectParserTest.cs @@ -1,6 +1,6 @@ -using Maple2.File.Parser; - using Maple2.File.Parser.Enum; - using Maple2.File.Parser.Tools; +using Maple2.File.Parser; +using Maple2.File.Parser.Enum; +using Maple2.File.Parser.Tools; using Maple2.File.Parser.Xml.AdditionalEffect; using Microsoft.VisualStudio.TestTools.UnitTesting; diff --git a/Maple2.File.Tests/ItemParserTest.cs b/Maple2.File.Tests/ItemParserTest.cs index e3f3fa0..5eb9fe7 100644 --- a/Maple2.File.Tests/ItemParserTest.cs +++ b/Maple2.File.Tests/ItemParserTest.cs @@ -39,7 +39,7 @@ public void TestItemParserNew() { // parser.NameSerializer.UnknownElement += TestUtils.UnknownElementHandler; // parser.NameSerializer.UnknownAttribute += TestUtils.UnknownAttributeHandler; - //parser.ItemSerializer.UnknownElement += TestUtils.UnknownElementHandler; + //parser.ItemSerializer.UnknownElement += TestUtils.UnknownElementHandler; // parser.ItemSerializer.UnknownAttribute += TestUtils.UnknownAttributeHandler; int count = 0; diff --git a/Maple2.File.Tests/SkillParserTest.cs b/Maple2.File.Tests/SkillParserTest.cs index ad0b66b..58f81eb 100644 --- a/Maple2.File.Tests/SkillParserTest.cs +++ b/Maple2.File.Tests/SkillParserTest.cs @@ -29,7 +29,7 @@ public void TestSkillParserNew() { Filter.Load(TestUtils.XmlReader, locale.ToString(), "Live"); var parser = new SkillParser(TestUtils.XmlReader, Language.kr); - // parser.skillNewSerializer.UnknownElement += TestUtils.UnknownElementHandler; + // parser.skillNewSerializer.UnknownElement += TestUtils.UnknownElementHandler; //parser.skillNewSerializer.UnknownAttribute += TestUtils.UnknownAttributeHandler; From 5a39e757001935e159fa5fe8de3349a1924027d1 Mon Sep 17 00:00:00 2001 From: Zin <62830952+Zintixx@users.noreply.github.com> Date: Fri, 30 May 2025 23:51:11 -0700 Subject: [PATCH 5/9] small adjustments to be all uniform --- Maple2.File.Parser/TableParser.cs | 28 ++++++++++++------------- Maple2.File.Tests/TableParserNewTest.cs | 5 +++-- Maple2.File.Tests/TableParserTest.cs | 5 +++-- 3 files changed, 20 insertions(+), 18 deletions(-) diff --git a/Maple2.File.Parser/TableParser.cs b/Maple2.File.Parser/TableParser.cs index 11f1299..86ca881 100644 --- a/Maple2.File.Parser/TableParser.cs +++ b/Maple2.File.Parser/TableParser.cs @@ -46,7 +46,7 @@ public class TableParser { private readonly XmlSerializer itemSocketSerializer; private readonly XmlSerializer itemSocketScrollSerializer; private readonly XmlSerializer jobSerializer; - private readonly XmlSerializer jobKRSerializer; + private readonly XmlSerializer jobNewSerializer; private readonly XmlSerializer magicPathSerializer; private readonly XmlSerializer mapSpawnTagSerializer; private readonly XmlSerializer masteryRecipeSerializer; @@ -60,10 +60,10 @@ public class TableParser { private readonly XmlSerializer premiumClubPackageSerializer; private readonly XmlSerializer setItemInfoSerializer; private readonly XmlSerializer setItemOptionSerializer; - private readonly XmlSerializer setItemOptionKRSerializer; + private readonly XmlSerializer setItemOptionNewSerializer; private readonly XmlSerializer titleTagSerializer; private readonly XmlSerializer individualItemDropSerializer; - private readonly XmlSerializer individualItemDropKRSerializer; + private readonly XmlSerializer individualItemDropNewSerializer; private readonly XmlSerializer gachaInfoSerializer; private readonly XmlSerializer shopBeautyCouponSerializer; private readonly XmlSerializer shopFurnishingSerializer; @@ -102,9 +102,9 @@ public class TableParser { private readonly XmlSerializer seasonDataSerializer; private readonly string locale; - private readonly string language; + private readonly Language language; - public TableParser(M2dReader xmlReader, string language) { + public TableParser(M2dReader xmlReader, Language language) { this.xmlReader = xmlReader; nameSerializer = new XmlSerializer(typeof(StringMapping)); bankTypeSerializer = new XmlSerializer(typeof(BankTypeRoot)); @@ -140,7 +140,7 @@ public TableParser(M2dReader xmlReader, string language) { itemSocketSerializer = new XmlSerializer(typeof(ItemSocketRoot)); itemSocketScrollSerializer = new XmlSerializer(typeof(ItemSocketScrollRoot)); jobSerializer = new XmlSerializer(typeof(JobRoot)); - jobKRSerializer = new XmlSerializer(typeof(JobRootNew)); + jobNewSerializer = new XmlSerializer(typeof(JobRootNew)); magicPathSerializer = new XmlSerializer(typeof(MagicPath)); mapSpawnTagSerializer = new XmlSerializer(typeof(MapSpawnTag)); masteryRecipeSerializer = new XmlSerializer(typeof(MasteryRecipeRoot)); @@ -154,10 +154,10 @@ public TableParser(M2dReader xmlReader, string language) { premiumClubPackageSerializer = new XmlSerializer(typeof(PremiumClubPackageRoot)); setItemInfoSerializer = new XmlSerializer(typeof(SetItemInfoRoot)); setItemOptionSerializer = new XmlSerializer(typeof(SetItemOptionRoot)); - setItemOptionKRSerializer = new XmlSerializer(typeof(SetItemOptionRootNew)); + setItemOptionNewSerializer = new XmlSerializer(typeof(SetItemOptionRootNew)); titleTagSerializer = new XmlSerializer(typeof(TitleTagRoot)); individualItemDropSerializer = new XmlSerializer(typeof(IndividualItemDropRoot)); - individualItemDropKRSerializer = new XmlSerializer(typeof(IndividualItemDropRootNew)); + individualItemDropNewSerializer = new XmlSerializer(typeof(IndividualItemDropRootNew)); gachaInfoSerializer = new XmlSerializer(typeof(GachaInfoRoot)); shopBeautyCouponSerializer = new XmlSerializer(typeof(ShopBeautyCouponRoot)); shopFurnishingSerializer = new XmlSerializer(typeof(ShopFurnishingRoot)); @@ -196,7 +196,7 @@ public TableParser(M2dReader xmlReader, string language) { seasonDataSerializer = new XmlSerializer(typeof(SeasonDataRoot)); locale = FeatureLocaleFilter.Locale.ToLower(); - this.language = language.ToLower(); + this.language = language; // var seen = new HashSet(); // this.bankTypeSerializer.UnknownAttribute += (sender, args) => { @@ -344,7 +344,7 @@ public IEnumerable ParseUnitedWeeklyReward() { } public IEnumerable<(int Id, string Name, Fish Fish)> ParseFish() { - XmlReader nameReader = xmlReader.GetXmlReader(xmlReader.GetEntry($"{language}/stringfishname.xml")); + XmlReader nameReader = xmlReader.GetXmlReader(xmlReader.GetEntry($"{language.ToString()}/stringfishname.xml")); var mapping = nameSerializer.Deserialize(nameReader) as StringMapping; Debug.Assert(mapping != null); @@ -623,7 +623,7 @@ public IEnumerable ParseJobTable() { public IEnumerable ParseJobTableNew() { string xml = Sanitizer.RemoveEmpty(xmlReader.GetString(xmlReader.GetEntry("table/job.xml"))); var reader = XmlReader.Create(new StringReader(xml)); - var data = jobKRSerializer.Deserialize(reader) as JobRootNew; + var data = jobNewSerializer.Deserialize(reader) as JobRootNew; Debug.Assert(data != null); foreach (JobTableNew job in data.job) { @@ -732,7 +732,7 @@ public IEnumerable ParseJobTableNew() { } public IEnumerable<(int Id, string Name, SetItemInfo Info)> ParseSetItemInfo() { - XmlReader reader = xmlReader.GetXmlReader(xmlReader.GetEntry($"{language}/setitemname.xml")); + XmlReader reader = xmlReader.GetXmlReader(xmlReader.GetEntry($"{language.ToString()}/setitemname.xml")); var mapping = nameSerializer.Deserialize(reader) as StringMapping; Debug.Assert(mapping != null); @@ -761,7 +761,7 @@ public IEnumerable ParseJobTableNew() { IO.Crypto.Common.PackFileEntry entry = xmlReader.GetEntry("table/setiteminfo.xml"); var strinte = xmlReader.GetString(entry); XmlReader reader = xmlReader.GetXmlReader(entry); - var data = setItemOptionKRSerializer.Deserialize(reader) as SetItemOptionRootNew; + var data = setItemOptionNewSerializer.Deserialize(reader) as SetItemOptionRootNew; Debug.Assert(data != null); foreach (SetItemOptionNew option in data.option) { @@ -806,7 +806,7 @@ public IEnumerable ParseJobTableNew() { xml = Sanitizer.SanitizeBool(xml); xml = Sanitizer.RemoveUtf8Bom(xml); var reader = XmlReader.Create(new StringReader(xml)); - var data = individualItemDropKRSerializer.Deserialize(reader) as IndividualItemDropRootNew; + var data = individualItemDropNewSerializer.Deserialize(reader) as IndividualItemDropRootNew; Debug.Assert(data != null); foreach (IndividualItemDropBox dropBox in data.DropBoxes) { diff --git a/Maple2.File.Tests/TableParserNewTest.cs b/Maple2.File.Tests/TableParserNewTest.cs index e657772..675ab7c 100644 --- a/Maple2.File.Tests/TableParserNewTest.cs +++ b/Maple2.File.Tests/TableParserNewTest.cs @@ -1,4 +1,5 @@ using Maple2.File.Parser; +using Maple2.File.Parser.Enum; using Maple2.File.Parser.Tools; using Maple2.File.Parser.Xml.Table; using Microsoft.VisualStudio.TestTools.UnitTesting; @@ -11,8 +12,8 @@ public class TableParserNewTest { [ClassInitialize] public static void ClassInit(TestContext context) { - Filter.Load(TestUtils.XmlReader, "KR", "Live"); - _parser = new TableParser(TestUtils.XmlReader, "kr"); + Filter.Load(TestUtils.XmlReader, Locale.KR.ToString(), "Live"); + _parser = new TableParser(TestUtils.XmlReader, Language.kr); } [TestMethod] diff --git a/Maple2.File.Tests/TableParserTest.cs b/Maple2.File.Tests/TableParserTest.cs index 586d562..8729cfa 100644 --- a/Maple2.File.Tests/TableParserTest.cs +++ b/Maple2.File.Tests/TableParserTest.cs @@ -1,4 +1,5 @@ using Maple2.File.Parser; +using Maple2.File.Parser.Enum; using Maple2.File.Parser.Tools; using Maple2.File.Parser.Xml.Table; using Microsoft.VisualStudio.TestTools.UnitTesting; @@ -11,8 +12,8 @@ public class TableParserTest { [ClassInitialize] public static void ClassInit(TestContext context) { - Filter.Load(TestUtils.XmlReader, "NA", "Live"); - _parser = new TableParser(TestUtils.XmlReader, "en"); + Filter.Load(TestUtils.XmlReader, Locale.NA.ToString(), "Live"); + _parser = new TableParser(TestUtils.XmlReader, Language.en); } From 777cfa3368d95de7b452140df50dd16f12d350f8 Mon Sep 17 00:00:00 2001 From: Zin <62830952+Zintixx@users.noreply.github.com> Date: Mon, 2 Jun 2025 08:56:54 -0700 Subject: [PATCH 6/9] More fixes. --- Maple2.File.Parser/ItemOptionParser.cs | 24 +- Maple2.File.Parser/MapParser.cs | 6 +- Maple2.File.Parser/TableParser.cs | 44 +- Maple2.File.Parser/Xml/Item/Customize.cs | 8 +- Maple2.File.Parser/Xml/Item/Cutting.cs | 2 +- Maple2.File.Parser/Xml/Item/Install.cs | 2 +- Maple2.File.Parser/Xml/Item/Item.cs | 116 +-- Maple2.File.Parser/Xml/Item/Property.cs | 6 +- Maple2.File.Parser/Xml/Item/Slot.cs | 28 +- Maple2.File.Parser/Xml/ItemOption.cs | 842 +++++++++--------- Maple2.File.Parser/Xml/ItemOptionConstant.cs | 6 +- Maple2.File.Parser/Xml/ItemOptionRandom.cs | 10 +- Maple2.File.Parser/Xml/Map/Map.cs | 38 +- Maple2.File.Parser/Xml/Npc/Collisions.cs | 12 +- Maple2.File.Parser/Xml/Npc/Corpse.cs | 2 +- Maple2.File.Parser/Xml/Npc/Crystal.cs | 2 +- Maple2.File.Parser/Xml/Npc/Dummy.cs | 10 +- Maple2.File.Parser/Xml/Npc/Model.cs | 2 +- Maple2.File.Parser/Xml/Npc/Npc.cs | 58 +- Maple2.File.Parser/Xml/Npc/Ride.cs | 4 +- Maple2.File.Parser/Xml/Npc/Skill.cs | 8 +- Maple2.File.Parser/Xml/Quest/Condition.cs | 2 +- Maple2.File.Parser/Xml/Quest/Quest.cs | 38 +- Maple2.File.Parser/Xml/Quest/Require.cs | 2 +- Maple2.File.Parser/Xml/Quest/Reward.cs | 8 +- Maple2.File.Parser/Xml/Riding/Riding.cs | 14 +- Maple2.File.Parser/Xml/Table/GachaInfo.cs | 5 +- .../Xml/Table/ItemOptionVariation.cs | 18 + Maple2.File.Parser/Xml/Table/JobTable.cs | 1 + Maple2.File.Parser/Xml/Table/StatString.cs | 21 + Maple2.File.Tests/ItemOptionParserTest.cs | 9 + Maple2.File.Tests/RidingParserTest.cs | 2 +- Maple2.File.Tests/TableParserNewTest.cs | 15 +- 33 files changed, 738 insertions(+), 627 deletions(-) create mode 100644 Maple2.File.Parser/Xml/Table/StatString.cs diff --git a/Maple2.File.Parser/ItemOptionParser.cs b/Maple2.File.Parser/ItemOptionParser.cs index f1f3b55..712cfd3 100644 --- a/Maple2.File.Parser/ItemOptionParser.cs +++ b/Maple2.File.Parser/ItemOptionParser.cs @@ -96,18 +96,20 @@ public class ItemOptionParser { 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)); - itemOptionConstantNewSerializer = new XmlSerializer(typeof(ItemOptionConstantRootKR)); + itemOptionConstantNewSerializer = new XmlSerializer(typeof(ItemOptionConstantRootNew)); itemOptionSerializer = new XmlSerializer(typeof(ItemOptionRoot)); - itemOptionNewSerializer = new XmlSerializer(typeof(ItemOptionRandomRootKR)); + 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)); } @@ -131,7 +133,7 @@ public IEnumerable 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 = itemOptionConstantNewSerializer.Deserialize(reader) as ItemOptionConstantRootKR; + var root = itemOptionConstantNewSerializer.Deserialize(reader) as ItemOptionConstantRootNew; Debug.Assert(root != null); foreach (ItemOptionConstant option in root.options) { @@ -157,14 +159,14 @@ public IEnumerable ParseRandom() { } } - public IEnumerable ParseRandomNew() { + public IEnumerable 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 = itemOptionNewSerializer.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; } @@ -242,6 +244,16 @@ public IEnumerable ParsePick() { } } + public IEnumerable 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 Option)> ParseVariationEquip() { foreach (string suffix in variationSuffix) { string filename = $"table/itemoptionvariation_{suffix}.xml"; diff --git a/Maple2.File.Parser/MapParser.cs b/Maple2.File.Parser/MapParser.cs index 6c21cde..54ad779 100644 --- a/Maple2.File.Parser/MapParser.cs +++ b/Maple2.File.Parser/MapParser.cs @@ -23,7 +23,7 @@ public MapParser(M2dReader xmlReader, Language language) { this.language = language; NameSerializer = new XmlSerializer(typeof(StringMapping)); MapSerializer = new XmlSerializer(typeof(MapDataRoot)); - MapNewSerializer = new XmlSerializer(typeof(MapDataRootKR)); + MapNewSerializer = new XmlSerializer(typeof(MapDataRootNew)); } public IEnumerable<(int Id, string Name, MapData Data)> Parse() { @@ -48,10 +48,10 @@ public MapParser(M2dReader xmlReader, Language language) { 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 MapDataRootKR; + var data = MapNewSerializer.Deserialize(reader) as MapDataRootNew; Debug.Assert(data != null); - foreach (MapDataRootKR item in data.fieldData) { + 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); diff --git a/Maple2.File.Parser/TableParser.cs b/Maple2.File.Parser/TableParser.cs index 86ca881..74e87b3 100644 --- a/Maple2.File.Parser/TableParser.cs +++ b/Maple2.File.Parser/TableParser.cs @@ -100,6 +100,7 @@ public class TableParser { private readonly XmlSerializer weddingSkillSerializer; private readonly XmlSerializer smartPushSerializer; private readonly XmlSerializer seasonDataSerializer; + private readonly XmlSerializer statStringSerializer; private readonly string locale; private readonly Language language; @@ -194,6 +195,7 @@ public TableParser(M2dReader xmlReader, Language language) { weddingSkillSerializer = new XmlSerializer(typeof(WeddingSkillRoot)); smartPushSerializer = new XmlSerializer(typeof(SmartPushRoot)); seasonDataSerializer = new XmlSerializer(typeof(SeasonDataRoot)); + statStringSerializer = new XmlSerializer(typeof(StatStringRoot)); locale = FeatureLocaleFilter.Locale.ToLower(); this.language = language; @@ -757,15 +759,20 @@ public IEnumerable ParseJobTableNew() { } } - public IEnumerable<(int Id, SetItemOptionNew Option)> ParseSetItemOptionNew() { + public IEnumerable<(int Id, string Name, SetItemOptionNew Option)> ParseSetItemOptionNew() { + XmlReader nameXmlReader = xmlReader.GetXmlReader(xmlReader.GetEntry($"{language.ToString()}/setitemname.xml")); + var mapping = nameSerializer.Deserialize(nameXmlReader) as StringMapping; + Debug.Assert(mapping != null); + + Dictionary setNames = mapping.key.ToDictionary(key => int.Parse(key.id), key => key.name); + IO.Crypto.Common.PackFileEntry entry = xmlReader.GetEntry("table/setiteminfo.xml"); - var strinte = xmlReader.GetString(entry); XmlReader reader = xmlReader.GetXmlReader(entry); var data = setItemOptionNewSerializer.Deserialize(reader) as SetItemOptionRootNew; Debug.Assert(data != null); foreach (SetItemOptionNew option in data.option) { - yield return (option.id, option); + yield return (option.id, setNames.GetValueOrDefault(option.id, string.Empty), option); } } @@ -1340,7 +1347,14 @@ public IEnumerable ParseJobTableNew() { } public IEnumerable<(int Id, MapleSurvivalSkinInfo Info)> ParseMapleSurvivalSkinInfo() { - string xml = Sanitizer.RemoveEmpty(xmlReader.GetString(xmlReader.GetEntry("table/maplesurvivalskininfo.xml"))); + string fileName = $"table/{locale}/maplesurvivalskininfo.xml"; + if (xmlReader.Files.All(f => f.Name != fileName)) { + fileName = "table/maplesurvivalskininfo.xml"; + if (xmlReader.Files.All(f => f.Name != fileName)) { + yield break; // Return empty if no matching file exists + } + } + string xml = Sanitizer.RemoveEmpty(xmlReader.GetString(xmlReader.GetEntry(fileName))); var reader = XmlReader.Create(new StringReader(xml)); var data = mapleSurvivalSkinInfoSerializer.Deserialize(reader) as MapleSurvivalSkinInfoRoot; Debug.Assert(data != null); @@ -1503,4 +1517,26 @@ public IEnumerable ParseJobTableNew() { yield return (entry.seasonID, entry); } } + + public IEnumerable<(int Id, StatString Data)> ParseStatString() { + string xml = Sanitizer.RemoveEmpty(xmlReader.GetString(xmlReader.GetEntry($"table/statstringtable.xml"))); + var reader = XmlReader.Create(new StringReader(xml)); + var data = statStringSerializer.Deserialize(reader) as StatStringRoot; + Debug.Assert(data != null); + + foreach (StatString entry in data.key) { + yield return (entry.id, entry); + } + } + + public IEnumerable<(int Id, StatString Data)> ParseSpecialAbilityString() { + string xml = Sanitizer.RemoveEmpty(xmlReader.GetString(xmlReader.GetEntry($"table/specialabilitystringtable.xml"))); + var reader = XmlReader.Create(new StringReader(xml)); + var data = statStringSerializer.Deserialize(reader) as StatStringRoot; + Debug.Assert(data != null); + + foreach (StatString entry in data.key) { + yield return (entry.id, entry); + } + } } diff --git a/Maple2.File.Parser/Xml/Item/Customize.cs b/Maple2.File.Parser/Xml/Item/Customize.cs index 0eb338e..8e4e9ab 100644 --- a/Maple2.File.Parser/Xml/Item/Customize.cs +++ b/Maple2.File.Parser/Xml/Item/Customize.cs @@ -13,9 +13,9 @@ public partial class Customize { [XmlAttribute] public int colordetail; [XmlAttribute] public int defaultColorIndex = -1; - [XmlElement] public Hair HR; - [XmlElement] public FaceDecal FD; - [XmlElement] public Cap CP; + [XmlElement] public Hair HR = new(); + [XmlElement] public FaceDecal FD = new(); + [XmlElement] public Cap CP = new(); public class Hair { [XmlAttribute] public int scale; @@ -35,7 +35,7 @@ public class Cap { [XmlAttribute] public int scale; [XmlAttribute] public int attach; - [XmlElement] public List transform; + [XmlElement] public List transform = []; } public partial class Transform { diff --git a/Maple2.File.Parser/Xml/Item/Cutting.cs b/Maple2.File.Parser/Xml/Item/Cutting.cs index 707078d..02380f6 100644 --- a/Maple2.File.Parser/Xml/Item/Cutting.cs +++ b/Maple2.File.Parser/Xml/Item/Cutting.cs @@ -3,7 +3,7 @@ namespace Maple2.File.Parser.Xml.Item; public class Cutting { - [XmlElement] public List mesh; + [XmlElement] public List mesh = []; public class Mesh { [XmlAttribute] public string name = string.Empty; diff --git a/Maple2.File.Parser/Xml/Item/Install.cs b/Maple2.File.Parser/Xml/Item/Install.cs index dc4dd08..ffb1be4 100644 --- a/Maple2.File.Parser/Xml/Item/Install.cs +++ b/Maple2.File.Parser/Xml/Item/Install.cs @@ -26,5 +26,5 @@ public partial class Install { [XmlAttribute] public string mapAttribute = string.Empty; [XmlAttribute] public string propCollisionGroup = string.Empty; [XmlAttribute] public bool useInstancing = true; - [M2dVector3] public Vector3 physXdimension; + [M2dVector3] public Vector3 physXdimension = default; } diff --git a/Maple2.File.Parser/Xml/Item/Item.cs b/Maple2.File.Parser/Xml/Item/Item.cs index fdf0984..def6550 100644 --- a/Maple2.File.Parser/Xml/Item/Item.cs +++ b/Maple2.File.Parser/Xml/Item/Item.cs @@ -10,35 +10,35 @@ public partial class ItemDataRoot { } public partial class ItemData : IFeatureLocale { - [XmlElement] public Basic basic; - [XmlElement] public Slots slots; - [XmlElement] public Customize customize; - [XmlElement] public Mutation mutation; - [XmlElement] public Cutting cutting; - [XmlElement] public Install install; - [XmlElement] public Property property; - [XmlElement] public Material material; - [XmlElement] public Life life; - [XmlElement] public Limit limit; - [XmlElement] public Skill skill; - [XmlElement] public Skill objectWeaponSkill; - [XmlElement] public Title title; - [XmlElement] public Drop drop; - [XmlElement] public UCC ucc; - [XmlElement] public Effect effect; - [XmlElement] public Fusion fusion; - [XmlElement] public Pet pet; - [XmlElement] public Ride ride; - [XmlElement] public Badge gem; - [XmlElement] public AdditionalEffect AdditionalEffect; - [XmlElement] public Function function; - [XmlElement] public Tool tool; - [XmlElement] public Option option; - [XmlElement] public Maid maid; - [XmlElement] public PCBang PCBang; - [XmlElement] public MusicScore MusicScore; - [XmlElement] public Housing housing; - [XmlElement] public Shop Shop; + [XmlElement] public Basic basic = new(); + [XmlElement] public Slots slots = new(); + [XmlElement] public Customize customize = new(); + [XmlElement] public Mutation mutation = new(); + [XmlElement] public Cutting cutting = new(); + [XmlElement] public Install install = new(); + [XmlElement] public Property property = new(); + [XmlElement] public Material material = new(); + [XmlElement] public Life life = new(); + [XmlElement] public Limit limit = new(); + [XmlElement] public Skill skill = new(); + [XmlElement] public Skill objectWeaponSkill = new(); + [XmlElement] public Title title = new(); + [XmlElement] public Drop drop = new(); + [XmlElement] public UCC ucc = new(); + [XmlElement] public Effect effect = new(); + [XmlElement] public Fusion fusion = new(); + [XmlElement] public Pet pet = new(); + [XmlElement] public Ride ride = new(); + [XmlElement] public Badge gem = new(); + [XmlElement] public AdditionalEffect AdditionalEffect = new(); + [XmlElement] public Function function = new(); + [XmlElement] public Tool tool = new(); + [XmlElement] public Option option = new(); + [XmlElement] public Maid maid = new(); + [XmlElement] public PCBang PCBang = new(); + [XmlElement] public MusicScore MusicScore = new(); + [XmlElement] public Housing housing = new(); + [XmlElement] public Shop Shop = new(); } // ./data/xml/itemdata/%03d.xml @@ -53,33 +53,33 @@ public partial class ItemDataRootNew { } public partial class ItemDataNew : IFeatureLocale { - [XmlElement] public Basic basic; - [XmlElement] public Slots slots; - [XmlElement] public Customize customize; - [XmlElement] public Mutation mutation; - [XmlElement] public Cutting cutting; - [XmlElement] public Install install; - [XmlElement] public Property property; - [XmlElement] public Material material; - [XmlElement] public Life life; - [XmlElement] public Limit limit; - [XmlElement] public Skill skill; - [XmlElement] public Skill objectWeaponSkill; - [XmlElement] public Title title; - [XmlElement] public Drop drop; - [XmlElement] public UCC ucc; - [XmlElement] public Effect effect; - [XmlElement] public Fusion fusion; - [XmlElement] public Pet pet; - [XmlElement] public Ride ride; - [XmlElement] public Badge gem; - [XmlElement] public AdditionalEffect AdditionalEffect; - [XmlElement] public Function function; - [XmlElement] public Tool tool; - [XmlElement] public Option option; - [XmlElement] public Maid maid; - [XmlElement] public PCBang PCBang; - [XmlElement] public MusicScore MusicScore; - [XmlElement] public Housing housing; - [XmlElement] public Shop Shop; + [XmlElement] public Basic basic = new(); + [XmlElement] public Slots slots = new(); + [XmlElement] public Customize customize = new(); + [XmlElement] public Mutation mutation = new(); + [XmlElement] public Cutting cutting = new(); + [XmlElement] public Install install = new(); + [XmlElement] public Property property = new(); + [XmlElement] public Material material = new(); + [XmlElement] public Life life = new(); + [XmlElement] public Limit limit = new(); + [XmlElement] public Skill skill = new(); + [XmlElement] public Skill objectWeaponSkill = new(); + [XmlElement] public Title title = new(); + [XmlElement] public Drop drop = new(); + [XmlElement] public UCC ucc = new(); + [XmlElement] public Effect effect = new(); + [XmlElement] public Fusion fusion = new(); + [XmlElement] public Pet pet = new(); + [XmlElement] public Ride ride = new(); + [XmlElement] public Badge gem = new(); + [XmlElement] public AdditionalEffect AdditionalEffect = new(); + [XmlElement] public Function function = new(); + [XmlElement] public Tool tool = new(); + [XmlElement] public Option option = new(); + [XmlElement] public Maid maid = new(); + [XmlElement] public PCBang PCBang = new(); + [XmlElement] public MusicScore MusicScore = new(); + [XmlElement] public Housing housing = new(); + [XmlElement] public Shop Shop = new(); } diff --git a/Maple2.File.Parser/Xml/Item/Property.cs b/Maple2.File.Parser/Xml/Item/Property.cs index 5667e95..1d26778 100644 --- a/Maple2.File.Parser/Xml/Item/Property.cs +++ b/Maple2.File.Parser/Xml/Item/Property.cs @@ -40,14 +40,14 @@ public partial class Property { [XmlAttribute] public int rePackingItemConsumeCount; [M2dNullable] public int? globalRePackingItemConsumeCount; [M2dArray] public int[] rePackingScrollID = Array.Empty(); - [M2dArray] public int[] globalRePackingScrollID; + [M2dArray] public int[] globalRePackingScrollID = Array.Empty(); [XmlAttribute] public int socketDataId; [XmlAttribute] public string functionTags = string.Empty; [XmlAttribute] public bool moveDisable; [XmlAttribute] public bool disableDrop; - [XmlElement] public Sell sell; - [XmlElement] public Exp exp; + [XmlElement] public Sell sell = new(); + [XmlElement] public Exp exp = new(); public partial class Sell { [M2dArray] public long[] price = Array.Empty(); diff --git a/Maple2.File.Parser/Xml/Item/Slot.cs b/Maple2.File.Parser/Xml/Item/Slot.cs index bd69f6d..aa3758f 100644 --- a/Maple2.File.Parser/Xml/Item/Slot.cs +++ b/Maple2.File.Parser/Xml/Item/Slot.cs @@ -5,15 +5,15 @@ namespace Maple2.File.Parser.Xml.Item; public class Slots { - [XmlElement] public List slot; + [XmlElement] public List slot = []; } public partial class Slot { [XmlAttribute] public string name = string.Empty; - [XmlElement] public List asset; - [XmlElement] public List scale; - [XmlElement] public Decal decal; + [XmlElement] public List asset = []; + [XmlElement] public List scale = []; + [XmlElement] public Decal decal = new(); public class Asset { [XmlAttribute] public string name = string.Empty; @@ -32,11 +32,11 @@ public class Asset { [XmlAttribute] public int weapon; [XmlAttribute] public int placeable; - [XmlElement] public List custom; - [XmlElement] public List userrotation; - [XmlElement] public List jointangle; - [XmlElement] public List dummy; - [XmlElement] public PhysX physx; + [XmlElement] public List custom = []; + [XmlElement] public List userrotation = []; + [XmlElement] public List jointangle = []; + [XmlElement] public List dummy = []; + [XmlElement] public PhysX physx = new(); } public partial class Scale { @@ -50,13 +50,13 @@ public class Decal { [XmlAttribute] public string texture = string.Empty; [XmlAttribute] public string controlTexture = string.Empty; - [XmlElement] public List custom; + [XmlElement] public List custom = []; } public partial class Custom { [XmlAttribute] public string icon = string.Empty; - [M2dVector3] public Vector3 position; - [M2dVector3] public Vector3 rotation; + [M2dVector3] public Vector3 position = default; + [M2dVector3] public Vector3 rotation = default; } public partial class UserRotation { @@ -81,8 +81,8 @@ public partial class Dummy { [XmlAttribute] public bool worldmode; [XmlAttribute] public bool worldlerp; [XmlAttribute] public float step; - [M2dVector3] public Vector3 rotation; - [M2dVector3] public Vector3 translation; + [M2dVector3] public Vector3 rotation = default; + [M2dVector3] public Vector3 translation = default; } public partial class PhysX { diff --git a/Maple2.File.Parser/Xml/ItemOption.cs b/Maple2.File.Parser/Xml/ItemOption.cs index ea482e7..4c6d738 100644 --- a/Maple2.File.Parser/Xml/ItemOption.cs +++ b/Maple2.File.Parser/Xml/ItemOption.cs @@ -14,43 +14,43 @@ public partial class ItemOptionData : IFeatureLocale { [XmlAttribute] public int code; [XmlAttribute] public int grade; [XmlAttribute] public float multiply_factor; - [M2dArray] public int[] optionNumPick = Array.Empty(); + [M2dArray] public int[] optionNumPick = []; #region StatValue - [M2dArray] public int[] str_value_base = Array.Empty(); - [M2dArray] public int[] dex_value_base = Array.Empty(); - [M2dArray] public int[] int_value_base = Array.Empty(); - [M2dArray] public int[] luk_value_base = Array.Empty(); - [M2dArray] public int[] hp_value_base = Array.Empty(); - [M2dArray] public int[] hp_rgp_value_base = Array.Empty(); - [M2dArray] public int[] hp_inv_value_base = Array.Empty(); - [M2dArray] public int[] sp_value_base = Array.Empty(); - [M2dArray] public int[] sp_rgp_value_base = Array.Empty(); - [M2dArray] public int[] sp_inv_value_base = Array.Empty(); - [M2dArray] public int[] ep_value_base = Array.Empty(); - [M2dArray] public int[] ep_rgp_value_base = Array.Empty(); - [M2dArray] public int[] ep_inv_value_base = Array.Empty(); - [M2dArray] public int[] asp_value_base = Array.Empty(); - [M2dArray] public int[] msp_value_base = Array.Empty(); - [M2dArray] public int[] atp_value_base = Array.Empty(); - [M2dArray] public int[] evp_value_base = Array.Empty(); - [M2dArray] public int[] cap_value_base = Array.Empty(); - [M2dArray] public int[] cad_value_base = Array.Empty(); - [M2dArray] public int[] car_value_base = Array.Empty(); - [M2dArray] public int[] ndd_value_base = Array.Empty(); - [M2dArray] public int[] abp_value_base = Array.Empty(); - [M2dArray] public int[] jmp_value_base = Array.Empty(); - [M2dArray] public int[] pap_value_base = Array.Empty(); - [M2dArray] public int[] map_value_base = Array.Empty(); - [M2dArray] public int[] par_value_base = Array.Empty(); - [M2dArray] public int[] mar_value_base = Array.Empty(); - [M2dArray] public int[] wapmin_value_base = Array.Empty(); - [M2dArray] public int[] wapmax_value_base = Array.Empty(); - [M2dArray] public int[] dmg_value_base = Array.Empty(); - [M2dArray] public int[] pen_value_base = Array.Empty(); - [M2dArray] public int[] rmsp_value_base = Array.Empty(); - [M2dArray] public int[] bap_value_base = Array.Empty(); - [M2dArray] public int[] bap_pet_value_base = Array.Empty(); + [M2dArray] public int[] str_value_base = []; + [M2dArray] public int[] dex_value_base = []; + [M2dArray] public int[] int_value_base = []; + [M2dArray] public int[] luk_value_base = []; + [M2dArray] public int[] hp_value_base = []; + [M2dArray] public int[] hp_rgp_value_base = []; + [M2dArray] public int[] hp_inv_value_base = []; + [M2dArray] public int[] sp_value_base = []; + [M2dArray] public int[] sp_rgp_value_base = []; + [M2dArray] public int[] sp_inv_value_base = []; + [M2dArray] public int[] ep_value_base = []; + [M2dArray] public int[] ep_rgp_value_base = []; + [M2dArray] public int[] ep_inv_value_base = []; + [M2dArray] public int[] asp_value_base = []; + [M2dArray] public int[] msp_value_base = []; + [M2dArray] public int[] atp_value_base = []; + [M2dArray] public int[] evp_value_base = []; + [M2dArray] public int[] cap_value_base = []; + [M2dArray] public int[] cad_value_base = []; + [M2dArray] public int[] car_value_base = []; + [M2dArray] public int[] ndd_value_base = []; + [M2dArray] public int[] abp_value_base = []; + [M2dArray] public int[] jmp_value_base = []; + [M2dArray] public int[] pap_value_base = []; + [M2dArray] public int[] map_value_base = []; + [M2dArray] public int[] par_value_base = []; + [M2dArray] public int[] mar_value_base = []; + [M2dArray] public int[] wapmin_value_base = []; + [M2dArray] public int[] wapmax_value_base = []; + [M2dArray] public int[] dmg_value_base = []; + [M2dArray] public int[] pen_value_base = []; + [M2dArray] public int[] rmsp_value_base = []; + [M2dArray] public int[] bap_value_base = []; + [M2dArray] public int[] bap_pet_value_base = []; public int[] StatValue(byte i) => i switch { 0 => str_value_base, @@ -93,40 +93,40 @@ public partial class ItemOptionData : IFeatureLocale { #endregion #region StatRate - [M2dArray] public float[] str_rate_base = Array.Empty(); - [M2dArray] public float[] dex_rate_base = Array.Empty(); - [M2dArray] public float[] int_rate_base = Array.Empty(); - [M2dArray] public float[] luk_rate_base = Array.Empty(); - [M2dArray] public float[] hp_rate_base = Array.Empty(); - [M2dArray] public float[] hp_rgp_rate_base = Array.Empty(); - [M2dArray] public float[] hp_inv_rate_base = Array.Empty(); - [M2dArray] public float[] sp_rate_base = Array.Empty(); - [M2dArray] public float[] sp_rgp_rate_base = Array.Empty(); - [M2dArray] public float[] sp_inv_rate_base = Array.Empty(); - [M2dArray] public float[] ep_rate_base = Array.Empty(); - [M2dArray] public float[] ep_rgp_rate_base = Array.Empty(); - [M2dArray] public float[] ep_inv_rate_base = Array.Empty(); - [M2dArray] public float[] asp_rate_base = Array.Empty(); - [M2dArray] public float[] msp_rate_base = Array.Empty(); - [M2dArray] public float[] atp_rate_base = Array.Empty(); - [M2dArray] public float[] evp_rate_base = Array.Empty(); - [M2dArray] public float[] cap_rate_base = Array.Empty(); - [M2dArray] public float[] cad_rate_base = Array.Empty(); - [M2dArray] public float[] car_rate_base = Array.Empty(); - [M2dArray] public float[] ndd_rate_base = Array.Empty(); - [M2dArray] public float[] abp_rate_base = Array.Empty(); - [M2dArray] public float[] jmp_rate_base = Array.Empty(); - [M2dArray] public float[] pap_rate_base = Array.Empty(); - [M2dArray] public float[] map_rate_base = Array.Empty(); - [M2dArray] public float[] par_rate_base = Array.Empty(); - [M2dArray] public float[] mar_rate_base = Array.Empty(); - [M2dArray] public float[] wapmin_rate_base = Array.Empty(); - [M2dArray] public float[] wapmax_rate_base = Array.Empty(); - [M2dArray] public float[] dmg_rate_base = Array.Empty(); - [M2dArray] public float[] pen_rate_base = Array.Empty(); - [M2dArray] public float[] rmsp_rate_base = Array.Empty(); - [M2dArray] public float[] bap_rate_base = Array.Empty(); - [M2dArray] public float[] bap_pet_rate_base = Array.Empty(); + [M2dArray] public float[] str_rate_base = []; + [M2dArray] public float[] dex_rate_base = []; + [M2dArray] public float[] int_rate_base = []; + [M2dArray] public float[] luk_rate_base = []; + [M2dArray] public float[] hp_rate_base = []; + [M2dArray] public float[] hp_rgp_rate_base = []; + [M2dArray] public float[] hp_inv_rate_base = []; + [M2dArray] public float[] sp_rate_base = []; + [M2dArray] public float[] sp_rgp_rate_base = []; + [M2dArray] public float[] sp_inv_rate_base = []; + [M2dArray] public float[] ep_rate_base = []; + [M2dArray] public float[] ep_rgp_rate_base = []; + [M2dArray] public float[] ep_inv_rate_base = []; + [M2dArray] public float[] asp_rate_base = []; + [M2dArray] public float[] msp_rate_base = []; + [M2dArray] public float[] atp_rate_base = []; + [M2dArray] public float[] evp_rate_base = []; + [M2dArray] public float[] cap_rate_base = []; + [M2dArray] public float[] cad_rate_base = []; + [M2dArray] public float[] car_rate_base = []; + [M2dArray] public float[] ndd_rate_base = []; + [M2dArray] public float[] abp_rate_base = []; + [M2dArray] public float[] jmp_rate_base = []; + [M2dArray] public float[] pap_rate_base = []; + [M2dArray] public float[] map_rate_base = []; + [M2dArray] public float[] par_rate_base = []; + [M2dArray] public float[] mar_rate_base = []; + [M2dArray] public float[] wapmin_rate_base = []; + [M2dArray] public float[] wapmax_rate_base = []; + [M2dArray] public float[] dmg_rate_base = []; + [M2dArray] public float[] pen_rate_base = []; + [M2dArray] public float[] rmsp_rate_base = []; + [M2dArray] public float[] bap_rate_base = []; + [M2dArray] public float[] bap_pet_rate_base = []; public float[] StatRate(byte i) => i switch { 0 => str_rate_base, @@ -169,182 +169,182 @@ public partial class ItemOptionData : IFeatureLocale { #endregion #region SpecialValue - [M2dArray] public int[] seg_value_base = Array.Empty(); - [M2dArray] public int[] smd_value_base = Array.Empty(); - [M2dArray] public int[] sss_value_base = Array.Empty(); - [M2dArray] public int[] dashdistance_value_base = Array.Empty(); - // [M2dArray] public int[] spd_value_base = Array.Empty(); - // [M2dArray] public int[] sid_value_base = Array.Empty(); - [M2dArray] public int[] finaladditionaldamage_value_base = Array.Empty(); - [M2dArray] public int[] cri_value_base = Array.Empty(); - [M2dArray] public int[] sgi_value_base = Array.Empty(); - [M2dArray] public int[] sgi_leader_value_base = Array.Empty(); - [M2dArray] public int[] sgi_elite_value_base = Array.Empty(); - [M2dArray] public int[] sgi_boss_value_base = Array.Empty(); - [M2dArray] public int[] killhprestore_value_base = Array.Empty(); - [M2dArray] public int[] killsprestore_value_base = Array.Empty(); - [M2dArray] public int[] killeprestore_value_base = Array.Empty(); - [M2dArray] public int[] heal_value_base = Array.Empty(); - [M2dArray] public int[] receivedhealincrease_value_base = Array.Empty(); - [M2dArray] public int[] icedamage_value_base = Array.Empty(); - [M2dArray] public int[] firedamage_value_base = Array.Empty(); - [M2dArray] public int[] darkdamage_value_base = Array.Empty(); - [M2dArray] public int[] lightdamage_value_base = Array.Empty(); - [M2dArray] public int[] poisondamage_value_base = Array.Empty(); - [M2dArray] public int[] thunderdamage_value_base = Array.Empty(); - [M2dArray] public int[] nddincrease_value_base = Array.Empty(); - [M2dArray] public int[] lddincrease_value_base = Array.Empty(); - [M2dArray] public int[] parpen_value_base = Array.Empty(); - [M2dArray] public int[] marpen_value_base = Array.Empty(); - [M2dArray] public int[] icedamagereduce_value_base = Array.Empty(); - [M2dArray] public int[] firedamagereduce_value_base = Array.Empty(); - [M2dArray] public int[] darkdamagereduce_value_base = Array.Empty(); - [M2dArray] public int[] lightdamagereduce_value_base = Array.Empty(); - [M2dArray] public int[] poisondamagereduce_value_base = Array.Empty(); - [M2dArray] public int[] thunderdamagereduce_value_base = Array.Empty(); - [M2dArray] public int[] stunreduce_value_base = Array.Empty(); - [M2dArray] public int[] conditionreduce_value_base = Array.Empty(); - [M2dArray] public int[] skillcooldown_value_base = Array.Empty(); - [M2dArray] public int[] neardistancedamagereduce_value_base = Array.Empty(); - [M2dArray] public int[] longdistancedamagereduce_value_base = Array.Empty(); - [M2dArray] public int[] knockbackreduce_value_base = Array.Empty(); - [M2dArray] public int[] stunprocndd_value_base = Array.Empty(); - [M2dArray] public int[] stunprocldd_value_base = Array.Empty(); - [M2dArray] public int[] knockbackprocndd_value_base = Array.Empty(); - [M2dArray] public int[] knockbackprocldd_value_base = Array.Empty(); - [M2dArray] public int[] snareprocndd_value_base = Array.Empty(); - [M2dArray] public int[] snareprocldd_value_base = Array.Empty(); - [M2dArray] public int[] aoeprocndd_value_base = Array.Empty(); - [M2dArray] public int[] aoeprocldd_value_base = Array.Empty(); - [M2dArray] public int[] npckilldropitemincrate_value_base = Array.Empty(); - [M2dArray] public int[] seg_questreward_value_base = Array.Empty(); - [M2dArray] public int[] smd_questreward_value_base = Array.Empty(); - [M2dArray] public int[] seg_fishingreward_value_base = Array.Empty(); - [M2dArray] public int[] seg_arcadereward_value_base = Array.Empty(); - [M2dArray] public int[] seg_playinstrumentreward_value_base = Array.Empty(); - [M2dArray] public int[] invoke_effect1_value_base = Array.Empty(); - [M2dArray] public int[] invoke_effect2_value_base = Array.Empty(); - [M2dArray] public int[] invoke_effect3_value_base = Array.Empty(); - [M2dArray] public int[] pvpdamageincrease_value_base = Array.Empty(); - [M2dArray] public int[] pvpdamagereduce_value_base = Array.Empty(); - [M2dArray] public int[] improveguildexp_value_base = Array.Empty(); - [M2dArray] public int[] improveguildcoin_value_base = Array.Empty(); - [M2dArray] public int[] improvemassiveeventbexpball_value_base = Array.Empty(); - [M2dArray] public int[] reduce_meso_trade_fee_value_base = Array.Empty(); - [M2dArray] public int[] reduce_enchant_matrial_fee_value_base = Array.Empty(); - [M2dArray] public int[] reduce_merat_revival_fee_value_base = Array.Empty(); - [M2dArray] public int[] improve_mining_reward_item_value_base = Array.Empty(); - [M2dArray] public int[] improve_breeding_reward_item_value_base = Array.Empty(); - [M2dArray] public int[] improve_blacksmithing_reward_mastery_value_base = Array.Empty(); - [M2dArray] public int[] improve_engraving_reward_mastery_value_base = Array.Empty(); - [M2dArray] public int[] improve_gathering_reward_item_value_base = Array.Empty(); - [M2dArray] public int[] improve_farming_reward_item_value_base = Array.Empty(); - [M2dArray] public int[] improve_alchemist_reward_mastery_value_base = Array.Empty(); - [M2dArray] public int[] improve_cooking_reward_mastery_value_base = Array.Empty(); - [M2dArray] public int[] improve_acquire_gathering_exp_value_base = Array.Empty(); - [M2dArray] public int[] skill_levelup_tier_1_value_base = Array.Empty(); - [M2dArray] public int[] skill_levelup_tier_2_value_base = Array.Empty(); - [M2dArray] public int[] skill_levelup_tier_3_value_base = Array.Empty(); - [M2dArray] public int[] skill_levelup_tier_4_value_base = Array.Empty(); - [M2dArray] public int[] skill_levelup_tier_5_value_base = Array.Empty(); - [M2dArray] public int[] skill_levelup_tier_6_value_base = Array.Empty(); - [M2dArray] public int[] skill_levelup_tier_7_value_base = Array.Empty(); - [M2dArray] public int[] skill_levelup_tier_8_value_base = Array.Empty(); - [M2dArray] public int[] skill_levelup_tier_9_value_base = Array.Empty(); - [M2dArray] public int[] skill_levelup_tier_10_value_base = Array.Empty(); - [M2dArray] public int[] skill_levelup_tier_11_value_base = Array.Empty(); - [M2dArray] public int[] skill_levelup_tier_12_value_base = Array.Empty(); - [M2dArray] public int[] skill_levelup_tier_13_value_base = Array.Empty(); - [M2dArray] public int[] skill_levelup_tier_14_value_base = Array.Empty(); - [M2dArray] public int[] improve_massive_ox_exp_value_base = Array.Empty(); - [M2dArray] public int[] improve_massive_trapmaster_exp_value_base = Array.Empty(); - [M2dArray] public int[] improve_massive_finalsurvival_exp_value_base = Array.Empty(); - [M2dArray] public int[] improve_massive_crazyrunner_exp_value_base = Array.Empty(); - [M2dArray] public int[] improve_massive_sh_crazyrunner_exp_value_base = Array.Empty(); - [M2dArray] public int[] improve_massive_escape_exp_value_base = Array.Empty(); - [M2dArray] public int[] improve_massive_springbeach_exp_value_base = Array.Empty(); - [M2dArray] public int[] improve_massive_dancedance_exp_value_base = Array.Empty(); - [M2dArray] public int[] improve_massive_ox_msp_value_base = Array.Empty(); - [M2dArray] public int[] improve_massive_trapmaster_msp_value_base = Array.Empty(); - [M2dArray] public int[] improve_massive_finalsurvival_msp_value_base = Array.Empty(); - [M2dArray] public int[] improve_massive_crazyrunner_msp_value_base = Array.Empty(); - [M2dArray] public int[] improve_massive_sh_crazyrunner_msp_value_base = Array.Empty(); - [M2dArray] public int[] improve_massive_escape_msp_value_base = Array.Empty(); - [M2dArray] public int[] improve_massive_springbeach_msp_value_base = Array.Empty(); - [M2dArray] public int[] improve_massive_dancedance_msp_value_base = Array.Empty(); - [M2dArray] public int[] npc_hit_reward_sp_ball_value_base = Array.Empty(); - [M2dArray] public int[] npc_hit_reward_ep_ball_value_base = Array.Empty(); - [M2dArray] public int[] improve_honor_token_value_base = Array.Empty(); - [M2dArray] public int[] improve_pvp_exp_value_base = Array.Empty(); - [M2dArray] public int[] improve_darkstream_damage_value_base = Array.Empty(); - [M2dArray] public int[] reduce_darkstream_recive_damage_value_base = Array.Empty(); - [M2dArray] public int[] improve_darkstream_evp_value_base = Array.Empty(); - [M2dArray] public int[] fishing_double_mastery_value_base = Array.Empty(); - [M2dArray] public int[] playinstrument_double_mastery_value_base = Array.Empty(); - [M2dArray] public int[] complete_fieldmission_msp_value_base = Array.Empty(); - [M2dArray] public int[] improve_glide_vertical_velocity_value_base = Array.Empty(); - [M2dArray] public int[] additionaleffect_95000018_value_base = Array.Empty(); - [M2dArray] public int[] additionaleffect_95000012_value_base = Array.Empty(); - [M2dArray] public int[] additionaleffect_95000014_value_base = Array.Empty(); - [M2dArray] public int[] additionaleffect_95000020_value_base = Array.Empty(); - [M2dArray] public int[] additionaleffect_95000021_value_base = Array.Empty(); - [M2dArray] public int[] additionaleffect_95000022_value_base = Array.Empty(); - [M2dArray] public int[] additionaleffect_95000023_value_base = Array.Empty(); - [M2dArray] public int[] additionaleffect_95000024_value_base = Array.Empty(); - [M2dArray] public int[] additionaleffect_95000025_value_base = Array.Empty(); - [M2dArray] public int[] additionaleffect_95000026_value_base = Array.Empty(); - [M2dArray] public int[] additionaleffect_95000027_value_base = Array.Empty(); - [M2dArray] public int[] additionaleffect_95000028_value_base = Array.Empty(); - [M2dArray] public int[] additionaleffect_95000029_value_base = Array.Empty(); - [M2dArray] public int[] reduce_recovery_ep_inv_value_base = Array.Empty(); - [M2dArray] public int[] improve_stat_wap_u_value_base = Array.Empty(); - [M2dArray] public int[] mining_double_reward_value_base = Array.Empty(); - [M2dArray] public int[] breeding_double_reward_value_base = Array.Empty(); - [M2dArray] public int[] gathering_double_reward_value_base = Array.Empty(); - [M2dArray] public int[] farming_double_reward_value_base = Array.Empty(); - [M2dArray] public int[] blacksmithing_double_reward_value_base = Array.Empty(); - [M2dArray] public int[] engraving_double_reward_value_base = Array.Empty(); - [M2dArray] public int[] alchemist_double_reward_value_base = Array.Empty(); - [M2dArray] public int[] cooking_double_reward_value_base = Array.Empty(); - [M2dArray] public int[] mining_double_mastery_value_base = Array.Empty(); - [M2dArray] public int[] breeding_double_mastery_value_base = Array.Empty(); - [M2dArray] public int[] gathering_double_mastery_value_base = Array.Empty(); - [M2dArray] public int[] farming_double_mastery_value_base = Array.Empty(); - [M2dArray] public int[] blacksmithing_double_mastery_value_base = Array.Empty(); - [M2dArray] public int[] engraving_double_mastery_value_base = Array.Empty(); - [M2dArray] public int[] alchemist_double_mastery_value_base = Array.Empty(); - [M2dArray] public int[] cooking_double_mastery_value_base = Array.Empty(); - [M2dArray] public int[] improve_chaosraid_wap_value_base = Array.Empty(); - [M2dArray] public int[] improve_chaosraid_asp_value_base = Array.Empty(); - [M2dArray] public int[] improve_chaosraid_atp_value_base = Array.Empty(); - [M2dArray] public int[] improve_chaosraid_hp_value_base = Array.Empty(); - [M2dArray] public int[] improve_recovery_ball_value_base = Array.Empty(); - [M2dArray] public int[] improve_fieldboss_kill_exp_value_base = Array.Empty(); - [M2dArray] public int[] improve_fieldboss_kill_drop_value_base = Array.Empty(); - [M2dArray] public int[] reduce_fieldboss_recive_damage_value_base = Array.Empty(); - [M2dArray] public int[] additionaleffect_95000016_value_base = Array.Empty(); - [M2dArray] public int[] improve_pettrap_reward_value_base = Array.Empty(); - [M2dArray] public int[] mining_multiaction_value_base = Array.Empty(); - [M2dArray] public int[] breeding_multiaction_value_base = Array.Empty(); - [M2dArray] public int[] gathering_multiaction_value_base = Array.Empty(); - [M2dArray] public int[] farming_multiaction_value_base = Array.Empty(); - [M2dArray] public int[] reduce_damage_by_targetmaxhp_value_base = Array.Empty(); - [M2dArray] public int[] reduce_meso_revival_fee_value_base = Array.Empty(); - [M2dArray] public int[] improve_riding_run_speed_value_base = Array.Empty(); - [M2dArray] public int[] improve_dungeon_reward_meso_value_base = Array.Empty(); - [M2dArray] public int[] improve_shop_buying_meso_value_base = Array.Empty(); - [M2dArray] public int[] improve_itembox_reward_meso_value_base = Array.Empty(); - [M2dArray] public int[] reduce_remakeoption_fee_value_base = Array.Empty(); - [M2dArray] public int[] reduce_airtaxi_fee_value_base = Array.Empty(); - [M2dArray] public int[] improve_socket_unlock_probability_value_base = Array.Empty(); - [M2dArray] public int[] reduce_gemstone_upgrade_fee_value_base = Array.Empty(); - [M2dArray] public int[] reduce_pet_remakeoption_fee_value_base = Array.Empty(); - [M2dArray] public int[] improve_riding_speed_value_base = Array.Empty(); - // [M2dArray] public int[] improve_survival_kill_exp_value_base = Array.Empty(); - // [M2dArray] public int[] improve_survival_time_exp_value_base = Array.Empty(); - // [M2dArray] public int[] offensive_physicaldamage_value_base = Array.Empty(); - // [M2dArray] public int[] offensive_magicaldamage_value_base = Array.Empty(); - [M2dArray] public int[] reduce_gameitem_socket_unlock_fee_value_base = Array.Empty(); + [M2dArray] public int[] seg_value_base = []; + [M2dArray] public int[] smd_value_base = []; + [M2dArray] public int[] sss_value_base = []; + [M2dArray] public int[] dashdistance_value_base = []; + // [M2dArray] public int[] spd_value_base = []; + // [M2dArray] public int[] sid_value_base = []; + [M2dArray] public int[] finaladditionaldamage_value_base = []; + [M2dArray] public int[] cri_value_base = []; + [M2dArray] public int[] sgi_value_base = []; + [M2dArray] public int[] sgi_leader_value_base = []; + [M2dArray] public int[] sgi_elite_value_base = []; + [M2dArray] public int[] sgi_boss_value_base = []; + [M2dArray] public int[] killhprestore_value_base = []; + [M2dArray] public int[] killsprestore_value_base = []; + [M2dArray] public int[] killeprestore_value_base = []; + [M2dArray] public int[] heal_value_base = []; + [M2dArray] public int[] receivedhealincrease_value_base = []; + [M2dArray] public int[] icedamage_value_base = []; + [M2dArray] public int[] firedamage_value_base = []; + [M2dArray] public int[] darkdamage_value_base = []; + [M2dArray] public int[] lightdamage_value_base = []; + [M2dArray] public int[] poisondamage_value_base = []; + [M2dArray] public int[] thunderdamage_value_base = []; + [M2dArray] public int[] nddincrease_value_base = []; + [M2dArray] public int[] lddincrease_value_base = []; + [M2dArray] public int[] parpen_value_base = []; + [M2dArray] public int[] marpen_value_base = []; + [M2dArray] public int[] icedamagereduce_value_base = []; + [M2dArray] public int[] firedamagereduce_value_base = []; + [M2dArray] public int[] darkdamagereduce_value_base = []; + [M2dArray] public int[] lightdamagereduce_value_base = []; + [M2dArray] public int[] poisondamagereduce_value_base = []; + [M2dArray] public int[] thunderdamagereduce_value_base = []; + [M2dArray] public int[] stunreduce_value_base = []; + [M2dArray] public int[] conditionreduce_value_base = []; + [M2dArray] public int[] skillcooldown_value_base = []; + [M2dArray] public int[] neardistancedamagereduce_value_base = []; + [M2dArray] public int[] longdistancedamagereduce_value_base = []; + [M2dArray] public int[] knockbackreduce_value_base = []; + [M2dArray] public int[] stunprocndd_value_base = []; + [M2dArray] public int[] stunprocldd_value_base = []; + [M2dArray] public int[] knockbackprocndd_value_base = []; + [M2dArray] public int[] knockbackprocldd_value_base = []; + [M2dArray] public int[] snareprocndd_value_base = []; + [M2dArray] public int[] snareprocldd_value_base = []; + [M2dArray] public int[] aoeprocndd_value_base = []; + [M2dArray] public int[] aoeprocldd_value_base = []; + [M2dArray] public int[] npckilldropitemincrate_value_base = []; + [M2dArray] public int[] seg_questreward_value_base = []; + [M2dArray] public int[] smd_questreward_value_base = []; + [M2dArray] public int[] seg_fishingreward_value_base = []; + [M2dArray] public int[] seg_arcadereward_value_base = []; + [M2dArray] public int[] seg_playinstrumentreward_value_base = []; + [M2dArray] public int[] invoke_effect1_value_base = []; + [M2dArray] public int[] invoke_effect2_value_base = []; + [M2dArray] public int[] invoke_effect3_value_base = []; + [M2dArray] public int[] pvpdamageincrease_value_base = []; + [M2dArray] public int[] pvpdamagereduce_value_base = []; + [M2dArray] public int[] improveguildexp_value_base = []; + [M2dArray] public int[] improveguildcoin_value_base = []; + [M2dArray] public int[] improvemassiveeventbexpball_value_base = []; + [M2dArray] public int[] reduce_meso_trade_fee_value_base = []; + [M2dArray] public int[] reduce_enchant_matrial_fee_value_base = []; + [M2dArray] public int[] reduce_merat_revival_fee_value_base = []; + [M2dArray] public int[] improve_mining_reward_item_value_base = []; + [M2dArray] public int[] improve_breeding_reward_item_value_base = []; + [M2dArray] public int[] improve_blacksmithing_reward_mastery_value_base = []; + [M2dArray] public int[] improve_engraving_reward_mastery_value_base = []; + [M2dArray] public int[] improve_gathering_reward_item_value_base = []; + [M2dArray] public int[] improve_farming_reward_item_value_base = []; + [M2dArray] public int[] improve_alchemist_reward_mastery_value_base = []; + [M2dArray] public int[] improve_cooking_reward_mastery_value_base = []; + [M2dArray] public int[] improve_acquire_gathering_exp_value_base = []; + [M2dArray] public int[] skill_levelup_tier_1_value_base = []; + [M2dArray] public int[] skill_levelup_tier_2_value_base = []; + [M2dArray] public int[] skill_levelup_tier_3_value_base = []; + [M2dArray] public int[] skill_levelup_tier_4_value_base = []; + [M2dArray] public int[] skill_levelup_tier_5_value_base = []; + [M2dArray] public int[] skill_levelup_tier_6_value_base = []; + [M2dArray] public int[] skill_levelup_tier_7_value_base = []; + [M2dArray] public int[] skill_levelup_tier_8_value_base = []; + [M2dArray] public int[] skill_levelup_tier_9_value_base = []; + [M2dArray] public int[] skill_levelup_tier_10_value_base = []; + [M2dArray] public int[] skill_levelup_tier_11_value_base = []; + [M2dArray] public int[] skill_levelup_tier_12_value_base = []; + [M2dArray] public int[] skill_levelup_tier_13_value_base = []; + [M2dArray] public int[] skill_levelup_tier_14_value_base = []; + [M2dArray] public int[] improve_massive_ox_exp_value_base = []; + [M2dArray] public int[] improve_massive_trapmaster_exp_value_base = []; + [M2dArray] public int[] improve_massive_finalsurvival_exp_value_base = []; + [M2dArray] public int[] improve_massive_crazyrunner_exp_value_base = []; + [M2dArray] public int[] improve_massive_sh_crazyrunner_exp_value_base = []; + [M2dArray] public int[] improve_massive_escape_exp_value_base = []; + [M2dArray] public int[] improve_massive_springbeach_exp_value_base = []; + [M2dArray] public int[] improve_massive_dancedance_exp_value_base = []; + [M2dArray] public int[] improve_massive_ox_msp_value_base = []; + [M2dArray] public int[] improve_massive_trapmaster_msp_value_base = []; + [M2dArray] public int[] improve_massive_finalsurvival_msp_value_base = []; + [M2dArray] public int[] improve_massive_crazyrunner_msp_value_base = []; + [M2dArray] public int[] improve_massive_sh_crazyrunner_msp_value_base = []; + [M2dArray] public int[] improve_massive_escape_msp_value_base = []; + [M2dArray] public int[] improve_massive_springbeach_msp_value_base = []; + [M2dArray] public int[] improve_massive_dancedance_msp_value_base = []; + [M2dArray] public int[] npc_hit_reward_sp_ball_value_base = []; + [M2dArray] public int[] npc_hit_reward_ep_ball_value_base = []; + [M2dArray] public int[] improve_honor_token_value_base = []; + [M2dArray] public int[] improve_pvp_exp_value_base = []; + [M2dArray] public int[] improve_darkstream_damage_value_base = []; + [M2dArray] public int[] reduce_darkstream_recive_damage_value_base = []; + [M2dArray] public int[] improve_darkstream_evp_value_base = []; + [M2dArray] public int[] fishing_double_mastery_value_base = []; + [M2dArray] public int[] playinstrument_double_mastery_value_base = []; + [M2dArray] public int[] complete_fieldmission_msp_value_base = []; + [M2dArray] public int[] improve_glide_vertical_velocity_value_base = []; + [M2dArray] public int[] additionaleffect_95000018_value_base = []; + [M2dArray] public int[] additionaleffect_95000012_value_base = []; + [M2dArray] public int[] additionaleffect_95000014_value_base = []; + [M2dArray] public int[] additionaleffect_95000020_value_base = []; + [M2dArray] public int[] additionaleffect_95000021_value_base = []; + [M2dArray] public int[] additionaleffect_95000022_value_base = []; + [M2dArray] public int[] additionaleffect_95000023_value_base = []; + [M2dArray] public int[] additionaleffect_95000024_value_base = []; + [M2dArray] public int[] additionaleffect_95000025_value_base = []; + [M2dArray] public int[] additionaleffect_95000026_value_base = []; + [M2dArray] public int[] additionaleffect_95000027_value_base = []; + [M2dArray] public int[] additionaleffect_95000028_value_base = []; + [M2dArray] public int[] additionaleffect_95000029_value_base = []; + [M2dArray] public int[] reduce_recovery_ep_inv_value_base = []; + [M2dArray] public int[] improve_stat_wap_u_value_base = []; + [M2dArray] public int[] mining_double_reward_value_base = []; + [M2dArray] public int[] breeding_double_reward_value_base = []; + [M2dArray] public int[] gathering_double_reward_value_base = []; + [M2dArray] public int[] farming_double_reward_value_base = []; + [M2dArray] public int[] blacksmithing_double_reward_value_base = []; + [M2dArray] public int[] engraving_double_reward_value_base = []; + [M2dArray] public int[] alchemist_double_reward_value_base = []; + [M2dArray] public int[] cooking_double_reward_value_base = []; + [M2dArray] public int[] mining_double_mastery_value_base = []; + [M2dArray] public int[] breeding_double_mastery_value_base = []; + [M2dArray] public int[] gathering_double_mastery_value_base = []; + [M2dArray] public int[] farming_double_mastery_value_base = []; + [M2dArray] public int[] blacksmithing_double_mastery_value_base = []; + [M2dArray] public int[] engraving_double_mastery_value_base = []; + [M2dArray] public int[] alchemist_double_mastery_value_base = []; + [M2dArray] public int[] cooking_double_mastery_value_base = []; + [M2dArray] public int[] improve_chaosraid_wap_value_base = []; + [M2dArray] public int[] improve_chaosraid_asp_value_base = []; + [M2dArray] public int[] improve_chaosraid_atp_value_base = []; + [M2dArray] public int[] improve_chaosraid_hp_value_base = []; + [M2dArray] public int[] improve_recovery_ball_value_base = []; + [M2dArray] public int[] improve_fieldboss_kill_exp_value_base = []; + [M2dArray] public int[] improve_fieldboss_kill_drop_value_base = []; + [M2dArray] public int[] reduce_fieldboss_recive_damage_value_base = []; + [M2dArray] public int[] additionaleffect_95000016_value_base = []; + [M2dArray] public int[] improve_pettrap_reward_value_base = []; + [M2dArray] public int[] mining_multiaction_value_base = []; + [M2dArray] public int[] breeding_multiaction_value_base = []; + [M2dArray] public int[] gathering_multiaction_value_base = []; + [M2dArray] public int[] farming_multiaction_value_base = []; + [M2dArray] public int[] reduce_damage_by_targetmaxhp_value_base = []; + [M2dArray] public int[] reduce_meso_revival_fee_value_base = []; + [M2dArray] public int[] improve_riding_run_speed_value_base = []; + [M2dArray] public int[] improve_dungeon_reward_meso_value_base = []; + [M2dArray] public int[] improve_shop_buying_meso_value_base = []; + [M2dArray] public int[] improve_itembox_reward_meso_value_base = []; + [M2dArray] public int[] reduce_remakeoption_fee_value_base = []; + [M2dArray] public int[] reduce_airtaxi_fee_value_base = []; + [M2dArray] public int[] improve_socket_unlock_probability_value_base = []; + [M2dArray] public int[] reduce_gemstone_upgrade_fee_value_base = []; + [M2dArray] public int[] reduce_pet_remakeoption_fee_value_base = []; + [M2dArray] public int[] improve_riding_speed_value_base = []; + // [M2dArray] public int[] improve_survival_kill_exp_value_base = []; + // [M2dArray] public int[] improve_survival_time_exp_value_base = []; + // [M2dArray] public int[] offensive_physicaldamage_value_base = []; + // [M2dArray] public int[] offensive_magicaldamage_value_base = []; + [M2dArray] public int[] reduce_gameitem_socket_unlock_fee_value_base = []; public int[] SpecialValue(byte i) => i switch { 0 => seg_value_base, @@ -528,182 +528,182 @@ public partial class ItemOptionData : IFeatureLocale { #endregion #region SpecialRate - [M2dArray] public float[] seg_rate_base = Array.Empty(); - [M2dArray] public float[] smd_rate_base = Array.Empty(); - [M2dArray] public float[] sss_rate_base = Array.Empty(); - [M2dArray] public float[] dashdistance_rate_base = Array.Empty(); - // [M2dArray] public float[] spd_rate_base = Array.Empty(); - // [M2dArray] public float[] sid_rate_base = Array.Empty(); - [M2dArray] public float[] finaladditionaldamage_rate_base = Array.Empty(); - [M2dArray] public float[] cri_rate_base = Array.Empty(); - [M2dArray] public float[] sgi_rate_base = Array.Empty(); - [M2dArray] public float[] sgi_leader_rate_base = Array.Empty(); - [M2dArray] public float[] sgi_elite_rate_base = Array.Empty(); - [M2dArray] public float[] sgi_boss_rate_base = Array.Empty(); - [M2dArray] public float[] killhprestore_rate_base = Array.Empty(); - [M2dArray] public float[] killsprestore_rate_base = Array.Empty(); - [M2dArray] public float[] killeprestore_rate_base = Array.Empty(); - [M2dArray] public float[] heal_rate_base = Array.Empty(); - [M2dArray] public float[] receivedhealincrease_rate_base = Array.Empty(); - [M2dArray] public float[] icedamage_rate_base = Array.Empty(); - [M2dArray] public float[] firedamage_rate_base = Array.Empty(); - [M2dArray] public float[] darkdamage_rate_base = Array.Empty(); - [M2dArray] public float[] lightdamage_rate_base = Array.Empty(); - [M2dArray] public float[] poisondamage_rate_base = Array.Empty(); - [M2dArray] public float[] thunderdamage_rate_base = Array.Empty(); - [M2dArray] public float[] nddincrease_rate_base = Array.Empty(); - [M2dArray] public float[] lddincrease_rate_base = Array.Empty(); - [M2dArray] public float[] parpen_rate_base = Array.Empty(); - [M2dArray] public float[] marpen_rate_base = Array.Empty(); - [M2dArray] public float[] icedamagereduce_rate_base = Array.Empty(); - [M2dArray] public float[] firedamagereduce_rate_base = Array.Empty(); - [M2dArray] public float[] darkdamagereduce_rate_base = Array.Empty(); - [M2dArray] public float[] lightdamagereduce_rate_base = Array.Empty(); - [M2dArray] public float[] poisondamagereduce_rate_base = Array.Empty(); - [M2dArray] public float[] thunderdamagereduce_rate_base = Array.Empty(); - [M2dArray] public float[] stunreduce_rate_base = Array.Empty(); - [M2dArray] public float[] conditionreduce_rate_base = Array.Empty(); - [M2dArray] public float[] skillcooldown_rate_base = Array.Empty(); - [M2dArray] public float[] neardistancedamagereduce_rate_base = Array.Empty(); - [M2dArray] public float[] longdistancedamagereduce_rate_base = Array.Empty(); - [M2dArray] public float[] knockbackreduce_rate_base = Array.Empty(); - [M2dArray] public float[] stunprocndd_rate_base = Array.Empty(); - [M2dArray] public float[] stunprocldd_rate_base = Array.Empty(); - [M2dArray] public float[] knockbackprocndd_rate_base = Array.Empty(); - [M2dArray] public float[] knockbackprocldd_rate_base = Array.Empty(); - [M2dArray] public float[] snareprocndd_rate_base = Array.Empty(); - [M2dArray] public float[] snareprocldd_rate_base = Array.Empty(); - [M2dArray] public float[] aoeprocndd_rate_base = Array.Empty(); - [M2dArray] public float[] aoeprocldd_rate_base = Array.Empty(); - [M2dArray] public float[] npckilldropitemincrate_rate_base = Array.Empty(); - [M2dArray] public float[] seg_questreward_rate_base = Array.Empty(); - [M2dArray] public float[] smd_questreward_rate_base = Array.Empty(); - [M2dArray] public float[] seg_fishingreward_rate_base = Array.Empty(); - [M2dArray] public float[] seg_arcadereward_rate_base = Array.Empty(); - [M2dArray] public float[] seg_playinstrumentreward_rate_base = Array.Empty(); - [M2dArray] public float[] invoke_effect1_rate_base = Array.Empty(); - [M2dArray] public float[] invoke_effect2_rate_base = Array.Empty(); - [M2dArray] public float[] invoke_effect3_rate_base = Array.Empty(); - [M2dArray] public float[] pvpdamageincrease_rate_base = Array.Empty(); - [M2dArray] public float[] pvpdamagereduce_rate_base = Array.Empty(); - [M2dArray] public float[] improveguildexp_rate_base = Array.Empty(); - [M2dArray] public float[] improveguildcoin_rate_base = Array.Empty(); - [M2dArray] public float[] improvemassiveeventbexpball_rate_base = Array.Empty(); - [M2dArray] public float[] reduce_meso_trade_fee_rate_base = Array.Empty(); - [M2dArray] public float[] reduce_enchant_matrial_fee_rate_base = Array.Empty(); - [M2dArray] public float[] reduce_merat_revival_fee_rate_base = Array.Empty(); - [M2dArray] public float[] improve_mining_reward_item_rate_base = Array.Empty(); - [M2dArray] public float[] improve_breeding_reward_item_rate_base = Array.Empty(); - [M2dArray] public float[] improve_blacksmithing_reward_mastery_rate_base = Array.Empty(); - [M2dArray] public float[] improve_engraving_reward_mastery_rate_base = Array.Empty(); - [M2dArray] public float[] improve_gathering_reward_item_rate_base = Array.Empty(); - [M2dArray] public float[] improve_farming_reward_item_rate_base = Array.Empty(); - [M2dArray] public float[] improve_alchemist_reward_mastery_rate_base = Array.Empty(); - [M2dArray] public float[] improve_cooking_reward_mastery_rate_base = Array.Empty(); - [M2dArray] public float[] improve_acquire_gathering_exp_rate_base = Array.Empty(); - [M2dArray] public float[] skill_levelup_tier_1_rate_base = Array.Empty(); - [M2dArray] public float[] skill_levelup_tier_2_rate_base = Array.Empty(); - [M2dArray] public float[] skill_levelup_tier_3_rate_base = Array.Empty(); - [M2dArray] public float[] skill_levelup_tier_4_rate_base = Array.Empty(); - [M2dArray] public float[] skill_levelup_tier_5_rate_base = Array.Empty(); - [M2dArray] public float[] skill_levelup_tier_6_rate_base = Array.Empty(); - [M2dArray] public float[] skill_levelup_tier_7_rate_base = Array.Empty(); - [M2dArray] public float[] skill_levelup_tier_8_rate_base = Array.Empty(); - [M2dArray] public float[] skill_levelup_tier_9_rate_base = Array.Empty(); - [M2dArray] public float[] skill_levelup_tier_10_rate_base = Array.Empty(); - [M2dArray] public float[] skill_levelup_tier_11_rate_base = Array.Empty(); - [M2dArray] public float[] skill_levelup_tier_12_rate_base = Array.Empty(); - [M2dArray] public float[] skill_levelup_tier_13_rate_base = Array.Empty(); - [M2dArray] public float[] skill_levelup_tier_14_rate_base = Array.Empty(); - [M2dArray] public float[] improve_massive_ox_exp_rate_base = Array.Empty(); - [M2dArray] public float[] improve_massive_trapmaster_exp_rate_base = Array.Empty(); - [M2dArray] public float[] improve_massive_finalsurvival_exp_rate_base = Array.Empty(); - [M2dArray] public float[] improve_massive_crazyrunner_exp_rate_base = Array.Empty(); - [M2dArray] public float[] improve_massive_sh_crazyrunner_exp_rate_base = Array.Empty(); - [M2dArray] public float[] improve_massive_escape_exp_rate_base = Array.Empty(); - [M2dArray] public float[] improve_massive_springbeach_exp_rate_base = Array.Empty(); - [M2dArray] public float[] improve_massive_dancedance_exp_rate_base = Array.Empty(); - [M2dArray] public float[] improve_massive_ox_msp_rate_base = Array.Empty(); - [M2dArray] public float[] improve_massive_trapmaster_msp_rate_base = Array.Empty(); - [M2dArray] public float[] improve_massive_finalsurvival_msp_rate_base = Array.Empty(); - [M2dArray] public float[] improve_massive_crazyrunner_msp_rate_base = Array.Empty(); - [M2dArray] public float[] improve_massive_sh_crazyrunner_msp_rate_base = Array.Empty(); - [M2dArray] public float[] improve_massive_escape_msp_rate_base = Array.Empty(); - [M2dArray] public float[] improve_massive_springbeach_msp_rate_base = Array.Empty(); - [M2dArray] public float[] improve_massive_dancedance_msp_rate_base = Array.Empty(); - [M2dArray] public float[] npc_hit_reward_sp_ball_rate_base = Array.Empty(); - [M2dArray] public float[] npc_hit_reward_ep_ball_rate_base = Array.Empty(); - [M2dArray] public float[] improve_honor_token_rate_base = Array.Empty(); - [M2dArray] public float[] improve_pvp_exp_rate_base = Array.Empty(); - [M2dArray] public float[] improve_darkstream_damage_rate_base = Array.Empty(); - [M2dArray] public float[] reduce_darkstream_recive_damage_rate_base = Array.Empty(); - [M2dArray] public float[] improve_darkstream_evp_rate_base = Array.Empty(); - [M2dArray] public float[] fishing_double_mastery_rate_base = Array.Empty(); - [M2dArray] public float[] playinstrument_double_mastery_rate_base = Array.Empty(); - [M2dArray] public float[] complete_fieldmission_msp_rate_base = Array.Empty(); - [M2dArray] public float[] improve_glide_vertical_velocity_rate_base = Array.Empty(); - [M2dArray] public float[] additionaleffect_95000018_rate_base = Array.Empty(); - [M2dArray] public float[] additionaleffect_95000012_rate_base = Array.Empty(); - [M2dArray] public float[] additionaleffect_95000014_rate_base = Array.Empty(); - [M2dArray] public float[] additionaleffect_95000020_rate_base = Array.Empty(); - [M2dArray] public float[] additionaleffect_95000021_rate_base = Array.Empty(); - [M2dArray] public float[] additionaleffect_95000022_rate_base = Array.Empty(); - [M2dArray] public float[] additionaleffect_95000023_rate_base = Array.Empty(); - [M2dArray] public float[] additionaleffect_95000024_rate_base = Array.Empty(); - [M2dArray] public float[] additionaleffect_95000025_rate_base = Array.Empty(); - [M2dArray] public float[] additionaleffect_95000026_rate_base = Array.Empty(); - [M2dArray] public float[] additionaleffect_95000027_rate_base = Array.Empty(); - [M2dArray] public float[] additionaleffect_95000028_rate_base = Array.Empty(); - [M2dArray] public float[] additionaleffect_95000029_rate_base = Array.Empty(); - [M2dArray] public float[] reduce_recovery_ep_inv_rate_base = Array.Empty(); - [M2dArray] public float[] improve_stat_wap_u_rate_base = Array.Empty(); - [M2dArray] public float[] mining_double_reward_rate_base = Array.Empty(); - [M2dArray] public float[] breeding_double_reward_rate_base = Array.Empty(); - [M2dArray] public float[] gathering_double_reward_rate_base = Array.Empty(); - [M2dArray] public float[] farming_double_reward_rate_base = Array.Empty(); - [M2dArray] public float[] blacksmithing_double_reward_rate_base = Array.Empty(); - [M2dArray] public float[] engraving_double_reward_rate_base = Array.Empty(); - [M2dArray] public float[] alchemist_double_reward_rate_base = Array.Empty(); - [M2dArray] public float[] cooking_double_reward_rate_base = Array.Empty(); - [M2dArray] public float[] mining_double_mastery_rate_base = Array.Empty(); - [M2dArray] public float[] breeding_double_mastery_rate_base = Array.Empty(); - [M2dArray] public float[] gathering_double_mastery_rate_base = Array.Empty(); - [M2dArray] public float[] farming_double_mastery_rate_base = Array.Empty(); - [M2dArray] public float[] blacksmithing_double_mastery_rate_base = Array.Empty(); - [M2dArray] public float[] engraving_double_mastery_rate_base = Array.Empty(); - [M2dArray] public float[] alchemist_double_mastery_rate_base = Array.Empty(); - [M2dArray] public float[] cooking_double_mastery_rate_base = Array.Empty(); - [M2dArray] public float[] improve_chaosraid_wap_rate_base = Array.Empty(); - [M2dArray] public float[] improve_chaosraid_asp_rate_base = Array.Empty(); - [M2dArray] public float[] improve_chaosraid_atp_rate_base = Array.Empty(); - [M2dArray] public float[] improve_chaosraid_hp_rate_base = Array.Empty(); - [M2dArray] public float[] improve_recovery_ball_rate_base = Array.Empty(); - [M2dArray] public float[] improve_fieldboss_kill_exp_rate_base = Array.Empty(); - [M2dArray] public float[] improve_fieldboss_kill_drop_rate_base = Array.Empty(); - [M2dArray] public float[] reduce_fieldboss_recive_damage_rate_base = Array.Empty(); - [M2dArray] public float[] additionaleffect_95000016_rate_base = Array.Empty(); - [M2dArray] public float[] improve_pettrap_reward_rate_base = Array.Empty(); - [M2dArray] public float[] mining_multiaction_rate_base = Array.Empty(); - [M2dArray] public float[] breeding_multiaction_rate_base = Array.Empty(); - [M2dArray] public float[] gathering_multiaction_rate_base = Array.Empty(); - [M2dArray] public float[] farming_multiaction_rate_base = Array.Empty(); - [M2dArray] public float[] reduce_damage_by_targetmaxhp_rate_base = Array.Empty(); - [M2dArray] public float[] reduce_meso_revival_fee_rate_base = Array.Empty(); - [M2dArray] public float[] improve_riding_run_speed_rate_base = Array.Empty(); - [M2dArray] public float[] improve_dungeon_reward_meso_rate_base = Array.Empty(); - [M2dArray] public float[] improve_shop_buying_meso_rate_base = Array.Empty(); - [M2dArray] public float[] improve_itembox_reward_meso_rate_base = Array.Empty(); - [M2dArray] public float[] reduce_remakeoption_fee_rate_base = Array.Empty(); - [M2dArray] public float[] reduce_airtaxi_fee_rate_base = Array.Empty(); - [M2dArray] public float[] improve_socket_unlock_probability_rate_base = Array.Empty(); - [M2dArray] public float[] reduce_gemstone_upgrade_fee_rate_base = Array.Empty(); - [M2dArray] public float[] reduce_pet_remakeoption_fee_rate_base = Array.Empty(); - [M2dArray] public float[] improve_riding_speed_rate_base = Array.Empty(); - // [M2dArray] public float[] improve_survival_kill_exp_rate_base = Array.Empty(); - // [M2dArray] public float[] improve_survival_time_exp_rate_base = Array.Empty(); - // [M2dArray] public float[] offensive_physicaldamage_rate_base = Array.Empty(); - // [M2dArray] public float[] offensive_magicaldamage_rate_base = Array.Empty(); - [M2dArray] public float[] reduce_gameitem_socket_unlock_fee_rate_base = Array.Empty(); + [M2dArray] public float[] seg_rate_base = []; + [M2dArray] public float[] smd_rate_base = []; + [M2dArray] public float[] sss_rate_base = []; + [M2dArray] public float[] dashdistance_rate_base = []; + // [M2dArray] public float[] spd_rate_base = []; + // [M2dArray] public float[] sid_rate_base = []; + [M2dArray] public float[] finaladditionaldamage_rate_base = []; + [M2dArray] public float[] cri_rate_base = []; + [M2dArray] public float[] sgi_rate_base = []; + [M2dArray] public float[] sgi_leader_rate_base = []; + [M2dArray] public float[] sgi_elite_rate_base = []; + [M2dArray] public float[] sgi_boss_rate_base = []; + [M2dArray] public float[] killhprestore_rate_base = []; + [M2dArray] public float[] killsprestore_rate_base = []; + [M2dArray] public float[] killeprestore_rate_base = []; + [M2dArray] public float[] heal_rate_base = []; + [M2dArray] public float[] receivedhealincrease_rate_base = []; + [M2dArray] public float[] icedamage_rate_base = []; + [M2dArray] public float[] firedamage_rate_base = []; + [M2dArray] public float[] darkdamage_rate_base = []; + [M2dArray] public float[] lightdamage_rate_base = []; + [M2dArray] public float[] poisondamage_rate_base = []; + [M2dArray] public float[] thunderdamage_rate_base = []; + [M2dArray] public float[] nddincrease_rate_base = []; + [M2dArray] public float[] lddincrease_rate_base = []; + [M2dArray] public float[] parpen_rate_base = []; + [M2dArray] public float[] marpen_rate_base = []; + [M2dArray] public float[] icedamagereduce_rate_base = []; + [M2dArray] public float[] firedamagereduce_rate_base = []; + [M2dArray] public float[] darkdamagereduce_rate_base = []; + [M2dArray] public float[] lightdamagereduce_rate_base = []; + [M2dArray] public float[] poisondamagereduce_rate_base = []; + [M2dArray] public float[] thunderdamagereduce_rate_base = []; + [M2dArray] public float[] stunreduce_rate_base = []; + [M2dArray] public float[] conditionreduce_rate_base = []; + [M2dArray] public float[] skillcooldown_rate_base = []; + [M2dArray] public float[] neardistancedamagereduce_rate_base = []; + [M2dArray] public float[] longdistancedamagereduce_rate_base = []; + [M2dArray] public float[] knockbackreduce_rate_base = []; + [M2dArray] public float[] stunprocndd_rate_base = []; + [M2dArray] public float[] stunprocldd_rate_base = []; + [M2dArray] public float[] knockbackprocndd_rate_base = []; + [M2dArray] public float[] knockbackprocldd_rate_base = []; + [M2dArray] public float[] snareprocndd_rate_base = []; + [M2dArray] public float[] snareprocldd_rate_base = []; + [M2dArray] public float[] aoeprocndd_rate_base = []; + [M2dArray] public float[] aoeprocldd_rate_base = []; + [M2dArray] public float[] npckilldropitemincrate_rate_base = []; + [M2dArray] public float[] seg_questreward_rate_base = []; + [M2dArray] public float[] smd_questreward_rate_base = []; + [M2dArray] public float[] seg_fishingreward_rate_base = []; + [M2dArray] public float[] seg_arcadereward_rate_base = []; + [M2dArray] public float[] seg_playinstrumentreward_rate_base = []; + [M2dArray] public float[] invoke_effect1_rate_base = []; + [M2dArray] public float[] invoke_effect2_rate_base = []; + [M2dArray] public float[] invoke_effect3_rate_base = []; + [M2dArray] public float[] pvpdamageincrease_rate_base = []; + [M2dArray] public float[] pvpdamagereduce_rate_base = []; + [M2dArray] public float[] improveguildexp_rate_base = []; + [M2dArray] public float[] improveguildcoin_rate_base = []; + [M2dArray] public float[] improvemassiveeventbexpball_rate_base = []; + [M2dArray] public float[] reduce_meso_trade_fee_rate_base = []; + [M2dArray] public float[] reduce_enchant_matrial_fee_rate_base = []; + [M2dArray] public float[] reduce_merat_revival_fee_rate_base = []; + [M2dArray] public float[] improve_mining_reward_item_rate_base = []; + [M2dArray] public float[] improve_breeding_reward_item_rate_base = []; + [M2dArray] public float[] improve_blacksmithing_reward_mastery_rate_base = []; + [M2dArray] public float[] improve_engraving_reward_mastery_rate_base = []; + [M2dArray] public float[] improve_gathering_reward_item_rate_base = []; + [M2dArray] public float[] improve_farming_reward_item_rate_base = []; + [M2dArray] public float[] improve_alchemist_reward_mastery_rate_base = []; + [M2dArray] public float[] improve_cooking_reward_mastery_rate_base = []; + [M2dArray] public float[] improve_acquire_gathering_exp_rate_base = []; + [M2dArray] public float[] skill_levelup_tier_1_rate_base = []; + [M2dArray] public float[] skill_levelup_tier_2_rate_base = []; + [M2dArray] public float[] skill_levelup_tier_3_rate_base = []; + [M2dArray] public float[] skill_levelup_tier_4_rate_base = []; + [M2dArray] public float[] skill_levelup_tier_5_rate_base = []; + [M2dArray] public float[] skill_levelup_tier_6_rate_base = []; + [M2dArray] public float[] skill_levelup_tier_7_rate_base = []; + [M2dArray] public float[] skill_levelup_tier_8_rate_base = []; + [M2dArray] public float[] skill_levelup_tier_9_rate_base = []; + [M2dArray] public float[] skill_levelup_tier_10_rate_base = []; + [M2dArray] public float[] skill_levelup_tier_11_rate_base = []; + [M2dArray] public float[] skill_levelup_tier_12_rate_base = []; + [M2dArray] public float[] skill_levelup_tier_13_rate_base = []; + [M2dArray] public float[] skill_levelup_tier_14_rate_base = []; + [M2dArray] public float[] improve_massive_ox_exp_rate_base = []; + [M2dArray] public float[] improve_massive_trapmaster_exp_rate_base = []; + [M2dArray] public float[] improve_massive_finalsurvival_exp_rate_base = []; + [M2dArray] public float[] improve_massive_crazyrunner_exp_rate_base = []; + [M2dArray] public float[] improve_massive_sh_crazyrunner_exp_rate_base = []; + [M2dArray] public float[] improve_massive_escape_exp_rate_base = []; + [M2dArray] public float[] improve_massive_springbeach_exp_rate_base = []; + [M2dArray] public float[] improve_massive_dancedance_exp_rate_base = []; + [M2dArray] public float[] improve_massive_ox_msp_rate_base = []; + [M2dArray] public float[] improve_massive_trapmaster_msp_rate_base = []; + [M2dArray] public float[] improve_massive_finalsurvival_msp_rate_base = []; + [M2dArray] public float[] improve_massive_crazyrunner_msp_rate_base = []; + [M2dArray] public float[] improve_massive_sh_crazyrunner_msp_rate_base = []; + [M2dArray] public float[] improve_massive_escape_msp_rate_base = []; + [M2dArray] public float[] improve_massive_springbeach_msp_rate_base = []; + [M2dArray] public float[] improve_massive_dancedance_msp_rate_base = []; + [M2dArray] public float[] npc_hit_reward_sp_ball_rate_base = []; + [M2dArray] public float[] npc_hit_reward_ep_ball_rate_base = []; + [M2dArray] public float[] improve_honor_token_rate_base = []; + [M2dArray] public float[] improve_pvp_exp_rate_base = []; + [M2dArray] public float[] improve_darkstream_damage_rate_base = []; + [M2dArray] public float[] reduce_darkstream_recive_damage_rate_base = []; + [M2dArray] public float[] improve_darkstream_evp_rate_base = []; + [M2dArray] public float[] fishing_double_mastery_rate_base = []; + [M2dArray] public float[] playinstrument_double_mastery_rate_base = []; + [M2dArray] public float[] complete_fieldmission_msp_rate_base = []; + [M2dArray] public float[] improve_glide_vertical_velocity_rate_base = []; + [M2dArray] public float[] additionaleffect_95000018_rate_base = []; + [M2dArray] public float[] additionaleffect_95000012_rate_base = []; + [M2dArray] public float[] additionaleffect_95000014_rate_base = []; + [M2dArray] public float[] additionaleffect_95000020_rate_base = []; + [M2dArray] public float[] additionaleffect_95000021_rate_base = []; + [M2dArray] public float[] additionaleffect_95000022_rate_base = []; + [M2dArray] public float[] additionaleffect_95000023_rate_base = []; + [M2dArray] public float[] additionaleffect_95000024_rate_base = []; + [M2dArray] public float[] additionaleffect_95000025_rate_base = []; + [M2dArray] public float[] additionaleffect_95000026_rate_base = []; + [M2dArray] public float[] additionaleffect_95000027_rate_base = []; + [M2dArray] public float[] additionaleffect_95000028_rate_base = []; + [M2dArray] public float[] additionaleffect_95000029_rate_base = []; + [M2dArray] public float[] reduce_recovery_ep_inv_rate_base = []; + [M2dArray] public float[] improve_stat_wap_u_rate_base = []; + [M2dArray] public float[] mining_double_reward_rate_base = []; + [M2dArray] public float[] breeding_double_reward_rate_base = []; + [M2dArray] public float[] gathering_double_reward_rate_base = []; + [M2dArray] public float[] farming_double_reward_rate_base = []; + [M2dArray] public float[] blacksmithing_double_reward_rate_base = []; + [M2dArray] public float[] engraving_double_reward_rate_base = []; + [M2dArray] public float[] alchemist_double_reward_rate_base = []; + [M2dArray] public float[] cooking_double_reward_rate_base = []; + [M2dArray] public float[] mining_double_mastery_rate_base = []; + [M2dArray] public float[] breeding_double_mastery_rate_base = []; + [M2dArray] public float[] gathering_double_mastery_rate_base = []; + [M2dArray] public float[] farming_double_mastery_rate_base = []; + [M2dArray] public float[] blacksmithing_double_mastery_rate_base = []; + [M2dArray] public float[] engraving_double_mastery_rate_base = []; + [M2dArray] public float[] alchemist_double_mastery_rate_base = []; + [M2dArray] public float[] cooking_double_mastery_rate_base = []; + [M2dArray] public float[] improve_chaosraid_wap_rate_base = []; + [M2dArray] public float[] improve_chaosraid_asp_rate_base = []; + [M2dArray] public float[] improve_chaosraid_atp_rate_base = []; + [M2dArray] public float[] improve_chaosraid_hp_rate_base = []; + [M2dArray] public float[] improve_recovery_ball_rate_base = []; + [M2dArray] public float[] improve_fieldboss_kill_exp_rate_base = []; + [M2dArray] public float[] improve_fieldboss_kill_drop_rate_base = []; + [M2dArray] public float[] reduce_fieldboss_recive_damage_rate_base = []; + [M2dArray] public float[] additionaleffect_95000016_rate_base = []; + [M2dArray] public float[] improve_pettrap_reward_rate_base = []; + [M2dArray] public float[] mining_multiaction_rate_base = []; + [M2dArray] public float[] breeding_multiaction_rate_base = []; + [M2dArray] public float[] gathering_multiaction_rate_base = []; + [M2dArray] public float[] farming_multiaction_rate_base = []; + [M2dArray] public float[] reduce_damage_by_targetmaxhp_rate_base = []; + [M2dArray] public float[] reduce_meso_revival_fee_rate_base = []; + [M2dArray] public float[] improve_riding_run_speed_rate_base = []; + [M2dArray] public float[] improve_dungeon_reward_meso_rate_base = []; + [M2dArray] public float[] improve_shop_buying_meso_rate_base = []; + [M2dArray] public float[] improve_itembox_reward_meso_rate_base = []; + [M2dArray] public float[] reduce_remakeoption_fee_rate_base = []; + [M2dArray] public float[] reduce_airtaxi_fee_rate_base = []; + [M2dArray] public float[] improve_socket_unlock_probability_rate_base = []; + [M2dArray] public float[] reduce_gemstone_upgrade_fee_rate_base = []; + [M2dArray] public float[] reduce_pet_remakeoption_fee_rate_base = []; + [M2dArray] public float[] improve_riding_speed_rate_base = []; + // [M2dArray] public float[] improve_survival_kill_exp_rate_base = []; + // [M2dArray] public float[] improve_survival_time_exp_rate_base = []; + // [M2dArray] public float[] offensive_physicaldamage_rate_base = []; + // [M2dArray] public float[] offensive_magicaldamage_rate_base = []; + [M2dArray] public float[] reduce_gameitem_socket_unlock_fee_rate_base = []; public float[] SpecialRate(byte i) => i switch { 0 => seg_rate_base, diff --git a/Maple2.File.Parser/Xml/ItemOptionConstant.cs b/Maple2.File.Parser/Xml/ItemOptionConstant.cs index 1a9bf31..48c5f8d 100644 --- a/Maple2.File.Parser/Xml/ItemOptionConstant.cs +++ b/Maple2.File.Parser/Xml/ItemOptionConstant.cs @@ -28,7 +28,7 @@ public partial class ItemOptionConstantData : ItemOption, IFeatureLocale { // ./data/xml/table/itemoptionconstant.xml [XmlRoot("ms2")] -public partial class ItemOptionConstantRootKR { +public partial class ItemOptionConstantRootNew { [XmlElement("option")] public List options = []; } @@ -42,10 +42,10 @@ public partial class ItemOptionConstantRank { [XmlAttribute] public int grade; [XmlAttribute] public int createType; - [XmlElement("v")] public List options = []; + [XmlElement("v")] public List options = []; } -public partial class ItemOptionConstantDataKR { +public partial class ItemOptionConstantDataNew { [XmlAttribute] public string name = string.Empty; //abp, asp, atp, bap, bap_pet, cad, cap, car, conditionreduce, dex, evp, finaladditionaldamage, firedamage, heal, hp, improve_darkstream_damage, improve_honor_token, improve_pvp_exp, int, lddincrease, longdistancedamagereduce, luk, map, mar, marpen, msp, ndd, nddincrease, neardistancedamagereduce, pap, par, parpen, pen, poisondamage, pvpdamageincrease, pvpdamagereduce, reduce_darkstream_recive_damage, sgi_boss, sgi_elite, skillcooldown, sss, str, stunreduce, thunderdamage, wapmax, wapmin, wapRate, [XmlAttribute] public int value; [XmlAttribute] public int luaIndex; //?? diff --git a/Maple2.File.Parser/Xml/ItemOptionRandom.cs b/Maple2.File.Parser/Xml/ItemOptionRandom.cs index 9c4d4e7..e6ab42f 100644 --- a/Maple2.File.Parser/Xml/ItemOptionRandom.cs +++ b/Maple2.File.Parser/Xml/ItemOptionRandom.cs @@ -2,11 +2,11 @@ using System.Xml.Serialization; [XmlRoot("ms2")] -public partial class ItemOptionRandomRootKR { - [XmlElement("option")] public List options = []; +public partial class ItemOptionRandomRootNew { + [XmlElement("option")] public List options = []; } -public partial class ItemOptionRandomKR { +public partial class ItemOptionRandomNew { [XmlAttribute] public int code; [XmlAttribute] public int copyID; [XmlAttribute] public bool isRarePickOne; @@ -14,10 +14,10 @@ public partial class ItemOptionRandomKR { [XmlAttribute] public int pickCount; [XmlAttribute] public string statGroup = string.Empty; - [XmlElement("rank")] public List ranks = []; + [XmlElement("v")] public List options = []; } -public partial class ItemOptionRandomDataKR { +public partial class ItemOptionRandomDataNew { [XmlAttribute] public string name = string.Empty; //additionaleffect_95000012, additionaleffect_95000014, asp, atp, breeding_double_mastery, cad, cap, car, complete_fieldmission_msp, conditionreduce, darkdamage, darkdamagereduce, dex, evp, farming_double_mastery, finaladditionaldamage, firedamage, firedamagereduce, fishing_double_mastery, gathering_double_mastery, heal, hp, icedamage, icedamagereduce, improve_glide_vertical_velocity, improve_massive_crazyrunner_exp, improve_massive_crazyrunner_msp, improve_massive_dancedance_exp, improve_massive_dancedance_msp, improve_massive_escape_exp, improve_massive_escape_msp, improve_massive_finalsurvival_exp, improve_massive_finalsurvival_msp, improve_massive_ox_exp, improve_massive_ox_msp, improve_massive_springbeach_exp, improve_massive_springbeach_msp, improve_massive_trapmaster_exp, improve_massive_trapmaster_msp, int, killhprestore, knockbackreduce, lddincrease, lightdamage, lightdamagereduce, longdistancedamagereduce, luk, map, mar, marpen, mining_double_mastery, msp, nddincrease, neardistancedamagereduce, npc_hit_reward_ep_ball, npc_hit_reward_sp_ball, npckilldropitemincrate, pap, par, parpen, pen, playinstrument_double_mastery, poisondamage, poisondamagereduce, receivedhealincrease, seg_fishingreward, seg_playinstrumentreward, sgi_boss, skillcooldown, smd, str, stunreduce, thunderdamage, thunderdamagereduce, [XmlAttribute] public int statID; } diff --git a/Maple2.File.Parser/Xml/Map/Map.cs b/Maple2.File.Parser/Xml/Map/Map.cs index 42ed1ce..fe81f09 100644 --- a/Maple2.File.Parser/Xml/Map/Map.cs +++ b/Maple2.File.Parser/Xml/Map/Map.cs @@ -10,31 +10,31 @@ public partial class MapDataRoot { } public partial class MapData : IFeatureLocale { - [XmlElement] public XBlock xblock; - [XmlElement] public Property property; - [XmlElement] public Drop drop; - [XmlElement] public Split split; - [XmlElement] public CashCall cashCall; - [XmlElement] public Indoor indoor; - [XmlElement] public UI ui; - [XmlElement] public BGM bgm; - [XmlElement] public HDR hdr; - [XmlElement] public Survival survival; - [XmlElement] public Camera camera; - [XmlElement] public Shadow shadow; - [XmlElement] public FOV fov; - [XmlElement] public Optimize optimize; - [XmlElement] public WorldMap worldmap; // Ignored by client. + [XmlElement] public XBlock xblock = new(); + [XmlElement] public Property property = new(); + [XmlElement] public Drop drop = new(); + [XmlElement] public Split split = new(); + [XmlElement] public CashCall cashCall = new(); + [XmlElement] public Indoor indoor = new(); + [XmlElement] public UI ui = new(); + [XmlElement] public BGM bgm = new(); + [XmlElement] public HDR hdr = new(); + [XmlElement] public Survival survival = new(); + [XmlElement] public Camera camera = new(); + [XmlElement] public Shadow shadow = new(); + [XmlElement] public FOV fov = new(); + [XmlElement] public Optimize optimize = new(); + [XmlElement] public WorldMap worldmap = new(); // Ignored by client. } // .data/xml/table/fielddata.xml [XmlRoot("ms2")] -public partial class MapDataRootKR { +public partial class MapDataRootNew { // list of fieldData with ID as mapId, then inside its environment as MapDataRoot - [XmlElement("fieldData")] public List fieldData = []; + [XmlElement("fieldData")] public List fieldData = []; } -public partial class MapDataRootKR { +public partial class MapDataRootNew { [XmlAttribute] public int id; - [M2dFeatureLocale] private MapData _environment; + [M2dFeatureLocale] private MapData _environment = new(); } diff --git a/Maple2.File.Parser/Xml/Npc/Collisions.cs b/Maple2.File.Parser/Xml/Npc/Collisions.cs index 5f79c02..37442c5 100644 --- a/Maple2.File.Parser/Xml/Npc/Collisions.cs +++ b/Maple2.File.Parser/Xml/Npc/Collisions.cs @@ -5,22 +5,22 @@ namespace Maple2.File.Parser.Xml.Npc; public partial class NodeCollisions { - [XmlElement] public List collision; + [XmlElement] public List collision = []; [XmlType(Namespace = "NodeCollisions")] public partial class Collision { [XmlAttribute] public string targetNode = string.Empty; - [M2dVector3] public Vector3 volume; - [M2dVector3] public Vector3 offset; + [M2dVector3] public Vector3 volume = default; + [M2dVector3] public Vector3 offset = default; } } public partial class NodeServerCollisions { - [XmlElement] public List collision; + [XmlElement] public List collision = []; [XmlType(Namespace = "NodeServerCollisions")] public partial class Collision { - [M2dVector3] public Vector3 volume; - [M2dVector3] public Vector3 offset; + [M2dVector3] public Vector3 volume = default; + [M2dVector3] public Vector3 offset = default; } } diff --git a/Maple2.File.Parser/Xml/Npc/Corpse.cs b/Maple2.File.Parser/Xml/Npc/Corpse.cs index be7a952..89b1656 100644 --- a/Maple2.File.Parser/Xml/Npc/Corpse.cs +++ b/Maple2.File.Parser/Xml/Npc/Corpse.cs @@ -11,6 +11,6 @@ public partial class Corpse { [XmlAttribute] public float added; [XmlAttribute] public float offsetNametag; [XmlAttribute] public int hitAble; - [M2dVector3] public Vector3 rotation; + [M2dVector3] public Vector3 rotation = default; [XmlAttribute] public string corpseEffect = string.Empty; } diff --git a/Maple2.File.Parser/Xml/Npc/Crystal.cs b/Maple2.File.Parser/Xml/Npc/Crystal.cs index e23dfb0..ff3e0ad 100644 --- a/Maple2.File.Parser/Xml/Npc/Crystal.cs +++ b/Maple2.File.Parser/Xml/Npc/Crystal.cs @@ -4,7 +4,7 @@ namespace Maple2.File.Parser.Xml.Npc; public class Crystals { - [XmlElement] public List crystal; + [XmlElement] public List crystal = []; } public partial class Crystal { diff --git a/Maple2.File.Parser/Xml/Npc/Dummy.cs b/Maple2.File.Parser/Xml/Npc/Dummy.cs index 22d3aae..4a3ab8b 100644 --- a/Maple2.File.Parser/Xml/Npc/Dummy.cs +++ b/Maple2.File.Parser/Xml/Npc/Dummy.cs @@ -5,14 +5,14 @@ namespace Maple2.File.Parser.Xml.Npc; public class EffectDummy { - [XmlElement] public List dummy; + [XmlElement] public List dummy = []; } public partial class Dummy { [XmlAttribute] public string name = string.Empty; - [XmlElement] public AttachInfo attachInfo; - [XmlElement] public Transform transform; + [XmlElement] public AttachInfo attachInfo = new(); + [XmlElement] public Transform transform = new(); public class AttachInfo { [XmlAttribute] public string parentNode = string.Empty; @@ -21,8 +21,8 @@ public class AttachInfo { } public partial class Transform { - [M2dVector3] public Vector3 translate; - [M2dVector3] public Vector3 rotation; + [M2dVector3] public Vector3 translate = default; + [M2dVector3] public Vector3 rotation = default; [XmlAttribute] public float scale; } } diff --git a/Maple2.File.Parser/Xml/Npc/Model.cs b/Maple2.File.Parser/Xml/Npc/Model.cs index a932fd8..077b652 100644 --- a/Maple2.File.Parser/Xml/Npc/Model.cs +++ b/Maple2.File.Parser/Xml/Npc/Model.cs @@ -10,5 +10,5 @@ public partial class Model { [XmlAttribute] public float anispeed = 1.0f; [XmlAttribute] public bool anispeedfix; [XmlAttribute] public int spawnAlphaAnimation = 1; - [M2dVector3] public Vector3 offset; + [M2dVector3] public Vector3 offset = default; } diff --git a/Maple2.File.Parser/Xml/Npc/Npc.cs b/Maple2.File.Parser/Xml/Npc/Npc.cs index a01cf7d..f8d84e9 100644 --- a/Maple2.File.Parser/Xml/Npc/Npc.cs +++ b/Maple2.File.Parser/Xml/Npc/Npc.cs @@ -11,44 +11,44 @@ public partial class NpcDataRoot { } public partial class NpcData : IFeatureLocale { - [XmlElement] public Model model; - [XmlElement] public Basic basic; - [XmlElement] public Stat stat; - [XmlElement] public Speed speed; - [XmlElement] public Distance distance; - [XmlElement] public Crystals crystals; - [XmlElement] public Skill skill; - [XmlElement] public AdditionalEffect additionalEffect; - [XmlElement] public Interact interact; - [XmlElement] public Combat combat; // Ignored by client. - [XmlElement] public Assist assist; - [XmlElement] public AiInfo aiInfo; - [XmlElement] public Collision collision; - [XmlElement] public NodeCollisions nodeCollisions; - [XmlElement] public NodeServerCollisions nodeServerCollisions; - [XmlElement] public Capsule capsule; - [XmlElement] public ValidBattleCylinder validBattleCylinder; - [XmlElement] public Dead dead; - [XmlElement] public Push push; - [XmlElement] public Exp exp; - [XmlElement] public Shadow shadow; - [XmlElement] public Normal normal; - [XmlElement] public DropItemInfo dropiteminfo; - [XmlElement] public LookAtTarget lookattarget; - [XmlElement] public Corpse corpse; - [XmlElement] public Ride ride; // Ignored by client. + [XmlElement] public Model model = new(); + [XmlElement] public Basic basic = new(); + [XmlElement] public Stat stat = new(); + [XmlElement] public Speed speed = new(); + [XmlElement] public Distance distance = new(); + [XmlElement] public Crystals crystals = new(); + [XmlElement] public Skill skill = new(); + [XmlElement] public AdditionalEffect additionalEffect = new(); + [XmlElement] public Interact interact = new(); + [XmlElement] public Combat combat = new(); // Ignored by client. + [XmlElement] public Assist assist = new(); + [XmlElement] public AiInfo aiInfo = new(); + [XmlElement] public Collision collision = new(); + [XmlElement] public NodeCollisions nodeCollisions = new(); + [XmlElement] public NodeServerCollisions nodeServerCollisions = new(); + [XmlElement] public Capsule capsule = new(); + [XmlElement] public ValidBattleCylinder validBattleCylinder = new(); + [XmlElement] public Dead dead = new(); + [XmlElement] public Push push = new(); + [XmlElement] public Exp exp = new(); + [XmlElement] public Shadow shadow = new(); + [XmlElement] public Normal normal = new(); + [XmlElement] public DropItemInfo dropiteminfo = new(); + [XmlElement] public LookAtTarget lookattarget = new(); + [XmlElement] public Corpse corpse = new(); + [XmlElement] public Ride ride = new(); // Ignored by client. } [XmlRoot("ms2")] public partial class NpcDataListNew { - [XmlElement("npc")] public List npcs; + [XmlElement("npc")] public List npcs = []; } public partial class NpcDataRootNew { [XmlAttribute] public int id; - [XmlElement] public NpcDataNew environment; + [XmlElement] public NpcDataNew environment = new(); } public partial class NpcDataNew : NpcData { - [XmlElement] public List effectdummy; + [XmlElement] public List effectdummy = []; } diff --git a/Maple2.File.Parser/Xml/Npc/Ride.cs b/Maple2.File.Parser/Xml/Npc/Ride.cs index f371c7d..918667c 100644 --- a/Maple2.File.Parser/Xml/Npc/Ride.cs +++ b/Maple2.File.Parser/Xml/Npc/Ride.cs @@ -8,8 +8,8 @@ public partial class Ride { [XmlAttribute] public float rideScale; [XmlAttribute] public string rideBone = string.Empty; [XmlAttribute] public string rideAnimation = string.Empty; - [M2dVector3] public Vector3 rideTranslation; - [M2dVector3] public Vector3 rideRotation; + [M2dVector3] public Vector3 rideTranslation = default; + [M2dVector3] public Vector3 rideRotation = default; [XmlAttribute] public float rideSpeed; [XmlAttribute] public string rideSkill = string.Empty; [XmlAttribute] public int rideSkill2; diff --git a/Maple2.File.Parser/Xml/Npc/Skill.cs b/Maple2.File.Parser/Xml/Npc/Skill.cs index 9a732ba..ced6d90 100644 --- a/Maple2.File.Parser/Xml/Npc/Skill.cs +++ b/Maple2.File.Parser/Xml/Npc/Skill.cs @@ -4,9 +4,9 @@ namespace Maple2.File.Parser.Xml.Npc; public partial class Skill { - [M2dArray] public int[] ids = Array.Empty(); - [M2dArray] public short[] levels = Array.Empty(); - [M2dArray] public int[] priorities = Array.Empty(); - [M2dArray] public int[] probs = Array.Empty(); + [M2dArray] public int[] ids = []; + [M2dArray] public short[] levels = []; + [M2dArray] public int[] priorities = []; + [M2dArray] public int[] probs = []; [XmlAttribute] public int coolDown; } diff --git a/Maple2.File.Parser/Xml/Quest/Condition.cs b/Maple2.File.Parser/Xml/Quest/Condition.cs index 28ffedb..80bd99a 100644 --- a/Maple2.File.Parser/Xml/Quest/Condition.cs +++ b/Maple2.File.Parser/Xml/Quest/Condition.cs @@ -3,5 +3,5 @@ namespace Maple2.File.Parser.Xml.Quest; public class Condition : Common.Condition { - [XmlElement] public List navi; + [XmlElement] public List navi = []; } diff --git a/Maple2.File.Parser/Xml/Quest/Quest.cs b/Maple2.File.Parser/Xml/Quest/Quest.cs index bf096d0..e1be2a5 100644 --- a/Maple2.File.Parser/Xml/Quest/Quest.cs +++ b/Maple2.File.Parser/Xml/Quest/Quest.cs @@ -15,27 +15,27 @@ public partial class QuestDataRoot : IFeatureLocale { } public partial class QuestData { - [XmlElement] public Basic basic; - [XmlElement] public Notify notify; - [XmlElement] public Require require; + [XmlElement] public Basic basic = new(); + [XmlElement] public Notify notify = new(); + [XmlElement] public Require require = new(); - [XmlElement] public List condition; + [XmlElement] public List condition = []; //[XmlElement] public Navigation navi; - [XmlElement] public Start start; - [XmlElement] public Complete complete; - [XmlElement] public Reward completeReward; - [XmlElement] public Reward acceptReward; - [XmlElement] public ProgressMap progressMap; - [XmlElement] public Guide guide; - [XmlElement] public EventMission eventMission; - [XmlElement] public MentoringMission mentoringMission; // feature="Mentoring" - [XmlElement] public Dispatch dispatch; - [XmlElement] public GotoNpc gotoNpc; - [XmlElement] public GotoDungeon gotoDungeon; - [XmlElement] public Remote remoteAccept; - [XmlElement] public Remote remoteComplete; - [XmlElement] public SummonPortal summonPortal; + [XmlElement] public Start start = new(); + [XmlElement] public Complete complete = new(); + [XmlElement] public Reward completeReward = new(); + [XmlElement] public Reward acceptReward = new(); + [XmlElement] public ProgressMap progressMap = new(); + [XmlElement] public Guide guide = new(); + [XmlElement] public EventMission eventMission = new(); + [XmlElement] public MentoringMission mentoringMission = new(); // feature="Mentoring" + [XmlElement] public Dispatch dispatch = new(); + [XmlElement] public GotoNpc gotoNpc = new(); + [XmlElement] public GotoDungeon gotoDungeon = new(); + [XmlElement] public Remote remoteAccept = new(); + [XmlElement] public Remote remoteComplete = new(); + [XmlElement] public SummonPortal summonPortal = new(); public class Start { [XmlAttribute] public int npc; @@ -56,7 +56,7 @@ public partial class Complete { [XmlRoot("ms2")] public partial class QuestDataRootNew { - [XmlElement("quest")] public List quests; + [XmlElement("quest")] public List quests = []; } public partial class QuestDataNew : QuestData, IFeatureLocale { diff --git a/Maple2.File.Parser/Xml/Quest/Require.cs b/Maple2.File.Parser/Xml/Quest/Require.cs index dc5177f..c2813a8 100644 --- a/Maple2.File.Parser/Xml/Quest/Require.cs +++ b/Maple2.File.Parser/Xml/Quest/Require.cs @@ -32,6 +32,6 @@ public partial class Require { [M2dArray] public int[] selectableQuest = Array.Empty(); [M2dArray] public int[] unrequireGroup = Array.Empty(); [XmlAttribute] public int guildLevel; - [M2dArray] public Enum.DayOfWeek[] dayOfWeek; // DayOfWeek? + [M2dArray] public Enum.DayOfWeek[] dayOfWeek = Array.Empty(); // DayOfWeek? [XmlAttribute] public int groupID; } diff --git a/Maple2.File.Parser/Xml/Quest/Reward.cs b/Maple2.File.Parser/Xml/Quest/Reward.cs index 0cf983b..8754b2e 100644 --- a/Maple2.File.Parser/Xml/Quest/Reward.cs +++ b/Maple2.File.Parser/Xml/Quest/Reward.cs @@ -25,10 +25,10 @@ public partial class Reward { [XmlAttribute] public int slotIndex; //[XmlElement] public List selectedItem; // Never set - [XmlElement] public List essentialItem; - [XmlElement] public List essentialJobItem; - [XmlElement] public List globalEssentialItem; // Feature 149 - [XmlElement] public List globalEssentialJobItem; // Feature 149 + [XmlElement] public List essentialItem = []; + [XmlElement] public List essentialJobItem = []; + [XmlElement] public List globalEssentialItem = []; // Feature 149 + [XmlElement] public List globalEssentialJobItem = []; // Feature 149 public class Item { [XmlAttribute] public int count; diff --git a/Maple2.File.Parser/Xml/Riding/Riding.cs b/Maple2.File.Parser/Xml/Riding/Riding.cs index 7ad01c5..901094c 100644 --- a/Maple2.File.Parser/Xml/Riding/Riding.cs +++ b/Maple2.File.Parser/Xml/Riding/Riding.cs @@ -11,12 +11,12 @@ public partial class RidingRoot { } public partial class Riding : IFeatureLocale { - [XmlElement] public Basic basic; - [XmlElement] public Collision collision; - [XmlElement] public Capsule capsule; - [XmlElement] public Shadow shadow; - [XmlElement] public StatValue stat; - [XmlElement] public FaceCamera faceCamera; + [XmlElement] public Basic basic = new(); + [XmlElement] public Collision collision = new(); + [XmlElement] public Capsule capsule = new(); + [XmlElement] public Shadow shadow = new(); + [XmlElement] public StatValue stat = new(); + [XmlElement] public FaceCamera faceCamera = new(); } // KMS2: ./data/xml/riding/%08d.xml @@ -26,6 +26,6 @@ public class RidingNewRoot { } public class RidingNew : Riding { - [XmlElement("passengers")] public List passengers; + [XmlElement("passengers")] public List passengers = []; } diff --git a/Maple2.File.Parser/Xml/Table/GachaInfo.cs b/Maple2.File.Parser/Xml/Table/GachaInfo.cs index 7a352b8..9c34403 100644 --- a/Maple2.File.Parser/Xml/Table/GachaInfo.cs +++ b/Maple2.File.Parser/Xml/Table/GachaInfo.cs @@ -1,14 +1,15 @@ using System.Xml.Serialization; +using M2dXmlGenerator; namespace Maple2.File.Parser.Xml.Table; // ./data/xml/table/gacha_info.xml [XmlRoot("ms2")] public partial class GachaInfoRoot { - [XmlElement] public List randomBox; + [M2dFeatureLocale(Selector = "randomBoxID")] private IList _randomBox; } -public partial class GachaInfo { +public partial class GachaInfo : IFeatureLocale { [XmlAttribute] public int randomBoxID; [XmlAttribute] public byte randomBoxGroup; [XmlAttribute] public byte randomBoxSeasonKR; diff --git a/Maple2.File.Parser/Xml/Table/ItemOptionVariation.cs b/Maple2.File.Parser/Xml/Table/ItemOptionVariation.cs index 3d8dbf8..918f680 100644 --- a/Maple2.File.Parser/Xml/Table/ItemOptionVariation.cs +++ b/Maple2.File.Parser/Xml/Table/ItemOptionVariation.cs @@ -68,3 +68,21 @@ public class Option { }; } } + +[XmlRoot("ms2")] +public class ItemOptionVariationNewRoot { + [XmlElement] public List