From 35d7712d8fb0d845233c0118c3e20a1492cfbf18 Mon Sep 17 00:00:00 2001 From: korenkonder Date: Tue, 9 Nov 2021 14:34:27 +0300 Subject: [PATCH] Release v0.4.10.8 A3DA, MotHead --- KKdBaseLib/Auth3D.cs | 20 +- KKdBaseLib/F2/ENRS.cs | 9 +- KKdBaseLib/KKdBaseLib.csproj | 4 +- KKdMainLib/A3DA.cs | 233 +++--- KKdMainLib/DB/Auth.cs | 13 +- KKdMainLib/Extensions.cs | 4 +- KKdMainLib/F2/Bloom.cs | 2 +- KKdMainLib/F2/ColorCorrection.cs | 2 +- KKdMainLib/F2/DOF.cs | 2 +- KKdMainLib/F2/Light.cs | 2 +- KKdMainLib/KKdMainLib.csproj | 4 +- KKdMainLib/MotHead.cs | 1109 +++++++++++++++++----------- KKdMainLib/libdeflate.dll | Bin 57870 -> 59918 bytes PD_Tool/Properties/AssemblyInfo.cs | 4 +- PD_Tool/classes/A3D.cs | 2 +- 15 files changed, 850 insertions(+), 560 deletions(-) diff --git a/KKdBaseLib/Auth3D.cs b/KKdBaseLib/Auth3D.cs index e415f9b..3a81e7b 100644 --- a/KKdBaseLib/Auth3D.cs +++ b/KKdBaseLib/Auth3D.cs @@ -2,6 +2,7 @@ namespace KKdBaseLib.Auth3D { public struct Data { + public string[] Auth2D; public string[] Motion; public string[] ObjectList; public string[] ObjectHRCList; @@ -62,9 +63,9 @@ namespace KKdBaseLib.Auth3D public float Aspect; public float CameraApertureH; public float CameraApertureW; - public Key FOV; - public Key Roll; - public Key FocalLength; + public Key? FocalLength; + public Key? FOV; + public Key? Roll; public ModelTransform MT; } } @@ -83,7 +84,6 @@ namespace KKdBaseLib.Auth3D public struct DOF { - public string Name; public ModelTransform MT; } @@ -171,7 +171,6 @@ namespace KKdBaseLib.Auth3D public struct Light { public int Id; - public string Name; public string Type; public Key? ConeAngle; public Key? Constant; @@ -230,6 +229,7 @@ namespace KKdBaseLib.Auth3D public string Morph; public string UIDName; public string ParentName; + public string ParentNode; public ModelTransform MT; public TexturePattern[] TexPat; public TextureTransform[] TexTrans; @@ -262,6 +262,8 @@ namespace KKdBaseLib.Auth3D public bool Shadow; public string Name; public string UIDName; + public string ParentName; + public string ParentNode; public ObjectNode[] Node; } @@ -275,11 +277,11 @@ namespace KKdBaseLib.Auth3D public struct PlayControl { - public int Begin; + public float Begin; public int? Div; - public int FPS; - public int? Offset; - public int Size; + public float FPS; + public float? Offset; + public float Size; } public struct Point diff --git a/KKdBaseLib/F2/ENRS.cs b/KKdBaseLib/F2/ENRS.cs index 3f48a7a..ec462f3 100644 --- a/KKdBaseLib/F2/ENRS.cs +++ b/KKdBaseLib/F2/ENRS.cs @@ -223,7 +223,7 @@ namespace KKdBaseLib.F2 public int Size; public int Repeat; public SubENRSEntry[] Sub; - + public ENRSEntry(int offset, int count, int size, int repeat) { Offset = offset; Count = count; Size = size; Repeat = repeat; Sub = new SubENRSEntry[count]; } @@ -255,13 +255,12 @@ namespace KKdBaseLib.F2 public int SizeSkip => Skip + Reverse * (2 << (byte)Type); public int Size => Reverse * (2 << (byte)Type); - public override string ToString() => "Skip: " + Skip + - "; Reverse: " + Reverse + "; Type: " + Type; + public override string ToString() => + $"Skip: {Skip}; Reverse: {Reverse}; Type: {Type}"; } public override string ToString() => - "Offset: " + Offset + "; Count: " + Count + "; " + - "Size: " + Size + "; Repeat: " + Repeat; + $"Offset: {Offset}; Count: {Count}; Size: {Size}; Repeat: {Repeat}"; } public override string ToString() => diff --git a/KKdBaseLib/KKdBaseLib.csproj b/KKdBaseLib/KKdBaseLib.csproj index 9d040d6..1ce0590 100644 --- a/KKdBaseLib/KKdBaseLib.csproj +++ b/KKdBaseLib/KKdBaseLib.csproj @@ -6,12 +6,12 @@ korenkonder (C) 2019-2021 A base library - 0.4.10.7 + 0.4.10.8 KKdBaseLib KKdBaseLib net461 KKdBaseLib - 0.4.10.7 + 0.4.10.8 AnyCPU diff --git a/KKdMainLib/A3DA.cs b/KKdMainLib/A3DA.cs index 0ad6880..7aff64f 100644 --- a/KKdMainLib/A3DA.cs +++ b/KKdMainLib/A3DA.cs @@ -178,10 +178,8 @@ namespace KKdMainLib if (dict.FV(out value, "dof.name")) { - DOF dof = new DOF { Name = value }; Head.Format = Format.AFT; - dof.MT = RMT("dof"); - Data.DOF = dof; + Data.DOF = new DOF { MT = RMT("dof") }; } if (dict.FV(out value, "ambient.length")) @@ -191,12 +189,24 @@ namespace KKdMainLib for (i0 = 0; i0 < Data.Ambient.Length; i0++) { name = "ambient." + i0; + dict.FV(out Data.Ambient[i0].Name, name + ".name"); Data.Ambient[i0]. LightDiffuse = RRGBAKN(name + ".light.Diffuse"); Data.Ambient[i0].RimLightDiffuse = RRGBAKN(name + ".rimlight.Diffuse"); } } + if (dict.FV(out value, "auth_2d.length")) + { + Data.Auth2D = new string[int.Parse(value)]; + for (i0 = 0; i0 < Data.Ambient.Length; i0++) + { + name = "auth_2d." + i0; + + dict.FV(out Data.Auth2D[i0], name + ".name"); + } + } + if (dict.FV(out value, "camera_root.length")) { Data.CameraRoot = new CameraRoot[int.Parse(value)]; @@ -206,24 +216,24 @@ namespace KKdMainLib nameView = name + ".view_point"; dict.FV(out Data.CameraRoot[i0].VP.Aspect, nameView + ".aspect"); - dict.FV(out i1, nameView + ".fov_is_horizontal"); - Data.CameraRoot[i0].VP.FOVIsHorizontal = i1 != 0; - if (!Data.CameraRoot[i0].VP.FOVIsHorizontal) + if (dict.FV(out i1, nameView + ".fov_is_horizontal")) + { + Data.CameraRoot[i0].VP.FOVIsHorizontal = i1 != 0; + Data.CameraRoot[i0].VP.FOV = RKN(nameView + ".fov"); + } + else { dict.FV(out Data.CameraRoot[i0].VP. CameraApertureH, nameView + ".camera_aperture_h"); dict.FV(out Data.CameraRoot[i0].VP. CameraApertureW, nameView + ".camera_aperture_w"); + Data.CameraRoot[i0].VP.FocalLength = RKN(nameView + ".focal_length"); } Data.CameraRoot[i0]. MT = RMT(name); Data.CameraRoot[i0].Interest = RMT(name + ".interest"); Data.CameraRoot[i0].VP. MT = RMT(nameView); - if (!Data.CameraRoot[i0].VP.FOVIsHorizontal) - Data.CameraRoot[i0].VP.FocalLength = RK(nameView + ".focal_length"); - else - Data.CameraRoot[i0].VP.FOV = RK(nameView + ".fov"); - Data.CameraRoot[i0].VP.Roll = RK(nameView + ".roll"); + Data.CameraRoot[i0].VP.Roll = RKN(nameView + ".roll"); } } @@ -235,7 +245,7 @@ namespace KKdMainLib name = "chara." + i0; dict.FV(out Data.Chara[i0].Name, name + ".name"); - + Data.Chara[i0].MT = RMT(name); } } @@ -294,7 +304,6 @@ namespace KKdMainLib name = "light." + i0; dict.FV(out Data.Light[i0].Id , name + ".id" ); - dict.FV(out Data.Light[i0].Name, name + ".name"); dict.FV(out Data.Light[i0].Type, name + ".type"); Data.Light[i0].Ambient = RRGBAKN(name + ".Ambient"); @@ -389,9 +398,9 @@ namespace KKdMainLib name = "material_list." + i0; dict.FV(out Data.MaterialList[i0].Name, name + ".name"); - Data.MaterialList[i0].BlendColor = RRGBAK(name + ".blend_color"); - Data.MaterialList[i0].GlowIntensity = RK (name + ".glow_intensity"); - Data.MaterialList[i0].Incandescence = RRGBAK(name + ".incandescence"); + Data.MaterialList[i0].BlendColor = RRGBAKN(name + ".blend_color"); + Data.MaterialList[i0].GlowIntensity = RKN (name + ".glow_intensity"); + Data.MaterialList[i0].Incandescence = RRGBAKN(name + ".incandescence"); } } @@ -413,6 +422,7 @@ namespace KKdMainLib dict.FV(out Data.Object[i0].MorphOffset, name + ".morph_offset"); dict.FV(out Data.Object[i0]. Name, name + ".name"); dict.FV(out Data.Object[i0]. ParentName, name + ".parent_name"); + dict.FV(out Data.Object[i0]. ParentNode, name + ".parent_node"); if (dict.FV(out Data.Object[i0]. Pat , name + ".pat" )) dict.FV(out Data.Object[i0]. PatOffset, name + ".pat_offset"); dict.FV(out Data.Object[i0]. UIDName, name + ".uid_name"); @@ -464,8 +474,10 @@ namespace KKdMainLib { name = "objhrc." + i0; - dict.FV(out Data.ObjectHRC[i0]. Name, name + ".name"); - dict.FV(out Data.ObjectHRC[i0].UIDName, name + ".uid_name"); + dict.FV(out Data.ObjectHRC[i0]. Name, name + ".name"); + dict.FV(out Data.ObjectHRC[i0].ParentName, name + ".parent_name"); + dict.FV(out Data.ObjectHRC[i0].ParentNode, name + ".parent_node"); + dict.FV(out Data.ObjectHRC[i0]. UIDName, name + ".uid_name"); dict.FV(out int shadow, name + ".shadow"); Data.ObjectHRC[i0].Shadow = shadow != 0; if (dict.FV(out value, name + ".node.length")) @@ -474,7 +486,7 @@ namespace KKdMainLib for (i1 = 0; i1 < Data.ObjectHRC[i0].Node.Length; i1++) { nameView = name + ".node." + i1; - + if (dict.SW(nameView + ".joint_orient")) { Vec3 jointOrient = new Vec3(); @@ -515,7 +527,7 @@ namespace KKdMainLib name = "point." + i0; dict.FV(out Data.Point[i0].Name, name + ".name"); - + Data.Point[i0].MT = RMT(name); } } @@ -555,6 +567,19 @@ namespace KKdMainLib W("ambient.length", Data.Fog.Length); } + if (Data.Auth2D != null) + { + so0 = Data.Auth2D.Length.SW(); + for (i0 = 0; i0 < Data.Auth2D.Length; i0++) + { + soi0 = so0[i0]; + name = "auth_2d." + soi0; + + W(name + ".name", Data.Auth2D[soi0]); + } + W("auth_2d.length", Data.Fog.Length); + } + if (Data.CameraAuxiliary != null) { name = "camera_auxiliary"; @@ -587,17 +612,17 @@ namespace KKdMainLib W(ref cr.Interest, name + ".interest"); W(ref cr.MT, name, 0b11110); W(nameView + ".aspect", cr.VP.Aspect); - if (!cr.VP.FOVIsHorizontal) + if (cr.VP.FOV.HasValue) + { + W(ref cr.VP.FOV, nameView + ".fov"); + W(nameView + ".fov_is_horizontal", cr.VP.FOVIsHorizontal ? 1 : 0); + } + else { W(nameView + ".camera_aperture_h", cr.VP.CameraApertureH); W(nameView + ".camera_aperture_w", cr.VP.CameraApertureW); W(ref cr.VP.FocalLength, nameView + ".focal_length"); } - else - { - W(ref cr.VP.FOV, nameView + ".fov"); - W(nameView + ".fov_is_horizontal", 1); - } W(ref cr.VP.MT , nameView, 0b10000); W(ref cr.VP.Roll, nameView + ".roll"); W(ref cr.VP.MT , nameView, 0b01111); @@ -635,7 +660,7 @@ namespace KKdMainLib if (Data.DOF != null && (Head.Format == Format.AFT || Head.Format == Format.FT)) { DOF dof = Data.DOF.Value; - W("dof.name", dof.Name); + W("dof.name", "DOF"); W(ref dof.MT, "dof"); Data.DOF = dof; } @@ -710,7 +735,16 @@ namespace KKdMainLib } W(ref light.Specular , name + ".Specular" ); W(name + ".id" , light.Id ); - W(name + ".name", light.Name); + W(name + ".name", light.Id switch + { + 0 => "Char", + 1 => "Stage", + 2 => "Sun", + 3 => "Reflect", + 5 => "CharColor", + 6 => "ToneCurve", + _ => "none", + }); W(ref light.Position , name + ".position" ); W(ref light.SpotDirection, name + ".spot_direction"); W(name + ".type", light.Type); @@ -833,6 +867,7 @@ namespace KKdMainLib } W(name + ".name" , @object.Name ); W(name + ".parent_name", @object.ParentName); + W(name + ".parent_node", @object.ParentNode); if (@object.Pat != null) { W(name + ".pat" , @object.Pat ); @@ -932,9 +967,11 @@ namespace KKdMainLib W(name + ".node.length", objectHRC.Node.Length); } + W(name + ".parent_name", objectHRC.ParentName); + W(name + ".parent_node", objectHRC.ParentNode); if (objectHRC.Shadow) W(name + ".shadow", 1); - W(name + ".uid_name", objectHRC.UIDName); + W(name + ".uid_name", objectHRC. UIDName); } W("objhrc.length", Data.ObjectHRC.Length); } @@ -1002,13 +1039,8 @@ namespace KKdMainLib } private Vec4? RRGBAKN(string str) => - dict.FV(out bool b, str + ".") ? b ? - (Vec4?)new Vec4 { W = RKNS(str + ".a"), Z = RKNS(str + ".b"), - Y = RKNS(str + ".g"), X = RKNS(str + ".r") } : null : null; - - private Vec4 RRGBAK(string str) => - new Vec4 { W = RKNS(str + ".a"), Z = RKNS(str + ".b"), - Y = RKNS(str + ".g"), X = RKNS(str + ".r") }; + dict.SW(str) ? (Vec4?)new Vec4 { W = RKNS(str + ".a"), Z = RKNS(str + ".b"), + Y = RKNS(str + ".g"), X = RKNS(str + ".r") } : null; private Vec3 RV3(string str) => new Vec3 { X = RK(str + ".x"), Y = RK(str + ".y"), Z = RK(str + ".z") }; @@ -1239,9 +1271,9 @@ namespace KKdMainLib RMT(ref Data.CameraRoot[i0]. MT); RMT(ref Data.CameraRoot[i0].Interest); RMT(ref Data.CameraRoot[i0].VP. MT); - RK (ref Data.CameraRoot[i0].VP.FocalLength); - RK (ref Data.CameraRoot[i0].VP.FOV ); - RK (ref Data.CameraRoot[i0].VP.Roll ); + RKN(ref Data.CameraRoot[i0].VP.FocalLength); + RKN(ref Data.CameraRoot[i0].VP.FOV ); + RKN(ref Data.CameraRoot[i0].VP.Roll ); } if (Data.Chara != null) @@ -1380,7 +1412,7 @@ namespace KKdMainLib WO(ref Data.CameraRoot[i0].VP. MT, ReturnToOffset); WO(ref Data.CameraRoot[i0].Interest, ReturnToOffset); } - + if (Data.Chara != null) for (i0 = 0; i0 < Data.Chara.Length; i0++) WO(ref Data.Chara[i0].MT, ReturnToOffset); @@ -1422,7 +1454,7 @@ namespace KKdMainLib if (Data.ObjectHRC[i0].Node != null) for (i1 = 0; i1 < Data.ObjectHRC[i0].Node.Length; i1++) WO(ref Data.ObjectHRC[i0].Node[i1].MT, ReturnToOffset); - + if (Data.Point != null) for (i0 = 0; i0 < Data.Point.Length; i0++) WO(ref Data.Point[i0].MT, ReturnToOffset); @@ -1791,9 +1823,9 @@ namespace KKdMainLib MMT(ref Data.CameraRoot[i0]. MT, ref mData.CameraRoot[i0]. MT); MMT(ref Data.CameraRoot[i0].Interest, ref mData.CameraRoot[i0].Interest); MMT(ref Data.CameraRoot[i0].VP. MT, ref mData.CameraRoot[i0].VP. MT); - MK (ref Data.CameraRoot[i0].VP.FocalLength, ref mData.CameraRoot[i0].VP.FocalLength); - MK (ref Data.CameraRoot[i0].VP.FOV , ref mData.CameraRoot[i0].VP.FOV ); - MK (ref Data.CameraRoot[i0].VP.Roll , ref mData.CameraRoot[i0].VP.Roll ); + MKN(ref Data.CameraRoot[i0].VP.FocalLength, ref mData.CameraRoot[i0].VP.FocalLength); + MKN(ref Data.CameraRoot[i0].VP.FOV , ref mData.CameraRoot[i0].VP.FOV ); + MKN(ref Data.CameraRoot[i0].VP.Roll , ref mData.CameraRoot[i0].VP.Roll ); } if (Data.Chara != null && mData.Chara != null) @@ -2039,6 +2071,14 @@ namespace KKdMainLib }; } + if ((temp = a3d["Auth2D", true]).NotNull) + { + Data.Auth2D = new string[temp.Array.Length]; + + for (i = 0; i < Data.Auth2D.Length; i++) + Data.Auth2D[i] = temp[i].RS(); + } + if ((temp = a3d["CameraAuxiliary"]).NotNull) Data.CameraAuxiliary = new CameraAuxiliary { @@ -2063,10 +2103,18 @@ namespace KKdMainLib if ((temp1 = temp[i]["ViewPoint"]).IsNull) continue; - bool fovIsHorizontal = temp1.RB(temp1["FOVHorizontal"].NotNull - ? "FOVHorizontal" : "FOVIsHorizontal"); - - if (!fovIsHorizontal) + if (temp1[temp1["FOVHorizontal"].NotNull + ? "FOVHorizontal" : "FOVIsHorizontal"].NotNull) + Data.CameraRoot[i].VP = new CameraRoot.ViewPoint + { + MT = temp1.RMT(), + Aspect = temp1.RF32("Aspect"), + FOVIsHorizontal = temp1.RB(temp1["FOVHorizontal"].NotNull + ? "FOVHorizontal" : "FOVIsHorizontal"), + FOV = temp1.RK ("FOV" ), + Roll = temp1.RK ("Roll" ), + }; + else Data.CameraRoot[i].VP = new CameraRoot.ViewPoint { MT = temp1.RMT(), @@ -2074,18 +2122,8 @@ namespace KKdMainLib CameraApertureH = temp1.RF32("CameraApertureH"), CameraApertureW = temp1.RF32("CameraApertureW"), FocalLength = temp1.RK ("FocalLength" ), - FOVIsHorizontal = false, Roll = temp1.RK ("Roll" ), }; - else - Data.CameraRoot[i].VP = new CameraRoot.ViewPoint - { - MT = temp1.RMT(), - Aspect = temp1.RF32("Aspect"), - FOVIsHorizontal = true, - FOV = temp1.RK ("FOV" ), - Roll = temp1.RK ("Roll" ), - }; } } @@ -2112,11 +2150,7 @@ namespace KKdMainLib } if ((temp = a3d["DOF"]).NotNull) - Data.DOF = new DOF - { - MT = temp.RMT(), - Name = temp.RS("Name"), - }; + Data.DOF = new DOF { MT = temp.RMT() }; if ((temp = a3d["Event", true]).NotNull) { @@ -2168,7 +2202,6 @@ namespace KKdMainLib Data.Light[i] = new Light { Id = temp[i].RI32 ("Id" ), - Name = temp[i].RS ("Name" ), Type = temp[i].RS ("Type" ), Ambient = temp[i].RRGBAKN("Ambient" ), ConeAngle = temp[i].RKN ("ConeAngle" ), @@ -2188,7 +2221,6 @@ namespace KKdMainLib Data.Light[i] = new Light { Id = temp[i].RI32 ("Id" ), - Name = temp[i].RS ("Name" ), Type = temp[i].RS ("Type" ), Ambient = temp[i].RRGBAKN("Ambient" ), ConeAngle = temp[i].RKN ("ConeAngle" ), @@ -2212,10 +2244,10 @@ namespace KKdMainLib for (i = 0; i < Data.MaterialList.Length; i++) Data.MaterialList[i] = new MaterialList { - Name = temp[i].RS ( "Name"), - BlendColor = temp[i].RRGBAK( "BlendColor"), - GlowIntensity = temp[i].RK ("GlowIntensity"), - Incandescence = temp[i].RRGBAK("Incandescence"), + Name = temp[i].RS ( "Name"), + BlendColor = temp[i].RRGBAKN( "BlendColor"), + GlowIntensity = temp[i].RKN ("GlowIntensity"), + Incandescence = temp[i].RRGBAKN("Incandescence"), }; } @@ -2293,6 +2325,7 @@ namespace KKdMainLib MorphOffset = temp[i0].RF32("MorphOffset"), Name = temp[i0].RS ( "Name"), ParentName = temp[i0].RS ( "ParentName"), + ParentNode = temp[i0].RS ( "ParentNode"), Pat = temp[i0].RS ( "Pat" ), PatOffset = temp[i0].RF32( "PatOffset"), UIDName = temp[i0].RS ( "UIDName"), @@ -2359,9 +2392,11 @@ namespace KKdMainLib { Data.ObjectHRC[i0] = new ObjectHRC { - Name = temp[i0].RS( "Name"), - Shadow = temp[i0].RB( "Shadow"), - UIDName = temp[i0].RS("UIDName"), + Name = temp[i0].RS( "Name"), + ParentName = temp[i0].RS("ParentName"), + ParentNode = temp[i0].RS("ParentNode"), + Shadow = temp[i0].RB( "Shadow"), + UIDName = temp[i0].RS( "UIDName"), }; if ((temp1 = temp[i0]["Node", true]).NotNull) @@ -2466,6 +2501,14 @@ namespace KKdMainLib a3d.Add(ambient); } + if (Data.Auth2D != null) + { + MsgPack auth2D = new MsgPack(Data.Ambient.Length, "Auth2D"); + for (i = 0; i < Data.Ambient.Length; i++) + auth2D[i] = new MsgPack(null, Data.Ambient[i].Name); + a3d.Add(auth2D); + } + if (Data.CameraAuxiliary != null) { CameraAuxiliary ca = Data.CameraAuxiliary.Value; @@ -2483,14 +2526,13 @@ namespace KKdMainLib { MsgPack cameraRoot = new MsgPack(Data.CameraRoot.Length, "CameraRoot"); for (i = 0; i < Data.CameraRoot.Length; i++) - if (!Data.CameraRoot[i].VP.FOVIsHorizontal) + if (Data.CameraRoot[i].VP.FOV.HasValue) cameraRoot[i] = MsgPack.New .Add("Interest", ref Data.CameraRoot[i].Interest) .Add(new MsgPack("ViewPoint") .Add("Aspect" , Data.CameraRoot[i].VP.Aspect ) - .Add("CameraApertureH", Data.CameraRoot[i].VP.CameraApertureH) - .Add("CameraApertureW", Data.CameraRoot[i].VP.CameraApertureW) - .Add("FocalLength" , ref Data.CameraRoot[i].VP.FocalLength ) + .Add("FOVIsHorizontal", Data.CameraRoot[i].VP.FOVIsHorizontal) + .Add("FOV" , ref Data.CameraRoot[i].VP.FOV ) .Add("Roll" , ref Data.CameraRoot[i].VP.Roll ) .Add(ref Data.CameraRoot[i].VP.MT)) .Add(ref Data.CameraRoot[i]. MT); @@ -2499,8 +2541,9 @@ namespace KKdMainLib .Add("Interest", ref Data.CameraRoot[i].Interest) .Add(new MsgPack("ViewPoint") .Add("Aspect" , Data.CameraRoot[i].VP.Aspect ) - .Add("FOVIsHorizontal", Data.CameraRoot[i].VP.FOVIsHorizontal) - .Add("FOV" , ref Data.CameraRoot[i].VP.FOV ) + .Add("CameraApertureH", Data.CameraRoot[i].VP.CameraApertureH) + .Add("CameraApertureW", Data.CameraRoot[i].VP.CameraApertureW) + .Add("FocalLength" , ref Data.CameraRoot[i].VP.FocalLength ) .Add("Roll" , ref Data.CameraRoot[i].VP.Roll ) .Add(ref Data.CameraRoot[i].VP.MT)) .Add(ref Data.CameraRoot[i]. MT); @@ -2527,7 +2570,7 @@ namespace KKdMainLib if (Data.DOF != null) { DOF dof = Data.DOF.Value; - a3d.Add(new MsgPack("DOF").Add("Name", dof.Name).Add(ref dof.MT)); + a3d.Add(new MsgPack("DOF").Add(ref dof.MT)); Data.DOF = dof; } @@ -2564,7 +2607,6 @@ namespace KKdMainLib MsgPack light = new MsgPack(Data.Light.Length, "Light"); for (i = 0; i < Data.Light.Length; i++) light[i] = MsgPack.New.Add("Id" , Data.Light[i].Id) - .Add("Name", Data.Light[i].Name) .Add("Type", Data.Light[i].Type) .Add("Ambient" , ref Data.Light[i].Ambient ) .Add("ConeAngle" , ref Data.Light[i].ConeAngle ) @@ -2600,7 +2642,7 @@ namespace KKdMainLib instance[i1].Add("Shadow", true); instance[i1].Add("UIDName", Data.MObjectHRC[i0].Instances[i1].UIDName); } - + _mObjectHRC.Add(instance); } @@ -2665,14 +2707,15 @@ namespace KKdMainLib { MsgPack _object = MsgPack.New; if (Data.Object[i0].Morph != null) - _object.Add("Morph" , Data.Object[i0].Morph ) - .Add("MorphOffset", Data.Object[i0].MorphOffset); + _object = _object.Add("Morph" , Data.Object[i0].Morph ) + .Add("MorphOffset", Data.Object[i0].MorphOffset); _object.Add("Name", Data.Object[i0].Name); if (Data.Object[i0].Pat != null) - _object.Add("Pat" , Data.Object[i0].Pat ) - .Add("PatOffset", Data.Object[i0].PatOffset); - _object.Add("ParentName", Data.Object[i0].ParentName) - .Add( "UIDName", Data.Object[i0]. UIDName); + _object = _object.Add("Pat" , Data.Object[i0].Pat ) + .Add("PatOffset", Data.Object[i0].PatOffset); + _object = _object.Add("ParentName", Data.Object[i0].ParentName) + .Add("ParentNode", Data.Object[i0].ParentNode) + .Add( "UIDName", Data.Object[i0]. UIDName); if (Data.Object[i0].TexPat != null) { MsgPack texPat = new MsgPack(Data.Object[i0].TexPat.Length, "TexturePattern"); @@ -2680,8 +2723,8 @@ namespace KKdMainLib { texPat[i1] = MsgPack.New.Add("Name", Data.Object[i0].TexPat[i1].Name); if (Data.Object[i0].TexPat[i1].Pat != null) - texPat[i1].Add("Pat" , Data.Object[i0].TexPat[i1].Pat ) - .Add("PatOffset", Data.Object[i0].TexPat[i1].PatOffset); + texPat[i1] = texPat[i1].Add("Pat" , Data.Object[i0].TexPat[i1].Pat ) + .Add("PatOffset", Data.Object[i0].TexPat[i1].PatOffset); } _object.Add(texPat); } @@ -2714,10 +2757,13 @@ namespace KKdMainLib MsgPack objectHRC = new MsgPack(Data.ObjectHRC.Length, "ObjectHRC"); for (i0 = 0; i0 < Data.ObjectHRC.Length; i0++) { - MsgPack _objectHRC = MsgPack.New.Add("Name", Data.MObjectHRC[i0].Instances[i1].Name); - if (Data.MObjectHRC[i0].Instances[i1].Shadow) + MsgPack _objectHRC = MsgPack.New + .Add("Name", Data.ObjectHRC[i0].Name) + .Add("ParentName", Data.ObjectHRC[i0].ParentName) + .Add("ParentNode", Data.ObjectHRC[i0].ParentNode); + if (Data.ObjectHRC[i0].Shadow) _objectHRC.Add("Shadow", true); - _objectHRC.Add("UIDName", Data.MObjectHRC[i0].Instances[i1].UIDName); + _objectHRC.Add("UIDName", Data.ObjectHRC[i0].UIDName); if (Data.ObjectHRC[i0].Node != null) { @@ -2813,9 +2859,6 @@ namespace KKdMainLib public static Vec4? RRGBAKN(this MsgPack msgPack, string name) => msgPack[name].NotNull ? (Vec4?)msgPack[name].RRGBAK() : null; - public static Vec4 RRGBAK(this MsgPack msgPack, string name) => - msgPack[name].RRGBAK(); - public static Vec4 RRGBAK(this MsgPack msgPack) => new Vec4 { X = msgPack.RKN("R"), Y = msgPack.RKN("G"), Z = msgPack.RKN("B"), W = msgPack.RKN("A") }; diff --git a/KKdMainLib/DB/Auth.cs b/KKdMainLib/DB/Auth.cs index cd6e8e4..bd662f3 100644 --- a/KKdMainLib/DB/Auth.cs +++ b/KKdMainLib/DB/Auth.cs @@ -61,8 +61,7 @@ namespace KKdMainLib.DB s = File.OpenWriter(file + ".bin", true); s.W("#A3DA__________\n"); - s.W("#" + DateTime.UtcNow.ToString("ddd MMM dd HH:mm:ss yyyy", - System.Globalization.CultureInfo.InvariantCulture) + "\n"); + s.W("# date time was eliminated.\n"); if (Category != null) { @@ -75,18 +74,26 @@ namespace KKdMainLib.DB if (UIDs != null) { int[] so = UIDs.Length.SW(); + int max = -1; for (i = 0; i < UIDs.Length; i++) { if (UIDs[so[i]].Category != null && UIDs[so[i]].Category != "") s.W($"uid.{so[i]}.category=" + UIDs[so[i]].Category + "\n"); if (UIDs[so[i]].OrgUid != null) - s.W($"uid.{so[i]}.org_uid=" + UIDs[so[i]].OrgUid + "\n"); + { + int orgUid = UIDs[so[i]].OrgUid.Value; + s.W($"uid.{so[i]}.org_uid=" + orgUid + "\n"); + if (max < orgUid) + max = orgUid; + } if (UIDs[so[i]].Size != null) s.W($"uid.{so[i]}.size=" + UIDs[so[i]].Size + "\n"); if (UIDs[so[i]].Value != null && UIDs[so[i]].Value != "") s.W($"uid.{so[i]}.value=" + UIDs[so[i]].Value + "\n"); } s.W($"uid.length={UIDs.Length}\n"); + if (max != -1) + s.W($"uid.max={max}\n"); } s.C(); diff --git a/KKdMainLib/Extensions.cs b/KKdMainLib/Extensions.cs index d11f12c..8ff696d 100644 --- a/KKdMainLib/Extensions.cs +++ b/KKdMainLib/Extensions.cs @@ -163,7 +163,7 @@ namespace KKdMainLib if (@struct.HasSubStructs) for (int i = 0; i < @struct.SubStructs.Length; i++) stream.W(@struct.SubStructs[i], depth + 1, shiftX, useDepth); - if (@struct.HasPOF || @struct.HasENRS || @struct.HasSubStructs) + if (@struct.HasPOF || @struct.HasENRS || @struct.HasSubStructs) stream.WEOFC(depth + 1); } } @@ -270,7 +270,7 @@ namespace KKdMainLib { uint a, b, hash; int i; - + const uint m = 0x7FD652AD; const int r = 16; diff --git a/KKdMainLib/F2/Bloom.cs b/KKdMainLib/F2/Bloom.cs index e0a257f..656c847 100644 --- a/KKdMainLib/F2/Bloom.cs +++ b/KKdMainLib/F2/Bloom.cs @@ -98,7 +98,7 @@ namespace KKdMainLib.F2 s.W(blt.Brightpass.Z); s.W(blt.Range ); } - + e.Array = new ENRS.ENRSEntry[2]; e.Array[0] = new ENRS.ENRSEntry(0x00, 0x01, 0x10, 0x01); e.Array[0].Sub[0] = new ENRS.ENRSEntry.SubENRSEntry(0x00, 0x02, ENRS.ENRSEntry.Type.DWORD); diff --git a/KKdMainLib/F2/ColorCorrection.cs b/KKdMainLib/F2/ColorCorrection.cs index af06796..8fa021a 100644 --- a/KKdMainLib/F2/ColorCorrection.cs +++ b/KKdMainLib/F2/ColorCorrection.cs @@ -99,7 +99,7 @@ namespace KKdMainLib.F2 s.W(cct.Gamma.Z ); s.W(cct.Contrast ); } - + e.Array = new ENRS.ENRSEntry[2]; e.Array[0] = new ENRS.ENRSEntry(0x00, 0x01, 0x10, 0x01); e.Array[0].Sub[0] = new ENRS.ENRSEntry.SubENRSEntry(0x00, 0x02, ENRS.ENRSEntry.Type.DWORD); diff --git a/KKdMainLib/F2/DOF.cs b/KKdMainLib/F2/DOF.cs index a7fd453..f40d128 100644 --- a/KKdMainLib/F2/DOF.cs +++ b/KKdMainLib/F2/DOF.cs @@ -91,7 +91,7 @@ namespace KKdMainLib.F2 s.W(dft.Ratio ); s.W(dft.Quality ); } - + e.Array = new ENRS.ENRSEntry[2]; e.Array[0] = new ENRS.ENRSEntry(0x00, 0x01, 0x10, 0x01); e.Array[0].Sub[0] = new ENRS.ENRSEntry.SubENRSEntry(0x00, 0x02, ENRS.ENRSEntry.Type.DWORD); diff --git a/KKdMainLib/F2/Light.cs b/KKdMainLib/F2/Light.cs index e736466..d32435c 100644 --- a/KKdMainLib/F2/Light.cs +++ b/KKdMainLib/F2/Light.cs @@ -895,7 +895,7 @@ namespace KKdMainLib.F2 ToneCurve = 0b00000001000000000, } } - + public struct LITX { public int C; diff --git a/KKdMainLib/KKdMainLib.csproj b/KKdMainLib/KKdMainLib.csproj index 12c5c68..6cfd21a 100644 --- a/KKdMainLib/KKdMainLib.csproj +++ b/KKdMainLib/KKdMainLib.csproj @@ -6,12 +6,12 @@ korenkonder (C) 2018-2021 A simple library for working with Project Diva AC/DT/F/AFT/F2/X/XHD/FT/VRFL/M39 files - 0.4.10.7 + 0.4.10.8 KKdMainLib KKdMainLib net461 KKdMainLib - 0.4.10.7 + 0.4.10.8 AnyCPU diff --git a/KKdMainLib/MotHead.cs b/KKdMainLib/MotHead.cs index 662e55e..48a68d1 100644 --- a/KKdMainLib/MotHead.cs +++ b/KKdMainLib/MotHead.cs @@ -22,12 +22,12 @@ namespace KKdMainLib s.P = 0; Header. MotionSetID = s.RI32(); - Header.StartMotionID = s.RI32(); - Header. EndMotionID = s.RI32(); + Header.FirstMotionID = s.RI32(); + Header. LastMotionID = s.RI32(); Header.SubHeaderOffset = s.RI32(); if (Header.SubHeaderOffset < 0x10) goto RETURN; - i0 = Header.EndMotionID - Header.StartMotionID; + i0 = Header.LastMotionID - Header.FirstMotionID; if (i0 < 0) goto RETURN; s.P = Header.SubHeaderOffset; @@ -39,10 +39,13 @@ namespace KKdMainLib s.P = Header.Data[i].Offset; - Header.Data[i].MotionID = Header.StartMotionID + i; - Header.Data[i].SomeData = s.RI32(); - s.RI64(); - s.RI64(); + Header.Data[i].MotionID = Header.FirstMotionID + i; + Header.Data[i].Field00 = s.RI32(); + 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(); Header.Data[i].Offset2 = s.RI32(); Header.Data[i].DataHeaderOffset = s.RI32(); @@ -55,7 +58,7 @@ namespace KKdMainLib 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 = s.RI32(); + Header.Data[i].Array[i0].Type = (Type)s.RI32(); Header.Data[i].Array[i0].Frame = s.RI32(); Header.Data[i].Array[i0].Offset = s.RI32(); } @@ -73,17 +76,18 @@ namespace KKdMainLib Header.Data[i].Array2 = new HeaderData.Sub.Data2[i0]; for (i0 = 0; i0 < Header.Data[i].Array2.Length; i0++) { - Header.Data[i].Array2[i0].Frame = s.RI32(); + Header.Data[i].Array2[i0].Type = s.RI32(); Header.Data[i].Array2[i0].Offset = s.RI32(); } 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 = Header.Data[i].Array2[i0].Offset; - Header.Data[i].Array2[i0].Array = new int[7]; - for (i1 = 0; i1 < Header.Data[i].Array2[i0].Array.Length; i1++) - Header.Data[i].Array2[i0].Array[i1] = s.RI32(); + s.P = Data.Offset; + Data.Array = s.RBy(i1); } } @@ -94,17 +98,10 @@ namespace KKdMainLib 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; - if (i1 == 0x01) Data.Array = new int[] { s.RU8 () }; - else if (i1 == 0x02) Data.Array = new int[] { s.RU16() }; - else - { - Data.Array = new int[i1 / 4]; - for (i1 = 0; i1 < Data.Array.Length; i1++) Data.Array[i1] = s.RI32(); - } + Data.Array = s.RBy(i1); } } } @@ -117,14 +114,14 @@ RETURN: { if (Header.Data == null || Header.Data.Length < 1) return; - Header.StartMotionID = 0x7FFFFFFF; - Header.EndMotionID = 0x00000000; + Header.FirstMotionID = 0x7FFFFFFF; + Header. LastMotionID = 0x00000000; for (i = 0; i < Header.Data.Length; i++) { - if (Header.Data[i].MotionID < Header.StartMotionID) - Header.StartMotionID = Header.Data[i].MotionID; - if (Header.Data[i].MotionID > Header. EndMotionID) - Header. EndMotionID = Header.Data[i].MotionID; + 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); @@ -134,9 +131,9 @@ RETURN: s.O = 0x20; s.P = 0; s.W(0); - for (int I = Header.EndMotionID - Header.StartMotionID; I > -1; I--) + for (int I = Header.LastMotionID - Header.FirstMotionID; I > -1; I--) for (i = 0; i < Header.Data.Length; i++) - if (Header.StartMotionID + I == Header.Data[i].MotionID) + if (Header.FirstMotionID + I == Header.Data[i].MotionID) { s.A(0x20, true); Header.Data[i].Offset = s.P; @@ -156,54 +153,55 @@ RETURN: int Size = GetSize(data.Type); if (data.Array == null || data.Array.Length < 1 || Size < 1) continue; - if (data.Type == 0x3E || data.Type == 0x49) s.A(0x20, true); + if ((int)data.Type == 0x3E || (int)data.Type == 0x49) + s.A(0x20, true); data.Offset = s.P; - if (Size == 0x01) s.W(( byte)data.Array[0]); - else if (Size == 0x02) s.W((short)data.Array[0]); - else - { - if (s.P % 0x4 != 0) s.A(0x04, true); - Size /= 4; - - data.Offset = s.P; - for (i1 = 0; i1 < data.Array.Length && i1 < Size; i1++) - s.W(data.Array[i1]); - - for (; i1 < Size; i1++) s.W(0); - } + 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); + s.W(data.Array); + if ((int)data.Type == 0x3C) + s.A(0x20, true); } - if (Header.Data[i].Array2 != null) - if (Header.Data[i].Array2.Length > 0) + 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--) { - Header.Data[i].Offset2 = s.P; + 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; - for (i0 = 0; i0 < Header.Data[i].Array2.Length; i0++) - { s.W( 0); s.W(0); } - s.W(-1); s.W(0); + data.Offset = s.P; - for (i0 = Header.Data[i].Array2.Length - 1; i0 > -1; i0--) - { - Header.Data[i].Array2[i0].Offset = s.P; - for (i1 = 0; i1 < Header.Data[i].Array2[i0].Array.Length && i1 < 7; i1++) - s.W(Header.Data[i].Array2[i0].Array[i1]); - - for (; i1 < 7; i1++) s.W(0); - } - } - 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); + s.W(data.Array); + } + break; + } } - s.A(0x04, true); + s.A(0x20, true); + Header.SubHeaderOffset = s.P; - i1 = Header.EndMotionID - Header.StartMotionID; + i1 = 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.StartMotionID + i == Header.Data[i0].MotionID) + if (Header.FirstMotionID + i == Header.Data[i0].MotionID) { offset = Header.Data[i0].Offset; break; } s.W(offset); } @@ -212,10 +210,12 @@ RETURN: for (i = 0; i < Header.Data.Length; i++) { s.P = Header.Data[i].Offset; - s.W(Header.Data[i].SomeData); - s.W(0); - s.W(0L); - s.W(0x040004); + 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); @@ -223,7 +223,7 @@ RETURN: s.P = Header.Data[i].DataHeaderOffset; for (i0 = 0; i0 < Header.Data[i].Array.Length; i0++) { - s.W(Header.Data[i].Array[i0].Type ); + 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); } @@ -232,15 +232,15 @@ RETURN: if (Header.Data[i].Array2 != null) for (i0 = 0; i0 < Header.Data[i].Array2.Length; i0++) { - s.W(Header.Data[i].Array2[i0].Frame ); + 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.StartMotionID ); - s.W(Header. EndMotionID ); + s.W(Header.FirstMotionID ); + s.W(Header. LastMotionID ); s.W(Header.SubHeaderOffset); s.C(); } @@ -254,14 +254,18 @@ RETURN: if ((motHead = msgPack["MotHead"]).IsNull) return; Header.MotionSetID = motHead.RI32("MotionSetID"); - MsgPack temp = MsgPack.New; 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].RI32("MotionID"); - Header.Data[i].SomeData = motions[i].RI32("SomeData"); + 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) @@ -270,14 +274,17 @@ RETURN: for (i0 = 0; i0 < Header.Data[i].Array2.Length; i0++) { - Header.Data[i].Array2[i0].Frame = array2[i0].RI32("Frame"); + 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; - Header.Data[i].Array2[i0].Array = new int[arrayArray.Array.Length]; - for (i1 = 0; i1 < Header.Data[i].Array2[i0].Array.Length; i1++) - Header.Data[i].Array2[i0].Array[i1] = arrayArray[i1].RI32(); + data.Array = new byte[arrayArray.Array.Length]; + for (i1 = 0; i1 < arrayArray.Array.Length; i1++) + data.Array.GBy(arrayArray[i1].RU8(), i1); } } @@ -288,196 +295,266 @@ RETURN: for (i0 = 0; i0 < Header.Data[i].Array.Length; i0++) { ref HeaderData.Sub.Data data = ref Header.Data[i].Array[i0]; - data.Type = array[i0].RI32("Type"); + System.Enum.TryParse(array[i0].RS("Type"), out data.Type); data.Frame = array[i0].RI32("Frame"); + MsgPack temp = array[i0]["Data"]; - if ((temp = array[i0]["Type3"]).NotNull) + if (temp.IsNull) { - data.Type = 0x03; - data.Array = new int[] { temp.RI32("i0") }; - } - else if ((temp = array[i0]["Type53"]).NotNull) - { - data.Type = 0x35; - data.Array = new int[] { temp.RI32("i0"), - temp.RF32("f1").ToI32(), - temp.RF32("f2").ToI32(), - temp.RI32("i3") }; - } - else if ((temp = array[i0]["Type54"]).NotNull) - { - data.Type = 0x36; - data.Array = new int[] { temp.RI32("i0"), - temp.RF32("f1").ToI32(), - temp.RF32("f2").ToI32(), - temp.RI32("i3") }; - } - else if ((temp = array[i0]["Type55"]).NotNull) - { - data.Type = 0x37; - data.Array = new int[] { temp.RI32("i0"), - temp.RF32("f1").ToI32(), - temp.RF32("f2").ToI32(), - temp.RI32("i3") }; - } - else if ((temp = array[i0]["Type56"]).NotNull) - { - data.Type = 0x38; - data.Array = new int[] { temp.RI32("i0"), - temp.RF32("f1").ToI32(), - temp.RF32("f2").ToI32(), - temp.RI32("i3") }; - } - else if ((temp = array[i0]["Type57"]).NotNull) - { - data.Type = 0x39; - data.Array = new int[] { temp.RI32("i0"), - temp.RF32("f1").ToI32(), - temp.RF32("f2").ToI32(), - temp.RI32("i3") }; - } - else if ((temp = array[i0]["Type60"]).NotNull) - { - data.Type = 0x3C; - data.Array = new int[] { temp.RI32("i0"), - temp.RF32("f1").ToI32(), - temp.RF32("f2").ToI32(), - temp.RF32("f3").ToI32() }; - } - else if ((temp = array[i0]["Type61"]).NotNull) - { - data.Type = 0x3D; - data.Array = new int[] { temp.RI32("i0"), temp.RF32("f1").ToI32() }; - } - else if ((temp = array[i0]["Type62"]).NotNull) - { - data.Type = 0x3E; - data.Array = new int[0x10]; - data.Array[ 0] = temp.RI32("i0"); - data.Array[ 1] = - ((byte)temp.RI32("i1_3") << 24) | ((byte)temp.RI32("i1_2") << 16) | - ((byte)temp.RI32("i1_1") << 8) | (byte)temp.RI32("i1_0"); - data.Array[ 2] = temp.RF32("f2" ).ToI32(); - data.Array[ 3] = temp.RF32("f3" ).ToI32(); - data.Array[ 4] = temp.RF32("f4" ).ToI32(); - data.Array[ 5] = temp.RF32("f5" ).ToI32(); - data.Array[ 6] = temp.RF32("f6" ).ToI32(); - data.Array[ 7] = temp.RF32("f7" ).ToI32(); - data.Array[ 8] = temp.RF32("f8" ).ToI32(); - data.Array[ 9] = temp.RF32("f9" ).ToI32(); - data.Array[10] = temp.RF32("f10").ToI32(); - data.Array[11] = temp.RF32("f11").ToI32(); - data.Array[12] = temp.RF32("f12").ToI32(); - data.Array[13] = temp.RF32("f13").ToI32(); - data.Array[14] = temp.RF32("f14").ToI32(); - data.Array[15] = temp.RI32("i15"); - } - else if ((temp = array[i0]["Type65"]).NotNull) - { - data.Type = 0x41; - data.Array = new int[] { temp.RI32("i0") }; - } - else if ((temp = array[i0]["Type66"]).NotNull) - { - data.Type = 0x42; - data.Array = new int[] { temp.RF32("f0").ToI32() }; - } - else if ((temp = array[i0]["Type67"]).NotNull) - { - data.Type = 0x43; - data.Array = new int[] { temp.RI32("i0"), temp.RF32("f1").ToI32() }; - } - else if ((temp = array[i0]["Type68"]).NotNull) - { - data.Type = 0x44; - data.Array = new int[] { temp.RI32("i0"), temp.RF32("f1").ToI32() }; - } - else if ((temp = array[i0]["Type69"]).NotNull) - { - data.Type = 0x45; - data.Array = new int[] { temp.RI32("i0"), temp.RI32("i1") }; - } - else if ((temp = array[i0]["Type70"]).NotNull) - { - data.Type = 0x46; - data.Array = new int[] { temp.RI32("i0") }; - } - else if ((temp = array[i0]["Type71"]).NotNull) - { - data.Type = 0x47; - data.Array = new int[] { temp.RI32("i0"), temp.RF32("f1").ToI32() }; - } - else if ((temp = array[i0]["Type72"]).NotNull) - { - data.Type = 0x48; - data.Array = new int[] { temp.RI32("i0"), temp.RF32("f1").ToI32() }; - } - else if ((temp = array[i0]["Type73"]).NotNull) - { - data.Type = 0x49; - data.Array = new int[] { temp.RI32("i0"), - temp.RF32("f1").ToI32(), - temp.RI32("i2"), - temp.RF32("f3").ToI32(), - temp.RI32("i4"), - temp.RI32("i5"), - temp.RI32("i6"), - temp.RI32("i7"), - temp.RI32("i8"), - temp.RI32("i9"), - temp.RI32("i10"), - temp.RI32("i11") }; - } - else if ((temp = array[i0]["Type74"]).NotNull) - { - data.Type = 0x4A; - data.Array = new int[] { temp.RI32("i0") }; - } - else if ((temp = array[i0]["Type62"]).NotNull) - { - data.Type = 0x4B; - data.Array = new int[0x0D]; - data.Array[ 0] = temp.RI32("i0"); - data.Array[ 1] = ((byte)temp.RI32("i1_1") << 8) | (byte)temp.RI32("i1_0"); - data.Array[ 2] = temp.RF32("f2" ).ToI32(); - data.Array[ 3] = temp.RF32("f3" ).ToI32(); - data.Array[ 4] = temp.RF32("f4" ).ToI32(); - data.Array[ 5] = temp.RF32("f5" ).ToI32(); - data.Array[ 6] = temp.RF32("f6" ).ToI32(); - data.Array[ 7] = temp.RF32("f7" ).ToI32(); - data.Array[ 8] = temp.RF32("f8" ).ToI32(); - data.Array[ 9] = temp.RF32("f9" ).ToI32(); - data.Array[10] = temp.RF32("f10").ToI32(); - data.Array[11] = temp.RF32("f11").ToI32(); - data.Array[12] = temp.RF32("f12").ToI32(); - } - else if ((temp = array[i0]["Type76"]).NotNull) - { - data.Type = 0x4C; - data.Array = new int[] { temp.RI32("i0"), - temp.RF32("f1").ToI32(), - temp.RF32("f2").ToI32() }; - } - else if ((temp = array[i0]["Type77"]).NotNull) - { - data.Type = 0x4D; - data.Array = new int[] { temp.RI32("i0") }; - } - else if ((temp = array[i0]["Type79"]).NotNull) - { - data.Type = 0x4F; - data.Array = new int[] { temp.RI32("i0") }; - } - else if ((temp = array[i0]["Type80"]).NotNull) - { - data.Type = 0x50; - data.Array = new int[] { temp.RI32("i0") }; - } - else if ((temp = array[i0]["Array", true]).NotNull) - { - data.Array = new int[temp.Array.Length]; + 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] = temp[i1].RI32(); + 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.RI32("i08"), 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: + data.Array.GBy(temp.RI32("i00"), 0x00); + data.Array.GBy(temp.RF32("f04"), 0x04); + break; + case 0x35: + 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.RI32("i0C"), 0x0C); + data.Array.GBy(temp.RF32("f10"), 0x10); + break; + case 0x36: + 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.RI32("i0C"), 0x0C); + data.Array.GBy(temp.RF32("f10"), 0x10); + break; + case 0x37: + 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.RI32("i0C"), 0x0C); + data.Array.GBy(temp.RF32("f10"), 0x10); + break; + case 0x38: + 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.RI32("i0C"), 0x0C); + data.Array.GBy(temp.RF32("f10"), 0x10); + break; + case 0x39: + 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.RI32("i0C"), 0x0C); + data.Array.GBy(temp.RF32("f10"), 0x10); + break; + case 0x3A: + 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.RI32("i0C"), 0x0C); + data.Array.GBy(temp.RF32("f10"), 0x10); + break; + case 0x3B: + data.Array.GBy(temp.RI32("i00"), 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: + data.Array.GBy(temp.RI32("i00"), 0x00); + data.Array.GBy(temp.RF32("f04"), 0x04); + break; + case 0x3E: + data.Array.GBy(temp.RI32("i00"), 0x00); + data.Array.GBy(temp.RU8("i04_8"), 0x04); + data.Array.GBy(temp.RU8("i05_8"), 0x05); + data.Array.GBy(temp.RU8("i06_8"), 0x06); + data.Array.GBy(temp.RU8("i07_8"), 0x07); + 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); + 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.RF32("f30"), 0x30); + data.Array.GBy(temp.RF32("f34"), 0x34); + data.Array.GBy(temp.RF32("f38"), 0x38); + break; + case 0x42: + 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: + data.Array.GBy(temp.RU8("i00_8"), 0x00); + data.Array.GBy(temp.RF32("f04"), 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: + 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.RI16("i08_16"), 0x08); + data.Array.GBy(temp.RF32("f0C"), 0x0C); + data.Array.GBy(temp.RI32("i10"), 0x10); + data.Array.GBy(temp.RI32("i14"), 0x14); + data.Array.GBy(temp.RI32("i18"), 0x18); + data.Array.GBy(temp.RI32("i1C"), 0x1C); + data.Array.GBy(temp.RU8("i20"), 0x20); + data.Array.GBy(temp.RU8("i21"), 0x21); + data.Array.GBy(temp.RU8("i22"), 0x22); + data.Array.GBy(temp.RU8("i23"), 0x23); + data.Array.GBy(temp.RF32("f24"), 0x24); + data.Array.GBy(temp.RI32("i28"), 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: + data.Array.GBy(temp.RI32("i00"), 0x00); + data.Array.GBy(temp.RU8("i04_8"), 0x04); + data.Array.GBy(temp.RU8("i05_8"), 0x05); + 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); + 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.RF32("f30"), 0x30); + break; + case 0x4C: + data.Array.GBy(temp.RI16("i00_16"), 0x00); + data.Array.GBy(temp.RF32("f04"), 0x04); + data.Array.GBy(temp.RF32("f08"), 0x08); + break; + case 0x4D: + data.Array.GBy(temp.RU8("i00_8"), 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: + data.Array.GBy(temp.RU8("i00_8"), 0x00); + break; + case 0x50: + data.Array.GBy(temp.RU8("i00_8"), 0x00); + break; } } } @@ -498,181 +575,323 @@ RETURN: if (Header.Data[i].Offset < 0x10) continue; MsgPack motion = MsgPack.New .Add("MotionID", Header.Data[i].MotionID) - .Add("SomeData", Header.Data[i].SomeData); + .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 < 1) { } - else + 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); - if (data.Array == null || data.Array.Length < 1) - arrayEntry.Add("Type", data.Type); - else if (data.Type == 0x03) - arrayEntry.Add(new MsgPack("Type3") - .Add("i0", data.Array[0])); - else if (data.Type == 0x35) - arrayEntry.Add(new MsgPack("Type53") - .Add("i0", data.Array[0]) - .Add("f1", data.Array[1].ToF32()) - .Add("f2", data.Array[2].ToF32()) - .Add("i3", data.Array[3])); - else if (data.Type == 0x36) - arrayEntry.Add(new MsgPack("Type54") - .Add("i0", data.Array[0]) - .Add("f1", data.Array[1].ToF32()) - .Add("f2", data.Array[2].ToF32()) - .Add("i3", data.Array[3])); - else if (data.Type == 0x37) - arrayEntry.Add(new MsgPack("Type55") - .Add("i0", data.Array[0]) - .Add("f1", data.Array[1].ToF32()) - .Add("f2", data.Array[2].ToF32()) - .Add("i3", data.Array[3])); - else if (data.Type == 0x38) - arrayEntry.Add(new MsgPack("Type56") - .Add("i0", data.Array[0]) - .Add("f1", data.Array[1].ToF32()) - .Add("f2", data.Array[2].ToF32()) - .Add("i3", data.Array[3])); - else if (data.Type == 0x39) - arrayEntry.Add(new MsgPack("Type57") - .Add("i0", data.Array[0]) - .Add("f1", data.Array[1].ToF32()) - .Add("f2", data.Array[2].ToF32()) - .Add("i3", data.Array[3])); - else if (data.Type == 0x3C) - arrayEntry.Add(new MsgPack("Type60") - .Add("i0", data.Array[0]) - .Add("f1", data.Array[1].ToF32()) - .Add("f2", data.Array[2].ToF32()) - .Add("f3", data.Array[3].ToF32())); - else if (data.Type == 0x3D) - arrayEntry.Add(new MsgPack("Type61") - .Add("i0", data.Array[0]) - .Add("f1", data.Array[1].ToF32())); - else if (data.Type == 0x3E) - arrayEntry.Add(new MsgPack("Type62") - .Add("i0", data.Array[0]) - .Add("i1_0", (byte) data.Array[1]) - .Add("i1_1", (byte)(data.Array[1] >> 8)) - .Add("i1_2", (byte)(data.Array[1] >> 16)) - .Add("i1_3", (byte)(data.Array[1] >> 24)) - .Add("f2" , data.Array[ 2].ToF32()) - .Add("f3" , data.Array[ 3].ToF32()) - .Add("f4" , data.Array[ 4].ToF32()) - .Add("f5" , data.Array[ 5].ToF32()) - .Add("f6" , data.Array[ 6].ToF32()) - .Add("f7" , data.Array[ 7].ToF32()) - .Add("f8" , data.Array[ 8].ToF32()) - .Add("f9" , data.Array[ 9].ToF32()) - .Add("f10", data.Array[10].ToF32()) - .Add("f11", data.Array[11].ToF32()) - .Add("f12", data.Array[12].ToF32()) - .Add("f13", data.Array[13].ToF32()) - .Add("f14", data.Array[14].ToF32()) - .Add("i15", data.Array[15])); - else if (data.Type == 0x41) - arrayEntry.Add(new MsgPack("Type65") - .Add("i0", data.Array[0])); - else if (data.Type == 0x42) - arrayEntry.Add(new MsgPack("Type66") - .Add("f0", data.Array[0].ToF32())); - else if (data.Type == 0x43) - arrayEntry.Add(new MsgPack("Type67") - .Add("i0", data.Array[0]) - .Add("f1", data.Array[1].ToF32())); - else if (data.Type == 0x44) - arrayEntry.Add(new MsgPack("Type68") - .Add("i0", data.Array[0]) - .Add("f1", data.Array[1].ToF32())); - else if (data.Type == 0x45) - arrayEntry.Add(new MsgPack("Type69") - .Add("i0", data.Array[0]) - .Add("i1", data.Array[1])); - else if (data.Type == 0x46) - arrayEntry.Add(new MsgPack("Type70") - .Add("i0", data.Array[0])); - else if (data.Type == 0x47) - arrayEntry.Add(new MsgPack("Type71") - .Add("i0", data.Array[0]) - .Add("f1", data.Array[1].ToF32())); - else if (data.Type == 0x48) - arrayEntry.Add(new MsgPack("Type72") - .Add("i0", data.Array[0]) - .Add("f1", data.Array[1].ToF32())); - else if (data.Type == 0x49) - arrayEntry.Add(new MsgPack("Type73") - .Add("i0", data.Array[0]) - .Add("f1", data.Array[1].ToF32()) - .Add("i2", data.Array[2]) - .Add("f3", data.Array[3].ToF32()) - .Add("i4", data.Array[4]) - .Add("i5", data.Array[5]) - .Add("i6", data.Array[6]) - .Add("i7", data.Array[7]) - .Add("i8", data.Array[8]) - .Add("i9", data.Array[9]) - .Add("i10", data.Array[10]) - .Add("i11", data.Array[11])); - else if (data.Type == 0x4A) - arrayEntry.Add(new MsgPack("Type74") - .Add("i0", data.Array[0])); - else if (data.Type == 0x4B) - arrayEntry.Add(new MsgPack("Type75") - .Add("i0", data.Array[0]) - .Add("i1_0", (byte) data.Array[1]) - .Add("i1_1", (byte)(data.Array[1] >> 8)) - .Add("f2" , data.Array[ 2].ToF32()) - .Add("f3" , data.Array[ 3].ToF32()) - .Add("f4" , data.Array[ 4].ToF32()) - .Add("f5" , data.Array[ 5].ToF32()) - .Add("f6" , data.Array[ 6].ToF32()) - .Add("f7" , data.Array[ 7].ToF32()) - .Add("f8" , data.Array[ 8].ToF32()) - .Add("f9" , data.Array[ 9].ToF32()) - .Add("f10", data.Array[10].ToF32()) - .Add("f11", data.Array[11].ToF32()) - .Add("f12", data.Array[12].ToF32())); - else if (data.Type == 0x4C) - arrayEntry.Add(new MsgPack("Type76") - .Add("i0", data.Array[0]) - .Add("f1", data.Array[1].ToF32()) - .Add("f2", data.Array[2].ToF32())); - else if (data.Type == 0x4D) - arrayEntry.Add(new MsgPack("Type77") - .Add("i0", data.Array[0])); - else if (data.Type == 0x4F) - arrayEntry.Add(new MsgPack("Type79") - .Add("i0", data.Array[0])); - else if (data.Type == 0x50) - arrayEntry.Add(new MsgPack("Type80") - .Add("i0", data.Array[0])); - else + switch ((int)data.Type) { - arrayEntry.Add("Type", data.Type); - MsgPack arrayArray = new MsgPack(data.Array.Length, "Array"); - for (i1 = 0; i1 < data.Array.Length; i1++) - arrayArray[i1] = data.Array[i1]; - arrayEntry.Add(arrayArray); + 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("i08", data.Array.TI32(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[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: + arrayEntry.Add(new MsgPack("Data") + .Add("i00", data.Array.TI32(0x00)) + .Add("f04", data.Array.TF32(0x04))); + break; + case 0x35: + arrayEntry.Add(new MsgPack("Data") + .Add("i00", data.Array.TI32(0x00)) + .Add("f04", data.Array.TF32(0x04)) + .Add("f08", data.Array.TF32(0x08)) + .Add("i0C", data.Array.TI32(0x0C)) + .Add("f10", data.Array.TF32(0x10))); + break; + case 0x36: + arrayEntry.Add(new MsgPack("Data") + .Add("i00", data.Array.TI32(0x00)) + .Add("f04", data.Array.TF32(0x04)) + .Add("f08", data.Array.TF32(0x08)) + .Add("i0C", data.Array.TI32(0x0C)) + .Add("f10", data.Array.TF32(0x10))); + break; + case 0x37: + arrayEntry.Add(new MsgPack("Data") + .Add("i00", data.Array.TI32(0x00)) + .Add("f04", data.Array.TF32(0x04)) + .Add("f08", data.Array.TF32(0x08)) + .Add("i0C", data.Array.TI32(0x0C)) + .Add("f10", data.Array.TF32(0x10))); + break; + case 0x38: + arrayEntry.Add(new MsgPack("Data") + .Add("i00", data.Array.TI32(0x00)) + .Add("f04", data.Array.TF32(0x04)) + .Add("f08", data.Array.TF32(0x08)) + .Add("i0C", data.Array.TI32(0x0C)) + .Add("f10", data.Array.TF32(0x10))); + break; + case 0x39: + arrayEntry.Add(new MsgPack("Data") + .Add("i00", data.Array.TI32(0x00)) + .Add("f04", data.Array.TF32(0x04)) + .Add("f08", data.Array.TF32(0x08)) + .Add("i0C", data.Array.TI32(0x0C)) + .Add("f10", data.Array.TF32(0x10))); + break; + case 0x3A: + arrayEntry.Add(new MsgPack("Data") + .Add("i00", data.Array.TI32(0x00)) + .Add("f04", data.Array.TF32(0x04)) + .Add("f08", data.Array.TF32(0x08)) + .Add("i0C", data.Array.TI32(0x0C)) + .Add("f10", data.Array.TF32(0x10))); + break; + case 0x3B: + arrayEntry.Add(new MsgPack("Data") + .Add("i00", 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: + arrayEntry.Add(new MsgPack("Data") + .Add("i00", data.Array.TI32(0x00)) + .Add("f04", data.Array.TF32(0x04))); + break; + case 0x3E: + arrayEntry.Add(new MsgPack("Data") + .Add("i00", data.Array.TI32(0x00)) + .Add("i04_8", data.Array[0x04]) + .Add("i05_8", data.Array[0x05]) + .Add("i06_8", data.Array[0x06]) + .Add("i07_8", data.Array[0x07]) + .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)) + .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("f30", data.Array.TF32(0x30)) + .Add("f34", data.Array.TF32(0x34)) + .Add("f38", data.Array.TF32(0x38))); + break; + case 0x42: + 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: + arrayEntry.Add(new MsgPack("Data") + .Add("i00_8", data.Array[0x00]) + .Add("f04", 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[0x18]) + .Add("i19_8", data.Array[0x19]) + .Add("i1A_8", data.Array[0x1A])); + break; + case 0x49: + 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("i08_16", data.Array.TI16(0x08)) + .Add("f0C", data.Array.TF32(0x0C)) + .Add("i10", data.Array.TI32(0x10)) + .Add("i14", data.Array.TI32(0x14)) + .Add("i18", data.Array.TI32(0x18)) + .Add("i1C", data.Array.TI32(0x1C)) + .Add("i20_8", data.Array[0x20]) + .Add("i21_8", data.Array[0x21]) + .Add("i22_8", data.Array[0x22]) + .Add("i23_8", data.Array[0x23]) + .Add("f24", data.Array.TI32(0x24)) + .Add("i28", data.Array.TI32(0x28)) + .Add("i2C", data.Array.TI32(0x2C))); + break; + case 0x4A: + arrayEntry.Add(new MsgPack("Data") + .Add("i00_8", data.Array[0x00]) + .Add("i01_8", data.Array[0x01])); + break; + case 0x4B: + arrayEntry.Add(new MsgPack("Data") + .Add("i00", data.Array.TI32(0x00)) + .Add("i04_8", data.Array[0x04]) + .Add("i05_8", data.Array[0x05]) + .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)) + .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("f30", data.Array.TF32(0x30))); + break; + case 0x4C: + 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 0x4D: + arrayEntry.Add(new MsgPack("Data") + .Add("i00_8", data.Array[0x00])); + break; + case 0x4E: + arrayEntry.Add(new MsgPack("Data") + .Add("i00_16", data.Array.TI16(0x00)) + .Add("i02_8", data.Array[0x02]) + .Add("i03_8", data.Array[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: + arrayEntry.Add(new MsgPack("Data") + .Add("i00_8", data.Array[0])); + break; + case 0x50: + arrayEntry.Add(new MsgPack("Data") + .Add("i00_8", data.Array[0])); + break; + 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 < 1) { } - else + 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("Frame", Header.Data[i].Array2[i0].Frame); - if (Header.Data[i].Array2[i0].Array == null || Header.Data[i].Array2[i0].Array.Length < 1) { } - else + 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++) @@ -691,19 +910,20 @@ RETURN: motHead.WriteAfterAll(false, true, file, json); } - private static int GetSize(int Type) => - Type switch + private static int GetSize(Type Type) => + (int)Type switch { 0x02 => 0x02, 0x03 => 0x04, 0x04 => 0x04, - 0x07 => 0x08, + 0x07 => 0x0C, 0x08 => 0x08, 0x0D => 0x0C, 0x11 => 0x1C, - 0x1D => 0x30, + 0x1D => 0x3C, 0x20 => 0x10, 0x21 => 0x18, + 0x32 => 0x04, 0x35 => 0x14, 0x36 => 0x14, 0x37 => 0x14, @@ -714,34 +934,41 @@ RETURN: 0x3C => 0x10, 0x3D => 0x08, 0x3E => 0x40, - 0x40 => 0x00, - 0x41 => 0x04, 0x42 => 0x04, 0x43 => 0x08, 0x44 => 0x08, - 0x45 => 0x08, + 0x45 => 0x04, 0x46 => 0x04, 0x47 => 0x08, - 0x48 => 0x08, + 0x48 => 0x1C, 0x49 => 0x30, 0x4A => 0x02, 0x4B => 0x34, 0x4C => 0x0C, - 0x4D => 0x04, + 0x4D => 0x01, 0x4E => 0x1C, 0x4F => 0x01, 0x50 => 0x01, _ => 0x00, }; - public void Dispose() + private static int GetSize2(int Type) => + (int)Type switch { + 0x00 => 0x1C, + 0x01 => 0x08, + 0x02 => 0x14, + 0x44 => 0x04, + _ => 0x00, + }; + + public void Dispose() { if (s != null) s.D(); s = null; Header = default; } public struct HeaderData { public int MotionSetID; - public int StartMotionID; - public int EndMotionID; + public int FirstMotionID; + public int LastMotionID; public int SubHeaderOffset; public Sub[] Data; @@ -751,7 +978,12 @@ RETURN: public int Offset; public int MotionID; - public int SomeData; + public int Field00; + public int Field04; + public int Field08; + public int Field0C; + public ushort Field10; + public ushort Field12; public int Offset2; public int DataHeaderOffset; @@ -760,21 +992,28 @@ RETURN: public struct Data { - public int Type; + public Type Type; public int Frame; public int Offset; - public int[] Array; + public byte[] Array; } public struct Data2 { public int Offset; - public int Frame; - public int[] Array; + public int Type; + public byte[] Array; } } } + + public enum Type + { + WingReset = 0x40, + OsageReset = 0x41, + OsagePhysStep = 0x42, + } } } diff --git a/KKdMainLib/libdeflate.dll b/KKdMainLib/libdeflate.dll index 681cfd763f867c36cfaba6e3a5234b96554fdaad..3c319e94e933d47a8dfd5c9316aed663d4d320a6 100644 GIT binary patch literal 59918 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 literal 57870 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 P4U|e8WB>h2Z;1Z|rh0U| diff --git a/PD_Tool/Properties/AssemblyInfo.cs b/PD_Tool/Properties/AssemblyInfo.cs index f44bb04..8760710 100644 --- a/PD_Tool/Properties/AssemblyInfo.cs +++ b/PD_Tool/Properties/AssemblyInfo.cs @@ -11,5 +11,5 @@ using System.Runtime.InteropServices; [assembly: AssemblyCulture("")] [assembly: ComVisible(false)] [assembly: Guid("7B5D5A3A-A6F8-4813-C97D-ACFC98F7397E")] -[assembly: AssemblyVersion("0.4.10.7")] -[assembly: AssemblyFileVersion("0.4.10.7")] +[assembly: AssemblyVersion("0.4.10.8")] +[assembly: AssemblyFileVersion("0.4.10.8")] diff --git a/PD_Tool/classes/A3D.cs b/PD_Tool/classes/A3D.cs index a1cce75..6214710 100644 --- a/PD_Tool/classes/A3D.cs +++ b/PD_Tool/classes/A3D.cs @@ -69,7 +69,7 @@ namespace PD_Tool { state = a3da.A3DAReader(filepath); if (state == 1) - if (choose == "F") a3da.MsgPackWriter(filepath, json); + if (choose == "9") a3da.MsgPackWriter(filepath, json); else { a3da.Head.Format = format;