Files
korenkonder_PD_Tool/PD_Tool/classes/A3D.cs
T
korenkonder ec5f8c803e Release v0.4.10.11
A3DA, DIVAFILE, MotHead
2022-03-10 21:29:09 +03:00

189 lines
7.7 KiB
C#

using System;
using KKdBaseLib;
using KKdMainLib.IO;
using KKdA3DA = KKdMainLib.A3DA;
using KKdFARC = KKdMainLib.FARC;
namespace PD_Tool
{
class A3D
{
public static void Processor(bool json)
{
Console.Title = "A3DA Converter";
Program.Choose(1, "a3da", out string[] fileNames);
if (fileNames.Length < 1) return;
bool mp = false;
foreach (string file in fileNames)
if (file.EndsWith(".mp") || file.EndsWith(".json") || file.EndsWith(".farc")) { mp = true; break; }
Format format = Format.NULL;
string choose = "";
Console.Clear();
Program.ConsoleDesign(true);
Program.ConsoleDesign(" Choose type of format to export:");
Program.ConsoleDesign(false);
Program.ConsoleDesign(" Tip: A3DC Opt - A3DC Optimization");
Program.ConsoleDesign(" WARNING! CHECK RESULTS AFTER CONVERTING ");
Program.ConsoleDesign(false);
Program.ConsoleDesign("1. A3DA [DT/AC/F]");
Program.ConsoleDesign("2. A3DC [DT/AC/F]");
Program.ConsoleDesign("3. A3DA [AFT/FT/M39]");
Program.ConsoleDesign("4. A3DC [AFT/FT/M39]");
Program.ConsoleDesign("5. A3DC [F2]");
Program.ConsoleDesign("6. A3DC [MGF]");
Program.ConsoleDesign("7. A3DC [X]");
Program.ConsoleDesign("8. A3DC [XHD/VRFL]");
if (!mp) Program.ConsoleDesign($"9. {(json ? "JSON" : "MsgPack")}");
Program.ConsoleDesign(false);
Program.ConsoleDesign("X[Y] - X: option; Y: rounding in text (def. 9)");
Program.ConsoleDesign(false);
Program.ConsoleDesign(true);
Console.WriteLine();
choose = Console.ReadLine().ToUpper();
if (choose == null || choose.Length < 1)
return;
else if (choose[0] == '1') format = Format.DT ;
else if (choose[0] == '2') format = Format.F ;
else if (choose[0] == '3') format = Format.AFT;
else if (choose[0] == '4') format = Format.AFT;
else if (choose[0] == '5') format = Format.F2 ;
else if (choose[0] == '6') format = Format.MGF;
else if (choose[0] == '7') format = Format.X ;
else if (choose[0] == '8') format = Format.XHD;
else if (choose[0] == '9') format = Format.NULL;
else return;
if (int.TryParse(choose.Substring(1), out int rounding))
KKdA3DA.Rounding = rounding;
else
KKdA3DA.Rounding = 9;
int state;
string filepath, ext;
KKdA3DA a3da;
KKdFARC farc;
foreach (string file in fileNames)
{
filepath = Path.RemoveExtension(file);
ext = Path.GetExtension(file).ToLower();
Console.Title = "A3DA Converter: " + Path.GetFileNameWithoutExtension(file);
if (ext == ".farc")
using (farc = new KKdFARC(file))
FARCProcessor(farc, choose, format);
else if (ext == ".a3da")
using (a3da = new KKdA3DA())
{
state = a3da.A3DAReader(filepath);
if (state == 1)
if (choose == "9") a3da.MsgPackWriter(filepath, json);
else
{
a3da.Head.Format = format;
File.WriteAllBytes(filepath + ".a3da", (choose == "1" ||
choose == "4") ? a3da.A3DAWriter() : a3da.A3DCWriter());
}
}
else if (ext == ".mp" || ext == ".json")
using (a3da = new KKdA3DA())
{
a3da.MsgPackReader(filepath, ext == ".json");
a3da.Head.Format = format;
File.WriteAllBytes(filepath + ".a3da", (choose == "1" ||
choose == "4") ? a3da.A3DAWriter() : a3da.A3DCWriter());
}
}
}
private static void FARCProcessor(KKdFARC farc, string choose, Format format)
{
if (!farc.HeaderReader() || !farc.HasFiles) return;
KKdList<string> list = KKdList<string>.New;
for (int i = 0; i < farc.Files.Count; i++)
{
string file = farc.Files[i].Name.ToLower();
if (!file.Contains("_div_") && file.EndsWith(".a3da")) list.Add(file);
}
KKdList<string> A3DAlist = KKdList<string>.New;
for (int i = 0; i < farc.Files.Count; i++)
if (farc.Files[i].Name.ToLower().EndsWith(".a3da"))
A3DAlist.Add(farc.Files[i].Name);
byte[] data = null;
if (list.Count == A3DAlist.Count)
{
KKdA3DA a3da;
for (int i = 0; i < A3DAlist.Count; i++)
using (a3da = new KKdA3DA())
{
data = farc.FileReader(A3DAlist[i]);
int state = a3da.A3DAReader(data);
if (state == 1)
{
KKdFARC.FARCFile file = farc.Files[i];
a3da.Head.Format = format;
file.Data = (choose == "1"|| choose == "4")
? a3da.A3DAWriter() : a3da.A3DCWriter();
farc.Files[i] = file;
}
}
farc.Save();
return;
}
KKdA3DA[] a3daArray;
using (KKdList<KKdA3DA> a3daList = KKdList<KKdA3DA>.NewReserve(list.Count))
{
for (int i = 0; i < list.Count; i++)
{
KKdA3DA a3da;
using (a3da = new KKdA3DA())
{
data = farc.FileReader(list[i]);
int state = a3da.A3DAReader(data);
if (state == 1) a3daList.Add(a3da);
}
}
a3daArray = a3daList.ToArray();
}
for (int i = 0; i < list.Count; i++)
{
if (a3daArray[i].Data.PlayControl.Div == null) continue;
int div = a3daArray[i].Data.PlayControl.Div.Value;
string filename = Path.RemoveExtension(list[i]);
string ext = Path.GetExtension(list[i]).ToLower();
KKdA3DA a3da;
for (int i1 = 1; i1 < div; i1++)
using (a3da = new KKdA3DA())
{
string file = filename + "_div_" + i1 + ext;
data = farc.FileReader(file);
int state = a3da.A3DAReader(data);
if (state == 1) a3daArray[i].A3DAMerger(ref a3da.Data);
}
a3daArray[i].Data.PlayControl.Div = null;
}
farc.Files.Capacity = 0;
farc.Files.Capacity = list.Count;
for (int i = 0; i < list.Count; i++)
{
KKdFARC.FARCFile file = default;
file.Name = list[i];
a3daArray[i].Head.Format = format;
file.Data = (choose == "1" || choose == "4")
? a3daArray[i].A3DAWriter() : a3daArray[i].A3DCWriter();
farc.Files.Add(file);
}
farc.Save();
return;
}
}
}