Make it recursive, and fix names
This commit is contained in:
parent
7a0e1a553b
commit
57d90e499e
|
@ -31,7 +31,7 @@ namespace CXML
|
||||||
class CXMLParser
|
class CXMLParser
|
||||||
{
|
{
|
||||||
|
|
||||||
private static bool _checkMagicNumber()
|
private bool _checkMagicNumber()
|
||||||
{
|
{
|
||||||
|
|
||||||
String Magic = Tools.ReadStringAt(InfoFile, 0x00);
|
String Magic = Tools.ReadStringAt(InfoFile, 0x00);
|
||||||
|
@ -54,35 +54,48 @@ namespace CXML
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static string _lastFileName = "";
|
|
||||||
|
|
||||||
static String MainDir = "";
|
String MainDir = "";
|
||||||
static String FileDir = "";
|
String FileDir = "";
|
||||||
static String XMLFilename = "";
|
String XMLFilename = "";
|
||||||
|
|
||||||
static FileStream InfoFile;
|
|
||||||
|
|
||||||
static MemoryStream TreeTable;
|
|
||||||
static MemoryStream StringIDTable;
|
|
||||||
static MemoryStream IntIDTable;
|
|
||||||
static MemoryStream StringTable;
|
|
||||||
static MemoryStream CharTable;
|
|
||||||
static MemoryStream HashIDTable;
|
|
||||||
static MemoryStream IntArrayTable;
|
|
||||||
static MemoryStream FloatArrayTable;
|
|
||||||
static MemoryStream FileTable;
|
|
||||||
|
|
||||||
|
|
||||||
static BinaryReader bTreeTable;
|
FileStream InfoFile;
|
||||||
static BinaryReader bIntIDTable;
|
|
||||||
static BinaryReader bFloatArrayTable;
|
|
||||||
static BinaryReader bIntArrayTable;
|
|
||||||
static BinaryReader bHashIDTable;
|
|
||||||
static BinaryReader bStringIDTable;
|
|
||||||
|
|
||||||
static XmlWriter XMLFile;
|
MemoryStream TreeTable;
|
||||||
|
MemoryStream StringIDTable;
|
||||||
|
MemoryStream IntIDTable;
|
||||||
|
MemoryStream StringTable;
|
||||||
|
MemoryStream CharTable;
|
||||||
|
MemoryStream HashIDTable;
|
||||||
|
MemoryStream IntArrayTable;
|
||||||
|
MemoryStream FloatArrayTable;
|
||||||
|
MemoryStream FileTable;
|
||||||
|
|
||||||
public static void Init(string path, bool CheckMagic = true)
|
Boolean IsInitalized = false;
|
||||||
|
|
||||||
|
BinaryReader bTreeTable;
|
||||||
|
BinaryReader bIntIDTable;
|
||||||
|
BinaryReader bFloatArrayTable;
|
||||||
|
BinaryReader bIntArrayTable;
|
||||||
|
BinaryReader bHashIDTable;
|
||||||
|
BinaryReader bStringIDTable;
|
||||||
|
|
||||||
|
public class LoopbackHandler
|
||||||
|
{
|
||||||
|
public String FileName;
|
||||||
|
public String OldFileName;
|
||||||
|
public Int64 FilePointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
List<LoopbackHandler> FileList = new List<LoopbackHandler>();
|
||||||
|
|
||||||
|
XmlWriter XMLFile;
|
||||||
|
|
||||||
|
public bool ProcessFiles = false;
|
||||||
|
public bool WaitExit = false;
|
||||||
|
|
||||||
|
public void Init(string path, bool CheckMagic = true)
|
||||||
{
|
{
|
||||||
InfoFile = File.Open(path, FileMode.Open, FileAccess.Read);
|
InfoFile = File.Open(path, FileMode.Open, FileAccess.Read);
|
||||||
if(CheckMagic)
|
if(CheckMagic)
|
||||||
|
@ -94,7 +107,6 @@ namespace CXML
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
TreeTable = Tools.ByteToStream(GetTreeTable());
|
TreeTable = Tools.ByteToStream(GetTreeTable());
|
||||||
StringIDTable = Tools.ByteToStream(GetStringIDTable());
|
StringIDTable = Tools.ByteToStream(GetStringIDTable());
|
||||||
IntIDTable = Tools.ByteToStream(GetIntIDTable());
|
IntIDTable = Tools.ByteToStream(GetIntIDTable());
|
||||||
|
@ -116,16 +128,12 @@ namespace CXML
|
||||||
FileDir = Path.Combine(MainDir, "files");
|
FileDir = Path.Combine(MainDir, "files");
|
||||||
XMLFilename = Path.GetFileNameWithoutExtension(path) + ".xml";
|
XMLFilename = Path.GetFileNameWithoutExtension(path) + ".xml";
|
||||||
|
|
||||||
if (Directory.Exists(MainDir))
|
IsInitalized = true;
|
||||||
Directory.Delete(MainDir, true);
|
|
||||||
|
|
||||||
if (!Directory.Exists(FileDir))
|
|
||||||
Directory.CreateDirectory(FileDir);
|
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void Term()
|
public void Term()
|
||||||
{
|
{
|
||||||
InfoFile.Close();
|
InfoFile.Close();
|
||||||
TreeTable.Close();
|
TreeTable.Close();
|
||||||
|
@ -143,99 +151,102 @@ namespace CXML
|
||||||
bFloatArrayTable.Close();
|
bFloatArrayTable.Close();
|
||||||
bIntArrayTable.Close();
|
bIntArrayTable.Close();
|
||||||
bHashIDTable.Close();
|
bHashIDTable.Close();
|
||||||
|
|
||||||
|
FileList.Clear();
|
||||||
|
IsInitalized = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int GetTreeTableOffset()
|
public int GetTreeTableOffset()
|
||||||
{
|
{
|
||||||
return Tools.ReadIntAt(InfoFile,0x8);
|
return Tools.ReadIntAt(InfoFile,0x8);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int GetTreeTableSize()
|
public int GetTreeTableSize()
|
||||||
{
|
{
|
||||||
return Tools.ReadIntAt(InfoFile, 0xC);
|
return Tools.ReadIntAt(InfoFile, 0xC);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int GetIDStringTableOffset()
|
public int GetIDStringTableOffset()
|
||||||
{
|
{
|
||||||
return Tools.ReadIntAt(InfoFile, 0x10);
|
return Tools.ReadIntAt(InfoFile, 0x10);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int GetIDStringTableSize()
|
public int GetIDStringTableSize()
|
||||||
{
|
{
|
||||||
return Tools.ReadIntAt(InfoFile, 0x14);
|
return Tools.ReadIntAt(InfoFile, 0x14);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int GetIDIntTableOffset()
|
public int GetIDIntTableOffset()
|
||||||
{
|
{
|
||||||
return Tools.ReadIntAt(InfoFile, 0x18);
|
return Tools.ReadIntAt(InfoFile, 0x18);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int GetIDIntTableSize()
|
public int GetIDIntTableSize()
|
||||||
{
|
{
|
||||||
return Tools.ReadIntAt(InfoFile, 0x1C);
|
return Tools.ReadIntAt(InfoFile, 0x1C);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int GetStringTableOffset()
|
public int GetStringTableOffset()
|
||||||
{
|
{
|
||||||
return Tools.ReadIntAt(InfoFile, 0x20);
|
return Tools.ReadIntAt(InfoFile, 0x20);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int GetStringTableSize()
|
public int GetStringTableSize()
|
||||||
{
|
{
|
||||||
return Tools.ReadIntAt(InfoFile, 0x24);
|
return Tools.ReadIntAt(InfoFile, 0x24);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int GetCharTableOffset()
|
public int GetCharTableOffset()
|
||||||
{
|
{
|
||||||
return Tools.ReadIntAt(InfoFile, 0x28);
|
return Tools.ReadIntAt(InfoFile, 0x28);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int GetCharTableSize()
|
public int GetCharTableSize()
|
||||||
{
|
{
|
||||||
return Tools.ReadIntAt(InfoFile, 0x2C);
|
return Tools.ReadIntAt(InfoFile, 0x2C);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int GetHashIDTableOffset()
|
public int GetHashIDTableOffset()
|
||||||
{
|
{
|
||||||
return Tools.ReadIntAt(InfoFile, 0x30);
|
return Tools.ReadIntAt(InfoFile, 0x30);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int GetHashIDTableSize()
|
public int GetHashIDTableSize()
|
||||||
{
|
{
|
||||||
return Tools.ReadIntAt(InfoFile, 0x34);
|
return Tools.ReadIntAt(InfoFile, 0x34);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int GetIntArrayTableOffset()
|
public int GetIntArrayTableOffset()
|
||||||
{
|
{
|
||||||
return Tools.ReadIntAt(InfoFile, 0x38);
|
return Tools.ReadIntAt(InfoFile, 0x38);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int GetIntArrayTableSize()
|
public int GetIntArrayTableSize()
|
||||||
{
|
{
|
||||||
return Tools.ReadIntAt(InfoFile, 0x3C);
|
return Tools.ReadIntAt(InfoFile, 0x3C);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int GetFloatArrayTableOffset()
|
public int GetFloatArrayTableOffset()
|
||||||
{
|
{
|
||||||
return Tools.ReadIntAt(InfoFile, 0x40);
|
return Tools.ReadIntAt(InfoFile, 0x40);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int GetFloatArrayTableSize()
|
public int GetFloatArrayTableSize()
|
||||||
{
|
{
|
||||||
return Tools.ReadIntAt(InfoFile, 0x44);
|
return Tools.ReadIntAt(InfoFile, 0x44);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int GetFileTableOffset()
|
public int GetFileTableOffset()
|
||||||
{
|
{
|
||||||
return Tools.ReadIntAt(InfoFile, 0x48);
|
return Tools.ReadIntAt(InfoFile, 0x48);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int GetFileTableSize()
|
public int GetFileTableSize()
|
||||||
{
|
{
|
||||||
return Tools.ReadIntAt(InfoFile, 0x4C);
|
return Tools.ReadIntAt(InfoFile, 0x4C);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static byte[] GetTreeTable()
|
public byte[] GetTreeTable()
|
||||||
{
|
{
|
||||||
int TableOffset = GetTreeTableOffset();
|
int TableOffset = GetTreeTableOffset();
|
||||||
int TableSize = GetTreeTableSize();
|
int TableSize = GetTreeTableSize();
|
||||||
|
@ -245,7 +256,7 @@ namespace CXML
|
||||||
return Table;
|
return Table;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static byte[] GetStringIDTable()
|
public byte[] GetStringIDTable()
|
||||||
{
|
{
|
||||||
int IDStrTableOffset = GetIDStringTableOffset();
|
int IDStrTableOffset = GetIDStringTableOffset();
|
||||||
int IDStrTableSize = GetIDStringTableSize();
|
int IDStrTableSize = GetIDStringTableSize();
|
||||||
|
@ -255,7 +266,7 @@ namespace CXML
|
||||||
return IDStringTable;
|
return IDStringTable;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static byte[] GetIntIDTable()
|
public byte[] GetIntIDTable()
|
||||||
{
|
{
|
||||||
int IDIntTableOffset = GetIDIntTableOffset();
|
int IDIntTableOffset = GetIDIntTableOffset();
|
||||||
int IDIntTableSize = GetIDIntTableSize();
|
int IDIntTableSize = GetIDIntTableSize();
|
||||||
|
@ -265,7 +276,7 @@ namespace CXML
|
||||||
return IDIntTable;
|
return IDIntTable;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static byte[] GetStringTable()
|
public byte[] GetStringTable()
|
||||||
{
|
{
|
||||||
int StringTableOffset = GetStringTableOffset();
|
int StringTableOffset = GetStringTableOffset();
|
||||||
int StringTableSize = GetStringTableSize();
|
int StringTableSize = GetStringTableSize();
|
||||||
|
@ -275,7 +286,7 @@ namespace CXML
|
||||||
return StringTable;
|
return StringTable;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static byte[] GetCharTable()
|
public byte[] GetCharTable()
|
||||||
{
|
{
|
||||||
int CharTableOffset = GetCharTableOffset();
|
int CharTableOffset = GetCharTableOffset();
|
||||||
int CharTableSize = GetCharTableSize();
|
int CharTableSize = GetCharTableSize();
|
||||||
|
@ -285,7 +296,7 @@ namespace CXML
|
||||||
return CharTable;
|
return CharTable;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static byte[] GetHashIDTable()
|
public byte[] GetHashIDTable()
|
||||||
{
|
{
|
||||||
int HashIDTableOffset = GetHashIDTableOffset();
|
int HashIDTableOffset = GetHashIDTableOffset();
|
||||||
int HashIDTableSize = GetHashIDTableSize();
|
int HashIDTableSize = GetHashIDTableSize();
|
||||||
|
@ -295,7 +306,7 @@ namespace CXML
|
||||||
return HashIDTable;
|
return HashIDTable;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static byte[] GetIntArrayTable()
|
public byte[] GetIntArrayTable()
|
||||||
{
|
{
|
||||||
int IntArrayTableOffset = GetIntArrayTableOffset();
|
int IntArrayTableOffset = GetIntArrayTableOffset();
|
||||||
int IntArrayTableSize = GetIntArrayTableSize();
|
int IntArrayTableSize = GetIntArrayTableSize();
|
||||||
|
@ -305,7 +316,7 @@ namespace CXML
|
||||||
return IntArrayTable;
|
return IntArrayTable;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static byte[] GetFloatArrayTable()
|
public byte[] GetFloatArrayTable()
|
||||||
{
|
{
|
||||||
int FloatArrayTableOffset = GetFloatArrayTableOffset();
|
int FloatArrayTableOffset = GetFloatArrayTableOffset();
|
||||||
int FloatArrayTableSize = GetFloatArrayTableSize();
|
int FloatArrayTableSize = GetFloatArrayTableSize();
|
||||||
|
@ -315,7 +326,7 @@ namespace CXML
|
||||||
return FloatArrayTable;
|
return FloatArrayTable;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static byte[] GetFileTable()
|
public byte[] GetFileTable()
|
||||||
{
|
{
|
||||||
int DataOffset = GetFileTableOffset();
|
int DataOffset = GetFileTableOffset();
|
||||||
int DataLength = GetFileTableSize();
|
int DataLength = GetFileTableSize();
|
||||||
|
@ -325,56 +336,96 @@ namespace CXML
|
||||||
return FileTable;
|
return FileTable;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void DecompileCXML(String CXMLFile, bool force = false)
|
public void DecompileCXML(String CXMLFile, bool force = false)
|
||||||
{
|
{
|
||||||
|
|
||||||
Directory.CreateDirectory(MainDir);
|
if (!IsInitalized)
|
||||||
|
Init(CXMLFile,force);
|
||||||
|
|
||||||
Term();
|
|
||||||
Init(CXMLFile,force);
|
if (Directory.Exists(MainDir))
|
||||||
|
Directory.Delete(MainDir, true);
|
||||||
|
|
||||||
|
if (!Directory.Exists(FileDir))
|
||||||
|
Directory.CreateDirectory(FileDir);
|
||||||
|
|
||||||
XmlWriterSettings XMLSettings = new XmlWriterSettings();
|
XmlWriterSettings XMLSettings = new XmlWriterSettings();
|
||||||
XMLSettings.Indent = true;
|
XMLSettings.Indent = true;
|
||||||
|
string XMLPath = Path.Combine(MainDir, XMLFilename);
|
||||||
XMLFile = XmlWriter.Create(Path.Combine(MainDir, XMLFilename), XMLSettings);
|
XMLFile = XmlWriter.Create(XMLPath, XMLSettings);
|
||||||
XMLFile.WriteStartDocument();
|
XMLFile.WriteStartDocument();
|
||||||
|
|
||||||
ReadElements();
|
ReadElements();
|
||||||
|
|
||||||
XMLFile.WriteEndDocument();
|
XMLFile.WriteEndDocument();
|
||||||
XMLFile.Flush();
|
XMLFile.Flush();
|
||||||
|
XMLFile.Close();
|
||||||
|
|
||||||
|
// Make corrections
|
||||||
|
string XmlData = File.ReadAllText(XMLPath, Encoding.UTF8);
|
||||||
|
foreach(LoopbackHandler lpHandler in FileList)
|
||||||
|
{
|
||||||
|
if(lpHandler.OldFileName != null)
|
||||||
|
{
|
||||||
|
Console.WriteLine("Replacing: " + lpHandler.OldFileName + " With " + lpHandler.FileName);
|
||||||
|
XmlData = XmlData.Replace(lpHandler.OldFileName, lpHandler.FileName);
|
||||||
|
}
|
||||||
|
if(ProcessFiles)
|
||||||
|
ProcessFile(Path.Combine(MainDir, lpHandler.FileName));
|
||||||
|
}
|
||||||
|
File.WriteAllText(XMLPath, XmlData);
|
||||||
|
|
||||||
Term();
|
Term();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void ProcessFile(String FileName)
|
public void ProcessFile(String FileName)
|
||||||
{
|
{
|
||||||
String Extension = Path.GetExtension(FileName);
|
String Extension = Path.GetExtension(FileName);
|
||||||
|
|
||||||
|
if (Extension == ".rcs") // Recursive Decompile, remove this if statement to remove RCS processing
|
||||||
|
{
|
||||||
|
Console.WriteLine("Decompiling " + Path.GetFileName(FileName));
|
||||||
|
string DirectoryName = Path.Combine(FileDir, "converted", "RCStoXML", Path.GetFileNameWithoutExtension(FileName));
|
||||||
|
if (!Directory.Exists(DirectoryName))
|
||||||
|
Directory.CreateDirectory(DirectoryName);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
CXMLParser cxmlParser = new CXMLParser();
|
||||||
|
cxmlParser.Init(FileName);
|
||||||
|
cxmlParser.ProcessFiles = this.ProcessFiles;
|
||||||
|
cxmlParser.MainDir = DirectoryName;
|
||||||
|
cxmlParser.FileDir = Path.Combine(cxmlParser.MainDir,"files");
|
||||||
|
cxmlParser.DecompileCXML(FileName);
|
||||||
|
}
|
||||||
|
catch (Exception) { };
|
||||||
|
}
|
||||||
if (Extension == ".vag") //Remove this IF statment if you dont want VAG Conversion.
|
if (Extension == ".vag") //Remove this IF statment if you dont want VAG Conversion.
|
||||||
{
|
{
|
||||||
Console.WriteLine("Decoding: " + Path.GetFileName(FileName));
|
Console.WriteLine("Decoding: " + Path.GetFileName(FileName));
|
||||||
byte[] WaveData = VAG.VAGAudio.Vag2Wav(FileName);
|
byte[] WaveData = VAG.VAGAudio.Vag2Wav(FileName);
|
||||||
String WaveName = Path.GetFileNameWithoutExtension(FileName) + "-" + VAG.VAGAudio.GetFilename(FileName) + ".wav";
|
String WaveName = Path.GetFileNameWithoutExtension(FileName) + "-" + VAG.VAGAudio.GetFilename(FileName) + ".wav";
|
||||||
|
String DirectoryName = Path.Combine(FileDir , "converted", "VAGtoWAV");
|
||||||
if (!Directory.Exists(FileDir+"/converted/VAGtoWAV"))
|
|
||||||
Directory.CreateDirectory(FileDir + "/converted/VAGtoWAV");
|
|
||||||
|
|
||||||
File.WriteAllBytes(FileDir + "/converted/VAGtoWAV/" + WaveName, WaveData);
|
if (!Directory.Exists(DirectoryName))
|
||||||
|
Directory.CreateDirectory(DirectoryName);
|
||||||
|
|
||||||
|
File.WriteAllBytes(Path.Combine(DirectoryName, WaveName), WaveData);
|
||||||
Console.WriteLine("Decoded file written to: " + WaveName);
|
Console.WriteLine("Decoded file written to: " + WaveName);
|
||||||
}
|
}
|
||||||
if (Extension == ".gim") //Remove this IF statement if you dont want GIM Conversion.
|
if (Extension == ".gim") //Remove this IF statement if you dont want GIM Conversion.
|
||||||
{
|
{
|
||||||
if (File.Exists("GimConv/GimConv.exe"))
|
if (File.Exists(Path.Combine("GimConv", "GimConv.exe")))
|
||||||
{
|
{
|
||||||
if (!Directory.Exists(FileDir + "/converted/GIMtoPNG"))
|
String DirectoryName = Path.Combine(FileDir, "converted", "GIMtoPNG");
|
||||||
Directory.CreateDirectory(FileDir + "/converted/GIMtoPNG");
|
if (!Directory.Exists(DirectoryName))
|
||||||
|
Directory.CreateDirectory(DirectoryName);
|
||||||
|
|
||||||
Console.WriteLine("Decoding GIM.");
|
Console.WriteLine("Decoding GIM.");
|
||||||
|
|
||||||
Process Proc = new Process();
|
Process Proc = new Process();
|
||||||
Proc.StartInfo.FileName = "GimConv/GimConv.exe";
|
Proc.StartInfo.FileName = Path.Combine("GimConv", "GimConv.exe");
|
||||||
Proc.StartInfo.Arguments = Path.GetFileName(FileName) + " -o " + "../converted/GIMtoPNG/" + Path.GetFileName(Path.ChangeExtension(FileName, "png"));
|
Proc.StartInfo.Arguments = Path.GetFileName(FileName) + " -o " + Path.Combine(Environment.CurrentDirectory, DirectoryName, Path.GetFileName(Path.ChangeExtension(FileName, "png")));
|
||||||
Proc.StartInfo.RedirectStandardOutput = true;
|
Proc.StartInfo.RedirectStandardOutput = true;
|
||||||
Proc.StartInfo.RedirectStandardError = true;
|
Proc.StartInfo.RedirectStandardError = true;
|
||||||
Proc.StartInfo.UseShellExecute = false;
|
Proc.StartInfo.UseShellExecute = false;
|
||||||
|
@ -387,17 +438,18 @@ namespace CXML
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
if (Extension == ".zlib")
|
if (Extension == ".z")
|
||||||
{
|
{
|
||||||
Console.WriteLine("Decompressing " + FileName);
|
Console.WriteLine("Decompressing " + FileName);
|
||||||
Byte[] FileData = File.ReadAllBytes(FileName);
|
Byte[] FileData = File.ReadAllBytes(FileName);
|
||||||
Byte[] DecompressedData = ZlibStream.UncompressBuffer(FileData);
|
Byte[] DecompressedData = ZlibStream.UncompressBuffer(FileData);
|
||||||
Extension = Tools.GetFileExtension(DecompressedData);
|
Extension = Tools.GetFileExtension(DecompressedData);
|
||||||
|
String DirectoryName = Path.Combine(FileDir, "decompressed");
|
||||||
|
|
||||||
if (!Directory.Exists(FileDir + "/decompressed"))
|
if (!Directory.Exists(DirectoryName))
|
||||||
Directory.CreateDirectory(FileDir + "/decompressed");
|
Directory.CreateDirectory(DirectoryName);
|
||||||
|
|
||||||
String DecompressedFilename = FileDir + "/decompressed /" + Path.GetFileNameWithoutExtension(FileName) + Extension;
|
String DecompressedFilename = Path.Combine(DirectoryName, Path.ChangeExtension(Path.GetFileNameWithoutExtension(FileName), Extension));
|
||||||
Console.WriteLine("Decompressed file written to: " + DecompressedFilename);
|
Console.WriteLine("Decompressed file written to: " + DecompressedFilename);
|
||||||
File.WriteAllBytes(DecompressedFilename, DecompressedData);
|
File.WriteAllBytes(DecompressedFilename, DecompressedData);
|
||||||
|
|
||||||
|
@ -405,8 +457,28 @@ namespace CXML
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void ChangeFilename(Int64 ElementPtr, String NewName)
|
||||||
|
{
|
||||||
|
Console.WriteLine("Correcting for Loopback: 0x" + ElementPtr.ToString("X8") + " (" + NewName + ")");
|
||||||
|
for(int i = 0; i < FileList.Count; i++)
|
||||||
|
{
|
||||||
|
if(FileList[i].FilePointer == ElementPtr)
|
||||||
|
{
|
||||||
|
string oldName = FileList[i].FileName;
|
||||||
|
string extension = Path.GetExtension(oldName);
|
||||||
|
string folderPath = Path.GetDirectoryName(FileList[i].FileName);
|
||||||
|
string newPath = Path.ChangeExtension(Path.Combine(folderPath, NewName), extension);
|
||||||
|
Console.WriteLine("Changed " + Path.Combine(MainDir, oldName) + " => " + Path.Combine(MainDir, newPath));
|
||||||
|
File.Move(Path.Combine(MainDir, oldName), Path.Combine(MainDir, newPath));
|
||||||
|
FileList[i].FileName = newPath;
|
||||||
|
FileList[i].OldFileName = oldName;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Console.WriteLine("Nothing to correct!");
|
||||||
|
}
|
||||||
|
|
||||||
public static void ReadAttribute(String ElementName = "")
|
public void ReadAttribute(String ElementName = "", Int64 ElementPtr = 0)
|
||||||
{
|
{
|
||||||
int AttributePtr = bTreeTable.ReadInt32();
|
int AttributePtr = bTreeTable.ReadInt32();
|
||||||
AttributeType Type = (AttributeType)bTreeTable.ReadInt32();
|
AttributeType Type = (AttributeType)bTreeTable.ReadInt32();
|
||||||
|
@ -448,7 +520,7 @@ namespace CXML
|
||||||
CharTable.Seek(CharOffset, 0x00);
|
CharTable.Seek(CharOffset, 0x00);
|
||||||
CharTable.Read(CharBytes, 0x00, CharLen);
|
CharTable.Read(CharBytes, 0x00, CharLen);
|
||||||
|
|
||||||
AttributeValue = Encoding.Unicode.GetString(CharBytes);
|
AttributeValue = Encoding.UTF8.GetString(Encoding.UTF8.GetBytes(Encoding.Unicode.GetString(CharBytes)));
|
||||||
break;
|
break;
|
||||||
case AttributeType.TYPE_HASH_ID:
|
case AttributeType.TYPE_HASH_ID:
|
||||||
int HashTableOffset = bTreeTable.ReadInt32();
|
int HashTableOffset = bTreeTable.ReadInt32();
|
||||||
|
@ -499,7 +571,8 @@ namespace CXML
|
||||||
|
|
||||||
String Extension = Tools.GetFileExtension(FileData);
|
String Extension = Tools.GetFileExtension(FileData);
|
||||||
String FileName = Path.Combine(FileDir, ElementName, FileHash + Extension);
|
String FileName = Path.Combine(FileDir, ElementName, FileHash + Extension);
|
||||||
if(!File.Exists(FileName))
|
String finalName = Path.Combine(Path.GetFileName(FileDir), ElementName, FileHash + Extension);
|
||||||
|
if (!File.Exists(FileName))
|
||||||
{
|
{
|
||||||
Console.WriteLine("Writing: " + FileName);
|
Console.WriteLine("Writing: " + FileName);
|
||||||
|
|
||||||
|
@ -507,14 +580,18 @@ namespace CXML
|
||||||
Directory.CreateDirectory(Path.GetDirectoryName(FileName));
|
Directory.CreateDirectory(Path.GetDirectoryName(FileName));
|
||||||
|
|
||||||
File.WriteAllBytes(FileName, FileData);
|
File.WriteAllBytes(FileName, FileData);
|
||||||
ProcessFile(FileName);
|
LoopbackHandler lpHandler = new LoopbackHandler();
|
||||||
|
lpHandler.FileName = finalName;
|
||||||
|
lpHandler.OldFileName = null;
|
||||||
|
lpHandler.FilePointer = ElementPtr;
|
||||||
|
FileList.Add(lpHandler);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Console.WriteLine("File allready extracted \n(theres a VERY low chance that it acturally is a different file that has the same hash.)");
|
Console.WriteLine("File allready extracted \n(theres a VERY low chance that it acturally is a different file that has the same hash.)");
|
||||||
}
|
}
|
||||||
|
|
||||||
AttributeValue = Path.Combine("files", ElementName, FileHash + Extension);
|
AttributeValue = finalName;
|
||||||
break;
|
break;
|
||||||
case AttributeType.TYPE_ID_STRING_LOOPBACK:
|
case AttributeType.TYPE_ID_STRING_LOOPBACK:
|
||||||
int StringIdTableOffset = bTreeTable.ReadInt32();
|
int StringIdTableOffset = bTreeTable.ReadInt32();
|
||||||
|
@ -524,9 +601,10 @@ namespace CXML
|
||||||
int StringPtr = Tools.ReadIntAt(TreeTable, LoopbackPtr);
|
int StringPtr = Tools.ReadIntAt(TreeTable, LoopbackPtr);
|
||||||
string LoopbackAttribute = Tools.ReadStringAt(StringTable, StringPtr);
|
string LoopbackAttribute = Tools.ReadStringAt(StringTable, StringPtr);
|
||||||
|
|
||||||
Console.WriteLine("Loopback: " + LoopbackAttribute);
|
Console.WriteLine("Loopback: " + LoopbackAttribute +" "+ LoopbackPtr.ToString("X")+" ("+ElementPtr.ToString("X")+")");
|
||||||
|
|
||||||
AttributeValue = Tools.ReadString(StringIDTable);
|
AttributeValue = Tools.ReadString(StringIDTable);
|
||||||
|
ChangeFilename(LoopbackPtr, AttributeValue.ToString());
|
||||||
|
|
||||||
TreeTable.Seek(4, SeekOrigin.Current);
|
TreeTable.Seek(4, SeekOrigin.Current);
|
||||||
break;
|
break;
|
||||||
|
@ -543,11 +621,11 @@ namespace CXML
|
||||||
|
|
||||||
int IDValue = bIntIDTable.ReadInt32();
|
int IDValue = bIntIDTable.ReadInt32();
|
||||||
|
|
||||||
|
|
||||||
LoopbackAttribute = Tools.ReadStringAt(StringTable, StringPtr);
|
LoopbackAttribute = Tools.ReadStringAt(StringTable, StringPtr);
|
||||||
Console.WriteLine("Loopback: " + LoopbackAttribute);
|
Console.WriteLine("Loopback: " + LoopbackAttribute + " " + LoopbackPtr.ToString("X") + " (" + ElementPtr.ToString("X") + ")");
|
||||||
|
|
||||||
AttributeValue = IDValue.ToString("X8");
|
AttributeValue = IDValue.ToString("X8");
|
||||||
|
ChangeFilename(LoopbackPtr, AttributeValue.ToString());
|
||||||
|
|
||||||
TreeTable.Seek(4, SeekOrigin.Current);
|
TreeTable.Seek(4, SeekOrigin.Current);
|
||||||
break;
|
break;
|
||||||
|
@ -570,9 +648,9 @@ namespace CXML
|
||||||
XMLFile.Flush();
|
XMLFile.Flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void ReadElements()
|
public void ReadElements()
|
||||||
{
|
{
|
||||||
|
Int64 ElementLocation = TreeTable.Position;
|
||||||
int ElementPtr = bTreeTable.ReadInt32();
|
int ElementPtr = bTreeTable.ReadInt32();
|
||||||
int NumAttributes = bTreeTable.ReadInt32();
|
int NumAttributes = bTreeTable.ReadInt32();
|
||||||
|
|
||||||
|
@ -600,7 +678,7 @@ namespace CXML
|
||||||
{
|
{
|
||||||
for (int i = 0; i < NumAttributes; i++)
|
for (int i = 0; i < NumAttributes; i++)
|
||||||
{
|
{
|
||||||
ReadAttribute(ElementName);
|
ReadAttribute(ElementName, ElementLocation);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -32,6 +32,8 @@ namespace CXMLCli
|
||||||
Console.WriteLine("\t-iat --dump-int-array Dump int array table.");
|
Console.WriteLine("\t-iat --dump-int-array Dump int array table.");
|
||||||
Console.WriteLine("\t-fat --dump-float-array Dump float array table.");
|
Console.WriteLine("\t-fat --dump-float-array Dump float array table.");
|
||||||
Console.WriteLine("\t-ft --dump-file Dump file table.");
|
Console.WriteLine("\t-ft --dump-file Dump file table.");
|
||||||
|
Console.WriteLine("\t-p --process-files Process Extracted Files");
|
||||||
|
Console.WriteLine("\t-w --wait-exit Wait for keypress before exiting");
|
||||||
Console.WriteLine("\t-d --decompile Decompile CXML.");
|
Console.WriteLine("\t-d --decompile Decompile CXML.");
|
||||||
Console.WriteLine("Example: " + Path.GetFileName(Assembly.GetEntryAssembly().Location) + " app.info -f -s -t -f -d");
|
Console.WriteLine("Example: " + Path.GetFileName(Assembly.GetEntryAssembly().Location) + " app.info -f -s -t -f -d");
|
||||||
Console.WriteLine("Default functonality is to Decompile,\ntThis is canceled if any other arguments passed.");
|
Console.WriteLine("Default functonality is to Decompile,\ntThis is canceled if any other arguments passed.");
|
||||||
|
@ -50,9 +52,13 @@ namespace CXMLCli
|
||||||
File.WriteAllBytes(FileName, WaveData);
|
File.WriteAllBytes(FileName, WaveData);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
CXML.CXMLParser cxmlParser = new CXML.CXMLParser();
|
||||||
|
cxmlParser.Init(path, Check);
|
||||||
|
|
||||||
CXML.CXMLParser.Init(path, Check);
|
if (args.Length == 1)
|
||||||
|
{
|
||||||
|
ArgsFull += "-d -p -w";
|
||||||
|
}
|
||||||
|
|
||||||
if (ArgsFull.Contains("-f") || ArgsFull.Contains("--force"))
|
if (ArgsFull.Contains("-f") || ArgsFull.Contains("--force"))
|
||||||
{
|
{
|
||||||
|
@ -67,68 +73,79 @@ namespace CXMLCli
|
||||||
if (ArgsFull.Contains("-tt") || ArgsFull.Contains("--dump-tree"))
|
if (ArgsFull.Contains("-tt") || ArgsFull.Contains("--dump-tree"))
|
||||||
{
|
{
|
||||||
Console.WriteLine("Dumping tree table.");
|
Console.WriteLine("Dumping tree table.");
|
||||||
File.WriteAllBytes("tree-table.bin", CXML.CXMLParser.GetTreeTable());
|
File.WriteAllBytes("tree-table.bin", cxmlParser.GetTreeTable());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ArgsFull.Contains("-ist") || ArgsFull.Contains("--dump-string-id"))
|
if (ArgsFull.Contains("-ist") || ArgsFull.Contains("--dump-string-id"))
|
||||||
{
|
{
|
||||||
Console.WriteLine("Dumping string ID table.");
|
Console.WriteLine("Dumping string ID table.");
|
||||||
File.WriteAllBytes("string-id-table.bin", CXML.CXMLParser.GetStringIDTable());
|
File.WriteAllBytes("string-id-table.bin", cxmlParser.GetStringIDTable());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ArgsFull.Contains("-iit") || ArgsFull.Contains("--dump-int-id"))
|
if (ArgsFull.Contains("-iit") || ArgsFull.Contains("--dump-int-id"))
|
||||||
{
|
{
|
||||||
Console.WriteLine("Dumping int ID table.");
|
Console.WriteLine("Dumping int ID table.");
|
||||||
File.WriteAllBytes("int-id-table.bin", CXML.CXMLParser.GetIntIDTable());
|
File.WriteAllBytes("int-id-table.bin", cxmlParser.GetIntIDTable());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ArgsFull.Contains("-st") || ArgsFull.Contains("--dump-string"))
|
if (ArgsFull.Contains("-st") || ArgsFull.Contains("--dump-string"))
|
||||||
{
|
{
|
||||||
Console.WriteLine("Dumping string table.");
|
Console.WriteLine("Dumping string table.");
|
||||||
File.WriteAllBytes("string-table.bin",CXML.CXMLParser.GetStringTable());
|
File.WriteAllBytes("string-table.bin",cxmlParser.GetStringTable());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ArgsFull.Contains("-ct") || ArgsFull.Contains("--dump-char"))
|
if (ArgsFull.Contains("-ct") || ArgsFull.Contains("--dump-char"))
|
||||||
{
|
{
|
||||||
Console.WriteLine("Dumping char table.");
|
Console.WriteLine("Dumping char table.");
|
||||||
File.WriteAllBytes("char-table.bin", CXML.CXMLParser.GetCharTable());
|
File.WriteAllBytes("char-table.bin", cxmlParser.GetCharTable());
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((ArgsFull.Contains("-sit") || ArgsFull.Contains("--dump-style-id")) /*kept for backwards comp*/ || (ArgsFull.Contains("-hit") || ArgsFull.Contains("--dump-hash-id")))
|
if ((ArgsFull.Contains("-sit") || ArgsFull.Contains("--dump-style-id")) /*kept for backwards comp*/ || (ArgsFull.Contains("-hit") || ArgsFull.Contains("--dump-hash-id")))
|
||||||
{
|
{
|
||||||
Console.WriteLine("Dumping hash ID table.");
|
Console.WriteLine("Dumping hash ID table.");
|
||||||
File.WriteAllBytes("hash-id-table.bin", CXML.CXMLParser.GetHashIDTable());
|
File.WriteAllBytes("hash-id-table.bin", cxmlParser.GetHashIDTable());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (ArgsFull.Contains("-iat") || ArgsFull.Contains("--dump-int-array"))
|
if (ArgsFull.Contains("-iat") || ArgsFull.Contains("--dump-int-array"))
|
||||||
{
|
{
|
||||||
Console.WriteLine("Dumping int array table.");
|
Console.WriteLine("Dumping int array table.");
|
||||||
File.WriteAllBytes("int-array-table.bin", CXML.CXMLParser.GetIntArrayTable());
|
File.WriteAllBytes("int-array-table.bin", cxmlParser.GetIntArrayTable());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ArgsFull.Contains("-fat") || ArgsFull.Contains("--dump-float-array"))
|
if (ArgsFull.Contains("-fat") || ArgsFull.Contains("--dump-float-array"))
|
||||||
{
|
{
|
||||||
Console.WriteLine("Dumping float array table.");
|
Console.WriteLine("Dumping float array table.");
|
||||||
File.WriteAllBytes("float-array-table.bin", CXML.CXMLParser.GetFloatArrayTable());
|
File.WriteAllBytes("float-array-table.bin", cxmlParser.GetFloatArrayTable());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (ArgsFull.Contains("-ft") || ArgsFull.Contains("--dump-tree"))
|
if (ArgsFull.Contains("-ft") || ArgsFull.Contains("--dump-tree"))
|
||||||
{
|
{
|
||||||
Console.WriteLine("Dumping file table.");
|
Console.WriteLine("Dumping file table.");
|
||||||
File.WriteAllBytes("file-table.bin", CXML.CXMLParser.GetTreeTable());
|
File.WriteAllBytes("file-table.bin", cxmlParser.GetTreeTable());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ArgsFull.Contains("-d") || ArgsFull.Contains("--decompile") || args.Length == 1)
|
if (ArgsFull.Contains("-p") || ArgsFull.Contains("--process-files"))
|
||||||
|
{
|
||||||
|
cxmlParser.ProcessFiles = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ArgsFull.Contains("-w") || ArgsFull.Contains("--wait-exit"))
|
||||||
|
{
|
||||||
|
cxmlParser.WaitExit = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ArgsFull.Contains("-d") || ArgsFull.Contains("--decompile"))
|
||||||
{
|
{
|
||||||
Console.WriteLine("Decompiling.");
|
Console.WriteLine("Decompiling.");
|
||||||
CXML.CXMLParser.DecompileCXML(path, Check);
|
cxmlParser.DecompileCXML(path, Check);
|
||||||
Console.WriteLine("\n\nDECOMPILATION COMPLETE!");
|
Console.WriteLine("\n\nDECOMPILATION COMPLETE!");
|
||||||
Console.ReadKey();
|
if(cxmlParser.WaitExit)
|
||||||
|
Console.ReadKey();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,7 +42,7 @@ namespace General
|
||||||
}
|
}
|
||||||
else if (IsZlib(Bytes))
|
else if (IsZlib(Bytes))
|
||||||
{
|
{
|
||||||
return ".zlib";
|
return ".z";
|
||||||
}
|
}
|
||||||
else if (IsRcf(Bytes))
|
else if (IsRcf(Bytes))
|
||||||
{
|
{
|
||||||
|
@ -208,8 +208,7 @@ namespace General
|
||||||
{
|
{
|
||||||
SHA1 sha = SHA1.Create();
|
SHA1 sha = SHA1.Create();
|
||||||
byte[] ShaBytes = sha.ComputeHash(Data);
|
byte[] ShaBytes = sha.ComputeHash(Data);
|
||||||
int Hash = BitConverter.ToInt32(ShaBytes, 0);
|
return BitConverter.ToString(ShaBytes).Replace("-", "").ToUpper();
|
||||||
return Hash.ToString("X8");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String ReadString(Stream ms, int limit = -1)
|
public static String ReadString(Stream ms, int limit = -1)
|
||||||
|
|
Loading…
Reference in New Issue