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

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Maple2.File.Parser/Maple2.File.Parser.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
<PackageTags>MapleStory2, File, Parser, m2d, xml</PackageTags>
<!-- Use following lines to write the generated files to disk. -->
<EmitCompilerGeneratedFiles Condition=" '$(Configuration)' == 'Debug' ">true</EmitCompilerGeneratedFiles>
<PackageVersion>2.4.15</PackageVersion>
<PackageVersion>2.4.16</PackageVersion>
<TargetFramework>net8.0</TargetFramework>
<PackageReadmeFile>README.md</PackageReadmeFile>
<ImplicitUsings>enable</ImplicitUsings>
Expand Down
28 changes: 28 additions & 0 deletions Maple2.File.Parser/ServerTableParser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
using ItemMergeOptionRoot = Maple2.File.Parser.Xml.Table.Server.ItemMergeOptionRoot;
using ItemOptionVariation = Maple2.File.Parser.Xml.Table.Server.ItemOptionVariation;
using MergeOption = Maple2.File.Parser.Xml.Table.Server.MergeOption;
using MaidRecipe = Maple2.File.Parser.Xml.Table.Server.MaidRecipe;
using MaidRecipeRoot = Maple2.File.Parser.Xml.Table.Server.MaidRecipeRoot;

namespace Maple2.File.Parser;

Expand Down Expand Up @@ -61,6 +63,8 @@ public class ServerTableParser {
private readonly XmlSerializer constantsSerializer;
private readonly XmlSerializer npcStatFactorByPlayerCountSerializer;
private readonly XmlSerializer npcStatFactorByLevelSerializer;
private readonly XmlSerializer maidGradeInfoSerializer;
private readonly XmlSerializer maidRecipeSerializer;

public ServerTableParser(M2dReader xmlReader) {
this.xmlReader = xmlReader;
Expand Down Expand Up @@ -105,6 +109,8 @@ public ServerTableParser(M2dReader xmlReader) {
constantsSerializer = new XmlSerializer(typeof(Constants));
npcStatFactorByPlayerCountSerializer = new XmlSerializer(typeof(NpcStatFactorByPlayerCountRoot));
npcStatFactorByLevelSerializer = new XmlSerializer(typeof(NpcStatFactorByLevelRoot));
maidGradeInfoSerializer = new XmlSerializer(typeof(MaidGradeInfoRoot));
maidRecipeSerializer = new XmlSerializer(typeof(MaidRecipeRoot));

// var seen = new HashSet<string>();
// this.bankTypeSerializer.UnknownAttribute += (sender, args) => {
Expand Down Expand Up @@ -728,4 +734,26 @@ public IEnumerable<NpcStatFactorByLevel> ParseNpcStatFactorByLevel() {
yield return entry;
}
}

public IEnumerable<(int Grade, MaidGradeInfo GradeInfo)> ParseMaidGradeInfo() {
string xml = Sanitizer.RemoveEmpty(xmlReader.GetString(xmlReader.GetEntry("table/Server/MaidGradeInfo.xml")));
var reader = XmlReader.Create(new StringReader(xml));
var data = maidGradeInfoSerializer.Deserialize(reader) as MaidGradeInfoRoot;
Debug.Assert(data != null);

foreach (MaidGradeInfo entry in data.Grade) {
yield return (entry.Grade, entry);
}
}

public IEnumerable<(int Id, MaidRecipe Recipe)> ParseMaidRecipe() {
string xml = Sanitizer.RemoveEmpty(xmlReader.GetString(xmlReader.GetEntry("table/Server/MaidRecipeSvr.xml")));
var reader = XmlReader.Create(new StringReader(xml));
var data = maidRecipeSerializer.Deserialize(reader) as MaidRecipeRoot;
Debug.Assert(data != null);

foreach (MaidRecipe entry in data.recipe) {
yield return (entry.Id, entry);
}
}
}
65 changes: 65 additions & 0 deletions Maple2.File.Parser/TableParser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,11 @@ public class TableParser {
private readonly XmlSerializer fameLogSerializer;
private readonly XmlSerializer famePickMethodSerializer;
private readonly XmlSerializer characterAbilitySerializer;
private readonly XmlSerializer maidExpSerializer;
private readonly XmlSerializer maidPropertySerializer;
private readonly XmlSerializer maidRecipeSerializer;
private readonly XmlSerializer maidRecipeGroupSerializer;
private readonly XmlSerializer maidSalarySerializer;

private readonly string locale;
private readonly string language;
Expand Down Expand Up @@ -228,6 +233,11 @@ public TableParser(M2dReader xmlReader, string language) {
fameLogSerializer = new XmlSerializer(typeof(FameLogRoot));
famePickMethodSerializer = new XmlSerializer(typeof(FamePickMethod));
characterAbilitySerializer = new XmlSerializer(typeof(CharacterAbilityRoot));
maidExpSerializer = new XmlSerializer(typeof(MaidExpRoot));
maidPropertySerializer = new XmlSerializer(typeof(MaidPropertyRoot));
maidRecipeSerializer = new XmlSerializer(typeof(MaidRecipeRoot));
maidRecipeGroupSerializer = new XmlSerializer(typeof(MaidRecipeGroupRoot));
maidSalarySerializer = new XmlSerializer(typeof(MaidSalaryRoot));

locale = FeatureLocaleFilter.Locale.ToLower();
this.language = language;
Expand Down Expand Up @@ -1746,4 +1756,59 @@ public IEnumerable<JobTableNew> ParseJobTableNew() {
yield return (entry.id, entry);
}
}

public IEnumerable<(int Level, MaidExp Exp)> ParseMaidExp() {
string xml = Sanitizer.RemoveEmpty(xmlReader.GetString(xmlReader.GetEntry($"table/maidexp.xml")));
var reader = XmlReader.Create(new StringReader(xml));
var data = maidExpSerializer.Deserialize(reader) as MaidExpRoot;
Debug.Assert(data != null);

foreach (MaidExp entry in data.Exp) {
yield return (entry.Level, entry);
}
}

public IEnumerable<(int MaidId, MaidProperty Property)> ParseMaidProperty() {
string xml = Sanitizer.RemoveEmpty(xmlReader.GetString(xmlReader.GetEntry($"table/maidproperty.xml")));
var reader = XmlReader.Create(new StringReader(xml));
var data = maidPropertySerializer.Deserialize(reader) as MaidPropertyRoot;
Debug.Assert(data != null);

foreach (MaidProperty entry in data.Property) {
yield return (entry.MaidID, entry);
}
}

public IEnumerable<(int Id, MaidRecipe Recipe)> ParseMaidRecipe() {
string xml = Sanitizer.RemoveEmpty(xmlReader.GetString(xmlReader.GetEntry($"table/maidrecipe.xml")));
var reader = XmlReader.Create(new StringReader(xml));
var data = maidRecipeSerializer.Deserialize(reader) as MaidRecipeRoot;
Debug.Assert(data != null);

foreach (MaidRecipe entry in data.recipe) {
yield return (entry.Id, entry);
}
}

public IEnumerable<(int GroupId, MaidRecipeGroup Group)> ParseMaidRecipeGroup() {
string xml = Sanitizer.RemoveEmpty(xmlReader.GetString(xmlReader.GetEntry($"table/maidrecipegroup.xml")));
var reader = XmlReader.Create(new StringReader(xml));
var data = maidRecipeGroupSerializer.Deserialize(reader) as MaidRecipeGroupRoot;
Debug.Assert(data != null);

foreach (MaidRecipeGroup entry in data.group) {
yield return (entry.GroupID, entry);
}
}

public IEnumerable<(int Id, MaidSalary Salary)> ParseMaidSalary() {
string xml = Sanitizer.RemoveEmpty(xmlReader.GetString(xmlReader.GetEntry($"table/{locale}/maidsalary.xml")));
var reader = XmlReader.Create(new StringReader(xml));
var data = maidSalarySerializer.Deserialize(reader) as MaidSalaryRoot;
Debug.Assert(data != null);

foreach (MaidSalary entry in data.key) {
yield return (entry.id, entry);
}
}
}
14 changes: 14 additions & 0 deletions Maple2.File.Parser/Xml/Table/MaidExp.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
using System.Xml.Serialization;

namespace Maple2.File.Parser.Xml.Table;

// ./data/xml/table/maidexp.xml
[XmlRoot("ms2")]
public class MaidExpRoot {
[XmlElement] public List<MaidExp> Exp;
}

public class MaidExp {
[XmlAttribute] public int Level;
[XmlAttribute] public int Exp;
}
15 changes: 15 additions & 0 deletions Maple2.File.Parser/Xml/Table/MaidProperty.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
using System.Xml.Serialization;

namespace Maple2.File.Parser.Xml.Table;

// ./data/xml/table/maidproperty.xml
[XmlRoot("ms2")]
public class MaidPropertyRoot {
[XmlElement] public List<MaidProperty> Property;
}

public class MaidProperty {
[XmlAttribute] public int MaidID;
[XmlAttribute] public int RecipeGroupID;
[XmlAttribute] public int NPCID;
}
30 changes: 30 additions & 0 deletions Maple2.File.Parser/Xml/Table/MaidRecipe.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
using System.Xml.Serialization;
using M2dXmlGenerator;

namespace Maple2.File.Parser.Xml.Table;

// ./data/xml/table/maidrecipe.xml
[XmlRoot("ms2")]
public partial class MaidRecipeRoot {
[M2dFeatureLocale(Selector = "Id")] private IList<MaidRecipe> _recipe;
}

public partial class MaidRecipe : IFeatureLocale {
[XmlAttribute] public int Id;
[XmlAttribute] public string FirstIngredientItemID = string.Empty;
[XmlAttribute] public int FirstIngredientCount;
[XmlAttribute] public string SecondIngredientItemID = string.Empty;
[XmlAttribute] public int SecondIngredientCount;
[XmlAttribute] public string ThirdIngredientItemID = string.Empty;
[XmlAttribute] public int ThirdIngredientCount;
[XmlAttribute] public int WorkbenchType;
[XmlAttribute] public int LeadTimeNormal;
[XmlAttribute] public int LeadTimeGood;
[XmlAttribute] public int LeadTimeVeryGood;
[XmlAttribute] public int MaidExp;
[XmlAttribute] public int MaidMood;
[XmlAttribute] public int ProductItemID;
[XmlAttribute] public int ProductsocketDataID;
[XmlAttribute] public int ProductCount;
[XmlAttribute] public int ProductRank;
}
16 changes: 16 additions & 0 deletions Maple2.File.Parser/Xml/Table/MaidRecipeGroup.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
using System.Xml.Serialization;
using M2dXmlGenerator;

namespace Maple2.File.Parser.Xml.Table;

// ./data/xml/table/maidrecipegroup.xml
[XmlRoot("ms2")]
public class MaidRecipeGroupRoot {
[XmlElement] public List<MaidRecipeGroup> group;
Comment thread
Zintixx marked this conversation as resolved.
}

public partial class MaidRecipeGroup {
[XmlAttribute] public int GroupID;
[M2dArray] public int[] RecipeIDs;
[M2dArray] public int[] RequireLevels;
}
15 changes: 15 additions & 0 deletions Maple2.File.Parser/Xml/Table/MaidSalary.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
using System.Xml.Serialization;

namespace Maple2.File.Parser.Xml.Table;

// ./data/xml/table/na/maidsalary.xml
[XmlRoot("ms2")]
public class MaidSalaryRoot {
[XmlElement] public List<MaidSalary> key;
Comment thread
Zintixx marked this conversation as resolved.
}

public partial class MaidSalary {
[XmlAttribute] public int id;
Comment thread
Zintixx marked this conversation as resolved.
[XmlAttribute] public int SalaryType;
[XmlAttribute] public int SalaryAmount;
}
17 changes: 17 additions & 0 deletions Maple2.File.Parser/Xml/Table/Server/MaidGradeInfo.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
using System.Xml.Serialization;

namespace Maple2.File.Parser.Xml.Table.Server;

// ./data/server/table/Server/MaidGradeInfo.xml
[XmlRoot("ms2")]
public class MaidGradeInfoRoot {
[XmlElement] public List<MaidGradeInfo> Grade;
}

public class MaidGradeInfo {
[XmlAttribute] public int Grade;
[XmlAttribute] public float JackpotRate;
[XmlAttribute] public float FeelNormalRate;
[XmlAttribute] public float FeelGoodRate;
[XmlAttribute] public float FeelVeryGoodRate;
}
36 changes: 36 additions & 0 deletions Maple2.File.Parser/Xml/Table/Server/MaidRecipeSvr.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
using System.Xml.Serialization;
using M2dXmlGenerator;

namespace Maple2.File.Parser.Xml.Table.Server;

// ./data/server/table/Server/MaidRecipeSvr.xml
[XmlRoot("ms2")]
public partial class MaidRecipeRoot {
[M2dFeatureLocale(Selector = "Id")] private IList<MaidRecipe> _recipe;
}

public partial class MaidRecipe : IFeatureLocale {
[XmlAttribute] public int Id;
[XmlAttribute] public string FirstIngredientItemID = string.Empty;
[XmlAttribute] public int FirstIngredientCount;
[XmlAttribute] public string SecondIngredientItemID = string.Empty;
[XmlAttribute] public int SecondIngredientCount;
[XmlAttribute] public string ThirdIngredientItemID = string.Empty;
[XmlAttribute] public int ThirdIngredientCount;
[XmlAttribute] public int WorkbenchType;
[XmlAttribute] public int LeadTimeNormal;
[XmlAttribute] public int LeadTimeGood;
[XmlAttribute] public int LeadTimeVeryGood;
[XmlAttribute] public int MaidExp;
[XmlAttribute] public int ProductItemID;
[XmlAttribute] public int ProductsocketDataID;
[XmlAttribute] public int ProductCount;
[XmlAttribute] public int ProductRank;
[XmlAttribute] public int JackpotItemID;
[XmlAttribute] public int JackpotsocketDataID;
[XmlAttribute] public int JackpotCount;
[XmlAttribute] public int JackpotRank;
[XmlAttribute] public float JackpotRate;
[XmlAttribute] public int JackpotMood;
[XmlAttribute] public int ImmediatelyCompleteFee;
}
18 changes: 18 additions & 0 deletions Maple2.File.Tests/ServerTableParserTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -464,5 +464,23 @@ public void TestNpcStatFactorByLevel() {
continue;
}
}

[TestMethod]
public void TestMaidGradeInfo() {
var parser = new ServerTableParser(TestUtils.ServerReader);

foreach ((_, _) in parser.ParseMaidGradeInfo()) {
continue;
}
}

[TestMethod]
public void TestMaidRecipe() {
var parser = new ServerTableParser(TestUtils.ServerReader);

foreach ((_, _) in parser.ParseMaidRecipe()) {
continue;
}
}
}

19 changes: 19 additions & 0 deletions Maple2.File.Tests/TableParserTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -843,4 +843,23 @@ public void TestCharacterAbility() {
continue;
}
}

[TestMethod]
public void TestMaid() {
foreach ((_, _) in _parser.ParseMaidExp()) {
continue;
}
foreach ((_, _) in _parser.ParseMaidProperty()) {
continue;
}
foreach ((_, _) in _parser.ParseMaidRecipe()) {
continue;
}
foreach ((_, _) in _parser.ParseMaidRecipeGroup()) {
continue;
}
foreach ((_, _) in _parser.ParseMaidSalary()) {
continue;
}
}
}
Loading