diff --git a/KKdMainLib/A3DA/A3DA.cs b/KKdMainLib/A3DA/A3DA.cs index 3c9ca8b..7e6405f 100644 --- a/KKdMainLib/A3DA/A3DA.cs +++ b/KKdMainLib/A3DA/A3DA.cs @@ -1368,18 +1368,17 @@ namespace KKdMainLib.A3DA }; } - if (A3D.Element("Ambient", out Temp)) + if (A3D.ElementArray("Ambient", out Temp)) { Data.Ambient = new Ambient[Temp.Array.Length]; for (i = 0; i < Data.Ambient.Length; i++) - if (Temp[i] is MsgPack Ambient) - Data.Ambient[i] = new Ambient - { - Name = Ambient.ReadString ( "Name"), - LightDiffuse = Ambient.ReadRGBAKey( "LightDiffuse"), - RimLightDiffuse = Ambient.ReadRGBAKey("RimLightDiffuse"), - }; + Data.Ambient[i] = new Ambient + { + Name = Temp[i].ReadString ( "Name"), + LightDiffuse = Temp[i].ReadRGBAKey( "LightDiffuse"), + RimLightDiffuse = Temp[i].ReadRGBAKey("RimLightDiffuse"), + }; } if (A3D.Element("CameraAuxiliary", out Temp)) @@ -1392,51 +1391,48 @@ namespace KKdMainLib.A3DA Saturate = Temp.ReadKey("Saturate" ), }; - if (A3D.Element("CameraRoot", out Temp)) + if (A3D.ElementArray("CameraRoot", out Temp)) { Data.CameraRoot = new CameraRoot[Temp.Array.Length]; for (i = 0; i < Data.CameraRoot.Length; i++) - if (Temp[i] is MsgPack _Root) + { + Data.CameraRoot[i] = new CameraRoot { - Data.CameraRoot[i] = new CameraRoot - { - MT = _Root.ReadMT(), - Interest = _Root.ReadMT("Interest"), - }; - if (!_Root.Element("ViewPoint", out MsgPack ViewPoint)) continue; + MT = Temp[i].ReadMT(), + Interest = Temp[i].ReadMT("Interest"), + }; + if (!Temp[i].Element("ViewPoint", out MsgPack ViewPoint)) continue; - Data.CameraRoot[i].ViewPoint = new ViewPoint - { - MT = ViewPoint.ReadMT(), - Aspect = ViewPoint.ReadNDouble("Aspect" ), - CameraApertureH = ViewPoint.ReadNDouble("CameraApertureH"), - CameraApertureW = ViewPoint.ReadNDouble("CameraApertureW"), - FOVHorizontal = ViewPoint.ReadNDouble("FOVHorizontal" ), - FocalLength = ViewPoint.ReadKey ("FocalLength" ), - FOV = ViewPoint.ReadKey ("FOV" ), - Roll = ViewPoint.ReadKey ("Roll" ), - }; + Data.CameraRoot[i].ViewPoint = new ViewPoint + { + MT = ViewPoint.ReadMT(), + Aspect = ViewPoint.ReadNDouble("Aspect" ), + CameraApertureH = ViewPoint.ReadNDouble("CameraApertureH"), + CameraApertureW = ViewPoint.ReadNDouble("CameraApertureW"), + FOVHorizontal = ViewPoint.ReadNDouble("FOVHorizontal" ), + FocalLength = ViewPoint.ReadKey ("FocalLength" ), + FOV = ViewPoint.ReadKey ("FOV" ), + Roll = ViewPoint.ReadKey ("Roll" ), + }; } } - if (A3D.Element("Chara", out Temp)) + if (A3D.ElementArray("Chara", out Temp)) { Data.Chara = new ModelTransform[Temp.Array.Length]; for (i = 0; i < Data.Chara.Length; i++) - if (Temp[i] is MsgPack Chara) - Data.Chara[i] = Chara.ReadMT(); + Data.Chara[i] = Temp[i].ReadMT(); } - if (A3D.Element("Curve", out Temp)) + if (A3D.ElementArray("Curve", out Temp)) { Data.Curve = new Curve[Temp.Array.Length]; for (i = 0; i < Data.Curve.Length; i++) - if (Temp[i] is MsgPack Curve) - Data.Curve[i] = new Curve - { - Name = Curve.ReadString("Name"), - CV = Curve.ReadKey ("CV" ), - }; + Data.Curve[i] = new Curve + { + Name = Temp[i].ReadString("Name"), + CV = Temp[i].ReadKey ("CV" ), + }; } if (A3D.Element("DOF", out Temp)) @@ -1446,237 +1442,221 @@ namespace KKdMainLib.A3DA Name = Temp.ReadString("Name"), }; - if (A3D.Element("Event", out Temp)) + if (A3D.ElementArray("Event", out Temp)) { Data.Event = new Event[Temp.Array.Length]; for (i = 0; i < Data.Event.Length; i++) - if (Temp[i] is MsgPack Event) - Data.Event[i] = new Event - { - Begin = Event.ReadNDouble( "Begin" ), - ClipBegin = Event.ReadNDouble("ClipBegin" ), - ClipEnd = Event.ReadNDouble("ClipEnd" ), - End = Event.ReadNDouble( "End" ), - Name = Event.ReadString ("Name" ), - Param1 = Event.ReadString ("Param1" ), - Ref = Event.ReadString ("Ref" ), - TimeRefScale = Event.ReadNDouble("TimeRefScale"), - Type = Event.ReadNInt32 ("Type" ), - }; + Data.Event[i] = new Event + { + Begin = Temp[i].ReadNDouble( "Begin" ), + ClipBegin = Temp[i].ReadNDouble("ClipBegin" ), + ClipEnd = Temp[i].ReadNDouble("ClipEnd" ), + End = Temp[i].ReadNDouble( "End" ), + Name = Temp[i].ReadString ("Name" ), + Param1 = Temp[i].ReadString ("Param1" ), + Ref = Temp[i].ReadString ("Ref" ), + TimeRefScale = Temp[i].ReadNDouble("TimeRefScale"), + Type = Temp[i].ReadNInt32 ("Type" ), + }; } - if (A3D.Element("Fog", out Temp)) + if (A3D.ElementArray("Fog", out Temp)) { Data.Fog = new Fog[Temp.Array.Length]; for (i = 0; i < Data.Fog.Length; i++) - if (Temp[i] is MsgPack Fog) - Data.Fog[i] = new Fog - { - Id = Fog.ReadNInt32 ("Id" ), - Density = Fog.ReadKey ("Density"), - Diffuse = Fog.ReadRGBAKey("Diffuse"), - End = Fog.ReadKey ("End" ), - Start = Fog.ReadKey ("Start" ), - }; + Data.Fog[i] = new Fog + { + Id = Temp[i].ReadNInt32 ("Id" ), + Density = Temp[i].ReadKey ("Density"), + Diffuse = Temp[i].ReadRGBAKey("Diffuse"), + End = Temp[i].ReadKey ("End" ), + Start = Temp[i].ReadKey ("Start" ), + }; } - if (A3D.Element("Light", out Temp)) + if (A3D.ElementArray("Light", out Temp)) { Data.Light = new Light[Temp.Array.Length]; for (i = 0; i < Data.Light.Length; i++) - if (Temp[i] is MsgPack Light) - Data.Light[i] = new Light - { - Id = Light.ReadNInt32 ("Id" ), - Name = Light.ReadString ("Name" ), - Type = Light.ReadString ("Type" ), - Ambient = Light.ReadRGBAKey("Ambient" ), - Diffuse = Light.ReadRGBAKey("Diffuse" ), - Incandescence = Light.ReadRGBAKey("Incandescence"), - Position = Light.ReadMT ("Position" ), - Specular = Light.ReadRGBAKey("Specular" ), - SpotDirection = Light.ReadMT ("SpotDirection"), - }; + Data.Light[i] = new Light + { + Id = Temp[i].ReadNInt32 ("Id" ), + Name = Temp[i].ReadString ("Name" ), + Type = Temp[i].ReadString ("Type" ), + Ambient = Temp[i].ReadRGBAKey("Ambient" ), + Diffuse = Temp[i].ReadRGBAKey("Diffuse" ), + Incandescence = Temp[i].ReadRGBAKey("Incandescence"), + Position = Temp[i].ReadMT ("Position" ), + Specular = Temp[i].ReadRGBAKey("Specular" ), + SpotDirection = Temp[i].ReadMT ("SpotDirection"), + }; } - if (A3D.Element("MaterialList", out Temp)) + if (A3D.ElementArray("MaterialList", out Temp)) { Data.MaterialList = new MaterialList[Temp.Array.Length]; for (i = 0; i < Data.MaterialList.Length; i++) - if (Temp[i] is MsgPack Material) - Data.MaterialList[i] = new MaterialList - { - HashName = Material.ReadString ( "HashName"), - Name = Material.ReadString ( "Name"), - BlendColor = Material.ReadRGBAKey( "BlendColor"), - GlowIntensity = Material.ReadKey ("GlowIntensity"), - Incandescence = Material.ReadRGBAKey("Incandescence"), - }; + Data.MaterialList[i] = new MaterialList + { + HashName = Temp[i].ReadString ( "HashName"), + Name = Temp[i].ReadString ( "Name"), + BlendColor = Temp[i].ReadRGBAKey( "BlendColor"), + GlowIntensity = Temp[i].ReadKey ("GlowIntensity"), + Incandescence = Temp[i].ReadRGBAKey("Incandescence"), + }; } - if (A3D.Element("MObjectHRC", out Temp)) + if (A3D.ElementArray("MObjectHRC", out Temp)) { Data.MObjectHRC = new MObjectHRC[Temp.Array.Length]; for (i0 = 0; i0 < Data.MObjectHRC.Length; i0++) - if (Temp[i0] is MsgPack MObjectHRC) + { + Data.MObjectHRC[i0] = new MObjectHRC { - Data.MObjectHRC[i0] = new MObjectHRC + MT = Temp[i].ReadMT(), + Name = Temp[i].ReadString("Name"), + }; + + if (Temp[i].Element("JointOrient", out MsgPack JointOrient)) + Data.MObjectHRC[i0].JointOrient = new Vector3 { - MT = MObjectHRC.ReadMT(), - Name = MObjectHRC.ReadString("Name"), + X = JointOrient.ReadDouble("X"), + Y = JointOrient.ReadDouble("Y"), + Z = JointOrient.ReadDouble("Z"), }; - if (MObjectHRC.Element("JointOrient", out MsgPack JointOrient)) - Data.MObjectHRC[i0].JointOrient = new Vector3 + if (Temp[i].ElementArray("Instance", out MsgPack Instance)) + { + Data.MObjectHRC[i0].Instance = new Instance[Instance.Array.Length]; + for (i1 = 0; i1 < Data.MObjectHRC[i0].Instance.Length; i1++) + Data.MObjectHRC[i0].Instance[i1] = new Instance { - X = JointOrient.ReadDouble("X"), - Y = JointOrient.ReadDouble("Y"), - Z = JointOrient.ReadDouble("Z"), + MT = Instance[i1].ReadMT(), + Name = Instance[i1].ReadString( "Name"), + Shadow = Instance[i1].ReadNInt32( "Shadow"), + UIDName = Instance[i1].ReadString("UIDName"), }; + } - if (MObjectHRC.Element("Instance", out MsgPack Instance)) - { - Data.MObjectHRC[i0].Instance = new Instance[Instance.Array.Length]; - for (i1 = 0; i1 < Data.MObjectHRC[i0].Instance.Length; i1++) - if (Instance[i1] is MsgPack _Instance) - Data.MObjectHRC[i0].Instance[i1] = new Instance - { - MT = _Instance.ReadMT(), - Name = _Instance.ReadString( "Name"), - Shadow = _Instance.ReadNInt32( "Shadow"), - UIDName = _Instance.ReadString("UIDName"), - }; - } - - if (MObjectHRC.Element("Node", out MsgPack Node)) - { - Data.MObjectHRC[i0].Node = new Node[Temp.Array.Length]; - for (i1 = 0; i1 < Data.MObjectHRC[i0].Node.Length; i1++) - if (Node[i1] is MsgPack _Node) - Data.MObjectHRC[i0].Node[i1] = new Node - { - MT = _Node.ReadMT(), - Name = _Node.ReadString( "Name"), - Parent = _Node.ReadNInt32("Parent"), - }; - } + if (Temp[i].ElementArray("Node", out MsgPack Node)) + { + Data.MObjectHRC[i0].Node = new Node[Temp.Array.Length]; + for (i1 = 0; i1 < Data.MObjectHRC[i0].Node.Length; i1++) + Data.MObjectHRC[i0].Node[i1] = new Node + { + MT = Node[i1].ReadMT(), + Name = Node[i1].ReadString( "Name"), + Parent = Node[i1].ReadNInt32("Parent"), + }; + } } } - if (A3D.Element("MObjectHRCList", out Temp)) + if (A3D.ElementArray("MObjectHRCList", out Temp)) { Data.MObjectHRCList = new string[Temp.Array.Length]; for (i = 0; i < Data.MObjectHRCList.Length; i++) - if (Temp[i] is MsgPack MObjectHRC) - Data.MObjectHRCList[i] = MObjectHRC.ReadString(); + Data.MObjectHRCList[i] = Temp[i].ReadString(); } - if (A3D.Element("Motion", out Temp)) + if (A3D.ElementArray("Motion", out Temp)) { Data.Motion = new string[Temp.Array.Length]; for (i = 0; i < Data.Motion.Length; i++) - if (Temp[i] is MsgPack Motion) - Data.Motion[i] = Motion.ReadString(); + Data.Motion[i] = Temp[i].ReadString(); } - if (A3D.Element("Object", out Temp)) + if (A3D.ElementArray("Object", out Temp)) { Data.Object = new Object[Temp.Array.Length]; for (i0 = 0; i0 < Data.Object.Length; i0++) - if (Temp[i0] is MsgPack Object) + { + Data.Object[i0] = new Object { - Data.Object[i0] = new Object - { - MT = Object.ReadMT(), - Morph = Object.ReadString("Morph" ), - MorphOffset = Object.ReadNInt32("MorphOffset"), - Name = Object.ReadString( "Name"), - ParentName = Object.ReadString( "ParentName"), - UIDName = Object.ReadString( "UIDName"), - }; + MT = Temp[i].ReadMT(), + Morph = Temp[i].ReadString("Morph" ), + MorphOffset = Temp[i].ReadNInt32("MorphOffset"), + Name = Temp[i].ReadString( "Name"), + ParentName = Temp[i].ReadString( "ParentName"), + UIDName = Temp[i].ReadString( "UIDName"), + }; - if (Object.Element("TP", out MsgPack TP)) - { - Data.Object[i0].TP = new Object.TexturePattern[TP.Array.Length]; - for (i1 = 0; i1 < Data.Object[i0].TP.Length; i1++) - if (TP[i1] is MsgPack _TP) - Data.Object[i0].TP[i1] = new Object.TexturePattern - { - Name = _TP.ReadString("Name" ), - Pat = _TP.ReadString("Pat" ), - PatOffset = _TP.ReadNInt32("PatOffset"), - }; - } - - if (Object.Element("TT", out MsgPack TT)) - { - Data.Object[i0].TT = new Object.TextureTransform[TT.Array.Length]; - for (i1 = 0; i1 < Data.Object[i0].TT.Length; i1++) - if (TT[i1] is MsgPack _TT) - Data.Object[i0].TT[i1] = new Object.TextureTransform - { - Name = _TT.ReadString("Name"), - C = _TT.ReadKeyUV ("C" ), - O = _TT.ReadKeyUV ("O" ), - R = _TT.ReadKeyUV ("R" ), - Ro = _TT.ReadKey ("Ro" ), - RF = _TT.ReadKey ("RF" ), - TF = _TT.ReadKeyUV ("TF" ), - }; - } - } - } - - if (A3D.Element("ObjectHRC", out Temp)) - { - Data.ObjectHRC = new ObjectHRC[Temp.Array.Length]; - for (i0 = 0; i0 < Data.ObjectHRC.Length; i0++) - if (Temp[i0] is MsgPack ObjectHRC) + if (Temp[i].ElementArray("TP", out MsgPack TP)) { - Data.ObjectHRC[i0] = new ObjectHRC - { - Name = ObjectHRC.ReadString ( "Name"), - Shadow = ObjectHRC.ReadNDouble( "Shadow"), - UIDName = ObjectHRC.ReadString ("UIDName"), - }; - - if (ObjectHRC.Element("JointOrient", out MsgPack JointOrient)) - Data.ObjectHRC[i0].JointOrient = new Vector3 + Data.Object[i0].TP = new Object.TexturePattern[TP.Array.Length]; + for (i1 = 0; i1 < Data.Object[i0].TP.Length; i1++) + Data.Object[i0].TP[i1] = new Object.TexturePattern { - X = JointOrient.ReadDouble("X"), - Y = JointOrient.ReadDouble("Y"), - Z = JointOrient.ReadDouble("Z"), + Name = TP[i1].ReadString("Name" ), + Pat = TP[i1].ReadString("Pat" ), + PatOffset = TP[i1].ReadNInt32("PatOffset"), + }; + } + + if (Temp[i].ElementArray("TT", out MsgPack TT)) + { + Data.Object[i0].TT = new Object.TextureTransform[TT.Array.Length]; + for (i1 = 0; i1 < Data.Object[i0].TT.Length; i1++) + Data.Object[i0].TT[i1] = new Object.TextureTransform + { + Name = TT[i1].ReadString("Name"), + C = TT[i1].ReadKeyUV ("C" ), + O = TT[i1].ReadKeyUV ("O" ), + R = TT[i1].ReadKeyUV ("R" ), + Ro = TT[i1].ReadKey ("Ro" ), + RF = TT[i1].ReadKey ("RF" ), + TF = TT[i1].ReadKeyUV ("TF" ), }; - - if (ObjectHRC.Element("Node", out MsgPack Node)) - { - Data.ObjectHRC[i0].Node = new Node[Node.Array.Length]; - for (i1 = 0; i1 < Data.ObjectHRC[i0].Node.Length; i1++) - if (Node[i1] is MsgPack _Node) - Data.ObjectHRC[i0].Node[i1] = new Node - { - MT = _Node.ReadMT(), - Name = _Node.ReadString( "Name"), - Parent = _Node.ReadInt32 ("Parent"), - }; } } } - if (A3D.Element("ObjectHRCList", out Temp)) + if (A3D.ElementArray("ObjectHRC", out Temp)) + { + Data.ObjectHRC = new ObjectHRC[Temp.Array.Length]; + for (i0 = 0; i0 < Data.ObjectHRC.Length; i0++) + { + Data.ObjectHRC[i0] = new ObjectHRC + { + Name = Temp[i].ReadString ( "Name"), + Shadow = Temp[i].ReadNDouble( "Shadow"), + UIDName = Temp[i].ReadString ("UIDName"), + }; + + if (Temp[i].Element("JointOrient", out MsgPack JointOrient)) + Data.ObjectHRC[i0].JointOrient = new Vector3 + { + X = JointOrient.ReadDouble("X"), + Y = JointOrient.ReadDouble("Y"), + Z = JointOrient.ReadDouble("Z"), + }; + + if (Temp[i].ElementArray("Node", out MsgPack Node)) + { + Data.ObjectHRC[i0].Node = new Node[Node.Array.Length]; + for (i1 = 0; i1 < Data.ObjectHRC[i0].Node.Length; i1++) + Data.ObjectHRC[i0].Node[i1] = new Node + { + MT = Node[i1].ReadMT(), + Name = Node[i1].ReadString( "Name"), + Parent = Node[i1].ReadInt32 ("Parent"), + }; + } + } + } + + if (A3D.ElementArray("ObjectHRCList", out Temp)) { Data.ObjectHRCList = new string[Temp.Array.Length]; for (i = 0; i < Data.ObjectHRCList.Length; i++) - if (Temp[i] is MsgPack ObjectHRC) - Data.ObjectHRCList[i] = ObjectHRC.ReadString(); + Data.ObjectHRCList[i] = Temp[i].ReadString(); } - if (A3D.Element("ObjectList", out Temp)) + if (A3D.ElementArray("ObjectList", out Temp)) { Data.ObjectList = new string[Temp.Array.Length]; for (i = 0; i < Data.ObjectList.Length; i++) - if (Temp[i] is MsgPack Object) - Data.ObjectList[i] = Object.ReadString(); + Data.ObjectList[i] = Temp[i].ReadString(); } if (A3D.Element("PlayControl", out Temp)) @@ -1689,12 +1669,11 @@ namespace KKdMainLib.A3DA Size = Temp.ReadNDouble("Size" ), }; - if (A3D.Element("Point", out Temp)) + if (A3D.ElementArray("Point", out Temp)) { Data.Point = new ModelTransform[Temp.Array.Length]; for (i = 0; i < Data.Point.Length; i++) - if (Temp[i] is MsgPack Point) - Data.Point[i] = Point.ReadMT(); + Data.Point[i] = Temp[i].ReadMT(); } if (A3D.Element("PostProcess", out Temp)) @@ -1864,7 +1843,8 @@ namespace KKdMainLib.A3DA if (Data.MObjectHRCList != null) { MsgPack MObjectHRCList = new MsgPack(Data.MObjectHRCList.Length, "MObjectHRCList"); - for (i = 0; i < Data.MObjectHRCList.Length; i++) MObjectHRCList[i] = Data.MObjectHRCList[i]; + for (i = 0; i < Data.MObjectHRCList.Length; i++) + MObjectHRCList[i] = (MsgPack)Data.MObjectHRCList[i]; A3D.Add(MObjectHRCList); } @@ -1884,7 +1864,7 @@ namespace KKdMainLib.A3DA if (Data.Motion != null) { MsgPack Motion = new MsgPack(Data.Motion.Length, "Motion"); - for (i = 0; i < Data.Motion.Length; i++) Motion[i] = Data.Motion[i]; + for (i = 0; i < Data.Motion.Length; i++) Motion[i] = (MsgPack)Data.Motion[i]; A3D.Add(Motion); } @@ -1958,14 +1938,14 @@ namespace KKdMainLib.A3DA if (Data.ObjectHRCList != null) { MsgPack ObjectHRCList = new MsgPack(Data.ObjectHRCList.Length, "ObjectHRCList"); - for (i = 0; i < Data.ObjectHRCList.Length; i++) ObjectHRCList[i] = Data.ObjectHRCList[i]; + for (i = 0; i < Data.ObjectHRCList.Length; i++) ObjectHRCList[i] = (MsgPack)Data.ObjectHRCList[i]; A3D.Add(ObjectHRCList); } if (Data.ObjectList != null) { MsgPack ObjectList = new MsgPack(Data.ObjectList.Length, "ObjectList"); - for (i = 0; i < Data.ObjectList.Length; i++) ObjectList[i] = Data.ObjectList[i]; + for (i = 0; i < Data.ObjectList.Length; i++) ObjectList[i] = (MsgPack)Data.ObjectList[i]; A3D.Add(ObjectList); } @@ -2109,9 +2089,9 @@ namespace KKdMainLib.A3DA public double? EPTypePost; public double? EPTypePre; public RawD RawData; - public KeyFrame[] Trans; + public IKeyFrame[] Trans; - public class RawD + public struct RawD { public int? KeyType; public int? ValueListSize; diff --git a/KKdMainLib/A3DA/A3DAExt.cs b/KKdMainLib/A3DA/A3DAExt.cs index 9b38717..2e0e4b7 100644 --- a/KKdMainLib/A3DA/A3DAExt.cs +++ b/KKdMainLib/A3DA/A3DAExt.cs @@ -62,7 +62,7 @@ namespace KKdMainLib.A3DA if (Key.Length != null) { int Type; - Key.Trans = new KeyFrame[(int)Key.Length]; + Key.Trans = new IKeyFrame[(int)Key.Length]; for (i0 = 0; i0 < Key.Length; i0++) if (Dict.FindValue(out value, Temp + "key" + d + i0 + d + "data")) { @@ -84,7 +84,6 @@ namespace KKdMainLib.A3DA } else if (Key.RawData.KeyType != null) { - Key.RawData = new Key.RawD(); Dict.FindValue(out Key.RawData.ValueType, Temp + "raw_data.value_type"); if (Dict.FindValue(out value, Temp + "raw_data.value_list")) Key.RawData.ValueList = value.Split(','); @@ -93,29 +92,29 @@ namespace KKdMainLib.A3DA int DS = (int)Key.RawData.KeyType + 1; Key.Length = Key.RawData.ValueListSize / DS; - Key.Trans = new KeyFrame[(int)Key.Length]; + Key.Trans = new IKeyFrame[(int)Key.Length]; if (Key.RawData.KeyType == 0) for (i = 0; i < Key.Length; i++) Key.Trans[i] = new KeyFrameT0 - { Frame = Key.RawData.ValueList[i * DS + 0].ToDouble() }; + { Frame = Key.RawData.ValueList[i * DS + 0].ToDouble() }.Check(); else if (Key.RawData.KeyType == 1) for (i = 0; i < Key.Length; i++) Key.Trans[i] = new KeyFrameT1 { Frame = Key.RawData.ValueList[i * DS + 0].ToDouble(), - Value = dataArray[i * DS + 1].ToDouble() }; + Value = Key.RawData.ValueList[i * DS + 1].ToDouble() }.Check(); else if (Key.RawData.KeyType == 2) for (i = 0; i < Key.Length; i++) Key.Trans[i] = new KeyFrameT2 { Frame = Key.RawData.ValueList[i * DS + 0].ToDouble(), - Value = dataArray[i * DS + 1].ToDouble(), - Interpolation = dataArray[i * DS + 2].ToDouble() }; + Value = Key.RawData.ValueList[i * DS + 1].ToDouble(), + Interpolation = Key.RawData.ValueList[i * DS + 2].ToDouble() }.Check(); else if (Key.RawData.KeyType == 3) for (i = 0; i < Key.Length; i++) Key.Trans[i] = new KeyFrameT3 { Frame = Key.RawData.ValueList[i * DS + 0].ToDouble(), - Value = dataArray[i * DS + 1].ToDouble(), - Interpolation1 = dataArray[i * DS + 2].ToDouble(), - Interpolation2 = dataArray[i * DS + 3].ToDouble() }; + Value = Key.RawData.ValueList[i * DS + 1].ToDouble(), + Interpolation1 = Key.RawData.ValueList[i * DS + 2].ToDouble(), + Interpolation2 = Key.RawData.ValueList[i * DS + 3].ToDouble() }.Check(); for (i = 0; i < Key.Length; i++) Key.Trans[i].Check(); Key.RawData.ValueList = null; @@ -174,7 +173,7 @@ namespace KKdMainLib.A3DA if (Key.EPTypePost != null) IO.Write(Temp + "ep_type_post=", Key.EPTypePost); if (Key.EPTypePre != null) IO.Write(Temp + "ep_type_pre=" , Key.EPTypePre ); - if (Key.RawData == null && Key.Trans != null) + if (Key.RawData.KeyType == null && Key.Trans != null) { SO = Key.Trans.Length.SortWriter(); for (i = 0; i < Key.Trans.Length; i++) @@ -199,18 +198,29 @@ namespace KKdMainLib.A3DA if (Key.Max != null) IO.Write(Temp + "max=", Key.Max); for (i = 0; i < Key.Trans.Length; i++) { - if (Key.Trans[SOi] is KeyFrameT0 && + if (Key.Trans[i] is KeyFrameT0 && Key.RawData.KeyType < 0) Key.RawData.KeyType = 0; - else if (Key.Trans[SOi] is KeyFrameT1 && + else if (Key.Trans[i] is KeyFrameT1 && Key.RawData.KeyType < 1) Key.RawData.KeyType = 1; - else if (Key.Trans[SOi] is KeyFrameT2 && + else if (Key.Trans[i] is KeyFrameT2 && Key.RawData.KeyType < 2) Key.RawData.KeyType = 2; - else if (Key.Trans[SOi] is KeyFrameT3 && + else if (Key.Trans[i] is KeyFrameT3 && Key.RawData.KeyType < 3) break; } Key.RawData.ValueListSize = Key.Trans.Length * (Key.RawData.KeyType + 1); IO.Write(Temp + "raw_data.value_list="); - for (i = 0; i < Key.Trans.Length; i++) IO.Write(Key.Trans[i].ToString(false)); + if (Key.RawData.KeyType == 0) for (i = 0; i < Key.Trans.Length; i++) + IO.Write(Key.Trans[i].ToKeyFrameT0().ToString(false) + + ((i + 1 < Key.Trans.Length) ? "," : "")); + else if (Key.RawData.KeyType == 1) for (i = 0; i < Key.Trans.Length; i++) + IO.Write(Key.Trans[i].ToKeyFrameT1().ToString(false) + + ((i + 1 < Key.Trans.Length) ? "," : "")); + else if (Key.RawData.KeyType == 2) for (i = 0; i < Key.Trans.Length; i++) + IO.Write(Key.Trans[i].ToKeyFrameT2().ToString(false) + + ((i + 1 < Key.Trans.Length) ? "," : "")); + else if (Key.RawData.KeyType == 3) for (i = 0; i < Key.Trans.Length; i++) + IO.Write(Key.Trans[i].ToKeyFrameT3().ToString(false) + + ((i + 1 < Key.Trans.Length) ? "," : "")); IO.Position = IO.Position - 1; IO.Write('\n'); IO.Write(Temp + "raw_data.value_list_size=", Key.RawData.ValueListSize); @@ -218,7 +228,7 @@ namespace KKdMainLib.A3DA IO.Write(Temp + "raw_data_key_type=" , Key.RawData. KeyType ); } IO.Write(Temp + "type=", Key.Type & 0xFF); - if (Key.RawData == null && Key.Trans == null && Key.Value != null) + if (Key.RawData.KeyType == null && Key.Trans == null && Key.Value != null) if (Key.Value != 0) IO.Write(Temp + "value=", Key.Value); } @@ -263,7 +273,7 @@ namespace KKdMainLib.A3DA Key.Max = IO.ReadSingle(); Key.Length = IO.ReadInt32 (); - Key.Trans = new KeyFrame[(int)Key.Length]; + Key.Trans = new IKeyFrame[(int)Key.Length]; KeyFrameT3 Temp; for (int i = 0; i < Key.Length; i++) { @@ -349,58 +359,45 @@ namespace KKdMainLib.A3DA Key Key = new Key { EPTypePost = k.ReadNDouble("Post"), EPTypePre = k.ReadNDouble("Pre"), Max = k.ReadNDouble("M"), Type = k.ReadNInt32("T"), Value = k.ReadNDouble("V") }; - if (k.ReadBoolean("RD")) Key.RawData = new Key.RawD(); + if (k.ReadBoolean("RD")) Key.RawData = new Key.RawD() { KeyType = -1, ValueType = "float" }; if (Key.Type == 0) Key.Value = 0.0; if (Key.Type < 2) return Key; - if (!k.Element("Trans", out MsgPack Trans)) return Key; + if (!k.ElementArray("Trans", out MsgPack Trans)) return Key; Key.Length = Trans.Array.Length; - Key.Trans = new KeyFrame[Key.Length.Value]; + Key.Trans = new IKeyFrame[Key.Length.Value]; for (int i = 0; i < Key.Length; i++) - if (Trans[i] is MsgPack _Trans) - { - if (_Trans.Array == null) continue; - else if (_Trans.Array.Length == 0) continue; - else if (_Trans.Array.Length == 1) + { + if (Trans[i].Array == null) continue; + else if (Trans[i].Array.Length == 0) continue; + else if (Trans[i].Array.Length == 1) + Key.Trans[i] = new KeyFrameT0 + { Frame = Trans[i][0].ReadDouble() }; + else if (Trans[i].Array.Length == 2) + Key.Trans[i] = new KeyFrameT1 { - if (_Trans[0] is MsgPack Frame) - Key.Trans[i] = new KeyFrameT0 { Frame = Frame.ReadDouble() }; - } - else if (_Trans.Array.Length == 2) + Frame = Trans[i][0].ReadDouble(), + Value = Trans[i][1].ReadDouble(), + }; + else if (Trans[i].Array.Length == 3) + Key.Trans[i] = new KeyFrameT2 { - KeyFrameT1 KeyFrameT1 = new KeyFrameT1(); - if (_Trans[0] is MsgPack Frame) KeyFrameT1.Frame = Frame.ReadDouble(); - if (_Trans[1] is MsgPack Value) KeyFrameT1.Value = Value.ReadDouble(); - Key.Trans[i] = KeyFrameT1; - } - else if (_Trans.Array.Length == 3) + Frame = Trans[i][0].ReadDouble(), + Value = Trans[i][1].ReadDouble(), + Interpolation = Trans[i][2].ReadDouble(), + }; + else if (Trans[i].Array.Length == 4) + Key.Trans[i] = new KeyFrameT3 { - KeyFrameT2 KeyFrameT2 = new KeyFrameT2(); - if (_Trans[0] is MsgPack Frame ) - KeyFrameT2.Frame = Frame .ReadDouble(); - if (_Trans[1] is MsgPack Value ) - KeyFrameT2.Value = Value .ReadDouble(); - if (_Trans[2] is MsgPack Interpolation) - KeyFrameT2.Interpolation = Interpolation.ReadDouble(); - Key.Trans[i] = KeyFrameT2; - } - else if (_Trans.Array.Length == 4) - { - KeyFrameT3 KeyFrameT3 = new KeyFrameT3(); - if (_Trans[0] is MsgPack Frame ) - KeyFrameT3.Frame = Frame .ReadDouble(); - if (_Trans[1] is MsgPack Value ) - KeyFrameT3.Value = Value .ReadDouble(); - if (_Trans[2] is MsgPack Interpolation1) - KeyFrameT3.Interpolation1 = Interpolation1.ReadDouble(); - if (_Trans[3] is MsgPack Interpolation2) - KeyFrameT3.Interpolation2 = Interpolation2.ReadDouble(); - Key.Trans[i] = KeyFrameT3; - } - Key.Trans[i] = Key.Trans[i].Check(); - } + Frame = Trans[i][0].ReadDouble(), + Value = Trans[i][1].ReadDouble(), + Interpolation1 = Trans[i][2].ReadDouble(), + Interpolation2 = Trans[i][3].ReadDouble(), + }; + Key.Trans[i] = Key.Trans[i].Check(); + } return Key; } @@ -435,9 +432,9 @@ namespace KKdMainLib.A3DA MsgPack Keys = new MsgPack(name).Add("T", Key.Type); if (Key.Trans != null) { - Keys.Add("Post", Key.EPTypePost).Add("Pre", Key.EPTypePre).Add("M", Key.Max); + Keys.Add("M", Key.Max).Add("Post", Key.EPTypePost).Add("Pre", Key.EPTypePre); - if (Key.RawData != null) Keys.Add("RD", true); + if (Key.RawData.KeyType != null) Keys.Add("RD", true); MsgPack Trans = new MsgPack(Key.Trans.Length, "Trans"); MsgPack K; @@ -445,31 +442,31 @@ namespace KKdMainLib.A3DA if (Key.Trans[i] is KeyFrameT0 KeyFrameT0) { K = new MsgPack(1); - K[0] = KeyFrameT0.Frame; + K[0] = (MsgPack)KeyFrameT0.Frame; Trans[i] = K; } else if (Key.Trans[i] is KeyFrameT1 KeyFrameT1) { K = new MsgPack(2); - K[0] = KeyFrameT1.Frame; - K[1] = KeyFrameT1.Value; + K[0] = (MsgPack)KeyFrameT1.Frame; + K[1] = (MsgPack)KeyFrameT1.Value; Trans[i] = K; } else if (Key.Trans[i] is KeyFrameT2 KeyFrameT2) { K = new MsgPack(3); - K[0] = KeyFrameT2.Frame; - K[1] = KeyFrameT2.Value; - K[2] = KeyFrameT2.Interpolation; + K[0] = (MsgPack)KeyFrameT2.Frame; + K[1] = (MsgPack)KeyFrameT2.Value; + K[2] = (MsgPack)KeyFrameT2.Interpolation; Trans[i] = K; } else if (Key.Trans[i] is KeyFrameT3 KeyFrameT3) { K = new MsgPack(4); - K[0] = KeyFrameT3.Frame; - K[1] = KeyFrameT3.Value; - K[2] = KeyFrameT3.Interpolation1; - K[3] = KeyFrameT3.Interpolation2; + K[0] = (MsgPack)KeyFrameT3.Frame; + K[1] = (MsgPack)KeyFrameT3.Value; + K[2] = (MsgPack)KeyFrameT3.Interpolation1; + K[3] = (MsgPack)KeyFrameT3.Interpolation2; Trans[i] = K; } Keys.Add(Trans); diff --git a/KKdMainLib/Aet/Aet.cs b/KKdMainLib/Aet/Aet.cs index eb9532d..4970d12 100644 --- a/KKdMainLib/Aet/Aet.cs +++ b/KKdMainLib/Aet/Aet.cs @@ -1,6 +1,6 @@ //Original: AetSet.bt Version: 2.0 by samyuu -using System.Collections.Generic; +//using System.Collections.Generic; using KKdMainLib.IO; using KKdMainLib.Types; using KKdMainLib.MessagePack; @@ -14,7 +14,7 @@ namespace KKdMainLib.Aet public AetHeader AET; - private int i, i0; + private int i, i0, i1; private Stream IO; private const string x00 = "\0"; @@ -67,53 +67,37 @@ namespace KKdMainLib.Aet Aet.Height = IO.ReadInt32(); Aet.DontChange = IO.ReadInt32(); if (Aet.DontChange != 0) { IO.Close(); return; } - Aet.LayObjPointers = IO.ReadCountPointer>(); - CountPointer Sprites = IO.ReadCountPointer(); + Aet.Layers = IO.ReadCountPointer< AetLayer>(); + Aet.SpriteEntries = IO.ReadCountPointer(); Aet.Unknown = IO.ReadCountPointer(); - Aet.LayObjDict = new Dictionary(); - Aet.ObjectsDict = new Dictionary(); - Aet.SprEntsDict = new Dictionary(); - Aet.SpritesDict = new Dictionary(); + IO.Position = Aet.Layers.Offset; + for (i = 0; i < Aet.Layers.Count; i++) + Aet.Layers[i] = new AetLayer() { Pointer = IO.Position, + Count = IO.ReadInt32(), Offset = IO.ReadInt32()}; - IO.Position = Aet.LayObjPointers.Offset; - for (i = 0; i < Aet.LayObjPointers.Count; i++) + for (i = 0, i1 = 0; i < Aet.Layers.Count; i++) { - Aet.LayObjDict.Add(i, IO.Position); - Aet.LayObjPointers.Entries[i] = IO.ReadCountPointer(); - } - - for (i = 0; i < Aet.LayObjPointers.Count; i++) - { - IO.Position = Aet.LayObjPointers.Entries[i].Offset; - for (i0 = 0; i0 < Aet.LayObjPointers.Entries[i].Count; i0++) - Aet.LayObjPointers.Entries[i].Entries[i0] = IO.ReadAetObject(ref Aet.ObjectsDict); - } - - IO.Position = Sprites.Offset; - for (i = 0; i < Sprites.Count; i++) - { - SpriteEntry SprEnt = new SpriteEntry(); - int Offset = IO.Position; - - SprEnt.Unknown = IO.ReadInt32(); - SprEnt.Width = IO.ReadInt16(); - SprEnt.Height = IO.ReadInt16(); - SprEnt.Frames = IO.ReadSingle(); - SprEnt.Sprites = IO.ReadCountPointer(); - long Position = IO.LongPosition; - IO.Position = SprEnt.Sprites.Offset; - for (i0 = 0; i0 < SprEnt.Sprites.Count; i0++) + IO.Position = Aet.Layers[i].Offset; + for (i0 = 0; i0 < Aet.Layers[i].Count; i0++, i1++) { - Sprite Spr = new Sprite(); - int OffsetLocal = IO.Position; - Spr.Name = IO.ReadPointerString(); - Spr.ID = IO.ReadInt32(); - Aet.SpritesDict.Add(OffsetLocal, Spr); - SprEnt.Sprites.Entries[i0] = OffsetLocal; + Aet.Layers[i].Objects[i0] = IO.ReadAetObject(); + Aet.Layers[i].ObjectIDs[i0] = i1; } - IO.LongPosition = Position; - Aet.SprEntsDict.Add(Offset, SprEnt); + } + + IO.Position = Aet.SpriteEntries.Offset; + for (i = 0; i < Aet.SpriteEntries.Count; i++) + Aet.SpriteEntries[i] = new SpriteEntry + { Offset = IO.Position, Unknown = IO.ReadInt32(), Width = IO.ReadInt16(), + Height = IO.ReadInt16(), Frames = IO.ReadSingle(), Sprites = IO.ReadCountPointer() }; + + for (i = 0; i < Aet.SpriteEntries.Count; i++) + { + IO.Position = Aet.SpriteEntries[i].Sprites.Offset; + for (i0 = 0; i0 < Aet.SpriteEntries[i].Sprites.Count; i0++) + Aet.SpriteEntries.Entries[i].Sprites[i0] = + new Sprite { Name = IO.ReadPointerString(), ID = IO.ReadInt32() }; } } @@ -121,38 +105,22 @@ namespace KKdMainLib.Aet { ref AetData Aet = ref AET.Value; - if (Aet.SpritesArr != null) + for (i = 0; i < Aet.SpriteEntries.Count; i++) { - List WrittenSprites = new List(); - for (i = 0; i < Aet.SprEntsArr.Length; i++) - { - ref SpriteEntry SprEnt = ref Aet.SprEntsArr[i].Value; - if (SprEnt.Sprites.Count < 1) continue; - SprEnt.Sprites.Offset = IO.Position; - for (i0 = 0; i0 < SprEnt.Sprites.Count; i0++) - { - ref int I = ref SprEnt.Sprites.Entries[i0]; - Aet.SpritesArr[Aet.SpritesIndDict[I]].Offset = IO.Position; - IO.Write(0); - IO.Write(Aet.SpritesArr[Aet.SpritesIndDict[I]].Value.ID); - WrittenSprites.Add(Aet.SpritesIndDict[I]); - } - } - for (i = 0; i < Aet.SpritesArr.Length; i++) - if (!WrittenSprites.Contains(i)) - { - Aet.SpritesArr[i].Offset = IO.Position; - IO.Write(0); - IO.Write(Aet.SpritesArr[i].Value.ID); - WrittenSprites.Add(i); - } + ref SpriteEntry SprEnt = ref Aet.SpriteEntries.Entries[i]; + if (SprEnt.Sprites.Count == 0) { SprEnt.Sprites.Offset = 0; continue; } + if (SprEnt.Sprites.Count > 1) IO.Align(0x20); + SprEnt.Sprites.Offset = IO.Position; + for (i0 = 0; i0 < SprEnt.Sprites.Count; i0++) + IO.Write(0L); } IO.Align(0x20); - for (i = 0; i < Aet.SprEntsArr.Length; i++) + Aet.SpriteEntries.Offset = IO.Position; + for (i = 0; i < Aet.SpriteEntries.Count; i++) { - Aet.SprEntsArr[i].Offset = IO.Position; - ref SpriteEntry SprEnt = ref Aet.SprEntsArr[i].Value; + ref SpriteEntry SprEnt = ref Aet.SpriteEntries.Entries[i]; + SprEnt.Offset = IO.Position; IO.Write(SprEnt.Unknown); IO.Write(SprEnt.Width); IO.Write(SprEnt.Height); @@ -162,28 +130,25 @@ namespace KKdMainLib.Aet } IO.Align(0x20); - Aet.LayObjPointers.Offset = IO.Position; - for (i = 0; i < Aet.LayObjPointers.Count; i++) + Aet.Layers.Offset = IO.Position; + for (i = 0; i < Aet.Layers.Count; i++) { - Aet.LayObjPointers.Entries[i].Offset = IO.Position; + Aet.Layers.Entries[i].Offset = IO.Position; IO.Write(0L); } - List NullValPointers = new List(); - for (i = 0; i < Aet.LayObjPointers.Count; i++) + KKdList NullValPointers = KKdList.New; + for (i = 0; i < Aet.Layers.Count; i++) { - for (i0 = 0; i0 < Aet.LayObjPointers.Entries[i].Count; i0++) - { - ref int I = ref Aet.LayObjPointers.Entries[i].Entries[i0]; - IO.Write(ref Aet.ObjectsArr[I].Value, ref NullValPointers); - } + if (Aet.Layers.Entries[i].Count < 1) continue; + + for (i0 = 0; i0 < Aet.Layers.Entries[i].Count; i0++) + IO.Write(ref Aet.Layers.Entries[i].Objects[i0], ref NullValPointers); IO.Align(0x20); - for (i0 = 0; i0 < Aet.LayObjPointers.Entries[i].Count; i0++) - { - ref int I = ref Aet.LayObjPointers.Entries[i].Entries[i0]; - IO.Write(ref Aet.ObjectsArr[I].Value, ref Aet.ObjectsArr[I].Offset); - } + Aet.Layers.Entries[i].Objects[0].Offset = IO.Position; + for (i0 = 0; i0 < Aet.Layers.Entries[i].Count; i0++) + IO.Write(ref Aet.Layers.Entries[i].Objects[i0]); } IO.Align(0x20); @@ -202,25 +167,30 @@ namespace KKdMainLib.Aet IO.Align(0x10); { - Dictionary UsedValues = new Dictionary(); + System.Collections.Generic.Dictionary UsedValues = + new System.Collections.Generic.Dictionary(); - if (Aet.SpritesArr != null) - for (i = 0; i < Aet.SpritesArr.Length; i++) - IO.WritePointerString(ref UsedValues, ref Aet.SpritesArr[i].Value.Name); + for (i = 0; i < Aet.SpriteEntries.Count; i++) + { + ref SpriteEntry SprEnt = ref Aet.SpriteEntries.Entries[i]; + for (i0 = 0; i0 < SprEnt.Sprites.Count; i0++) + IO.WritePointerString(ref UsedValues, ref SprEnt.Sprites.Entries[i0].Name); + } //IO.Align(0x4); - for (i = 0; i < Aet.ObjectsArr.Length; i++) - { - ref AetObject Obj = ref Aet.ObjectsArr[i].Value; - if (Obj.Type == ObjType.Pic) - for (i0 = 0; i0 < Obj.Pic.Value.Marker.Count; i0++) - IO.WritePointerString(ref UsedValues, ref Obj.Pic.Value.Marker.Entries[i0].Name); - else if (Obj.Type == ObjType.Eff) - for (i0 = 0; i0 < Obj.Eff.Value.Marker.Count; i0++) - IO.WritePointerString(ref UsedValues, ref Obj.Eff.Value.Marker.Entries[i0].Name); + for (i = 0; i < Aet.Layers.Count; i++) + for (i0 = 0; i0 < Aet.Layers.Entries[i].Count; i0++) + { + ref AetObject Obj = ref Aet.Layers.Entries[i].Objects[i0]; + if (Obj.Type == AetObject.ObjType.Pic) + for (i1 = 0; i1 < Obj.Pic.Value.Marker.Count; i1++) + IO.WritePointerString(ref UsedValues, ref Obj.Pic.Value.Marker.Entries[i1].Name); + else if (Obj.Type == AetObject.ObjType.Eff) + for (i1 = 0; i1 < Obj.Eff.Value.Marker.Count; i1++) + IO.WritePointerString(ref UsedValues, ref Obj.Eff.Value.Marker.Entries[i1].Name); - IO.WritePointerString(ref UsedValues, ref Obj.Name); - } + IO.WritePointerString(ref UsedValues, ref Obj.Name); + } //IO.Align(0x4); Aet.Name.Offset = IO.Position; @@ -237,78 +207,112 @@ namespace KKdMainLib.Aet IO.Align(0x10); int ReturnPosition = IO.Position; + for (i = 0; i < NullValPointers.Count; i++) IO.Write(0); + + IO.Align(0x10, true); + for (i = 0; i < NullValPointers.Count; i++) { IO.Position = NullValPointers[i]; IO.Write(ReturnPosition + i * 4); } - IO.Position = ReturnPosition; - for (i = 0; i < NullValPointers.Count; i++) IO.Write(0); - IO.Align(1, true); + for (i = 0; i < Aet.Layers.Count; i++) + for (i0 = 0; i0 < Aet.Layers.Entries[i].Count; i0++) + { + ref AetObject Obj = ref Aet.Layers.Entries[i].Objects[i0]; + if (Obj.Type == AetObject.ObjType.Pic) + { + IO.Position = Obj.Pic.Offset; + IO.Write(Aet.SpriteEntries[Obj.Pic.Value.SpriteEntryID].Offset); + if (Obj.Pic.Value.ParentObjectID > -1) + { + bool Found = false; + for (int I = 0; I < Aet.Layers.Count; I++) + for (int I0 = 0; I0 < Aet.Layers.Entries[I].Count; I0++) + if (Aet.Layers.Entries[I].ObjectIDs[I0] == Obj.Pic.Value.ParentObjectID) + { + Found = true; + IO.Write(Aet.Layers.Entries[I].Objects[I0].Offset); + break; + } + if (!Found) IO.Write(0); + } + else IO.Write(0); + IO.Write(Obj.Eff.Value.Marker.Count); + IO.Write(Obj.Eff.Value.Marker.Offset); + ref CountPointer Marker = ref Obj.Pic.Value.Marker; + IO.Position = Marker.Offset; + for (i1 = 0; i1 < Marker.Count; i1++) + { + IO.Write(Marker[i1].Frame); + IO.Write(Marker[i1].Name.Offset); + } + } + else if (Obj.Type == AetObject.ObjType.Eff) + { + IO.Position = Obj.Eff.Offset; + IO.Write(Aet.Layers[Obj.Eff.Value.LayerID].Offset); + if (Obj.Eff.Value.ParentObjectID > -1) + { + bool Found = false; + for (int I = 0; I < Aet.Layers.Count; I++) + for (int I0 = 0; I0 < Aet.Layers.Entries[I].Count; I0++) + if (Aet.Layers.Entries[I].ObjectIDs[I0] == Obj.Eff.Value.ParentObjectID) + { + Found = true; + IO.Write(Aet.Layers.Entries[I].Objects[I0].Offset); + break; + } + if (!Found) IO.Write(0); + } + else IO.Write(0); + IO.Write(Obj.Eff.Value.Marker.Count); + IO.Write(Obj.Eff.Value.Marker.Offset); + ref CountPointer Marker = ref Obj.Eff.Value.Marker; + IO.Position = Marker.Offset; + for (i1 = 0; i1 < Marker.Count; i1++) + { + IO.Write(Marker[i1].Frame); + IO.Write(Marker[i1].Name.Offset); + } + } - for (i = 0; i < Aet.ObjectsArr.Length; i++) + IO.Position = Obj.Offset; + IO.Write(Obj.Name.Offset); + } + + + for (i = 0; i < Aet.SpriteEntries.Count; i++) { - ref AetObject Obj = ref Aet.ObjectsArr[i].Value; - if (Obj.Type == ObjType.Pic) + ref SpriteEntry SprEnt = ref Aet.SpriteEntries.Entries[i]; + if (SprEnt.Sprites.Count == 0) continue; + IO.Position = SprEnt.Sprites.Offset; + for (i0 = 0; i0 < SprEnt.Sprites.Count; i0++) { - IO.Position = Obj.Pic.Offset; - IO.Write(Aet.SprEntsArr[Aet.SprEntsIndDict[Obj.Pic.Value.SpriteEntryID]].Offset); - IO.Write(Obj.Pic.Value.ParentObjectID > -1 ? - Aet.ObjectsArr[Obj.Pic.Value.ParentObjectID].Offset : 0); - IO.Write(Obj.Eff.Value.Marker.Count ); - IO.Write(Obj.Eff.Value.Marker.Offset); - ref CountPointer Marker = ref Obj.Pic.Value.Marker; - IO.Position = Marker.Offset; - for (i0 = 0; i0 < Marker.Count; i0++) - { - IO.Write(Marker.Entries[i0].Frame); - IO.Write(Marker.Entries[i0]. Name.Offset); - } + IO.Write(SprEnt.Sprites[i0].Name.Offset); + IO.Write(SprEnt.Sprites[i0].ID); } - else if (Obj.Type == ObjType.Eff) - { - IO.Position = Obj.Eff.Offset; - IO.Write(Aet.LayObjPointers.Entries[Obj.Eff.Value.LayerID].Offset); - IO.Write(Obj.Eff.Value.ParentObjectID > -1 ? - Aet.ObjectsArr[Obj.Eff.Value.ParentObjectID].Offset : 0); - IO.Write(Obj.Eff.Value.Marker.Count ); - IO.Write(Obj.Eff.Value.Marker.Offset); - ref CountPointer Marker = ref Obj.Eff.Value.Marker; - IO.Position = Marker.Offset; - for (i0 = 0; i0 < Marker.Count; i0++) - { - IO.Write(Marker.Entries[i0].Frame); - IO.Write(Marker.Entries[i0]. Name.Offset); - } - } - - IO.Position = Aet.ObjectsArr[i].Offset; - IO.Write(Obj.Name.Offset); } - if (Aet.SpritesArr != null) - for (i = 0; i < Aet.SpritesArr.Length; i++) - { - IO.Position = Aet.SpritesArr[i].Offset; - IO.Write(Aet.SpritesArr[i].Value.Name.Offset); - } - - for (i = 0; i < Aet.LayObjPointers.Count; i++) + IO.Position = Aet.Layers.Offset; + for (i = 0; i < Aet.Layers.Count; i++) { - IO.Position = Aet.LayObjPointers.Entries[i].Offset; - IO.Write(Aet.LayObjPointers.Entries[i].Count); - IO.Write(Aet.LayObjPointers.Entries[i].Count > 0 ? - Aet.ObjectsArr[Aet.ObjectsIndDict[Aet.LayObjPointers.Entries[i].Entries[0]]].Offset : 0); + if (Aet.Layers[i].Count > 0) + { + IO.Write(Aet.Layers[i].Count); + IO.Write(Aet.Layers[i].Objects[0].Offset); + } + else IO.Write(0L); } IO.Position = AET.Offset; IO.Write(Aet.Name.Offset); IO.Position = AET.Offset + 0x20; - IO.Write(Aet.LayObjPointers.Count ); - IO.Write(Aet.LayObjPointers.Offset); - IO.Write(Aet.SprEntsArr.Length); - IO.Write(Aet.SprEntsArr[0].Offset); + IO.Write(Aet.Layers.Count ); + IO.Write(Aet.Layers.Offset); + IO.Write(Aet.SpriteEntries.Count ); + IO.Write(Aet.SpriteEntries.Offset); if (Aet.Unknown.Count > 0) { IO.Write(Aet.Unknown.Count); IO.Write(Aet.Unknown.Offset); } else IO.Write(0L); @@ -319,14 +323,14 @@ namespace KKdMainLib.Aet AET = new AetHeader(); MsgPack MsgPack = file.ReadMPAllAtOnce(JSON); - if (!MsgPack.Element("Aet", out MsgPack Aet)) { MsgPack = MsgPack.New; return; } + if (!MsgPack.ElementArray("Aet", out MsgPack Aet)) { MsgPack = MsgPack.New; return; } if (Aet.Array != null) if (Aet.Array.Length > 0) { AET.Data = new Pointer[Aet.Array.Length]; for (int i = 0; i < AET.Data.Length; i++) - if (Aet.Array[i] is MsgPack SubAet ) MsgPackReader(SubAet, ref AET.Data[i] ); + MsgPackReader(Aet.Array[i], ref AET.Data[i] ); } MsgPack = MsgPack.New; @@ -356,151 +360,74 @@ namespace KKdMainLib.Aet Aet.Width = AET.ReadInt32("Width" ); Aet.Height = AET.ReadInt32("Height"); - if (AET.Element("Layers", out MsgPack Layers)) - { - Aet.LayObjPointers.Count = Layers.Array.Length; - for (i = 0; i < Aet.LayObjPointers.Count; i++) - if (Layers[i] is MsgPack ObjectID) - { - Aet.LayObjPointers.Entries[i].Count = - ObjectID.Array == null ? 0 : ObjectID.Array.Length; - for (i0 = 0; i0 < Aet.LayObjPointers.Entries[i].Count; i0++) - if (ObjectID.Array[i0] is MsgPack msg) - Aet.LayObjPointers.Entries[i].Entries[i0] = msg.ReadInt32(); - } - } - else return; - - Aet.ObjectsIndDict = new Dictionary(); - Aet.SprEntsIndDict = new Dictionary(); - Aet.SpritesIndDict = new Dictionary(); - - int? ID = null; - if (AET.Element("SpriteEntry", out Temp)) - { - Aet.SprEntsArr = new Pointer[1]; - ID = Aet.SprEntsArr[0].Value.ReadMP(Temp); - if (ID != null) Aet.SprEntsIndDict.Add(ID.Value, 0); - } - else if (AET.Element("SpriteEntries", out Temp)) - { - Aet.SprEntsArr = new Pointer[Temp.Array.Length]; - for (i = 0; i < Aet.SprEntsArr.Length; i++) - if (Temp[i] is MsgPack SpriteEntry) - { - ID = Aet.SprEntsArr[i].Value.ReadMP(SpriteEntry); - if (ID != null) Aet.SprEntsIndDict.Add(ID.Value, i); - } - } - else return; - - if (AET.Element("Object", out Temp)) - { - Aet.ObjectsArr = new Pointer[1]; - ID = Aet.ObjectsArr[0].Value.ReadMP(Temp, 0, ref Aet); - if (ID != null) Aet.ObjectsIndDict.Add(ID.Value, 0); - } - else if (AET.Element("Objects", out Temp)) - { - Aet.ObjectsArr = new Pointer[Temp.Array.Length]; - for (i = 0; i < Aet.ObjectsArr.Length; i++) - if (Temp[i] is MsgPack Object) - { - ID = Aet.ObjectsArr[i].Value.ReadMP(Object, i, ref Aet); - if (ID != null) Aet.ObjectsIndDict.Add(ID.Value, i); - } - } - else return; - - if (AET.Element("Sprite", out Temp)) - { - Aet.SpritesArr = new Pointer[1]; - ID = Aet.SpritesArr[0].Value.ReadMP(Temp); - if (ID != null) Aet.SpritesIndDict.Add(ID.Value, 0); - } - else if (AET.Element("Sprites", out Temp)) - { - Aet.SpritesArr = new Pointer[Temp.Array.Length]; - for (i = 0; i < Aet.SpritesArr.Length; i++) - if (Temp[i] is MsgPack Sprite) - { - ID = Aet.SpritesArr[i].Value.ReadMP(Sprite); - if (ID != null) Aet.SpritesIndDict.Add(ID.Value, i); - } - } if (AET.Element("Unknown", out Temp)) Aet.Unknown.Count = Temp.ReadInt32(); + + if (AET.ElementArray("SpriteEntries", out Temp)) + { + Aet.SpriteEntries.Count = Temp.Array.Length; + for (i = 0; i < Aet.SpriteEntries.Count; i++) + Aet.SpriteEntries.Entries[i].ReadMP(Temp[i]); + } + else return; + + + if (AET.ElementArray("Layers", out Temp)) + { + Aet.Layers.Count = Temp.Array.Length + 1; + for (i = 0; i < Aet.Layers.Count - 1; i++) + Aet.Layers.Entries[i].ReadMP(Temp[i]); + } + else return; + + + i = Aet.Layers.Count - 1; + if (AET.ElementArray("RootLayer", out Temp)) + { + Aet.Layers.Entries[i].Objects = new AetObject[Temp.Array.Length]; + for (i0 = 0; i0 < Aet.Layers[i].Count; i0++) + Aet.Layers.Entries[i].Objects[i0].ReadMP(Temp[i0]); + } + else if (AET.Element("RootLayer", out Temp)) + Aet.Layers.Entries[i].Objects[0].ReadMP(Temp); + else return; + AetData.Offset = 0; } - - + public MsgPack MsgPackWriter(ref Pointer AetData) { if (AetData.Offset <= 0) return MsgPack.New; ref AetData Aet = ref AetData.Value; - Aet.ObjectsIndDict = Aet.ObjectsDict.GetIndDict(); - Aet.SpritesIndDict = Aet.SpritesDict.GetIndDict(); - Aet.SprEntsIndDict = Aet.SprEntsDict.GetIndDict(); - Aet.ObjectsArr = Aet.ObjectsDict.ToPointerArray(); - Aet.SpritesArr = Aet.SpritesDict.ToPointerArray(); - Aet.SprEntsArr = Aet.SprEntsDict.ToPointerArray(); - Aet.ObjectsDict = null; - Aet.SpritesDict = null; - Aet.SprEntsDict = null; - MsgPack AET = MsgPack.New.Add("Name", Aet.Name.Value).Add("Duration", Aet.Duration).Add("FrameRate", Aet.FrameRate).Add("Width", Aet.Width).Add("Height", Aet.Height).Add("Unk", Aet.Unk); - - if (Aet.LayObjPointers.Count > 0) - { - MsgPack Layers = new MsgPack(Aet.LayObjPointers.Count, "Layers"); - for (i = 0; i < Aet.LayObjPointers.Count; i++) - if (Aet.LayObjPointers.Entries[i].Count > 0) - { - MsgPack Objects = new MsgPack(Aet.LayObjPointers.Entries[i].Count); - for (i0 = 0; i0 < Aet.LayObjPointers.Entries[i].Count; i0++) - Objects[i0] = Aet.ObjectsIndDict[Aet.LayObjPointers.Entries[i].Entries[i0]]; - Layers[i] = Objects; - } - AET.Add(Layers); - } - - if (Aet.SprEntsArr.Length == 1) - AET.Add(Aet.SprEntsArr[0].Value.WriteMP(0, ref Aet.SpritesIndDict, "SpriteEntry")); - else if (Aet.SprEntsArr.Length > 0) - { - MsgPack SpriteEntries = new MsgPack(Aet.SprEntsArr.Length, "SpriteEntries"); - for (i = 0; i < Aet.SprEntsArr.Length; i++) - SpriteEntries[i] = Aet.SprEntsArr[i].Value.WriteMP(i, ref Aet.SpritesIndDict); - AET.Add(SpriteEntries); - } - - if (Aet.ObjectsArr.Length == 1) - AET.Add(Aet.ObjectsArr[0].Value.WriteMP(0, ref Aet, "Object")); - else if (Aet.ObjectsArr.Length > 1) - { - MsgPack Objects = new MsgPack(Aet.ObjectsArr.Length, "Objects"); - for (i = 0; i < Aet.ObjectsArr.Length; i++) - Objects[i] = Aet.ObjectsArr[i].Value.WriteMP(i, ref Aet); - AET.Add(Objects); - } - - if (Aet.SpritesArr.Length == 1) - AET.Add(Aet.SpritesArr[0].Value.WriteMP(0, "Sprite")); - else if (Aet.SpritesArr.Length > 1) - { - MsgPack Sprites = new MsgPack(Aet.SpritesArr.Length, "Sprites"); - for (i = 0; i < Aet.SpritesArr.Length; i++) - Sprites[i] = Aet.SpritesArr[i].Value.WriteMP(i); - AET.Add(Sprites); - } - if (Aet.Unknown.Count > 0) AET.Add("Unknown", Aet.Unknown.Count); + i = Aet.Layers.Count - 1; + if (Aet.Layers[i].Count == 1) + AET.Add(Aet.Layers[i][0].WriteMP(ref Aet, Aet.Layers[i].ObjectIDs[0], "RootLayer")); + if (Aet.Layers[i].Count > 1) + { + MsgPack RootLayer = new MsgPack(Aet.Layers[i].Count, "RootLayer"); + for (i0 = 0; i0 < Aet.Layers[i].Count; i0++) + RootLayer[i0] = Aet.Layers[i][i0].WriteMP(ref Aet, Aet.Layers[i].ObjectIDs[i0]); + AET.Add(RootLayer); + } + + MsgPack Layers = new MsgPack(Aet.Layers.Count - 1, "Layers"); + for (i = 0; i < Aet.Layers.Count - 1; i++) + Layers[i] = Aet.Layers[i].WriteMP(i, ref Aet); + AET.Add(Layers); + + MsgPack SpriteEntries = new MsgPack(Aet.SpriteEntries.Count, "SpriteEntries"); + for (i = 0; i < Aet.SpriteEntries.Count; i++) + SpriteEntries[i] = Aet.SpriteEntries[i].WriteMP(i); + AET.Add(SpriteEntries); + return AET; } } @@ -520,19 +447,57 @@ namespace KKdMainLib.Aet public int Width; public int Height; public int DontChange; - public CountPointer> LayObjPointers; + public CountPointer< AetLayer> Layers; + public CountPointer SpriteEntries; public CountPointer Unknown; + } - public Dictionary LayObjDict; - public Dictionary ObjectsIndDict; - public Dictionary SpritesIndDict; - public Dictionary SprEntsIndDict; - public Pointer< AetObject>[] ObjectsArr; - public Pointer[] SprEntsArr; - public Pointer< Sprite>[] SpritesArr; - public Dictionary ObjectsDict; - public Dictionary SprEntsDict; - public Dictionary SpritesDict; + public struct AetLayer + { + public int Pointer; + public int Count + { + get => Objects != null ? Objects.Length : 0; + set { ObjectIDs = new int[value]; Objects = new AetObject[value]; } + } + public int Offset; + public int[] ObjectIDs; + public AetObject[] Objects; + + public void ReadMP(MsgPack msg) + { + if (msg.Element("Object", out MsgPack Object)) + { + Count = 1; + Objects[0].ReadMP(Object); + } + else if (msg.ElementArray("Objects", out MsgPack Objects)) + { + Count = Objects.Array.Length; + for (int i0 = 0; i0 < Count; i0++) + this.Objects[i0].ReadMP(Objects[i0]); + } + } + + public MsgPack WriteMP(int Id, ref AetData Aet) + { + if (Count < 1) + return MsgPack.New.Add("ID", Id); + else if (Count == 1) + return MsgPack.New.Add("ID", Id).Add(this.Objects[0].WriteMP(ref Aet, ObjectIDs[0], "Object")); + MsgPack Objects = new MsgPack(Count, "Objects"); + for (int i = 0; i < Count; i++) + Objects[i] = this.Objects[i].WriteMP(ref Aet, ObjectIDs[i]); + return MsgPack.New.Add("ID", Id).Add(Objects); + } + + public AetObject this[int index] + { + get { if (Count > 0) return Objects[index]; return default(AetObject); } + set { if (Count > 0) { Objects[index] = value; } } + } + + public override string ToString() => "Count: " + Count; } public struct AetObject @@ -547,11 +512,11 @@ namespace KKdMainLib.Aet public byte Unk1; public byte Unk2; public ObjType Type; - public Pointer Pic; - public Pointer Aif; - public Pointer Eff; + public Pointer Pic; + public Pointer