`A3DA`: Added support for Raw Data Binary `Aet`: Complete overhaul of AET writer `FARC`: Fixed compressed files not having correct size and encrypted files not being encrypted Updated libdeflate to 1.20
1115 lines
56 KiB
C#
1115 lines
56 KiB
C#
using KKdBaseLib;
|
|
using KKdBaseLib.F2;
|
|
using KKdMainLib.IO;
|
|
|
|
namespace KKdMainLib
|
|
{
|
|
public struct MotHead : System.IDisposable
|
|
{
|
|
private int i, i0, i1;
|
|
private Stream s;
|
|
|
|
public HeaderData Header;
|
|
|
|
public void MotHeadReader(string file, string ext)
|
|
{
|
|
bool x = false;
|
|
int x_offset = 0;
|
|
s = File.OpenReader(file + ext);
|
|
Header = new HeaderData();
|
|
int signature = s.RI32();
|
|
if (signature == 0x484D4D4D)
|
|
{
|
|
x_offset = (int)s.ReadHeader(true).Length;
|
|
Header.MotionSetID = s.RU32();
|
|
int mot_count = s.RI32();
|
|
int mot_hashes_offset = s.RI32();
|
|
Header.SubHeaderOffset = s.RI32();
|
|
if (Header.SubHeaderOffset == 0)
|
|
{
|
|
if (mot_hashes_offset != 0) mot_hashes_offset += x_offset;
|
|
s.IsX = true;
|
|
x = true;
|
|
Header.SubHeaderOffset = (int)s.RIX();
|
|
if (Header.SubHeaderOffset != 0) Header.SubHeaderOffset += x_offset;
|
|
}
|
|
|
|
if (Header.SubHeaderOffset < 0x20) goto RETURN;
|
|
|
|
s.P = mot_hashes_offset;
|
|
Header.Data = new HeaderData.Sub[mot_count];
|
|
for (i = 0; i < Header.Data.Length; i++) Header.Data[i].MotionID = s.RU32();
|
|
}
|
|
else
|
|
{
|
|
int offset = s.RI32();
|
|
if (offset < 0x10) goto RETURN;
|
|
s.O = offset;
|
|
s.P = 0;
|
|
|
|
Header.MotionSetID = s.RU32();
|
|
Header.FirstMotionID = s.RU32();
|
|
Header.LastMotionID = s.RU32();
|
|
Header.SubHeaderOffset = (int)s.RIX();
|
|
|
|
if (Header.SubHeaderOffset < 0x10) goto RETURN;
|
|
i0 = (int)(Header.LastMotionID - Header.FirstMotionID);
|
|
if (i0 < 0) goto RETURN;
|
|
|
|
Header.Data = new HeaderData.Sub[++i0];
|
|
for (i = 0; i < Header.Data.Length; i++)
|
|
Header.Data[i].MotionID = Header.FirstMotionID + (uint)i;
|
|
}
|
|
|
|
s.P = Header.SubHeaderOffset;
|
|
for (i = 0; i < Header.Data.Length; i++)
|
|
{
|
|
if (x) s.A(0x08);
|
|
Header.Data[i].Offset = (int)s.RIX();
|
|
if (x && Header.Data[i].Offset != 0) Header.Data[i].Offset += x_offset;
|
|
}
|
|
|
|
for (i = 0; i < Header.Data.Length; i++)
|
|
{
|
|
if (Header.Data[i].Offset < 0x10) continue;
|
|
|
|
s.P = Header.Data[i].Offset;
|
|
|
|
Header.Data[i].Field00 = s.RI32();
|
|
if (!x)
|
|
{
|
|
Header.Data[i].Field04 = s.RI32();
|
|
Header.Data[i].Field08 = s.RI32();
|
|
Header.Data[i].Field0C = s.RI32();
|
|
}
|
|
Header.Data[i].Field10 = s.RU16();
|
|
Header.Data[i].Field12 = s.RU16();
|
|
if (x) s.A(0x08);
|
|
Header.Data[i].Offset2 = (int)s.RIX();
|
|
if (x && Header.Data[i].Offset2 != 0) Header.Data[i].Offset2 += x_offset;
|
|
if (x) s.A(0x08);
|
|
Header.Data[i].DataHeaderOffset = (int)s.RIX();
|
|
if (x && Header.Data[i].DataHeaderOffset != 0)
|
|
Header.Data[i].DataHeaderOffset += x_offset;
|
|
|
|
if (Header.Data[i].DataHeaderOffset < 0x10) goto RETURN;
|
|
s.P = Header.Data[i].DataHeaderOffset;
|
|
i0 = 0;
|
|
while (s.RI32() != -1) { s.RI32(); if (x) s.A(0x08); s.RIX(); i0++; }
|
|
s.P = Header.Data[i].DataHeaderOffset;
|
|
|
|
Header.Data[i].Array = new HeaderData.Sub.Data[i0];
|
|
for (i0 = 0; i0 < Header.Data[i].Array.Length; i0++)
|
|
{
|
|
Header.Data[i].Array[i0].Type = (Type)s.RI32();
|
|
Header.Data[i].Array[i0].Frame = s.RI32();
|
|
if (x) s.A(0x08);
|
|
Header.Data[i].Array[i0].Offset = (int)s.RIX();
|
|
if (x && Header.Data[i].Array[i0].Offset != 0)
|
|
Header.Data[i].Array[i0].Offset += x_offset;
|
|
}
|
|
}
|
|
|
|
for (i = 0; i < Header.Data.Length; i++)
|
|
{
|
|
if (Header.Data[i].Offset2 > 0x10)
|
|
{
|
|
s.P = Header.Data[i].Offset2;
|
|
i0 = 0;
|
|
while (s.RI32() != -1) { s.RI32(); i0++; }
|
|
s.P = Header.Data[i].Offset2;
|
|
|
|
Header.Data[i].Array2 = new HeaderData.Sub.Data2[i0];
|
|
for (i0 = 0; i0 < Header.Data[i].Array2.Length; i0++)
|
|
{
|
|
Header.Data[i].Array2[i0].Type = s.RI32();
|
|
if (x) s.A(0x08);
|
|
Header.Data[i].Array2[i0].Offset = (int)s.RIX();
|
|
if (x && Header.Data[i].Array2[i0].Offset != 0)
|
|
Header.Data[i].Array2[i0].Offset += x_offset;
|
|
}
|
|
|
|
for (i0 = 0; i0 < Header.Data[i].Array2.Length; i0++)
|
|
{
|
|
ref HeaderData.Sub.Data2 Data = ref Header.Data[i].Array2[i0];
|
|
if ((i1 = GetSize2(Data.Type)) < 1) continue;
|
|
|
|
if (Header.Data[i].Array2[i0].Offset < 0x10) goto RETURN;
|
|
s.P = Data.Offset;
|
|
Data.Array = s.RBy(i1);
|
|
}
|
|
}
|
|
|
|
if (Header.Data[i].Array == null || Header.Data[i].Array.Length < 1) continue;
|
|
|
|
for (i0 = 0; i0 < Header.Data[i].Array.Length; i0++)
|
|
{
|
|
ref HeaderData.Sub.Data Data = ref Header.Data[i].Array[i0];
|
|
if ((i1 = GetSize(Data.Type)) < 1) continue;
|
|
|
|
if (Data.Offset > 0)
|
|
{
|
|
s.P = Data.Offset;
|
|
Data.Array = s.RBy(i1);
|
|
}
|
|
}
|
|
}
|
|
|
|
RETURN:
|
|
s.C();
|
|
}
|
|
|
|
public void MotHeadWriter(string file)
|
|
{
|
|
if (Header.Data == null || Header.Data.Length < 1) return;
|
|
|
|
Header.FirstMotionID = 0x7FFFFFFF;
|
|
Header. LastMotionID = 0x00000000;
|
|
for (i = 0; i < Header.Data.Length; i++)
|
|
{
|
|
if (Header.Data[i].MotionID < Header.FirstMotionID)
|
|
Header.FirstMotionID = Header.Data[i].MotionID;
|
|
if (Header.Data[i].MotionID > Header. LastMotionID)
|
|
Header. LastMotionID = Header.Data[i].MotionID;
|
|
}
|
|
|
|
s = File.OpenWriter(file + ".bin", true);
|
|
s.W(0x01);
|
|
s.W(0x20);
|
|
s.A(0x20, true);
|
|
s.O = 0x20;
|
|
s.P = 0;
|
|
s.W(0);
|
|
for (int I = (int)(Header.LastMotionID - Header.FirstMotionID); I > -1; I--)
|
|
for (i = 0; i < Header.Data.Length; i++)
|
|
if (Header.FirstMotionID + I == Header.Data[i].MotionID)
|
|
{
|
|
s.A(0x20, true);
|
|
Header.Data[i].Offset = s.P;
|
|
Header.Data[i].DataHeaderOffset = Header.Data[i].Offset + 0x20;
|
|
s.W(0L);
|
|
s.W(0L);
|
|
s.W(0L);
|
|
s.W(0L);
|
|
|
|
for (i0 = 0; i0 < Header.Data[i].Array.Length; i0++)
|
|
{ s.W( 0); s.W( 0); s.W(0); }
|
|
s.W(-1); s.W(-1); s.W(0);
|
|
|
|
for (i0 = Header.Data[i].Array.Length - 1; i0 > -1; i0--)
|
|
{
|
|
ref HeaderData.Sub.Data data = ref Header.Data[i].Array[i0];
|
|
int Size = GetSize(data.Type);
|
|
if (data.Array == null || data.Array.Length < 1 || Size < 1) continue;
|
|
|
|
switch ((int)data.Type)
|
|
{
|
|
case 0x3E:
|
|
case 0x49:
|
|
case 0x4B:
|
|
s.A(0x20, true);
|
|
break;
|
|
}
|
|
|
|
if (data.Array.Length >= 4 && s.P % 0x4 != 0)
|
|
s.A(0x04, true);
|
|
else if (data.Array.Length == 2 && s.P % 0x2 != 0)
|
|
s.A(0x02, true);
|
|
|
|
data.Offset = s.P;
|
|
s.W(data.Array);
|
|
|
|
if ((int)data.Type == 0x3C)
|
|
s.A(0x20, true);
|
|
}
|
|
|
|
if (Header.Data[i].Array2 != null && Header.Data[i].Array2.Length > 0)
|
|
{
|
|
Header.Data[i].Offset2 = s.P;
|
|
|
|
for (i0 = 0; i0 < Header.Data[i].Array2.Length; i0++)
|
|
{ s.W( 0); s.W(0); }
|
|
s.W(-1); s.W(0);
|
|
|
|
for (i0 = Header.Data[i].Array2.Length - 1; i0 > -1; i0--)
|
|
{
|
|
ref HeaderData.Sub.Data2 data = ref Header.Data[i].Array2[i0];
|
|
int Size = GetSize2(data.Type);
|
|
if (data.Array == null || data.Array.Length < 1 || Size < 1) continue;
|
|
|
|
if (data.Array.Length >= 4 && s.P % 0x4 != 0)
|
|
s.A(0x04, true);
|
|
else if (data.Array.Length == 2 && s.P % 0x2 != 0)
|
|
s.A(0x02, true);
|
|
|
|
data.Offset = s.P;
|
|
s.W(data.Array);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
s.A(0x10, true);
|
|
|
|
Header.SubHeaderOffset = s.P;
|
|
i1 = (int)(Header.LastMotionID - Header.FirstMotionID);
|
|
|
|
int offset = 0;
|
|
for (i = 0, i1++; i < i1; i++)
|
|
{
|
|
offset = 0;
|
|
for (i0 = 0; i0 < Header.Data.Length; i0++)
|
|
if (Header.FirstMotionID + i == Header.Data[i0].MotionID)
|
|
{ offset = Header.Data[i0].Offset; break; }
|
|
s.W(offset);
|
|
}
|
|
s.A(0x20, true);
|
|
|
|
for (i = 0; i < Header.Data.Length; i++)
|
|
{
|
|
s.P = Header.Data[i].Offset;
|
|
s.W(Header.Data[i].Field00);
|
|
s.W(Header.Data[i].Field04);
|
|
s.W(Header.Data[i].Field08);
|
|
s.W(Header.Data[i].Field0C);
|
|
s.W(Header.Data[i].Field10);
|
|
s.W(Header.Data[i].Field12);
|
|
s.W(Header.Data[i].Offset2);
|
|
s.W(Header.Data[i].DataHeaderOffset);
|
|
s.W(0);
|
|
|
|
s.P = Header.Data[i].DataHeaderOffset;
|
|
for (i0 = 0; i0 < Header.Data[i].Array.Length; i0++)
|
|
{
|
|
s.W((int)Header.Data[i].Array[i0].Type );
|
|
s.W(Header.Data[i].Array[i0].Frame );
|
|
s.W(Header.Data[i].Array[i0].Offset);
|
|
}
|
|
|
|
s.P = Header.Data[i].Offset2;
|
|
if (Header.Data[i].Array2 != null)
|
|
for (i0 = 0; i0 < Header.Data[i].Array2.Length; i0++)
|
|
{
|
|
s.W(Header.Data[i].Array2[i0].Type );
|
|
s.W(Header.Data[i].Array2[i0].Offset);
|
|
}
|
|
}
|
|
|
|
s.P = 0;
|
|
s.W(Header.MotionSetID );
|
|
s.W(Header.FirstMotionID );
|
|
s.W(Header. LastMotionID );
|
|
s.W(Header.SubHeaderOffset);
|
|
s.C();
|
|
}
|
|
|
|
public void MsgPackReader(string file, bool json)
|
|
{
|
|
Header = new HeaderData();
|
|
|
|
MsgPack motHead;
|
|
MsgPack msgPack = file.ReadMPAllAtOnce(json);
|
|
if ((motHead = msgPack["MotHead"]).IsNull) return;
|
|
Header.MotionSetID = motHead.RU32("MotionSetID");
|
|
|
|
MsgPack motions, array;
|
|
if ((motions = motHead["Motions", true]).IsNull) return;
|
|
Header.Data = new HeaderData.Sub[motions.Array.Length];
|
|
for (i = 0; i < Header.Data.Length; i++)
|
|
{
|
|
Header.Data[i].MotionID = motions[i].RU32("MotionID");
|
|
Header.Data[i].Field00 = motions[i].RI32("Field00");
|
|
Header.Data[i].Field04 = motions[i].RI32("Field04");
|
|
Header.Data[i].Field08 = motions[i].RI32("Field08");
|
|
Header.Data[i].Field0C = motions[i].RI32("Field0C");
|
|
Header.Data[i].Field10 = motions[i].RU16("Field10");
|
|
Header.Data[i].Field12 = motions[i].RU16("Field12");
|
|
|
|
MsgPack array2;
|
|
if ((array2 = motions[i]["Array2", true]).NotNull)
|
|
{
|
|
Header.Data[i].Array2 = new HeaderData.Sub.Data2[array2.Array.Length];
|
|
|
|
for (i0 = 0; i0 < Header.Data[i].Array2.Length; i0++)
|
|
{
|
|
ref HeaderData.Sub.Data2 data = ref Header.Data[i].Array2[i0];
|
|
|
|
data.Type = array2[i0].RI32("Type");
|
|
data.Array = new byte[GetSize2(data.Type)];
|
|
|
|
MsgPack arrayArray;
|
|
if ((arrayArray = array2[i0]["Array", true]).IsNull) continue;
|
|
|
|
data.Array = new byte[arrayArray.Array.Length];
|
|
for (i1 = 0; i1 < arrayArray.Array.Length; i1++)
|
|
data.Array.GBy(arrayArray[i1].RU8(), i1);
|
|
}
|
|
}
|
|
|
|
if ((array = motions[i]["Array", true]).IsNull) { continue; }
|
|
|
|
Header.Data[i].Array = new HeaderData.Sub.Data[array.Array.Length];
|
|
|
|
for (i0 = 0; i0 < Header.Data[i].Array.Length; i0++)
|
|
{
|
|
ref HeaderData.Sub.Data data = ref Header.Data[i].Array[i0];
|
|
System.Enum.TryParse(array[i0].RS("Type"), out data.Type);
|
|
data.Frame = array[i0].RI32("Frame");
|
|
MsgPack temp = array[i0]["Data"];
|
|
|
|
if (temp.IsNull)
|
|
{
|
|
MsgPack arrayArray = array[i0]["Array"];
|
|
if (arrayArray.IsNull)
|
|
continue;
|
|
|
|
data.Array = new byte[arrayArray.Array.Length];
|
|
for (i1 = 0; i1 < data.Array.Length; i1++)
|
|
data.Array[i1] = arrayArray[i1].RU8();
|
|
continue;
|
|
}
|
|
|
|
data.Array = new byte[GetSize(data.Type)];
|
|
|
|
switch ((int)data.Type)
|
|
{
|
|
case 0x02:
|
|
data.Array.GBy(temp.RI16("i00_16"), 0x00);
|
|
break;
|
|
case 0x03:
|
|
data.Array.GBy(temp.RI32("i00"), 0x00);
|
|
break;
|
|
case 0x04:
|
|
data.Array.GBy(temp.RI32("i00"), 0x00);
|
|
break;
|
|
case 0x07:
|
|
data.Array.GBy(temp.RI32("i00_16"), 0x00);
|
|
data.Array.GBy(temp.RF32("f04"), 0x04);
|
|
data.Array.GBy(temp.RF32("f08"), 0x08);
|
|
break;
|
|
case 0x08:
|
|
data.Array.GBy(temp.RI16("i04_16"), 0x04);
|
|
break;
|
|
case 0x0D:
|
|
data.Array.GBy(temp.RI32("i00"), 0x00);
|
|
data.Array.GBy(temp.RI32("i04"), 0x04);
|
|
data.Array.GBy(temp.RI32("i08"), 0x08);
|
|
break;
|
|
case 0x11:
|
|
data.Array.GBy(temp.RI16("i00_16"), 0x00);
|
|
data.Array.GBy(temp.RI16("i02_16"), 0x02);
|
|
data.Array.GBy(temp.RF32("f04"), 0x04);
|
|
data.Array.GBy(temp.RF32("f08"), 0x08);
|
|
data.Array.GBy(temp.RF32("f0C"), 0x0C);
|
|
data.Array.GBy(temp.RF32("f10"), 0x10);
|
|
data.Array.GBy(temp.RF32("f14"), 0x14);
|
|
data.Array.GBy(temp.RF32("f18"), 0x18);
|
|
break;
|
|
case 0x1D:
|
|
data.Array.GBy(temp.RI16("i00_16"), 0x00);
|
|
data.Array.GBy(temp.RI16("i02_16"), 0x02);
|
|
data.Array.GBy(temp.RI16("i04_16"), 0x04);
|
|
data.Array.GBy(temp.RI16("i06_16"), 0x06);
|
|
data.Array.GBy(temp.RF32("f08"), 0x08);
|
|
data.Array.GBy(temp.RF32("f0C"), 0x0C);
|
|
data.Array.GBy(temp.RF32("f10"), 0x10);
|
|
data.Array.GBy(temp.RI16("i14_16"), 0x14);
|
|
data.Array.GBy(temp.RF32("f18"), 0x18);
|
|
data.Array.GBy(temp.RF32("f1C"), 0x1C);
|
|
data.Array.GBy(temp.RF32("f20"), 0x20);
|
|
data.Array.GBy(temp.RF32("f24"), 0x24);
|
|
data.Array.GBy(temp.RF32("f28"), 0x28);
|
|
data.Array.GBy(temp.RF32("f2C"), 0x2C);
|
|
data.Array.GBy(temp.RI16("i30_16"), 0x30);
|
|
data.Array.GBy(temp.RI32("i34"), 0x34);
|
|
data.Array.GBy(temp.RI32("i38"), 0x38);
|
|
break;
|
|
case 0x20:
|
|
data.Array.GBy(temp.RI16("i00_16"), 0x00);
|
|
data.Array.GBy(temp.RI32("i04"), 0x04);
|
|
data.Array.GBy(temp.RF32("Duration"), 0x08);
|
|
data.Array.GBy(temp.RI32("i0C"), 0x0C);
|
|
break;
|
|
case 0x21:
|
|
data.Array.GBy(temp.RI16("i00_16"), 0x00);
|
|
data.Array.GBy(temp.RU8("i02_8"), 0x02);
|
|
data.Array.GBy(temp.RI32("i04"), 0x04);
|
|
data.Array.GBy(temp.RF32("f08"), 0x08);
|
|
data.Array.GBy(temp.RF32("f0C"), 0x0C);
|
|
data.Array.GBy(temp.RI32("i10"), 0x10);
|
|
data.Array.GBy(temp.RI32("i14"), 0x14);
|
|
break;
|
|
case 0x32: // SetFaceMotionId
|
|
data.Array.GBy(temp.RI32("MotionID"), 0x00);
|
|
data.Array.GBy(temp.RF32("Frame"), 0x04);
|
|
break;
|
|
case 0x35: // SetFaceMottblMotion
|
|
data.Array.GBy(temp.RI32("Index"), 0x00);
|
|
data.Array.GBy(temp.RF32("Value"), 0x04);
|
|
data.Array.GBy(temp.RF32("Duration"), 0x08);
|
|
data.Array.GBy(temp.RI32("i0C"), 0x0C);
|
|
data.Array.GBy(temp.RF32("f10"), 0x10);
|
|
break;
|
|
case 0x36: // SetHandRMottblMotion
|
|
data.Array.GBy(temp.RI32("Index"), 0x00);
|
|
data.Array.GBy(temp.RF32("Value"), 0x04);
|
|
data.Array.GBy(temp.RF32("Duration"), 0x08);
|
|
data.Array.GBy(temp.RI32("i0C"), 0x0C);
|
|
data.Array.GBy(temp.RF32("f10"), 0x10);
|
|
break;
|
|
case 0x37: // SetHandLMottblMotion
|
|
data.Array.GBy(temp.RI32("Index"), 0x00);
|
|
data.Array.GBy(temp.RF32("Value"), 0x04);
|
|
data.Array.GBy(temp.RF32("Duration"), 0x08);
|
|
data.Array.GBy(temp.RI32("i0C"), 0x0C);
|
|
data.Array.GBy(temp.RF32("f10"), 0x10);
|
|
break;
|
|
case 0x38: // SetMouthMottblMotion
|
|
data.Array.GBy(temp.RI32("Index"), 0x00);
|
|
data.Array.GBy(temp.RF32("Value"), 0x04);
|
|
data.Array.GBy(temp.RF32("Duration"), 0x08);
|
|
data.Array.GBy(temp.RI32("i0C"), 0x0C);
|
|
data.Array.GBy(temp.RF32("f10"), 0x10);
|
|
break;
|
|
case 0x39: // SetEyesMottblMotion
|
|
data.Array.GBy(temp.RI32("Index"), 0x00);
|
|
data.Array.GBy(temp.RF32("Value"), 0x04);
|
|
data.Array.GBy(temp.RF32("Duration"), 0x08);
|
|
data.Array.GBy(temp.RI32("i0C"), 0x0C);
|
|
data.Array.GBy(temp.RF32("f10"), 0x10);
|
|
break;
|
|
case 0x3A: // SetEyelidMottblMotion
|
|
data.Array.GBy(temp.RI32("Index"), 0x00);
|
|
data.Array.GBy(temp.RF32("Value"), 0x04);
|
|
data.Array.GBy(temp.RF32("Duration"), 0x08);
|
|
data.Array.GBy(temp.RI32("i0C"), 0x0C);
|
|
data.Array.GBy(temp.RF32("f10"), 0x10);
|
|
break;
|
|
case 0x3B: // SetRobCharaHeadObject
|
|
data.Array.GBy(temp.RI32("Index"), 0x00);
|
|
break;
|
|
case 0x3C:
|
|
data.Array.GBy(temp.RI32("i00"), 0x00);
|
|
data.Array.GBy(temp.RF32("f04"), 0x04);
|
|
data.Array.GBy(temp.RF32("f08"), 0x08);
|
|
data.Array.GBy(temp.RF32("f0C"), 0x0C);
|
|
break;
|
|
case 0x3D: // SetEyelidMotionFromFace
|
|
data.Array.GBy(temp.RI32("i00"), 0x00);
|
|
data.Array.GBy(temp.RF32("Duration"), 0x04);
|
|
break;
|
|
case 0x3E: // RobPartsAdjust
|
|
data.Array.GBy(temp.RI32("TransitionDuration"), 0x00);
|
|
data.Array.GBy(temp.RU8("Parts"), 0x04);
|
|
data.Array.GBy(temp.RU8("Type"), 0x05);
|
|
data.Array.GBy((byte)(temp.RB("IgnoreGravity") ? 1 : 0), 0x06);
|
|
data.Array.GBy(temp.RU8("CycleType"), 0x07);
|
|
data.Array.GBy(temp.RF32("ExternalForceX"), 0x08);
|
|
data.Array.GBy(temp.RF32("ExternalForceY"), 0x0C);
|
|
data.Array.GBy(temp.RF32("ExternalForceZ"), 0x10);
|
|
data.Array.GBy(temp.RF32("ExternalForceCycleStrengthX"), 0x14);
|
|
data.Array.GBy(temp.RF32("ExternalForceCycleStrengthY"), 0x18);
|
|
data.Array.GBy(temp.RF32("ExternalForceCycleStrengthZ"), 0x1C);
|
|
data.Array.GBy(temp.RF32("ExternalForceCycleX"), 0x20);
|
|
data.Array.GBy(temp.RF32("ExternalForceCycleY"), 0x24);
|
|
data.Array.GBy(temp.RF32("ExternalForceCycleZ"), 0x28);
|
|
data.Array.GBy(temp.RF32("Cycle"), 0x2C);
|
|
data.Array.GBy(temp.RF32("Phase"), 0x30);
|
|
data.Array.GBy(temp.RF32("Force"), 0x34);
|
|
data.Array.GBy(temp.RF32("Strength"), 0x38);
|
|
data.Array.GBy(temp.RI32("StrengthTransition"), 0x3C);
|
|
break;
|
|
case 0x41: // OsageReset
|
|
data.Array.GBy(temp.RI32("Iterations"), 0x00);
|
|
break;
|
|
case 0x42: // OsageStep
|
|
data.Array.GBy(temp.RF32("Value"), 0x00);
|
|
break;
|
|
case 0x43:
|
|
data.Array.GBy(temp.RI32("i00"), 0x00);
|
|
data.Array.GBy(temp.RF32("f04"), 0x04);
|
|
break;
|
|
case 0x44:
|
|
data.Array.GBy(temp.RI32("i00"), 0x00);
|
|
data.Array.GBy(temp.RF32("f04"), 0x04);
|
|
break;
|
|
case 0x45:
|
|
data.Array.GBy(temp.RI32("i00"), 0x00);
|
|
break;
|
|
case 0x46:
|
|
data.Array.GBy(temp.RI32("i00"), 0x00);
|
|
break;
|
|
case 0x47: // OsageMoveCancel
|
|
data.Array.GBy(temp.RU8("ID"), 0x00); // 0 - All, 1 - Kami, 2 - Outer
|
|
data.Array.GBy(temp.RF32("Value"), 0x04);
|
|
break;
|
|
case 0x48:
|
|
data.Array.GBy(temp.RF32("f00"), 0x00);
|
|
data.Array.GBy(temp.RF32("f04"), 0x04);
|
|
data.Array.GBy(temp.RF32("f08"), 0x08);
|
|
data.Array.GBy(temp.RI32("i0C"), 0x0C);
|
|
data.Array.GBy(temp.RI32("i10"), 0x10);
|
|
data.Array.GBy(temp.RI32("i14"), 0x14);
|
|
data.Array.GBy(temp.RU8("i18_8"), 0x18);
|
|
data.Array.GBy(temp.RU8("i19_8"), 0x19);
|
|
data.Array.GBy(temp.RU8("i1A_8"), 0x1A);
|
|
break;
|
|
case 0x49: // RobHandAdjust
|
|
data.Array.GBy(temp.RI16("Hand"), 0x00);
|
|
data.Array.GBy(temp.RI16("ScaleSelect"), 0x02);
|
|
data.Array.GBy(temp.RF32("Duration"), 0x04);
|
|
data.Array.GBy(temp.RI16("Type"), 0x08);
|
|
data.Array.GBy(temp.RF32("Scale"), 0x0C);
|
|
data.Array.GBy(temp.RF32("RotBlend"), 0x10);
|
|
data.Array.GBy(temp.RF32("OffsetX"), 0x14);
|
|
data.Array.GBy(temp.RF32("OffsetY"), 0x18);
|
|
data.Array.GBy(temp.RF32("OffsetZ"), 0x1C);
|
|
data.Array.GBy((byte)(temp.RB("EnableScale") ? 1 : 0), 0x20);
|
|
data.Array.GBy((byte)(temp.RB("DisableX") ? 1 : 0), 0x21);
|
|
data.Array.GBy((byte)(temp.RB("DisableY") ? 1 : 0), 0x22);
|
|
data.Array.GBy((byte)(temp.RB("DisableZ") ? 1 : 0), 0x23);
|
|
data.Array.GBy(temp.RF32("OffsetBlend"), 0x24);
|
|
data.Array.GBy(temp.RF32("ArmLength"), 0x28);
|
|
data.Array.GBy(temp.RI32("i2C"), 0x2C);
|
|
break;
|
|
case 0x4A:
|
|
data.Array.GBy(temp.RU8("i00_8"), 0x00);
|
|
data.Array.GBy(temp.RU8("i01_8"), 0x01);
|
|
break;
|
|
case 0x4B: // RobAdjustGlobal
|
|
data.Array.GBy(temp.RI32("TransitionDuration"), 0x00);
|
|
data.Array.GBy(temp.RU8("Type"), 0x04);
|
|
data.Array.GBy(temp.RU8("CycleType"), 0x05);
|
|
data.Array.GBy(temp.RF32("ExternalForceX"), 0x08);
|
|
data.Array.GBy(temp.RF32("ExternalForceY"), 0x0C);
|
|
data.Array.GBy(temp.RF32("ExternalForceZ"), 0x10);
|
|
data.Array.GBy(temp.RF32("ExternalForceCycleStrengthX"), 0x14);
|
|
data.Array.GBy(temp.RF32("ExternalForceCycleStrengthY"), 0x18);
|
|
data.Array.GBy(temp.RF32("ExternalForceCycleStrengthZ"), 0x1C);
|
|
data.Array.GBy(temp.RF32("ExternalForceCycleX"), 0x20);
|
|
data.Array.GBy(temp.RF32("ExternalForceCycleY"), 0x24);
|
|
data.Array.GBy(temp.RF32("ExternalForceCycleZ"), 0x28);
|
|
data.Array.GBy(temp.RF32("Cycle"), 0x2C);
|
|
data.Array.GBy(temp.RF32("Phase"), 0x30);
|
|
break;
|
|
case 0x4C: // RobArmAdjust
|
|
data.Array.GBy(temp.RI16("Index"), 0x00);
|
|
data.Array.GBy(temp.RF32("Duration"), 0x04);
|
|
data.Array.GBy(temp.RF32("Value"), 0x08);
|
|
break;
|
|
case 0x4D: // DisableEyeMotion
|
|
data.Array.GBy((byte)(temp.RB("Value") ? 1 : 0), 0x00);
|
|
break;
|
|
case 0x4E:
|
|
data.Array.GBy(temp.RI16("i00_16"), 0x00);
|
|
data.Array.GBy(temp.RU8("i02_8"), 0x02);
|
|
data.Array.GBy(temp.RU8("i03_8"), 0x03);
|
|
data.Array.GBy(temp.RI32("i04"), 0x04);
|
|
data.Array.GBy(temp.RI32("i08"), 0x08);
|
|
data.Array.GBy(temp.RI32("i0C"), 0x0C);
|
|
data.Array.GBy(temp.RI32("i10"), 0x10);
|
|
data.Array.GBy(temp.RI32("i14"), 0x14);
|
|
data.Array.GBy(temp.RI32("i18"), 0x18);
|
|
break;
|
|
case 0x4F: // RobCharaColiRing
|
|
data.Array.GBy(temp.RU8("Index"), 0x00);
|
|
break;
|
|
case 0x50: // AdjustGetGlobalTrans
|
|
data.Array.GBy((byte)(temp.RB("Value") ? 1 : 0), 0x00);
|
|
break;
|
|
case 0x40: // WindReset
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
msgPack.Dispose();
|
|
}
|
|
|
|
public void MsgPackWriter(string file, bool json)
|
|
{
|
|
if (Header.Data == null || Header.Data.Length < 1) return;
|
|
|
|
for (i = 0, i1 = 0; i < Header.Data.Length; i++)
|
|
if (Header.Data[i].Offset >= 0x10) i1++;
|
|
MsgPack motHead = new MsgPack("MotHead").Add("MotionSetID", Header.MotionSetID);
|
|
MsgPack motions = new MsgPack(i1, "Motions");
|
|
for (int I = 0, i = 0; i < Header.Data.Length; i++)
|
|
{
|
|
if (Header.Data[i].Offset < 0x10) continue;
|
|
MsgPack motion = MsgPack.New
|
|
.Add("MotionID", Header.Data[i].MotionID)
|
|
.Add("Field00", Header.Data[i].Field00)
|
|
.Add("Field04", Header.Data[i].Field04)
|
|
.Add("Field08", Header.Data[i].Field08)
|
|
.Add("Field0C", Header.Data[i].Field0C)
|
|
.Add("Field10", Header.Data[i].Field10)
|
|
.Add("Field12", Header.Data[i].Field12);
|
|
|
|
if (Header.Data[i].Array != null && Header.Data[i].Array.Length > 0)
|
|
{
|
|
MsgPack array = new MsgPack(Header.Data[i].Array.Length, "Array");
|
|
for (i0 = 0; i0 < Header.Data[i].Array.Length; i0++)
|
|
{
|
|
ref HeaderData.Sub.Data data = ref Header.Data[i].Array[i0];
|
|
MsgPack arrayEntry = MsgPack.New;
|
|
arrayEntry.Add("Type", data.Type.ToString());
|
|
arrayEntry.Add("Frame", data.Frame);
|
|
switch ((int)data.Type)
|
|
{
|
|
case 0x02:
|
|
arrayEntry.Add(new MsgPack("Data")
|
|
.Add("i00_16", data.Array.TI16(0x00)));
|
|
break;
|
|
case 0x03:
|
|
arrayEntry.Add(new MsgPack("Data")
|
|
.Add("i00", data.Array.TI32(0x00)));
|
|
break;
|
|
case 0x04:
|
|
arrayEntry.Add(new MsgPack("Data")
|
|
.Add("i00", data.Array.TI32(0x00)));
|
|
break;
|
|
case 0x07:
|
|
arrayEntry.Add(new MsgPack("Data")
|
|
.Add("i00_16", data.Array.TI16(0x00))
|
|
.Add("f04", data.Array.TF32(0x04))
|
|
.Add("f08", data.Array.TF32(0x08)));
|
|
break;
|
|
case 0x08:
|
|
arrayEntry.Add(new MsgPack("Data")
|
|
.Add("i04_16", data.Array.TI16(0x04)));
|
|
break;
|
|
case 0x0D:
|
|
arrayEntry.Add(new MsgPack("Data")
|
|
.Add("i00", data.Array.TI32(0x00))
|
|
.Add("i04", data.Array.TI32(0x04))
|
|
.Add("i08", data.Array.TI32(0x08)));
|
|
break;
|
|
case 0x11:
|
|
arrayEntry.Add(new MsgPack("Data")
|
|
.Add("i00_16", data.Array.TI16(0x00))
|
|
.Add("i02_16", data.Array.TI16(0x02))
|
|
.Add("f04", data.Array.TF32(0x04))
|
|
.Add("f08", data.Array.TF32(0x08))
|
|
.Add("f0C", data.Array.TF32(0x0C))
|
|
.Add("f10", data.Array.TF32(0x10))
|
|
.Add("f14", data.Array.TF32(0x14))
|
|
.Add("f18", data.Array.TF32(0x18)));
|
|
break;
|
|
case 0x1D:
|
|
arrayEntry.Add(new MsgPack("Data")
|
|
.Add("i00_16", data.Array.TI16(0x00))
|
|
.Add("i02_16", data.Array.TI16(0x02))
|
|
.Add("i04_16", data.Array.TI16(0x04))
|
|
.Add("i06_16", data.Array.TI16(0x06))
|
|
.Add("f08", data.Array.TF32(0x08))
|
|
.Add("f0C", data.Array.TF32(0x0C))
|
|
.Add("f10", data.Array.TF32(0x10))
|
|
.Add("i14_16", data.Array.TI16(0x14))
|
|
.Add("f18", data.Array.TF32(0x18))
|
|
.Add("f1C", data.Array.TF32(0x1C))
|
|
.Add("f20", data.Array.TF32(0x20))
|
|
.Add("f24", data.Array.TF32(0x24))
|
|
.Add("f28", data.Array.TF32(0x28))
|
|
.Add("f2C", data.Array.TF32(0x2C))
|
|
.Add("i30_16", data.Array.TI16(0x30))
|
|
.Add("i34", data.Array.TI32(0x34))
|
|
.Add("i38", data.Array.TI32(0x38)));
|
|
break;
|
|
case 0x20:
|
|
arrayEntry.Add(new MsgPack("Data")
|
|
.Add("i00_16", data.Array.TI16(0x00))
|
|
.Add("i04", data.Array.TI32(0x04))
|
|
.Add("Duration", data.Array.TF32(0x08))
|
|
.Add("i0C", data.Array.TI32(0x0C)));
|
|
break;
|
|
case 0x21:
|
|
arrayEntry.Add(new MsgPack("Data")
|
|
.Add("i00_16", data.Array.TI16(0x00))
|
|
.Add("i02_8", data.Array.TU8(0x02))
|
|
.Add("i04", data.Array.TI32(0x04))
|
|
.Add("f08", data.Array.TF32(0x08))
|
|
.Add("f0C", data.Array.TF32(0x0C))
|
|
.Add("i10", data.Array.TI32(0x10))
|
|
.Add("i14", data.Array.TI32(0x14)));
|
|
break;
|
|
case 0x32: // SetFaceMotionId
|
|
arrayEntry.Add(new MsgPack("Data")
|
|
.Add("MotionID", data.Array.TI32(0x00))
|
|
.Add("Frame", data.Array.TF32(0x04)));
|
|
break;
|
|
case 0x35: // SetFaceMottblMotion
|
|
arrayEntry.Add(new MsgPack("Data")
|
|
.Add("Index", data.Array.TI32(0x00))
|
|
.Add("Value", data.Array.TF32(0x04))
|
|
.Add("Duration", data.Array.TF32(0x08))
|
|
.Add("i0C", data.Array.TI32(0x0C))
|
|
.Add("f10", data.Array.TF32(0x10)));
|
|
break;
|
|
case 0x36: // SetHandRMottblMotion
|
|
arrayEntry.Add(new MsgPack("Data")
|
|
.Add("Index", data.Array.TI32(0x00))
|
|
.Add("Value", data.Array.TF32(0x04))
|
|
.Add("Duration", data.Array.TF32(0x08))
|
|
.Add("i0C", data.Array.TI32(0x0C))
|
|
.Add("f10", data.Array.TF32(0x10)));
|
|
break;
|
|
case 0x37: // SetHandLMottblMotion
|
|
arrayEntry.Add(new MsgPack("Data")
|
|
.Add("Index", data.Array.TI32(0x00))
|
|
.Add("Value", data.Array.TF32(0x04))
|
|
.Add("Duration", data.Array.TF32(0x08))
|
|
.Add("i0C", data.Array.TI32(0x0C))
|
|
.Add("f10", data.Array.TF32(0x10)));
|
|
break;
|
|
case 0x38: // SetMouthMottblMotion
|
|
arrayEntry.Add(new MsgPack("Data")
|
|
.Add("Index", data.Array.TI32(0x00))
|
|
.Add("Value", data.Array.TF32(0x04))
|
|
.Add("Duration", data.Array.TF32(0x08))
|
|
.Add("i0C", data.Array.TI32(0x0C))
|
|
.Add("f10", data.Array.TF32(0x10)));
|
|
break;
|
|
case 0x39: // SetEyesMottblMotion
|
|
arrayEntry.Add(new MsgPack("Data")
|
|
.Add("Index", data.Array.TI32(0x00))
|
|
.Add("Value", data.Array.TF32(0x04))
|
|
.Add("Duration", data.Array.TF32(0x08))
|
|
.Add("i0C", data.Array.TI32(0x0C))
|
|
.Add("f10", data.Array.TF32(0x10)));
|
|
break;
|
|
case 0x3A: // SetEyelidMottblMotion
|
|
arrayEntry.Add(new MsgPack("Data")
|
|
.Add("Index", data.Array.TI32(0x00))
|
|
.Add("Value", data.Array.TF32(0x04))
|
|
.Add("Duration", data.Array.TF32(0x08))
|
|
.Add("i0C", data.Array.TI32(0x0C))
|
|
.Add("f10", data.Array.TF32(0x10)));
|
|
break;
|
|
case 0x3B: // SetRobCharaHeadObject
|
|
arrayEntry.Add(new MsgPack("Data")
|
|
.Add("Index", data.Array.TI32(0x00)));
|
|
break;
|
|
case 0x3C:
|
|
arrayEntry.Add(new MsgPack("Data")
|
|
.Add("i00", data.Array.TI32(0x00))
|
|
.Add("f04", data.Array.TF32(0x04))
|
|
.Add("f08", data.Array.TF32(0x08))
|
|
.Add("f0C", data.Array.TF32(0x0C)));
|
|
break;
|
|
case 0x3D: // SetEyelidMotionFromFace
|
|
arrayEntry.Add(new MsgPack("Data")
|
|
.Add("i00", data.Array.TI32(0x00))
|
|
.Add("Duration", data.Array.TF32(0x04)));
|
|
break;
|
|
case 0x3E: // RobPartsAdjust
|
|
arrayEntry.Add(new MsgPack("Data")
|
|
.Add("TransitionDuration", data.Array.TI32(0x00))
|
|
.Add("Parts", data.Array.TU8(0x04))
|
|
.Add("Type", data.Array.TU8(0x05))
|
|
.Add("IgnoreGravity", data.Array.TU8(0x06) != 0)
|
|
.Add("CycleType", data.Array.TU8(0x07))
|
|
.Add("ExternalForceX", data.Array.TF32(0x08))
|
|
.Add("ExternalForceY", data.Array.TF32(0x0C))
|
|
.Add("ExternalForceZ", data.Array.TF32(0x10))
|
|
.Add("ExternalForceCycleStrengthX", data.Array.TF32(0x14))
|
|
.Add("ExternalForceCycleStrengthY", data.Array.TF32(0x18))
|
|
.Add("ExternalForceCycleStrengthZ", data.Array.TF32(0x1C))
|
|
.Add("ExternalForceCycleX", data.Array.TF32(0x20))
|
|
.Add("ExternalForceCycleY", data.Array.TF32(0x24))
|
|
.Add("ExternalForceCycleZ", data.Array.TF32(0x28))
|
|
.Add("Cycle", data.Array.TF32(0x2C))
|
|
.Add("Phase", data.Array.TF32(0x30))
|
|
.Add("Force", data.Array.TF32(0x34))
|
|
.Add("Strength", data.Array.TF32(0x38))
|
|
.Add("StrengthTransition", data.Array.TI32(0x3C)));
|
|
break;
|
|
case 0x41: // OsageReset
|
|
arrayEntry.Add(new MsgPack("Data")
|
|
.Add("Iterations", data.Array.TI32(0x00)));
|
|
break;
|
|
case 0x42: // OsageStep
|
|
arrayEntry.Add(new MsgPack("Data")
|
|
.Add("Value", data.Array.TF32(0x00)));
|
|
break;
|
|
case 0x43:
|
|
arrayEntry.Add(new MsgPack("Data")
|
|
.Add("i00", data.Array.TI32(0x00))
|
|
.Add("f04", data.Array.TF32(0x04)));
|
|
break;
|
|
case 0x44:
|
|
arrayEntry.Add(new MsgPack("Data")
|
|
.Add("i00", data.Array.TI32(0x00))
|
|
.Add("f04", data.Array.TF32(0x04)));
|
|
break;
|
|
case 0x45:
|
|
arrayEntry.Add(new MsgPack("Data")
|
|
.Add("i00", data.Array.TI32(0x00)));
|
|
break;
|
|
case 0x46:
|
|
arrayEntry.Add(new MsgPack("Data")
|
|
.Add("i00", data.Array.TI32(0x00)));
|
|
break;
|
|
case 0x47: // OsageMoveCancel
|
|
arrayEntry.Add(new MsgPack("Data")
|
|
.Add("ID", data.Array.TU8(0x00)) // 0 - All, 1 - Kami, 2 - Outer
|
|
.Add("Value", data.Array.TF32(0x04)));
|
|
break;
|
|
case 0x48:
|
|
arrayEntry.Add(new MsgPack("Data")
|
|
.Add("f00", data.Array.TF32(0x00))
|
|
.Add("f04", data.Array.TF32(0x04))
|
|
.Add("f08", data.Array.TF32(0x08))
|
|
.Add("i0C", data.Array.TI32(0x0C))
|
|
.Add("i10", data.Array.TI32(0x10))
|
|
.Add("i14", data.Array.TI32(0x14))
|
|
.Add("i18_8", data.Array.TU8(0x18))
|
|
.Add("i19_8", data.Array.TU8(0x19))
|
|
.Add("i1A_8", data.Array.TU8(0x1A)));
|
|
break;
|
|
case 0x49: // RobHandAdjust
|
|
arrayEntry.Add(new MsgPack("Data")
|
|
.Add("Hand", data.Array.TI16(0x00))
|
|
.Add("ScaleSelect", data.Array.TI16(0x02))
|
|
.Add("Duration", data.Array.TF32(0x04))
|
|
.Add("Type", data.Array.TI16(0x08))
|
|
.Add("Scale", data.Array.TF32(0x0C))
|
|
.Add("RotBlend", data.Array.TF32(0x10))
|
|
.Add("OffsetX", data.Array.TF32(0x14))
|
|
.Add("OffsetY", data.Array.TF32(0x18))
|
|
.Add("OffsetZ", data.Array.TF32(0x1C))
|
|
.Add("EnableScale", data.Array.TU8(0x20) != 0)
|
|
.Add("DisableX", data.Array.TU8(0x21) != 0)
|
|
.Add("DisableY", data.Array.TU8(0x22) != 0)
|
|
.Add("DisableZ", data.Array.TU8(0x23) != 0)
|
|
.Add("OffsetBlend", data.Array.TF32(0x24))
|
|
.Add("ArmLength", data.Array.TF32(0x28))
|
|
.Add("i2C", data.Array.TI32(0x2C)));
|
|
break;
|
|
case 0x4A:
|
|
arrayEntry.Add(new MsgPack("Data")
|
|
.Add("i00_8", data.Array.TU8(0x00))
|
|
.Add("i01_8", data.Array.TU8(0x01)));
|
|
break;
|
|
case 0x4B: // RobAdjustGlobal
|
|
arrayEntry.Add(new MsgPack("Data")
|
|
.Add("TransitionDuration", data.Array.TI32(0x00))
|
|
.Add("Type", data.Array.TU8(0x04))
|
|
.Add("CycleType", data.Array.TU8(0x05))
|
|
.Add("ExternalForceX", data.Array.TF32(0x08))
|
|
.Add("ExternalForceY", data.Array.TF32(0x0C))
|
|
.Add("ExternalForceZ", data.Array.TF32(0x10))
|
|
.Add("ExternalForceCycleStrengthX", data.Array.TF32(0x14))
|
|
.Add("ExternalForceCycleStrengthY", data.Array.TF32(0x18))
|
|
.Add("ExternalForceCycleStrengthZ", data.Array.TF32(0x1C))
|
|
.Add("ExternalForceCycleX", data.Array.TF32(0x20))
|
|
.Add("ExternalForceCycleY", data.Array.TF32(0x24))
|
|
.Add("ExternalForceCycleZ", data.Array.TF32(0x28))
|
|
.Add("Cycle", data.Array.TF32(0x2C))
|
|
.Add("Phase", data.Array.TF32(0x30)));
|
|
break;
|
|
case 0x4C: // RobArmAdjust
|
|
arrayEntry.Add(new MsgPack("Data")
|
|
.Add("Index", data.Array.TI16(0x00))
|
|
.Add("Duration", data.Array.TF32(0x04))
|
|
.Add("Value", data.Array.TF32(0x08)));
|
|
break;
|
|
case 0x4D: // DisableEyeMotion
|
|
arrayEntry.Add(new MsgPack("Data")
|
|
.Add("Value", data.Array.TU8(0x00) != 0));
|
|
break;
|
|
case 0x4E:
|
|
arrayEntry.Add(new MsgPack("Data")
|
|
.Add("i00_16", data.Array.TI16(0x00))
|
|
.Add("i02_8", data.Array.TU8(0x02))
|
|
.Add("i03_8", data.Array.TU8(0x03))
|
|
.Add("i04", data.Array.TI32(0x04))
|
|
.Add("i08", data.Array.TI32(0x08))
|
|
.Add("i0C", data.Array.TI32(0x0C))
|
|
.Add("i10", data.Array.TI32(0x10))
|
|
.Add("i14", data.Array.TI32(0x14))
|
|
.Add("i18", data.Array.TI32(0x18)));
|
|
break;
|
|
case 0x4F: // RobCharaColiRing
|
|
arrayEntry.Add(new MsgPack("Data")
|
|
.Add("Index", data.Array.TU8(0)));
|
|
break;
|
|
case 0x50: // AdjustGetGlobalTrans
|
|
arrayEntry.Add(new MsgPack("Data")
|
|
.Add("Value", data.Array.TU8(0) != 0));
|
|
break;
|
|
case 0x40: // WindReset
|
|
default:
|
|
if (data.Array != null && data.Array.Length > 0)
|
|
{
|
|
MsgPack arrayArray = new MsgPack(data.Array.Length, "Array");
|
|
for (i1 = 0; i1 < data.Array.Length; i1++)
|
|
arrayArray[i1] = data.Array[i1];
|
|
arrayEntry.Add(arrayArray);
|
|
}
|
|
break;
|
|
}
|
|
|
|
array[i0] = arrayEntry;
|
|
}
|
|
motion.Add(array);
|
|
}
|
|
|
|
if (Header.Data[i].Array2 != null && Header.Data[i].Array2.Length > 0)
|
|
{
|
|
MsgPack array2 = new MsgPack(Header.Data[i].Array2.Length, "Array2");
|
|
for (i0 = 0; i0 < Header.Data[i].Array2.Length; i0++)
|
|
{
|
|
MsgPack arrayEntry = MsgPack.New.Add("Type", Header.Data[i].Array2[i0].Type);
|
|
if (Header.Data[i].Array2[i0].Array != null && Header.Data[i].Array2[i0].Array.Length > 0)
|
|
{
|
|
MsgPack arrayArray = new MsgPack(Header.Data[i].Array2[i0].Array.Length, "Array");
|
|
for (i1 = 0; i1 < Header.Data[i].Array2[i0].Array.Length; i1++)
|
|
arrayArray[i1] = Header.Data[i].Array2[i0].Array[i1];
|
|
arrayEntry.Add(arrayArray);
|
|
}
|
|
array2[i0] = arrayEntry;
|
|
}
|
|
motion.Add(array2);
|
|
}
|
|
|
|
motions[I] = motion;
|
|
I++;
|
|
}
|
|
motHead.Add(motions);
|
|
motHead.WriteAfterAll(false, true, file, json);
|
|
}
|
|
|
|
private static int GetSize(Type Type) =>
|
|
(int)Type switch
|
|
{
|
|
0x02 => 0x02,
|
|
0x03 => 0x04,
|
|
0x04 => 0x04,
|
|
0x07 => 0x0C,
|
|
0x08 => 0x08,
|
|
0x0D => 0x0C,
|
|
0x11 => 0x1C,
|
|
0x1D => 0x3C,
|
|
0x20 => 0x10,
|
|
0x21 => 0x18,
|
|
0x32 => 0x08, // SetFaceMotionId
|
|
0x35 => 0x14, // SetFaceMottblMotion
|
|
0x36 => 0x14, // SetHandRMottblMotion
|
|
0x37 => 0x14, // SetHandLMottblMotion
|
|
0x38 => 0x14, // SetMouthMottblMotion
|
|
0x39 => 0x14, // SetEyesMottblMotion
|
|
0x3A => 0x14, // SetEyelidMottblMotion
|
|
0x3B => 0x04, // SetRobCharaHeadObject
|
|
0x3C => 0x10,
|
|
0x3D => 0x08, // SetEyelidMotionFromFace
|
|
0x3E => 0x40, // RobPartsAdjust
|
|
0x40 => 0x00, // WindReset
|
|
0x41 => 0x04, // OsageReset
|
|
0x42 => 0x04, // OsageStep
|
|
0x43 => 0x08,
|
|
0x44 => 0x08,
|
|
0x45 => 0x04,
|
|
0x46 => 0x04,
|
|
0x47 => 0x08, // OsageMoveCancel
|
|
0x48 => 0x1C,
|
|
0x49 => 0x30, // RobHandAdjust
|
|
0x4A => 0x02,
|
|
0x4B => 0x34, // RobAdjustGlobal
|
|
0x4C => 0x0C, // RobArmAdjust
|
|
0x4D => 0x01, // DisableEyeMotion
|
|
0x4E => 0x1C,
|
|
0x4F => 0x01, // RobCharaColiRing
|
|
0x50 => 0x01, // AdjustGetGlobalTrans
|
|
_ => 0x00,
|
|
};
|
|
|
|
private static int GetSize2(int Type) =>
|
|
(int)Type switch {
|
|
0x00 => 0x1C,
|
|
0x01 => 0x08,
|
|
0x02 => 0x14,
|
|
0x28 => 0x10,
|
|
0x2E => 0x02,
|
|
0x33 => 0x02,
|
|
0x37 => 0x0C,
|
|
0x40 => 0x0C,
|
|
0x42 => 0x04,
|
|
0x44 => 0x04,
|
|
_ => 0x00,
|
|
};
|
|
|
|
public void Dispose()
|
|
{ if (s != null) s.D(); s = null; Header = default; }
|
|
|
|
public struct HeaderData
|
|
{
|
|
public uint MotionSetID;
|
|
public uint FirstMotionID;
|
|
public uint LastMotionID;
|
|
public int SubHeaderOffset;
|
|
|
|
public Sub[] Data;
|
|
|
|
public struct Sub
|
|
{
|
|
public int Offset;
|
|
public uint MotionID;
|
|
|
|
public int Field00;
|
|
public int Field04;
|
|
public int Field08;
|
|
public int Field0C;
|
|
public ushort Field10;
|
|
public ushort Field12;
|
|
public int Offset2;
|
|
public int DataHeaderOffset;
|
|
|
|
public Data[] Array;
|
|
public Data2[] Array2;
|
|
|
|
public struct Data
|
|
{
|
|
public Type Type;
|
|
public int Frame;
|
|
public int Offset;
|
|
|
|
public byte[] Array;
|
|
}
|
|
|
|
public struct Data2
|
|
{
|
|
public int Offset;
|
|
|
|
public int Type;
|
|
public byte[] Array;
|
|
}
|
|
}
|
|
}
|
|
|
|
public enum Type
|
|
{
|
|
SetFaceMotionId = 0x32,
|
|
SetFaceMottblMotion = 0x35,
|
|
SetHandRMottblMotion = 0x36,
|
|
SetHandLMottblMotion = 0x37,
|
|
SetMouthMottblMotion = 0x38,
|
|
SetEyesMottblMotion = 0x39,
|
|
SetEyelidMottblMotion = 0x3A,
|
|
SetRobCharaHeadObject = 0x3B,
|
|
SetEyelidMotionFromFace = 0x3D,
|
|
RobPartsAdjust = 0x3E,
|
|
WindReset = 0x40,
|
|
OsageReset = 0x41,
|
|
OsageStep = 0x42,
|
|
OsageMoveCancel = 0x47,
|
|
RobHandAdjust = 0x49,
|
|
RobAdjustGlobal = 0x4B,
|
|
RobArmAdjust = 0x4C,
|
|
DisableEyeMotion = 0x4D,
|
|
RobCharaColiRing = 0x4F,
|
|
AdjustGetGlobalTrans = 0x50,
|
|
}
|
|
}
|
|
}
|