forked from GEEKiDoS/D4DJ-Tools
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Program.cs
147 lines (127 loc) · 4.01 KB
/
Program.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
using MessagePack;
using MessagePack.Resolvers;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using System;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
using System.Security.Cryptography;
using D4DJ_Tools.Masters;
namespace D4DJ_Tools
{
class Program
{
static T DeserializeMsgPack<T>(byte[] decrypted)
{
var options = MessagePackSerializerOptions.Standard.WithCompression(MessagePackCompression.Lz4Block);
return MessagePackSerializer.Deserialize<T>(decrypted, options);
}
static byte[] SerializeMsgPack(object obj)
{
var options = MessagePackSerializerOptions.Standard.WithCompression(MessagePackCompression.Lz4Block);
return MessagePackSerializer.Serialize(obj, options);
}
static void DecryptMaster(FileInfo inputFile, byte[] decrypted)
{
var typeName = inputFile.Name.Replace(".msgpack", "");
var targetType = MasterTypes.GetDeserializeType(typeName);
var options = MessagePackSerializerOptions.Standard.WithCompression(MessagePackCompression.Lz4Block);
if (targetType == null)
{
Console.WriteLine($"Not supported master {typeName}.");
File.WriteAllText(
inputFile.FullName.Replace(".msgpack", ".json"),
MessagePackSerializer.ConvertToJson(decrypted, options)
);
}
else
{
var result = MessagePackSerializer.Deserialize(targetType, decrypted, options);
File.WriteAllText(
inputFile.FullName.Replace(".msgpack", ".json"),
DumpToJson(result)
);
}
}
static string DumpToJson(object obj)
{
return JsonConvert.SerializeObject(obj, Formatting.Indented, new StringEnumConverter());
}
static void ProcessFileSystemEntry(FileSystemInfo fileSystemInfo)
{
if (fileSystemInfo is FileInfo fileInfo)
{
var fStream = fileInfo.OpenRead();
// transform the string into bytes
byte[] fileData = new byte[fStream.Length];
// reading the data
fStream.Read(fileData, 0, fileData.Length);
if (fileInfo.Name.EndsWith("Master.msgpack"))
{
DecryptMaster(fileInfo, fileData);
}
else if (fileInfo.Name.StartsWith("chart_"))
{
try
{
object result = null;
// Check if this is chart common data
if (fileInfo.Name.EndsWith("0"))
result = DeserializeMsgPack<ChartCommonData>(fileData);
else
result = DeserializeMsgPack<ChartData>(fileData);
var options = MessagePackSerializerOptions.Standard.WithCompression(MessagePackCompression.Lz4Block);
File.WriteAllText(
fileInfo.FullName + ".json",
DumpToJson(result)
);
}
catch (Exception ex)
{
Console.WriteLine($"Failed to dump chart: {ex.Message}");
}
}
else if (fileInfo.Name.EndsWith("ResourceList.msgpack"))
{
Console.WriteLine($"Dumping ResourceList...");
var result = DeserializeMsgPack<Dictionary<string, (int, int)>>(fileData);
File.WriteAllText(
fileInfo.FullName.Replace(".msgpack", ".json"),
DumpToJson(result)
);
}
else if (fileInfo.Name.EndsWith("ResourceList.json"))
{
try
{
var result = SerializeMsgPack(
JsonConvert.DeserializeObject<Dictionary<string, (int, int)>>(
File.ReadAllText(fileInfo.FullName)
)
);
File.WriteAllBytes(
fileInfo.FullName.Replace(".json", ".msgpack"),
result
);
Console.WriteLine($"Success!");
}
catch (Exception ex)
{
Console.WriteLine($"Failed to dump resource list: {ex.Message}");
}
}
}
}
static void Main(string[] args)
{
foreach (var arg in args)
{
if (File.Exists(arg))
{
ProcessFileSystemEntry(new FileInfo(arg));
}
}
}
}
}