Compare commits

...
8 Commits
Author SHA1 Message Date
korenkonder 89c9afd0c5 Release v0.4.9.5
A3DA, DataBank, STR
2020-08-09 03:37:23 +03:00
korenkonder cd2eab5b8e Release v0.4.9.4.2 (Hotfix)
STR
2020-06-19 19:09:36 +03:00
korenkonder 8dd10b2fa4 Release v0.4.9.4.1 (Hotfix)
STR
2020-06-19 18:57:04 +03:00
korenkonder 35dee99307 Release v0.4.9.4
A3DA, DEX, STR
2020-06-19 14:09:15 +03:00
korenkonder b49b86887e Release v0.4.9.3.2 (Hotfix)
CLI, Tables
2020-06-03 01:45:36 +03:00
korenkonder a0a3737b47 Release v0.4.9.3.1 (Hotfix)
AET
2020-05-27 18:02:32 +03:00
korenkonder 9c86616dcd Release v0.4.9.3
AET
2020-05-25 14:23:28 +03:00
korenkonder e2990dccaf Update README.md 2020-05-21 23:10:27 +03:00
68 changed files with 2312 additions and 2056 deletions
+24
View File
@@ -22,5 +22,29 @@ namespace KKdBaseLib
public long DataOffset; //Used only in-game and points to KFT3 Array
public KFT3[] Keys;
public A3DAKey(Key k)
{
Type = 0; Value = MaxFrames = FrameDelta = ValueDelta = 0; EPTypePre = EPTypePost = 0;
Unk1C = Unk20 = Unk24 = Unk28 = Unk2C = Unk30 = Unk34 = 0;
Length = DataOffset = 0; Keys = null;
EPTypePost = k.EPTypePost;
EPTypePre = k.EPTypePre;
MaxFrames = k.Max ?? 0;
if (k.Type > KeyType.Value && k.Length > 1)
{
Type = k.Type;
Length = k.Length;
Keys = k.Keys;
FrameDelta = k.Keys[k.Length - 1].F - k.Keys[0].F;
ValueDelta = k.Keys[k.Length - 1].V - k.Keys[0].V;
}
else
{
Type = k.Type;
Value = k.Type > 0 ? k.Value : 0.0f;
}
}
}
}
+9
View File
@@ -0,0 +1,9 @@
namespace KKdBaseLib
{
public class HeadData : System.Attribute { }
public class Padding : System.Attribute { }
public class Binary : System.Attribute { }
public class Offset : System.Attribute { }
public class Count : System.Attribute { }
public class Flags : System.Attribute { }
}
+8 -8
View File
@@ -17,9 +17,9 @@ namespace KKdBaseLib.Auth2D
public uint Width;
public uint Height;
public Pointer<Vec2<CountPointer<KFT2>>> Camera;
public CountPointer<Composition> Compositions;
public CountPointer<Video > Videos;
public CountPointer<Audio > Audios;
public CountPointer<Composition> Composition;
public CountPointer<Video > Video;
public CountPointer<Audio > Audio;
}
public struct Composition
@@ -47,9 +47,9 @@ namespace KKdBaseLib.Auth2D
public AetLayerFlags Flags;
public AetLayerQuality Quality;
public AetLayerType Type;
public int VideoItemOffset;
public int VidItmOff; //VideoItemOffset
public int ParentLayer;
public CountPointer<Marker> Markers;
public CountPointer<Marker> Marker;
public Pointer<VideoData> Video;
public Pointer<AudioData> Audio;
@@ -210,11 +210,11 @@ namespace KKdBaseLib.Auth2D
public ushort Width;
public ushort Height;
public float Frames;
public CountPointer<Source> Sources;
public CountPointer<Identifier> Identifiers;
public override string ToString() => $"Width: {Width}; Height: {Height}; Color: {Color.ToString("X2")}";
public override string ToString() => $"Width: {Width}; Height: {Height}; Color: {Color:X2)}";
public struct Source
public struct Identifier
{
public Pointer<string> Name;
public uint ID;
+53 -80
View File
@@ -36,17 +36,17 @@ namespace KKdBaseLib.Auth3D
public struct Ambient
{
public string Name;
public Vec4<Key> LightDiffuse;
public Vec4<Key> RimLightDiffuse;
public Vec4<Key>? LightDiffuse;
public Vec4<Key>? RimLightDiffuse;
}
public struct CameraAuxiliary
{
public Key Gamma;
public Key Exposure;
public Key Saturate;
public Key GammaRate;
public Key AutoExposure;
public Key? Gamma;
public Key? Exposure;
public Key? Saturate;
public Key? GammaRate;
public Key? AutoExposure;
}
public struct CameraRoot
@@ -99,7 +99,7 @@ namespace KKdBaseLib.Auth3D
public Key End;
public Key Start;
public Key Density;
public Vec4<Key> Diffuse;
public Vec4<Key>? Diffuse;
}
public enum CompressF16 : int
@@ -127,16 +127,41 @@ namespace KKdBaseLib.Auth3D
public struct Key
{
public KeyType? Type;
public KeyType Type;
public int Length;
public int? BinOffset;
public EPType EPTypePre;
public EPType EPTypePost;
public float? Max;
public float? Value;
public float Value;
public RawD RawData;
public KFT3[] Keys;
public Key(A3DAKey k)
{
Type = 0;
Value = 0;
Length = 0;
BinOffset = null;
RawData = default;
Keys = null;
EPTypePost = k.EPTypePost;
EPTypePre = k.EPTypePre;
Max = k.MaxFrames;
if (k.Length > 1)
{
Type = k.Type;
Length = (int)k.Length;
Keys = k.Keys;
}
else if (k.Length == 1)
{
Type = KeyType.Value;
Value = k.Keys[0].V;
}
}
public struct RawD
{
public int KeyType;
@@ -144,58 +169,6 @@ namespace KKdBaseLib.Auth3D
public string ValueType;
public string[] ValueList;
}
public static Vec3<A3DAKey> ToA3DAKey(Vec3< Key> k) =>
new Vec3<A3DAKey> { X = (A3DAKey)k.X, Y = (A3DAKey)k.Y, Z = (A3DAKey)k.Z };
public static Vec3< Key> ToKey (Vec3<A3DAKey> k) =>
new Vec3< Key> { X = ( Key)k.X, Y = ( Key)k.Y, Z = ( Key)k.Z };
public static explicit operator Key(A3DAKey k)
{
Key key = default;
key.EPTypePost = k.EPTypePost;
key.EPTypePre = k.EPTypePre;
key.Max = k.MaxFrames;
if (k.Length > 1)
{
key.Type = k.Type;
key.Length = (int)k.Length;
key.Keys = k.Keys;
}
else if (k.Length == 1)
{
key.Type = KeyType.Value;
key.Value = k.Keys[0].V;
}
return key;
}
public static explicit operator A3DAKey(Key k)
{
A3DAKey key = default;
key.EPTypePost = k.EPTypePost;
key.EPTypePre = k.EPTypePre;
key.MaxFrames = k.Max ?? 0;
if (k.Type != null && k.Length > 1)
{
key.Type = k.Type.Value;
key.Length = k.Length;
key.Keys = k.Keys;
key.FrameDelta = k.Keys[k.Length - 1].F - k.Keys[0].F;
key.ValueDelta = k.Keys[k.Length - 1].V - k.Keys[0].V;
}
else
{
key.Type = 0;
key.Value = 0.0f;
if (k.Type.HasValue && k.Value.HasValue)
{
key.Type = k.Type.Value;
key.Value = k.Value.Value;
}
}
return key;
}
}
public struct Light
@@ -203,10 +176,10 @@ namespace KKdBaseLib.Auth3D
public int? Id;
public string Name;
public string Type;
public Vec4<Key> Ambient;
public Vec4<Key> Diffuse;
public Vec4<Key> Specular;
public Vec4<Key> Incandescence;
public Vec4<Key>? Ambient;
public Vec4<Key>? Diffuse;
public Vec4<Key>? Specular;
public Vec4<Key>? Incandescence;
public ModelTransform Position;
public ModelTransform SpotDirection;
}
@@ -216,8 +189,8 @@ namespace KKdBaseLib.Auth3D
public string Name;
public string HashName;
public Key GlowIntensity;
public Vec4<Key> BlendColor;
public Vec4<Key> Incandescence;
public Vec4<Key>? BlendColor;
public Vec4<Key>? Incandescence;
}
public struct MObjectHRC
@@ -275,12 +248,12 @@ namespace KKdBaseLib.Auth3D
public struct TextureTransform
{
public string Name;
public Key Rotate;
public Key RotateFrame;
public Vec2<Key> Offset;
public Vec2<Key> Repeat;
public Vec2<Key> Coverage;
public Vec2<Key> TranslateFrame;
public Key? Rotate;
public Key? RotateFrame;
public Vec2<Key?> Offset;
public Vec2<Key?> Repeat;
public Vec2<Key?> Coverage;
public Vec2<Key?> TranslateFrame;
}
}
@@ -304,11 +277,11 @@ namespace KKdBaseLib.Auth3D
public struct PostProcess
{
public Key LensFlare;
public Key LensGhost;
public Key LensShaft;
public Vec4<Key> Ambient;
public Vec4<Key> Diffuse;
public Vec4<Key> Specular;
public Key? LensFlare;
public Key? LensGhost;
public Key? LensShaft;
public Vec4<Key>? Ambient;
public Vec4<Key>? Diffuse;
public Vec4<Key>? Specular;
}
}
+87 -33
View File
@@ -7,7 +7,7 @@ namespace KKdBaseLib
public static double Acos (this double d ) => Math.Acos (d );
public static double Asin (this double d ) => Math.Asin (d );
public static double Atan (this double d ) => Math.Atan (d );
public static double Aсtg (this double d ) => 1 / Math.Atan (d );
public static double Actg (this double d ) => 1 / Math.Atan (d );
public static double Cos (this double d ) => Math.Cos (d );
public static double Cosh (this double val) => Math.Cosh (val);
public static double Sin (this double a ) => Math.Sin (a );
@@ -26,7 +26,6 @@ namespace KKdBaseLib
public static int Sign (this double val) => Math.Sign (val);
public static double Sqrt (this double d ) => Math.Sqrt (d );
public static double Atan2(this double y , double x ) => Math.Atan2(y , x );
public static double Log (this double val , double newBase) => Math.Log (val , newBase);
public static double Max (this double val1, double val2 ) => Math.Max (val1, val2 );
@@ -37,7 +36,7 @@ namespace KKdBaseLib
public static float Acos (this float d ) => (float) Math.Acos (d ) ;
public static float Asin (this float d ) => (float) Math.Asin (d ) ;
public static float Atan (this float d ) => (float) Math.Atan (d ) ;
public static float Aсtg (this float d ) => (float)(1 / Math.Atan (d ));
public static float Actg (this float d ) => (float)(1 / Math.Atan (d ));
public static float Cos (this float d ) => (float) Math.Cos (d ) ;
public static float Cosh (this float val) => (float) Math.Cosh (val) ;
public static float Sin (this float a ) => (float) Math.Sin (a ) ;
@@ -55,7 +54,6 @@ namespace KKdBaseLib
public static float Round (this float d ) => (float) Math.Round (d ) ;
public static float Sqrt (this float d ) => (float) Math.Sqrt (d ) ;
public static float Atan2(this float y , float x ) => (float)Math.Atan2(y , x );
public static float Log (this float val , float newBase) => (float)Math.Log (val , newBase);
public static float Max (this float val1, float val2 ) => Math.Max (val1, val2 );
@@ -89,10 +87,29 @@ namespace KKdBaseLib
public static byte[] E(this byte[] le, byte len, bool isBE)
{ if (isBE) { for (byte i = 0; i < len; i++) buf[i] = le[i];
for (byte i = 0; i < len; i++) le[len - i - 1] = buf[i]; } return le; }
public static short E(this short le)
{ for (byte i = 0; i < 2; i++) { buf[i] = (byte)le; le >>= 8; } le = 0;
for (byte i = 0; i < 2; i++) { le = (short)((int)le | buf[i]); if (i < 1) le <<= 8; } return le; }
public static ushort E(this ushort le)
{ for (byte i = 0; i < 2; i++) { buf[i] = (byte)le; le >>= 8; } le = 0;
for (byte i = 0; i < 2; i++) { le |= buf[i]; if (i < 1) le <<= 8; } return le; }
public static int E(this int le)
{ for (byte i = 0; i < 4; i++) { buf[i] = (byte)le; le >>= 8; } le = 0;
for (byte i = 0; i < 4; i++) { le |= buf[i]; if (i < 3) le <<= 8; } return le; }
public static uint E(this uint le)
{ for (byte i = 0; i < 4; i++) { buf[i] = (byte)le; le >>= 8; } le = 0;
for (byte i = 0; i < 4; i++) { le |= buf[i]; if (i < 3) le <<= 8; } return le; }
public static long E(this long le)
{ for (byte i = 0; i < 8; i++) { buf[i] = (byte)le; le >>= 8; } le = 0;
for (byte i = 0; i < 8; i++) { le |= buf[i]; if (i < 7) le <<= 8; } return le; }
public static ulong E(this ulong le)
{ for (byte i = 0; i < 8; i++) { buf[i] = (byte)le; le >>= 8; } le = 0;
for (byte i = 0; i < 8; i++) { le |= buf[i]; if (i < 7) le <<= 8; } return le; }
public static short E(this short le, bool isBE)
{ if (isBE) { for (byte i = 0; i < 2; i++) { buf[i] = (byte)le; le >>= 8; } le = 0;
for (byte i = 0; i < 2; i++) { le = (short)((int)le |
buf[i]); if (i < 1) le <<= 8; } } return le; }
for (byte i = 0; i < 2; i++) { le = (short)((int)le | buf[i]); if (i < 1) le <<= 8; } } return le; }
public static ushort E(this ushort le, bool isBE)
{ if (isBE) { for (byte i = 0; i < 2; i++) { buf[i] = (byte)le; le >>= 8; } le = 0;
for (byte i = 0; i < 2; i++) { le |= buf[i]; if (i < 1) le <<= 8; } } return le; }
@@ -142,32 +159,32 @@ namespace KKdBaseLib
public static Quat TQ (this byte[] arr, int offset = 0)
{ Quat val; fixed (byte* ptr = arr) val = *( Quat*)(ptr + offset); return val; }
public static void GBy(this byte[] arr, short val)
{ fixed (byte* ptr = arr) *( short*)ptr = val; }
public static void GBy(this byte[] arr, ushort val)
{ fixed (byte* ptr = arr) *(ushort*)ptr = val; }
public static void GBy(this byte[] arr, int val)
{ fixed (byte* ptr = arr) *( int*)ptr = val; }
public static void GBy(this byte[] arr, uint val)
{ fixed (byte* ptr = arr) *( uint*)ptr = val; }
public static void GBy(this byte[] arr, long val)
{ fixed (byte* ptr = arr) *( long*)ptr = val; }
public static void GBy(this byte[] arr, ulong val)
{ fixed (byte* ptr = arr) *( ulong*)ptr = val; }
public static void GBy(this byte[] arr, Half val)
{ fixed (byte* ptr = arr) *( Half*)ptr = val; }
public static void GBy(this byte[] arr, float val)
{ fixed (byte* ptr = arr) *( float*)ptr = val; }
public static void GBy(this byte[] arr, double val)
{ fixed (byte* ptr = arr) *(double*)ptr = val; }
public static void GBy(this byte[] arr, Vec2 val)
{ fixed (byte* ptr = arr) *( Vec2*)ptr = val; }
public static void GBy(this byte[] arr, Vec3 val)
{ fixed (byte* ptr = arr) *( Vec3*)ptr = val; }
public static void GBy(this byte[] arr, Vec4 val)
{ fixed (byte* ptr = arr) *( Vec4*)ptr = val; }
public static void GBy(this byte[] arr, Quat val)
{ fixed (byte* ptr = arr) *( Quat*)ptr = val; }
public static void GBy(this byte[] arr, short val, int offset = 0)
{ fixed (byte* ptr = arr) *( short*)(ptr + offset) = val; }
public static void GBy(this byte[] arr, ushort val, int offset = 0)
{ fixed (byte* ptr = arr) *(ushort*)(ptr + offset) = val; }
public static void GBy(this byte[] arr, int val, int offset = 0)
{ fixed (byte* ptr = arr) *( int*)(ptr + offset) = val; }
public static void GBy(this byte[] arr, uint val, int offset = 0)
{ fixed (byte* ptr = arr) *( uint*)(ptr + offset) = val; }
public static void GBy(this byte[] arr, long val, int offset = 0)
{ fixed (byte* ptr = arr) *( long*)(ptr + offset) = val; }
public static void GBy(this byte[] arr, ulong val, int offset = 0)
{ fixed (byte* ptr = arr) *( ulong*)(ptr + offset) = val; }
public static void GBy(this byte[] arr, Half val, int offset = 0)
{ fixed (byte* ptr = arr) *( Half*)(ptr + offset) = val; }
public static void GBy(this byte[] arr, float val, int offset = 0)
{ fixed (byte* ptr = arr) *( float*)(ptr + offset) = val; }
public static void GBy(this byte[] arr, double val, int offset = 0)
{ fixed (byte* ptr = arr) *(double*)(ptr + offset) = val; }
public static void GBy(this byte[] arr, Vec2 val, int offset = 0)
{ fixed (byte* ptr = arr) *( Vec2*)(ptr + offset) = val; }
public static void GBy(this byte[] arr, Vec3 val, int offset = 0)
{ fixed (byte* ptr = arr) *( Vec3*)(ptr + offset) = val; }
public static void GBy(this byte[] arr, Vec4 val, int offset = 0)
{ fixed (byte* ptr = arr) *( Vec4*)(ptr + offset) = val; }
public static void GBy(this byte[] arr, Quat val, int offset = 0)
{ fixed (byte* ptr = arr) *( Quat*)(ptr + offset) = val; }
public static sbyte CITSB(this int c)
{ return ( sbyte)(c > 0x0000007F ?
@@ -222,7 +239,10 @@ namespace KKdBaseLib
public static double ToF64(this long i) => *(double*)&i;
public static double ToF64(this ulong i) => *(double*)&i;
public static string ToString(this int d, bool BE) =>
public static string ToS(this int d, bool BE) =>
BitConverter.GetBytes(d.E(BE)).ToASCII();
public static string ToS(this uint d, bool BE) =>
BitConverter.GetBytes(d.E(BE)).ToASCII();
public static string ToS(this object d)
@@ -289,5 +309,39 @@ namespace KKdBaseLib
public static bool ToF64(this string s, out double? val)
{ val = null; if (s.Length < 1) return false; ulong d = 0; if (s[0] == '-') d = 0x8000000000000000;
bool b = double.TryParse(s.Replace(".", NDS), out double t); if (b) val = (d | t.ToU64()).ToF64(); return b; }
public static T[] ReverseEndian<T>(this T[] a)
{
if (a == null || a.Length < 1) return a;
int length = a.Length;
T[] b = new T[length];
for (int i = 0; i < length; i++)
b[i] = (T)ReverseEndian(a[i]);
return b;
}
public static object ReverseEndian(this object a)
{
object c = default;
System.Reflection.FieldInfo[] d = a.GetType().GetFields();
foreach (System.Reflection.FieldInfo field in d)
{
object e = field.GetValue(a);
Type t = field.FieldType;
if (t == typeof( short)) e = (( short)e).E();
else if (t == typeof(ushort)) e = ((ushort)e).E();
else if (t == typeof( int)) e = (( int)e).E();
else if (t == typeof( uint)) e = (( uint)e).E();
else if (t == typeof( long)) e = (( long)e).E();
else if (t == typeof( ulong)) e = (( ulong)e).E();
else if (t == typeof( float)) e = (( float)e).ToI32().E().ToF32();
else if (t == typeof(double)) e = ((double)e).ToI64().E().ToF64();
else if (t == typeof( Half)) e = (Half)((ushort)(Half)e).E();
else e = ReverseEndian(e);
field.SetValue(a, e);
}
return c;
}
}
}
+12 -12
View File
@@ -2,22 +2,22 @@ namespace KKdBaseLib.F2
{
public struct Header
{
public int Signature;
public int DataSize;
public int Length;
public int Flags;
public int Depth;
public int SectionSize;
public int Mode;
public int InnerSignature;
public int SectionSignature;
public uint Signature; // 0x00
public uint DataSize; // 0x04
public uint Length; // 0x08
public uint Flags; // 0x0C
public uint Depth; // 0x10
public uint SectionSize; // 0x14
public uint Version; // 0x18
public uint InnerSignature; // 0x30
public uint SectionSignature; // 0x40
public Format Format;
public bool NotUseDataSizeAsSectionSize;
public bool UseBigEndian;
public bool UseSectionSize;
public bool IsBE => Format == Format.F2BE;
public bool IsX => Format == Format.X || Format == Format.XHD;
public override string ToString() => Signature.ToString(false);
public override string ToString() => Signature.ToS(false);
}
}
+15 -11
View File
@@ -16,24 +16,28 @@ namespace KKdBaseLib.F2
Offsets = KKdList<long>.New;
fixed (byte* ptr = data)
{
int i = 0, offset = 0, v = 0;
long offset = 0;
int i = 0, j = 0, v = 0;
byte bitShift = (byte)(shiftX ? 3 : 2);
int length = *(int*)ptr - 4;
byte* localPtr = ptr + 4;
byte* l = ptr + 4;
Offsets.Capacity = length;
while (length > i)
{
v = *ptr & 0x3F;
Val = (Value)(*ptr & 0xC0);
localPtr++; i++;
if (Val == Value.Int32 )
{ v = (v << 24) | (ptr[0] << 16) | (ptr[1] << 8) | ptr[2]; localPtr += 3; i += 3; }
else if (Val == Value.Int16 )
{ v = (v << 8) | ptr[0]; localPtr += 1; i += 3; }
else if (Val == Value.Invalid) break;
v = *l & 0x3F;
Val = (Value)(*l & 0xC0);
if (Val == Value.Int32)
{ v = (v << 24) | (l[1] << 16) | (l[2] << 8) | l[3]; l += 4; i += 4; }
else if (Val == Value.Int16)
{ v = (v << 8) | l[1]; l += 2; i += 2; }
else if (Val == Value.Int8 ) { l ++ ; i ++ ; }
else break;
j++;
offset += v;
Offsets.Add(offset << bitShift);
}
Offsets.Capacity = j;
}
}
@@ -73,7 +77,7 @@ namespace KKdBaseLib.F2
private int length(bool shiftX = false)
{
int length = 5;
int length = 6;
long offset = 0;
byte bitShift = (byte)(shiftX ? 3 : 2);
int max1 = 0x00100 >> bitShift;
+18 -17
View File
@@ -9,10 +9,10 @@ namespace KKdBaseLib.F2
public ENRS ENRS;
public POF POF;
public int Length => length(false);
public int LengthX => length( true);
public uint Length => length(false);
public uint LengthX => length( true);
public int Depth => Header.Depth;
public uint Depth => Header.Depth;
public bool HasPOF => POF .NotNull;
public bool HasENRS => ENRS.NotNull;
@@ -20,29 +20,30 @@ namespace KKdBaseLib.F2
public long DataOffset;
public override string ToString() => $"{Header.ToString()}" +
$"{(HasSubStructs ? $"; SubStructs: {SubStructs.Length}" : "")}" +
$"{(HasENRS ? "; Has ENRS" : "")}{(HasPOF ? "; Has POF" : "")}";
private int length(bool shiftX = false)
public void Update(bool ShiftX = false)
{
int length = Data != null ? Data.Length : 0;
if (HasPOF ) length += 0x20 + (shiftX ? POF.LengthX : POF.Length);
if (HasENRS) length += 0x20 + ENRS.Length;
Header.SectionSize = Data != null ? (uint)Data.Length : 0;
Header.DataSize = length(ShiftX);
}
private uint length(bool shiftX = false)
{
uint length = Data != null ? (uint)Data.Length : 0;
if (HasPOF ) length += 0x20 + (uint)(shiftX ? POF.LengthX : POF.Length);
if (HasENRS) length += 0x20 + (uint)ENRS.Length;
if (HasSubStructs)
{
for (int i = 0; i < SubStructs.Length; i++)
length += (shiftX ? SubStructs[i].LengthX : SubStructs[i].Length) + SubStructs[i].Header.Length;
length += (uint)(shiftX ? SubStructs[i].LengthX : SubStructs[i].Length)
+ SubStructs[i].Header.Length;
length += 0x20;
}
return length;
}
public void Update(bool ShiftX = false)
{
Header.SectionSize = Data != null ? Data.Length : 0;
Header.DataSize = length(ShiftX);
}
public override string ToString() => $"{Header}" +
$"{(HasSubStructs ? $"; SubStructs: {SubStructs.Length}" : "")}" +
$"{(HasENRS ? "; Has ENRS" : "")}{(HasPOF ? "; Has POF" : "")}";
}
}
+6 -6
View File
@@ -9,11 +9,11 @@ namespace KKdBaseLib
DTe = 4,
F = 5,
AFT = 6,
F2LE = 7,
F2BE = 8,
MGF = 9,
X = 10,
XHD = 11,
FT = 12,
F2 = 7,
MGF = 8,
X = 9,
XHD = 10,
FT = 11,
M39 = 12,
}
}
+4 -4
View File
@@ -16,17 +16,17 @@ namespace KKdBaseLib.Interpolation
private KFT3 firstKey;
private KFT3 lastKey;
public float RequestedFramerate { get => rf; set { rf = value; df = @if / rf; } }
public float RequestedFramerate { get => rf; set { rf = value; df = @if / rf; } }
public float Frame => f;
public float Time => t;
public float Value => v;
public bool IsNull => a3daKey.Keys == null ? true : a3daKey.Length < 1;
public bool NotNull => a3daKey.Keys == null ? false : a3daKey.Length > 0;
public bool IsNull => a3daKey.Keys == null || a3daKey.Length < 1;
public bool NotNull => a3daKey.Keys != null && a3daKey.Length > 0;
public A3DAI(Key key, float a3daFramerate = 60, float requestedFramerate = 60)
{
a3daKey = (A3DAKey)key; f = -1; df = @if = rf = t = v = 0;
a3daKey = new A3DAKey(key); f = -1; df = @if = rf = t = v = 0;
@if = a3daFramerate;
firstKey = lastKey = default;
RequestedFramerate = requestedFramerate;
+3 -3
View File
@@ -20,8 +20,8 @@ namespace KKdBaseLib.Interpolation
public float Frame => f;
public float Time => t;
public float Value => v;
public bool IsNull => array == null ? true : array.Length < 1;
public bool NotNull => array == null ? false : array.Length > 0;
public bool IsNull => array == null || array.Length < 1;
public bool NotNull => array != null && array.Length > 0;
public PDI(KFT2[] array, float interpolationFramerate = 60, float requestedFramerate = 60)
{
@@ -124,7 +124,7 @@ namespace KKdBaseLib.Interpolation
else result = frame > c.F ? n.V : c.V;
return result;
}
public void ResetFrameCount() { f = -df; t = f / rf; }
public override string ToString() => $"F: {f}; T: {t}; V: {v}";
+23 -5
View File
@@ -4,7 +4,7 @@ namespace KKdBaseLib
{
public float F;
public KFT0(float F = 0)
public KFT0(float F)
{ this.F = F; }
public KFT0 ToT0() => this;
@@ -55,7 +55,10 @@ namespace KKdBaseLib
public float F;
public float V;
public KFT1(float F = 0, float V = 0)
public KFT1(float F)
{ this.F = F; V = 0; }
public KFT1(float F, float V)
{ this.F = F; this.V = V; }
public KFT0 ToT0() =>
@@ -109,7 +112,13 @@ namespace KKdBaseLib
public float V;
public float T;
public KFT2(float F = 0, float V = 0, float T = 0)
public KFT2(float F)
{ this.F = F; V = T = 0; }
public KFT2(float F, float V)
{ this.F = F; this.V = V; T = 0; }
public KFT2(float F, float V, float T)
{ this.F = F; this.V = V; this.T = T; }
public KFT0 ToT0() =>
@@ -118,7 +127,7 @@ namespace KKdBaseLib
new KFT1(F, V);
public KFT2 ToT2() => this;
public KFT3 ToT3() =>
new KFT3(F, V, T, T);
new KFT3(F, V, T);
public KFT3 ToT3(IKF Previous) =>
Previous is KFT2 PreviousT2 ?
@@ -169,7 +178,16 @@ namespace KKdBaseLib
public float T1;
public float T2;
public KFT3(float F = 0, float V = 0, float T1 = 0, float T2 = 0)
public KFT3(float F)
{ this.F = F; V = T1 = T2 = 0; }
public KFT3(float F, float V)
{ this.F = F; this.V = V; T1 = T2 = 0; }
public KFT3(float F, float V, float T)
{ this.F = F; this.V = V; T1 = T2 = T; }
public KFT3(float F, float V, float T1, float T2)
{ this.F = F; this.V = V; this.T1 = T1; this.T2 = T2; }
public KFT0 ToT0() =>
+10 -7
View File
@@ -1,17 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<Authors>korenkonder</Authors>
<Company></Company>
<Configuration></Configuration>
<Copyright>korenkonder © 2019-2020</Copyright>
<Copyright>korenkonder (C) 2019-2020</Copyright>
<Description>A base library</Description>
<FileVersion>0.4.9.2</FileVersion>
<FileVersion>0.4.9.5</FileVersion>
<PackageId>KKdBaseLib</PackageId>
<Product>KKdBaseLib</Product>
<TargetFramework>netstandard2.0</TargetFramework>
<TargetFramework>net461</TargetFramework>
<Title>KKdBaseLib</Title>
<Version>0.4.9.2</Version>
<Version>0.4.9.5</Version>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
@@ -24,7 +24,7 @@
<WarningLevel>4</WarningLevel>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<LangVersion>8.0</LangVersion>
<NoWarn>IDE0004, IDE0044, IDE0045, IDE0046, IDE0055, IDE0059, IDE0069, IDE1006</NoWarn>
<NoWarn>IDE0004, IDE0032, IDE0044, IDE0045, IDE0046, IDE0055, IDE0059, IDE0066, IDE0069, IDE1006</NoWarn>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
@@ -37,6 +37,9 @@
<DebugSymbols>true</DebugSymbols>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<LangVersion>8.0</LangVersion>
<NoWarn>IDE0004, IDE0044, IDE0045, IDE0046, IDE0055, IDE0059, IDE0069, IDE1006</NoWarn>
<NoWarn>IDE0004, IDE0032, IDE0044, IDE0045, IDE0046, IDE0055, IDE0059, IDE0066, IDE0069, IDE1006</NoWarn>
</PropertyGroup>
<ItemGroup>
<Reference Include="System.Windows.Forms" />
</ItemGroup>
</Project>
+18 -18
View File
@@ -4,8 +4,8 @@ namespace KKdBaseLib
{
public static KKdDict<TKey, TValue> Null => new KKdDict<TKey, TValue>();
public static KKdDict<TKey, TValue> New => new KKdDict<TKey, TValue>() { count = 0, Capacity = 0 };
public static KKdDict<TKey, TValue> NewReserve(int Capacity) =>
new KKdDict<TKey, TValue>() { count = 0, Capacity = Capacity };
public static KKdDict<TKey, TValue> NewReserve(int capacity) =>
new KKdDict<TKey, TValue>() { count = 0, Capacity = capacity };
private int count;
private int index;
@@ -73,22 +73,22 @@ namespace KKdBaseLib
public void Add(KeyValuePair<TKey, TValue> pair)
{
if (IsNull) return;
if (IsNull || ContainsKey(pair.Key)) return;
count++;
if (keyArray.Length < count) System.Array.Resize(ref keyArray, count);
if (valArray.Length < count) System.Array.Resize(ref valArray, count);
if (keyArray.Length < count) System.Array.Resize(ref keyArray, keyArray.Length * 2 + 1);
if (valArray.Length < count) System.Array.Resize(ref valArray, valArray.Length * 2 + 1);
keyArray[count - 1] = pair.Key;
valArray[count - 1] = pair.Value;
}
public void Add(TKey key, TValue val)
{
if (IsNull) return;
if (IsNull || ContainsKey(key)) return;
count++;
if (keyArray.Length < count) System.Array.Resize(ref keyArray, count);
if (valArray.Length < count) System.Array.Resize(ref valArray, count);
if (keyArray.Length < count) System.Array.Resize(ref keyArray, keyArray.Length * 2 + 1);
if (valArray.Length < count) System.Array.Resize(ref valArray, valArray.Length * 2 + 1);
keyArray[count - 1] = key;
valArray[count - 1] = val;
}
@@ -101,8 +101,8 @@ namespace KKdBaseLib
if (index == -1) return false;
if (index + 1 < count)
{ System.Array.Copy(keyArray, index + 1, keyArray, index, count - index);
System.Array.Copy(valArray, index + 1, valArray, index, count - index); }
{ System.Array.Copy(keyArray, index + 1, keyArray, index, count - index - 1);
System.Array.Copy(valArray, index + 1, valArray, index, count - index - 1); }
count--;
return true;
}
@@ -115,8 +115,8 @@ namespace KKdBaseLib
if (index == -1) return false;
if (index + 1 < count)
{ System.Array.Copy(keyArray, index + 1, keyArray, index, count - index);
System.Array.Copy(valArray, index + 1, valArray, index, count - index); }
{ System.Array.Copy(keyArray, index + 1, keyArray, index, count - index - 1);
System.Array.Copy(valArray, index + 1, valArray, index, count - index - 1); }
count--;
return true;
}
@@ -126,8 +126,8 @@ namespace KKdBaseLib
if (IsNull || index < 0 || index >= count) return;
if (index + 1 < count)
{ System.Array.Copy(keyArray, index + 1, keyArray, index, count - index);
System.Array.Copy(valArray, index + 1, valArray, index, count - index); }
{ System.Array.Copy(keyArray, index + 1, keyArray, index, count - index - 1);
System.Array.Copy(valArray, index + 1, valArray, index, count - index - 1); }
count--;
}
@@ -192,9 +192,9 @@ namespace KKdBaseLib
{
if (IsNull) return default;
for (int i = 0; i < count; i++)
if (keyArray[i] == null && val == null) return keyArray[i];
else if (keyArray[i] == null || val == null) continue;
else if (keyArray[i].Equals(val)) return keyArray[i];
if (valArray[i] == null && val == null) return keyArray[i];
else if (valArray[i] == null || val == null) continue;
else if (valArray[i].Equals(val)) return keyArray[i];
return default;
}
@@ -231,6 +231,6 @@ namespace KKdBaseLib
{ Key = key; Value = value; }
public override string ToString() =>
$"(Key: {Key}; value: {Value})";
$"(Key: {Key}; Value: {Value})";
}
}
+3 -3
View File
@@ -7,7 +7,7 @@ namespace KKdBaseLib
{
public static KKdList<T> Null => new KKdList<T>();
public static KKdList<T> New => new KKdList<T>() { count = 0, Capacity = 0 };
public static KKdList<T> NewReserve(int Capacity) => new KKdList<T>() { count = 0, Capacity = Capacity };
public static KKdList<T> NewReserve(int capacity) => new KKdList<T>() { count = 0, Capacity = capacity };
private int count;
private int index;
@@ -61,7 +61,7 @@ namespace KKdBaseLib
count++;
if (array.Length < count)
System.Array.Resize(ref array, count);
System.Array.Resize(ref array, array.Length * 2 + 1);
array[count - 1] = item;
}
@@ -70,7 +70,7 @@ namespace KKdBaseLib
if (IsNull || index < 0 || index >= count) return;
if (index + 1 < count)
System.Array.Copy(array, index + 1, array, index, count - index);
System.Array.Copy(array, index + 1, array, index, count - index - 1);
count--;
}
+55 -28
View File
@@ -2,10 +2,9 @@ using System;
using System.Linq;
using System.Globalization;
using System.Collections.Generic;
using KKdBaseLib;
using A3DADict = System.Collections.Generic.Dictionary<string, object>;
namespace KKdMainLib
namespace KKdBaseLib
{
public static unsafe class Main
{
@@ -52,57 +51,67 @@ namespace KKdMainLib
string[] newArgs = new string[args.Length - 1];
for (int i = 0; i < args.Length - 1; i++)
newArgs[i] = args[i + 1];
return dict.ContainsKey(args[0]) ? SW((A3DADict)dict[args[0]], newArgs) : false;
return dict.ContainsKey(args[0]) && SW((A3DADict)dict[args[0]], newArgs);
}
return dict.ContainsKey(args[0]);
}
public static bool FV(this A3DADict dict, ref bool value, char split, string args) =>
dict.FV(out string val, args.Split(split)) ? bool.TryParse(val, out value) : false;
public static bool FV (this A3DADict dict, ref bool value, char split, string args) =>
dict.FV(out string val, args.Split(split)) && bool.TryParse(val, out value);
public static bool FV(this A3DADict dict, ref int value, char split, string args) =>
dict.FV(out string val, args.Split(split)) ? int.TryParse(val, out value) : false;
public static bool FV (this A3DADict dict, ref int value, char split, string args) =>
dict.FV(out string val, args.Split(split)) && int.TryParse(val, out value);
public static bool FV(this A3DADict dict, ref float value, char split, string args) =>
dict.FV(out string val, args.Split(split)) ? val.ToF32(out value) : false;
public static bool FV (this A3DADict dict, ref float value, char split, string args) =>
dict.FV(out string val, args.Split(split)) && val.ToF32(out value);
public static bool FV(this A3DADict dict, ref double value, char split, string args) =>
dict.FV(out string val, args.Split(split)) ? val.ToF64(out value) : false;
public static bool FV (this A3DADict dict, ref double value, char split, string args) =>
dict.FV(out string val, args.Split(split)) && val.ToF64(out value);
public static bool FV(this A3DADict dict, ref string value, char split, string args)
public static bool FV (this A3DADict dict, ref string value, char split, string args)
{ if (dict.FV(out string val , args.Split(split)))
{ value = val; return true; } return false; }
{ value = val; return true; } return false; }
public static bool FV(this A3DADict dict, out bool value, string args)
public static bool FV (this A3DADict dict, out bool value, string args)
{ if (dict.FV(out string val , args.Split('.' )))
return bool.TryParse(val, out value); value = false; return false; }
public static bool FV(this A3DADict dict, out int value, string args)
public static bool FV (this A3DADict dict, out int value, string args)
{ if (dict.FV(out string val , args.Split('.' )))
return int.TryParse(val, out value); value = 0; return false; }
return int.TryParse(val, out value); value = 0; return false; }
public static bool FV(this A3DADict dict, out float value, string args)
public static bool FV (this A3DADict dict, out float value, string args)
{ if (dict.FV(out string val , args.Split('.' )))
return val.ToF32(out value); value = 0; return false; }
return val.ToF32(out value); value = 0; return false; }
public static bool FV(this A3DADict dict, out double value, string args)
public static bool FV (this A3DADict dict, out double value, string args)
{ if (dict.FV(out string val , args.Split('.' )))
return val.ToF64(out value); value = 0; return false; }
return val.ToF64(out value); value = 0; return false; }
public static bool FV(this A3DADict dict, out int? value, string args)
public static bool FV<T>(this A3DADict dict, out T value, string args) where T : struct
{ if (dict.FV(out string val , args.Split('.' )))
{ bool Val = int.TryParse(val, out int _value);
value = _value; return Val; } value = null; return false; }
{ bool Val = Enum.TryParse(val, out T _value); value = _value; return Val; }
value = default; return false; }
public static bool FV(this A3DADict dict, out float? value, string args)
public static bool FV (this A3DADict dict, out int? value, string args)
{ if (dict.FV(out string val , args.Split('.' )))
return val.ToF32(out value); value = null; return false; }
{ bool Val = int.TryParse(val, out int _value); value = _value; return Val; }
value = null; return false; }
public static bool FV(this A3DADict dict, out double? value, string args)
public static bool FV (this A3DADict dict, out float? value, string args)
{ if (dict.FV(out string val , args.Split('.' )))
return val.ToF64(out value); value = null; return false; }
return val.ToF32(out value); value = null; return false; }
public static bool FV(this A3DADict dict, out string value, string args) =>
public static bool FV (this A3DADict dict, out double? value, string args)
{ if (dict.FV(out string val , args.Split('.' )))
return val.ToF64(out value); value = null; return false; }
public static bool FV<T>(this A3DADict dict, out T? value, string args) where T : struct
{ if (dict.FV(out string val , args.Split('.' )))
{ bool Val = Enum.TryParse(val, out T _value); value = _value; return Val; }
value = null; return false; }
public static bool FV (this A3DADict dict, out string value, string args) =>
dict.FV(out value, args.Split('.' ));
public static bool FV(this A3DADict dict, out string value, string[] args)
@@ -129,6 +138,24 @@ namespace KKdMainLib
return true;
}
public static bool FK(this A3DADict dict, string args) =>
dict.FK(args.Split('.' ));
public static bool FK(this A3DADict dict, string[] args)
{
if (dict == null || args.Length < 1) return false;
args[0] = args[0].ToLower();
if (!dict.ContainsKey(args[0])) return false;
else if (args.Length > 1)
{
string[] newArgs = new string[args.Length - 1];
for (int i = 0; i < args.Length - 1; i++) newArgs[i] = args[i + 1];
return ((A3DADict)dict[args[0]]).FK(newArgs);
}
return true;
}
public static void GD(this A3DADict dict, string args, char split = '.')
{
string[] dataArray = args.Split('=');
+2 -2
View File
@@ -69,7 +69,7 @@ namespace KKdBaseLib
if (irow != icol)
for (int k = 0; k < 2; k++)
(inverse[irow, k], inverse[icol, k]) = (inverse[icol, k], inverse[irow, k]);
{ float t = inverse[irow, k]; inverse[irow, k] = inverse[icol, k]; inverse[icol, k] = t; }
rowIdx[i] = irow;
colIdx[i] = icol;
@@ -97,7 +97,7 @@ namespace KKdBaseLib
int ir = rowIdx[j];
int ic = colIdx[j];
for (int k = 0; k < 2; k++)
(inverse[k, ic], inverse[k, ir]) = (inverse[k, ir], inverse[k, ic]);
{ float t = inverse[k, ic]; inverse[k, ic] = inverse[k, ir]; inverse[k, ir] = t; }
}
result.Row0.X = inverse[0, 0]; result.Row0.Y = inverse[0, 1];
+2 -2
View File
@@ -154,7 +154,7 @@ namespace KKdBaseLib
if (irow != icol)
for (int k = 0; k < 3; k++)
(inverse[irow, k], inverse[icol, k]) = (inverse[icol, k], inverse[irow, k]);
{ float t = inverse[irow, k]; inverse[irow, k] = inverse[icol, k]; inverse[icol, k] = t; }
rowIdx[i] = irow;
colIdx[i] = icol;
@@ -182,7 +182,7 @@ namespace KKdBaseLib
int ir = rowIdx[j];
int ic = colIdx[j];
for (int k = 0; k < 3; k++)
(inverse[k, ic], inverse[k, ir]) = (inverse[k, ir], inverse[k, ic]);
{ float t = inverse[k, ic]; inverse[k, ic] = inverse[k, ir]; inverse[k, ir] = t; }
}
result.Row0.X = inverse[0, 0]; result.Row0.Y = inverse[0, 1]; result.Row0.Z = inverse[0, 2];
+2 -9
View File
@@ -45,9 +45,6 @@ namespace KKdBaseLib
public Mat4(Quat q, Vec4 t)
{ Row0 = Row1 = Row2 = Row3 = default; FromQuat(q); Row3 = t; }
public Mat4(QuatTrans qt)
{ Row0 = Row1 = Row2 = Row3 = default; FromQuat(qt.Quat); Row3 = new Vec4(qt.Trans, 1.0f); }
private void FromQuat(Quat q)
{
float qx = q.X;
@@ -184,7 +181,7 @@ namespace KKdBaseLib
if (irow != icol)
for (int k = 0; k < 4; k++)
(inverse[irow, k], inverse[icol, k]) = (inverse[icol, k], inverse[irow, k]);
{ float t = inverse[irow, k]; inverse[irow, k] = inverse[icol, k]; inverse[icol, k] = t; }
rowIdx[i] = irow;
colIdx[i] = icol;
@@ -212,11 +209,7 @@ namespace KKdBaseLib
int ir = rowIdx[j];
int ic = colIdx[j];
for (int k = 0; k < 4; k++)
{
float f = inverse[k, ir];
inverse[k, ir] = inverse[k, ic];
inverse[k, ic] = f;
}
{ float t = inverse[k, ic]; inverse[k, ic] = inverse[k, ir]; inverse[k, ir] = t; }
}
result.Row0.X = inverse[0, 0]; result.Row0.Y = inverse[0, 1];
+23 -1
View File
@@ -47,7 +47,12 @@ namespace KKdBaseLib
public MsgPack this[string key, bool array]
{ get { if (!array) return this[key];
if (Object is KKdList<MsgPack> List) { MsgPack MsgPack = List[ElementIndex(key)];
if (Object is KKdList<MsgPack> List) { MsgPack MsgPack = List[ElementIndex(key)];
return MsgPack.Object is MsgPack[] ? MsgPack : default; } return default; } }
public MsgPack this[bool startsWith, string key]
{ get { if (Object is KKdList<MsgPack> List) { MsgPack MsgPack =
List[startsWith ? ElementIndexStartsWith(key) : ElementIndex(key)];
return MsgPack.Object is MsgPack[] ? MsgPack : default; } return default; } }
public MsgPack Add(MsgPack obj)
@@ -377,6 +382,17 @@ namespace KKdBaseLib
return -1;
}
public bool ContainsKeyStartsWith(string name) => ElementIndexStartsWith(name) > -1;
public int ElementIndexStartsWith(string name)
{
if (List.IsNull) return -1;
for (int i = 0; i < List.Count; i++)
if (List[i].Name.StartsWith(name)) return i;
return -1;
}
public struct Ext
{
@@ -384,4 +400,10 @@ namespace KKdBaseLib
public byte[] Data;
}
}
public interface IMsgPack : INull
{
//public void ReadMsgPack();
public MsgPack WriteMsgPack(string name);
}
}
+1 -1
View File
@@ -1,4 +1,4 @@
using System.Reflection;
using System.Reflection;
using System.Runtime.InteropServices;
[assembly: AssemblyTrademark("")]
+2 -2
View File
@@ -1,4 +1,4 @@
namespace KKdBaseLib
namespace KKdBaseLib.Tables
{
public struct ButtonSE
{
@@ -190,6 +190,6 @@ namespace KKdBaseLib
}
public override string ToString() =>
$"{Year.ToString("d4")}-{Month.ToString("d2")}-{Day.ToString("d2")}";
$"{Year:d4}-{Month:d2}-{Day:d2}";
}
}
+288 -248
View File
@@ -14,7 +14,7 @@ namespace KKdMainLib
public Data Data;
public A3DAHeader Head;
private Stream _IO;
private Stream s;
private bool a3dc;
private bool a3dcOpt;
private int i, i0, i1;
@@ -38,20 +38,20 @@ namespace KKdMainLib
public A3DA(bool a3dcOpt = true)
{ a3dc = false; i = i0 = i1 = soi = soi0 = soi1 = 0; value = null;
name = null; nameView = null; so = null; so0 = null; so1 = null;
dataArray = null; _IO = null; Head = default; Data = default;
dataArray = null; s = null; Head = default; Data = default;
dict = null; usedValues = null; this.a3dcOpt = a3dcOpt; }
public int A3DAReader(string file)
{ using (_IO = File.OpenReader(file + ".a3da"))
return A3DAReader(ref _IO); }
{ using (s = File.OpenReader(file + ".a3da"))
return A3DAReader(ref s); }
public int A3DAReader(byte[] data)
{ using (_IO = File.OpenReader(data))
return A3DAReader(ref _IO); }
{ using (s = File.OpenReader(data))
return A3DAReader(ref s); }
public byte[] A3DAWriter() => A3DAWriter(false);
private int A3DAReader(ref Stream _IO)
private int A3DAReader(ref Stream s)
{
name = "";
nameView = "";
@@ -61,44 +61,44 @@ namespace KKdMainLib
Head = new A3DAHeader();
Header header = new Header();
Head.Format = _IO.Format = Format.F;
header.SectionSignature = _IO.RI32();
Head.Format = s.Format = Format.F;
header.SectionSignature = s.RU32();
if (header.SectionSignature == 0x41443341)
{ header = _IO.ReadHeader(true, true); Head.Format = header.Format; }
{ header = s.ReadHeader(true, true); Head.Format = header.Format; }
if (header.SectionSignature != 0x44334123) return 0;
_IO.O = _IO.P - 4;
header.SectionSignature = _IO.RI32();
s.O = s.P - 4;
header.SectionSignature = s.RU32();
if (header.SectionSignature == 0x5F5F5F41)
{
_IO.P = 0x10;
header.Format = _IO.Format = Format.DT;
s.P = 0x10;
header.Format = s.Format = Format.DT;
}
else if (header.SectionSignature == 0x5F5F5F43)
{
_IO.P = 0x10;
_IO.RI32();
_IO.RI32();
Head.HeaderOffset = _IO.RI32E(true);
s.P = 0x10;
s.RI32();
s.RI32();
Head.HeaderOffset = s.RI32E(true);
_IO.P = Head.HeaderOffset;
if (_IO.RI32() != 0x50) return 0;
Head.StringOffset = _IO.RI32E(true);
Head.StringLength = _IO.RI32E(true);
Head.Count = _IO.RI32E(true);
if (_IO.RI32() != 0x4C42) return 0;
Head.BinaryOffset = _IO.RI32E(true);
Head.BinaryLength = _IO.RI32E(true);
s.P = Head.HeaderOffset;
if (s.RI32() != 0x50) return 0;
Head.StringOffset = s.RI32E(true);
Head.StringLength = s.RI32E(true);
Head.Count = s.RI32E(true);
if (s.RI32() != 0x4C42) return 0;
Head.BinaryOffset = s.RI32E(true);
Head.BinaryLength = s.RI32E(true);
_IO.P = Head.StringOffset;
s.P = Head.StringOffset;
}
else return 0;
if (header.Format == Format.DT)
Head.StringLength = _IO.L - 0x10;
Head.StringLength = s.L - 0x10;
string[] strData = _IO.RS(Head.StringLength).Replace("\r\n", "\n").Replace("\r", "\n").Split('\n');
string[] strData = s.RS(Head.StringLength).Replace("\r\n", "\n").Replace("\r", "\n").Split('\n');
for (i = 0; i < strData.Length; i++)
dict.GD(strData[i]);
strData = null;
@@ -107,12 +107,12 @@ namespace KKdMainLib
if (header.SectionSignature == 0x5F5F5F43)
{
_IO.P = _IO.O + Head.BinaryOffset;
_IO.O = _IO.P;
_IO.P = 0;
byte[] data = _IO.RBy(Head.BinaryLength);
_IO.C();
_IO = File.OpenReader(data);
s.P = s.O + Head.BinaryOffset;
s.O = s.P;
s.P = 0;
byte[] data = s.RBy(Head.BinaryLength);
s.C();
s = File.OpenReader(data);
A3DCReader();
}
@@ -142,13 +142,13 @@ namespace KKdMainLib
Data.CameraAuxiliary = new CameraAuxiliary
{
AutoExposure = RK(name + "auto_exposure" + d),
Exposure = RK(name + "exposure" + d),
Gamma = RK(name + "gamma" + d),
GammaRate = RK(name + "gamma_rate" + d),
Saturate = RK(name + "saturate" + d)
AutoExposure = RKN(name + "auto_exposure" + d),
Exposure = RKN(name + "exposure" + d),
Gamma = RKN(name + "gamma" + d),
GammaRate = RKN(name + "gamma_rate" + d),
Saturate = RKN(name + "saturate" + d),
};
if (Data.CameraAuxiliary.Value.GammaRate.Type != null)
if (Data.CameraAuxiliary.Value.GammaRate.HasValue)
if (Head.Format < Format.F || Head.Format == Format.AFT || Head.Format >= Format.FT)
Head.Format = Format.F;
}
@@ -174,9 +174,9 @@ namespace KKdMainLib
Ambient = RRGBAK(name + "Ambient" + d),
Diffuse = RRGBAK(name + "Diffuse" + d),
Specular = RRGBAK(name + "Specular" + d),
LensFlare = RK (name + "lens_flare" + d),
LensGhost = RK (name + "lens_ghost" + d),
LensShaft = RK (name + "lens_shaft" + d),
LensFlare = RKN (name + "lens_flare" + d),
LensGhost = RKN (name + "lens_ghost" + d),
LensShaft = RKN (name + "lens_shaft" + d),
};
}
@@ -418,18 +418,12 @@ namespace KKdMainLib
nameView = name + "tex_transform" + d + i1 + d;
dict.FV(out Data.Object[i0].TexTrans[i1].Name, nameView + "name");
Data.Object[i0].TexTrans[i1].Coverage =
RKUV(nameView + "coverage" );
Data.Object[i0].TexTrans[i1].Offset =
RKUV(nameView + "offset" );
Data.Object[i0].TexTrans[i1].Repeat =
RKUV(nameView + "repeat" );
Data.Object[i0].TexTrans[i1]. Rotate =
RK (nameView + "rotate" + d);
Data.Object[i0].TexTrans[i1]. RotateFrame =
RK (nameView + "rotateFrame"+ d);
Data.Object[i0].TexTrans[i1].TranslateFrame =
RKUV(nameView + "translateFrame");
Data.Object[i0].TexTrans[i1].Coverage = RKUV(nameView + "coverage" );
Data.Object[i0].TexTrans[i1].Offset = RKUV(nameView + "offset" );
Data.Object[i0].TexTrans[i1].Repeat = RKUV(nameView + "repeat" );
Data.Object[i0].TexTrans[i1]. Rotate = RKN (nameView + "rotate" + d);
Data.Object[i0].TexTrans[i1]. RotateFrame = RKN (nameView + "rotateFrame"+ d);
Data.Object[i0].TexTrans[i1].TranslateFrame = RKUV(nameView + "translateFrame");
}
}
@@ -495,13 +489,13 @@ namespace KKdMainLib
private byte[] A3DAWriter(bool a3dc)
{
this.a3dc = a3dc;
_IO = File.OpenWriter();
s = File.OpenWriter();
DateTime date = DateTime.Now;
if (a3dc && Data._.CompressF16 != 0)
W("", "#-compress_f16");
s.W("#-compress_f16\n");
if (!a3dc)
_IO.W("#A3DA__________\n");
_IO.W("#" + DateTime.UtcNow.ToString("ddd MMM dd HH:mm:ss yyyy",
s.W("#A3DA__________\n");
s.W("#" + DateTime.UtcNow.ToString("ddd MMM dd HH:mm:ss yyyy",
System.Globalization.CultureInfo.InvariantCulture) + "\n");
if (a3dc && Data._.CompressF16 != 0)
W("_.compress_f16", (int)Data._.CompressF16);
@@ -530,12 +524,12 @@ namespace KKdMainLib
{
name = "camera_auxiliary" + d;
CameraAuxiliary ca = Data.CameraAuxiliary.Value;
W(ref ca.AutoExposure, name + "auto_exposure", true);
W(ref ca. Exposure, name + "exposure", true);
W(ref ca.Gamma , name + "gamma" , true);
W(ref ca.AutoExposure, name + "auto_exposure");
W(ref ca. Exposure, name + "exposure");
W(ref ca.Gamma , name + "gamma" );
if (Head.Format == Format.F || (Head.Format > Format.AFT && Head.Format < Format.FT))
W(ref ca.GammaRate , name + "gamma_rate" , true);
W(ref ca.Saturate , name + "saturate" , true);
W(ref ca.GammaRate , name + "gamma_rate" );
W(ref ca.Saturate , name + "saturate" );
Data.CameraAuxiliary = ca;
}
@@ -629,11 +623,11 @@ namespace KKdMainLib
name = "fog" + d + soi0 + d;
ref Fog fog = ref Data.Fog[soi0];
W(ref fog.Diffuse, name + "Diffuse" );
W(ref fog.Density, name + "density", true);
W(ref fog.End , name + "end" , true);
W(ref fog.Diffuse, name + "Diffuse");
W(ref fog.Density, name + "density");
W(ref fog.End , name + "end" );
W(name + "id", fog.Id);
W(ref fog.Start , name + "start" , true);
W(ref fog.Start , name + "start" );
}
W("fog.length", Data.Fog.Length);
}
@@ -893,12 +887,12 @@ namespace KKdMainLib
{
PostProcess pp = Data.PostProcess.Value;
name = "post_process" + d;
W(ref pp.Ambient , name + "Ambient" );
W(ref pp.Diffuse , name + "Diffuse" );
W(ref pp.Specular , name + "Specular" );
W(ref pp.LensFlare, name + "lens_flare", true);
W(ref pp.LensGhost, name + "lens_ghost", true);
W(ref pp.LensShaft, name + "lens_shaft", true);
W(ref pp.Ambient , name + "Ambient" );
W(ref pp.Diffuse , name + "Diffuse" );
W(ref pp.Specular , name + "Specular" );
W(ref pp.LensFlare, name + "lens_flare");
W(ref pp.LensGhost, name + "lens_ghost");
W(ref pp.LensShaft, name + "lens_shaft");
Data.PostProcess = pp;
}
@@ -910,9 +904,9 @@ namespace KKdMainLib
W("point.length", Data.Point.Length);
}
_IO.A(0x1, true);
byte[] data = _IO.ToArray();
_IO.Dispose();
s.A(0x1, true);
byte[] data = s.ToArray();
s.Dispose();
return data;
}
@@ -928,15 +922,19 @@ namespace KKdMainLib
return mt;
}
private Vec4<Key> RRGBAK(string str) =>
new Vec4<Key> { W = RK(str + "a" + d), Z = RK(str + "b" + d),
Y = RK(str + "g" + d), X = RK(str + "r" + d) };
private Vec4<Key>? RRGBAK(string str) =>
dict.FV(out bool b, str) ? b ?
(Vec4<Key>?)new Vec4<Key> { W = RK(str + "a" + d), Z = RK(str + "b" + d),
Y = RK(str + "g" + d), X = RK(str + "r" + d) }: null : null;
private Vec3<Key> RV3(string str) =>
new Vec3<Key> { X = RK(str + "x" + d), Y = RK(str + "y" + d), Z = RK(str + "z" + d) };
private Vec2<Key> RKUV(string str) =>
new Vec2<Key> { X = RK(str + "U" + d), Y = RK(str + "V" + d) };
private Vec2<Key?> RKUV(string str) =>
new Vec2<Key?> { X = RKN(str + "U" + d), Y = RKN(str + "V" + d) };
private Key? RKN(string str) =>
dict.FV(out bool b, str) ? b ? (Key?)RK(str) : null : null;
private Key RK(string str)
{
@@ -972,18 +970,18 @@ namespace KKdMainLib
key.Keys = new KFT3[key.Length];
if (key.RawData.KeyType == 0)
for (i = 0; i < key.Length; i++)
key.Keys[i] = new KFT3 (VL[i * ds + 0].ToF32());
key.Keys[i] = new KFT3(VL[i * ds + 0].ToF32());
else if (key.RawData.KeyType == 1)
for (i = 0; i < key.Length; i++)
key.Keys[i] = new KFT3 (VL[i * ds + 0].ToF32(), VL[i * ds + 1].ToF32());
key.Keys[i] = new KFT3(VL[i * ds + 0].ToF32(), VL[i * ds + 1].ToF32());
else if (key.RawData.KeyType == 2)
for (i = 0; i < key.Length; i++)
key.Keys[i] = new KFT3 (VL[i * ds + 0].ToF32(), VL[i * ds + 1].ToF32(),
VL[i * ds + 2].ToF32(), VL[i * ds + 2].ToF32());
key.Keys[i] = new KFT3(VL[i * ds + 0].ToF32(), VL[i * ds + 1].ToF32(),
VL[i * ds + 2].ToF32());
else if (key.RawData.KeyType == 3)
for (i = 0; i < key.Length; i++)
key.Keys[i] = new KFT3 (VL[i * ds + 0].ToF32(), VL[i * ds + 1].ToF32(),
VL[i * ds + 2].ToF32(), VL[i * ds + 3].ToF32());
key.Keys[i] = new KFT3(VL[i * ds + 0].ToF32(), VL[i * ds + 1].ToF32(),
VL[i * ds + 2].ToF32(), VL[i * ds + 3].ToF32());
key.RawData.ValueList = null;
}
@@ -1001,11 +999,9 @@ namespace KKdMainLib
else if (type == 1) key.Keys[i] = new KFT3
(dataArray[0].ToF32(), dataArray[1].ToF32());
else if (type == 2) key.Keys[i] = new KFT3
(dataArray[0].ToF32(), dataArray[1].ToF32(),
dataArray[2].ToF32(), dataArray[2].ToF32());
(dataArray[0].ToF32(), dataArray[1].ToF32(), dataArray[2].ToF32());
else if (type == 3) key.Keys[i] = new KFT3
(dataArray[0].ToF32(), dataArray[1].ToF32(),
dataArray[2].ToF32(), dataArray[3].ToF32());
(dataArray[0].ToF32(), dataArray[1].ToF32(), dataArray[2].ToF32(), dataArray[3].ToF32());
}
}
return key;
@@ -1025,43 +1021,42 @@ namespace KKdMainLib
}
}
private void W(ref Vec4<Key> rgba, string str)
private void W(ref Vec4<Key>? rgba, string str)
{
if (rgba.X.Type == null && rgba.Y.Type == null &&
rgba.Z.Type == null && rgba.W.Type == null) return;
if (!rgba.HasValue) return;
W(str, "true");
W(ref rgba.W, str + d + "a" + d);
W(ref rgba.Z, str + d + "b" + d);
W(ref rgba.Y, str + d + "g" + d);
W(ref rgba.X, str + d + "r" + d);
Vec4<Key> rgbav = rgba.Value;
W(ref rgbav.W, str + d + "a" + d);
W(ref rgbav.Z, str + d + "b" + d);
W(ref rgbav.Y, str + d + "g" + d);
W(ref rgbav.X, str + d + "r" + d);
rgba = rgbav;
}
private void W(ref Vec3<Key> key, string str)
{ W(ref key.X, str + "x" + d); W(ref key.Y, str + "y" + d); W(ref key.Z, str + "z" + d); }
private void W(ref Vec2<Key> uv, string str)
{ W(ref uv.X, str + "U", true); W(ref uv.Y, str + "V", true); }
private void W(ref Vec2<Key?> uv, string str)
{ W(ref uv.X, str + "U"); W(ref uv.Y, str + "V"); }
private void W(ref Key Key, string Temp, bool setBoolean)
{ if (Key.Type == null) return; if (setBoolean) W(Temp + "", "true"); W(ref Key, Temp + d); }
private void W(ref Key? key, string str)
{ if (!key.HasValue) return; Key k = key.Value; W(str, "true"); W(ref k, str + d); key = k; }
private void W(ref Key key, string str)
{
if (key.Type == null) return;
if (a3dc) { W(str + BO + "", key.BinOffset); return; }
int i = 0;
if (key.Keys != null)
if (key.Keys.Length == 0)
{
W(str + "type", (int)key.Type);
if (key.Type > 0) W(str + "value", key.Value);
return;
}
if (key.Type < KeyType.Lerp || key.Keys == null || (key.Keys != null && key.Keys.Length == 0))
{
W(str + "type", (int)key.Type);
if (key.Type > 0) W(str + "value", key.Value);
return;
}
if ((int)key.EPTypePost > 0) W(str + "ep_type_post", (int)key.EPTypePost);
if ((int)key.EPTypePre > 0) W(str + "ep_type_pre" , (int)key.EPTypePre );
if (key.EPTypePost > 0) W(str + "ep_type_post", (int)key.EPTypePost);
if (key.EPTypePre > 0) W(str + "ep_type_pre" , (int)key.EPTypePre );
if (key.RawData.KeyType == 0 && key.Keys != null)
{
IKF kf;
@@ -1080,6 +1075,7 @@ namespace KKdMainLib
}
W(str + "key.length", key.Length);
if (key.Max != null) W(str + "max", key.Max);
W(str + "type", (int)key.Type);
}
else if (key.Keys != null)
{
@@ -1097,25 +1093,23 @@ namespace KKdMainLib
else if (kf is KFT3 && keyType < 3) keyType = 3;
}
key.RawData.ValueListSize = length * keyType + length;
_IO.W(str + "raw_data.value_list");
s.W(str + "raw_data.value_list");
if (keyType == 0) for (i = 0; i < length; i++)
_IO.W(key.Keys[i].ToT0().ToString(false) + (i + 1 < length ? "," : ""));
s.W(key.Keys[i].ToT0().ToString(false) + (i + 1 < length ? "," : ""));
else if (keyType == 1) for (i = 0; i < length; i++)
_IO.W(key.Keys[i].ToT1().ToString(false) + (i + 1 < length ? "," : ""));
s.W(key.Keys[i].ToT1().ToString(false) + (i + 1 < length ? "," : ""));
else if (keyType == 2) for (i = 0; i < length; i++)
_IO.W(key.Keys[i].ToT2().ToString(false) + (i + 1 < length ? "," : ""));
s.W(key.Keys[i].ToT2().ToString(false) + (i + 1 < length ? "," : ""));
else if (keyType == 3) for (i = 0; i < length; i++)
_IO.W(key.Keys[i] .ToString(false) + (i + 1 < length ? "," : ""));
_IO.P--;
_IO.W('\n');
s.W(key.Keys[i] .ToString(false) + (i + 1 < length ? "," : ""));
s.P--;
s.W('\n');
W(str + "raw_data.value_list_size", key.RawData.ValueListSize);
W(str + "raw_data.value_type" , key.RawData.ValueType );
W(str + "raw_data_key_type" , key.RawData. KeyType );
W(str + "type", (int)key.Type);
}
W(str + "type", (int)key.Type);
if (key.RawData.KeyType == 0 && key.Keys == null && key.Type != null &&
key.Type.Value != 0 && key.Value != null && key.Value != 0)
W(str + "value", key.Value);
}
private void W(string Data, long? val)
@@ -1127,7 +1121,7 @@ namespace KKdMainLib
private void W(string Data, float val) =>
W(Data, val.ToS());
private void W(string Data, string val)
{ if (val != null) _IO.W(Data + "=" + val + "\n"); }
{ if (val != null) s.W(Data + "=" + val + "\n"); }
private void A3DCReader()
{
@@ -1263,11 +1257,11 @@ namespace KKdMainLib
Data._.CompressF16 = Head.Format > Format.AFT && Head.Format < Format.FT ?
(Head.Format == Format.MGF ? CompressF16.I16F16F16F16 : CompressF16.I16F16F32F32) : 0;
_IO = File.OpenWriter();
s = File.OpenWriter();
for (byte i = 0; i < 2; i++)
{
bool ReturnToOffset = i == 1;
_IO.P = 0;
s.P = 0;
if (Data.CameraRoot != null)
for (i0 = 0; i0 < Data.CameraRoot.Length; i0++)
@@ -1447,55 +1441,55 @@ namespace KKdMainLib
Data.PostProcess = pp;
}
_IO.A(0x10, true);
s.A(0x10, true);
}
byte[] A3DCData = _IO.ToArray(); _IO.Dispose();
byte[] A3DCData = s.ToArray(); s.Dispose();
byte[] A3DAData = A3DAWriter(true);
_IO = File.OpenWriter();
_IO.O = Head.Format > Format.AFT && Head.Format < Format.FT ? 0x40 : 0;
_IO.P = 0x40;
s = File.OpenWriter();
s.O = Head.Format > Format.AFT && Head.Format < Format.FT ? 0x40 : 0;
s.P = 0x40;
Head.StringOffset = _IO.P;
Head.StringOffset = s.P;
Head.StringLength = A3DAData.Length;
_IO.W(A3DAData);
_IO.A(0x20, true);
s.W(A3DAData);
s.A(0x20, true);
Head.BinaryOffset = _IO.P;
Head.BinaryOffset = s.P;
Head.BinaryLength = A3DCData.Length;
_IO.W(A3DCData);
_IO.A(0x10, true);
s.W(A3DCData);
s.A(0x10, true);
int A3DCEnd = _IO.P;
uint A3DCEnd = s.PU32;
_IO.P = 0;
_IO.W("#A3DC__________\n");
_IO.W(0x2000);
_IO.W(0x00);
_IO.WE(0x20, true);
_IO.W(0x10000200);
_IO.W(0x50);
_IO.WE(Head.StringOffset, true);
_IO.WE(Head.StringLength, true);
_IO.WE(0x01, true);
_IO.W(0x4C42);
_IO.WE(Head.BinaryOffset, true);
_IO.WE(Head.BinaryLength, true);
_IO.WE(0x20, true);
s.P = 0;
s.W("#A3DC__________\n");
s.W(0x2000);
s.W(0x00);
s.WE(0x20, true);
s.W(0x10000200);
s.W(0x50);
s.WE(Head.StringOffset, true);
s.WE(Head.StringLength, true);
s.WE(0x01, true);
s.W(0x4C42);
s.WE(Head.BinaryOffset, true);
s.WE(Head.BinaryLength, true);
s.WE(0x20, true);
if (Head.Format > Format.AFT && Head.Format < Format.FT)
{
_IO.P = A3DCEnd;
_IO.WEOFC(0);
_IO.O = 0;
_IO.P = 0;
Header header = new Header { Signature = 0x41443341, Format = Format.F2LE,
DataSize = A3DCEnd, SectionSize = A3DCEnd, InnerSignature = 0x01131010 };
_IO.W(header, true);
s.PU32 = A3DCEnd;
s.WEOFC(0);
s.O = 0;
s.P = 0;
Header header = new Header { Signature = 0x41443341, InnerSignature = 0x01131010,
Format = Format.F2, DataSize = A3DCEnd, SectionSize = A3DCEnd, UseSectionSize = true };
s.W(header, true);
}
byte[] data = _IO.ToArray();
_IO.Dispose();
byte[] data = s.ToArray();
s.Dispose();
return data;
}
@@ -1503,12 +1497,12 @@ namespace KKdMainLib
{
if (mt.BinOffset == null) return;
_IO.P = (int)mt.BinOffset;
s.P = (int)mt.BinOffset;
ReadOffset(out mt.Scale);
ReadOffset(out mt.Rot );
ReadOffset(out mt.Trans);
mt.Visibility = new Key { BinOffset = _IO.RI32() };
mt.Visibility = new Key { BinOffset = s.RI32() };
RV3(ref mt.Scale );
RV3(ref mt.Rot , true);
@@ -1516,27 +1510,35 @@ namespace KKdMainLib
RK (ref mt.Visibility);
}
private void RRGBAK(ref Vec4<Key> rgba)
{ RK(ref rgba.X); RK(ref rgba.Y);
RK(ref rgba.Z); RK(ref rgba.W); }
private void RRGBAK(ref Vec4<Key>? rgba)
{
if (!rgba.HasValue) return;
Vec4<Key> rgbav = rgba.Value;
RK(ref rgbav.X); RK(ref rgbav.Y);
RK(ref rgbav.Z); RK(ref rgbav.W);
rgba = rgbav;
}
private void RV3(ref Vec3<Key> key, bool f16 = false)
{ RK(ref key.X, f16); RK(ref key.Y, f16); RK(ref key.Z, f16); }
private void RKUV(ref Vec2<Key> uv)
private void RKUV(ref Vec2<Key?> uv)
{ RK(ref uv.X); RK(ref uv.Y); }
private void RK(ref Key? key)
{ if (!key.HasValue) return; Key k = key.Value; RK(ref k); key = k; }
private void RK(ref Key key, bool f16 = false)
{
if (key.BinOffset == null || key.BinOffset < 0) return;
_IO.P = (int)key.BinOffset;
int Type = _IO.RI32();
key.Value = _IO.RF32();
s.P = (int)key.BinOffset;
int Type = s.RI32();
key.Value = s.RF32();
key.Type = (KeyType)(Type & 0xFF);
if (key.Type < KeyType.Lerp) return;
key.Max = _IO.RF32();
key.Length = _IO.RI32 ();
key.Max = s.RF32();
key.Length = s.RI32 ();
if (Type >> 8 != 0)
{
key.EPTypePost = (EPType)((Type >> 12) & 0xF);
@@ -1546,93 +1548,101 @@ namespace KKdMainLib
if (f16 && Data._.CompressF16 == CompressF16.I16F16F16F16)
for (int i = 0; i < key.Keys.Length; i++)
{ ref KFT3 kf = ref key.Keys[i]; kf.F = _IO.RU16(); kf.V = _IO.RF16();
kf.T1 = _IO.RF16(); kf.T2 = _IO.RF16(); }
{ ref KFT3 kf = ref key.Keys[i]; kf.F = s.RU16(); kf.V = s.RF16();
kf.T1 = s.RF16(); kf.T2 = s.RF16(); }
else if (f16 && Data._.CompressF16 > 0)
for (int i = 0; i < key.Keys.Length; i++)
{ ref KFT3 kf = ref key.Keys[i]; kf.F = _IO.RU16(); kf.V = _IO.RF16();
kf.T1 = _IO.RF32(); kf.T2 = _IO.RF32(); }
{ ref KFT3 kf = ref key.Keys[i]; kf.F = s.RU16(); kf.V = s.RF16();
kf.T1 = s.RF32(); kf.T2 = s.RF32(); }
else
for (int i = 0; i < key.Keys.Length; i++)
{ ref KFT3 kf = ref key.Keys[i]; kf.F = _IO.RF32(); kf.V = _IO.RF32();
kf.T1 = _IO.RF32(); kf.T2 = _IO.RF32(); }
{ ref KFT3 kf = ref key.Keys[i]; kf.F = s.RF32(); kf.V = s.RF32();
kf.T1 = s.RF32(); kf.T2 = s.RF32(); }
}
private void ReadOffset(out Vec3<Key> key)
{ key = new Vec3<Key> { X = new Key { BinOffset = _IO.RI32() },
Y = new Key { BinOffset = _IO.RI32() },
Z = new Key { BinOffset = _IO.RI32() }, }; }
{ key = new Vec3<Key> { X = new Key { BinOffset = s.RI32() },
Y = new Key { BinOffset = s.RI32() },
Z = new Key { BinOffset = s.RI32() }, }; }
private void WO(ref ModelTransform mt, bool ReturnToOffset)
{
if (ReturnToOffset)
{
_IO.P = (int)mt.BinOffset;
s.P = (int)mt.BinOffset;
WriteOffset(mt.Scale);
WriteOffset(mt.Rot );
WriteOffset(mt.Trans);
_IO.W(mt.Visibility.BinOffset);
s.W(mt.Visibility.BinOffset);
}
else { mt.BinOffset = _IO.P; _IO.P += 0x30; _IO.L += 0x30; }
else { mt.BinOffset = s.P; s.P += 0x30; s.L += 0x30; }
}
private void WriteOffset(Vec3<Key> key)
{ _IO.W(key.X.BinOffset); _IO.W(key.Y.BinOffset); _IO.W(key.Z.BinOffset); }
{ s.W(key.X.BinOffset); s.W(key.Y.BinOffset); s.W(key.Z.BinOffset); }
private void W(ref ModelTransform mt)
{ W(ref mt.Scale); W(ref mt.Rot, true); W(ref mt.Trans); W(ref mt.Visibility); }
private void W(ref Vec4<Key> rgba)
{ W(ref rgba.X); W(ref rgba.Y); W(ref rgba.Z); W(ref rgba.W); }
private void W(ref Vec4<Key>? rgba)
{
if (!rgba.HasValue) return;
Vec4<Key> rgbav = rgba.Value;
W(ref rgbav.X); W(ref rgbav.Y);
W(ref rgbav.Z); W(ref rgbav.W);
rgba = rgbav;
}
private void W(ref Vec3<Key> key, bool f16 = false)
{ W(ref key.X, f16); W(ref key.Y, f16); W(ref key.Z, f16); }
private void W(ref Vec2<Key> uv)
private void W(ref Vec2<Key?> uv)
{ W(ref uv.X); W(ref uv.Y); }
private void W(ref Key? key)
{ if (!key.HasValue) return; Key k = key.Value; W(ref k); key = k; }
private void W(ref Key key, bool f16 = false)
{
if (key.Type == null) return;
int i = 0;
if (key.Keys != null)
if (key.Type > KeyType.Value && key.Keys != null)
{
key.BinOffset = _IO.P;
key.BinOffset = s.P;
int Type = (int)key.Type & 0xFF;
Type |= ((int)key.EPTypePost & 0xF) << 12;
Type |= ((int)key.EPTypePre & 0xF) << 8;
_IO.W(Type);
_IO.W(0x00);
_IO.W((float)key.Max);
_IO.W(key.Keys.Length);
s.W(Type);
s.W(0x00);
s.W((float)key.Max);
s.W(key.Keys.Length);
if (f16 && Data._.CompressF16 == CompressF16.I16F16F16F16)
for (i = 0; i < key.Keys.Length; i++)
{ ref KFT3 kf = ref key.Keys[i]; _IO.W((ushort)kf.F ); _IO.W((Half)kf.V );
_IO.W(( Half)kf.T1); _IO.W((Half)kf.T2); }
{ ref KFT3 kf = ref key.Keys[i]; s.W((ushort)kf.F ); s.W((Half)kf.V );
s.W(( Half)kf.T1); s.W((Half)kf.T2); }
else if (f16 && Data._.CompressF16 > 0)
for (i = 0; i < key.Keys.Length; i++)
{ ref KFT3 kf = ref key.Keys[i]; _IO.W((ushort)kf.F ); _IO.W((Half)kf.V );
_IO.W( kf.T1); _IO.W( kf.T2); }
{ ref KFT3 kf = ref key.Keys[i]; s.W((ushort)kf.F ); s.W((Half)kf.V );
s.W( kf.T1); s.W( kf.T2); }
else
for (i = 0; i < key.Keys.Length; i++)
{ ref KFT3 kf = ref key.Keys[i]; _IO.W( kf.F ); _IO.W( kf.V );
_IO.W( kf.T1); _IO.W( kf.T2); }
{ ref KFT3 kf = ref key.Keys[i]; s.W( kf.F ); s.W( kf.V );
s.W( kf.T1); s.W( kf.T2); }
}
else
{
if (!a3dcOpt)
{
key.BinOffset = _IO.P;
_IO.W(( int)key.Type );
_IO.W((float)key.Value);
key.BinOffset = s.P;
if (key.Type == 0) s.W(0x00L);
else { s.W((int)key.Type); s.W((float)key.Value); }
}
else if (!usedValues.ContainsValue(key.Value))
{
key.BinOffset = _IO.P;
_IO.W(( int)key.Type );
_IO.W((float)key.Value);
key.BinOffset = s.P;
if (key.Type == 0) s.W(0x00L);
else { s.W((int)key.Type); s.W((float)key.Value); }
usedValues.Add(key.BinOffset, key.Value);
}
else key.BinOffset = usedValues.GK(key.Value);
@@ -1798,15 +1808,25 @@ namespace KKdMainLib
MK (ref mt.Visibility, ref mMT.Visibility);
}
private void MRGBAK(ref Vec4<Key> rgba, ref Vec4<Key> mRGBA)
{ MK(ref rgba.X, ref mRGBA.X); MK(ref rgba.Y, ref mRGBA.Y);
MK(ref rgba.Z, ref mRGBA.Z); MK(ref rgba.W, ref mRGBA.W); }
private void MRGBAK(ref Vec4<Key>? rgba, ref Vec4<Key>? mRGBA)
{
if (!rgba.HasValue) return;
Vec4<Key> rgbav = rgba.Value;
Vec4<Key> mrgbav = mRGBA.Value;
MK(ref rgbav.X, ref mrgbav.X); MK(ref rgbav.Y, ref mrgbav.Y);
MK(ref rgbav.Z, ref mrgbav.Z); MK(ref rgbav.W, ref mrgbav.W);
mRGBA = mrgbav;
}
private void MV3(ref Vec3<Key> key, ref Vec3<Key> mKey)
{ MK(ref key.X, ref mKey.X); MK(ref key.Y, ref mKey.Y); MK(ref key.Z, ref mKey.Z); }
private void MKUV(ref Vec2<Key> uv, ref Vec2<Key> mUV)
private void MKUV(ref Vec2<Key?> uv, ref Vec2<Key?> mUV)
{ MK(ref uv.X, ref mUV.X); MK(ref uv.Y, ref mUV.Y); }
private void MK(ref Key? key, ref Key? mKey)
{ if (!key.HasValue || !mKey.HasValue) return; Key k = key.Value; Key mk = mKey.Value; MK(ref k, ref mk); key = k; mKey = mk; }
private void MK(ref Key key, ref Key mKey)
{
@@ -1861,7 +1881,7 @@ namespace KKdMainLib
}
public void MsgPackWriter(string file, bool json) =>
MsgPackWriter().Write(true, file, json);
MsgPackWriter().Write(false, true, file, json);
private void MsgPackReader(MsgPack a3d)
{
@@ -1892,11 +1912,11 @@ namespace KKdMainLib
if ((temp = a3d["CameraAuxiliary"]).NotNull)
Data.CameraAuxiliary = new CameraAuxiliary
{
AutoExposure = temp.RK("AutoExposure"),
Exposure = temp.RK( "Exposure"),
Gamma = temp.RK("Gamma" ),
GammaRate = temp.RK("GammaRate" ),
Saturate = temp.RK("Saturate" ),
AutoExposure = temp.RKN("AutoExposure"),
Exposure = temp.RKN( "Exposure"),
Gamma = temp.RKN("Gamma" ),
GammaRate = temp.RKN("GammaRate" ),
Saturate = temp.RKN("Saturate" ),
};
if ((temp = a3d["CameraRoot", true]).NotNull)
@@ -2111,8 +2131,8 @@ namespace KKdMainLib
Coverage = temp1[i1].RKUV("Coverage" ),
Offset = temp1[i1].RKUV("Offset" ),
Repeat = temp1[i1].RKUV("Repeat" ),
Rotate = temp1[i1].RK ( "Rotate" ),
RotateFrame = temp1[i1].RK ( "RotateFrame"),
Rotate = temp1[i1].RKN ( "Rotate" ),
RotateFrame = temp1[i1].RKN ( "RotateFrame"),
TranslateFrame = temp1[i1].RKUV("TranslateFrame"),
};
}
@@ -2189,9 +2209,9 @@ namespace KKdMainLib
{
Ambient = temp.RRGBAK("Ambient" ),
Diffuse = temp.RRGBAK("Diffuse" ),
LensFlare = temp.RK ("LensFlare"),
LensGhost = temp.RK ("LensGhost"),
LensShaft = temp.RK ("LensShaft"),
LensFlare = temp.RKN ("LensFlare"),
LensGhost = temp.RKN ("LensGhost"),
LensShaft = temp.RKN ("LensShaft"),
Specular = temp.RRGBAK("Specular" ),
};
@@ -2506,7 +2526,7 @@ namespace KKdMainLib
dataArray = null;
usedValues = null;
dict = null;
_IO = null;
s = null;
Data = default;
Head = default;
}
@@ -2534,23 +2554,26 @@ namespace KKdMainLib
public static Vec3<Key> RV3(this MsgPack msgPack) =>
new Vec3<Key> { X = msgPack.RK("X"), Y = msgPack.RK("Y"), Z = msgPack.RK("Z") };
public static Vec2<Key> RKUV(this MsgPack msgPack, string name) =>
public static Vec2<Key?> RKUV(this MsgPack msgPack, string name) =>
msgPack[name].RKUV();
public static Vec2<Key> RKUV(this MsgPack msgPack) =>
new Vec2<Key> { X = msgPack.RK("U"), Y = msgPack.RK("V") };
public static Vec2<Key?> RKUV(this MsgPack msgPack) =>
new Vec2<Key?> { X = msgPack.RKN("U"), Y = msgPack.RKN("V") };
public static Key? RKN(this MsgPack msgPack, string name) =>
msgPack[name].Object != null ? (Key?)msgPack[name].RK() : default;
public static Key RK(this MsgPack msgPack, string name) =>
msgPack[name].ReadKey();
msgPack[name].RK();
public static Key ReadKey(this MsgPack msgPack)
public static Key RK(this MsgPack msgPack)
{
if (msgPack.Object == null) return default;
Key key = new Key { Max = msgPack.RnF32("Max"), Value = msgPack.RnF32("Value") };
Key key = new Key { Max = msgPack.RnF32("Max"), Value = msgPack.RF32("Value") };
if (Enum.TryParse(msgPack.RS("EPTypePost"), out EPType EPTypePost)) key.EPTypePost = EPTypePost;
if (Enum.TryParse(msgPack.RS("EPTypePre" ), out EPType EPTypePre )) key.EPTypePre = EPTypePre;
if (!Enum.TryParse(msgPack.RS("Type"), out KeyType KeyType)) { key.Value = null; return key; }
if (!Enum.TryParse(msgPack.RS("Type"), out KeyType KeyType)) { key.Value = 0; return key; }
key.Type = KeyType;
if (key.Type == 0) { key.Value = 0; return key; }
else if (key.Type < KeyType.Lerp) return key;
@@ -2573,12 +2596,10 @@ namespace KKdMainLib
(trans[i][0].RF32(), trans[i][1].RF32());
else if (trans[i].Array.Length == 3)
key.Keys[i] = new KFT3
(trans[i][0].RF32(), trans[i][1].RF32(),
trans[i][2].RF32(), trans[i][2].RF32());
(trans[i][0].RF32(), trans[i][1].RF32(), trans[i][2].RF32());
else if (trans[i].Array.Length == 4)
key.Keys[i] = new KFT3
(trans[i][0].RF32(), trans[i][1].RF32(),
trans[i][2].RF32(), trans[i][3].RF32());
(trans[i][0].RF32(), trans[i][1].RF32(), trans[i][2].RF32(), trans[i][3].RF32());
}
return key;
}
@@ -2595,23 +2616,41 @@ namespace KKdMainLib
.Add("Trans" , ref mt.Trans )
.Add("Visibility", ref mt.Visibility));
public static MsgPack Add(this MsgPack msgPack, string name, ref Vec4<Key> rgba) =>
(rgba.X.Type == null && rgba.Y.Type == null &&
rgba.Z.Type == null && rgba.W.Type == null) ? msgPack :
msgPack.Add(new MsgPack(name).Add("R", ref rgba.X).Add("G", ref rgba.Y)
.Add("B", ref rgba.Z).Add("A", ref rgba.W));
public static MsgPack Add(this MsgPack msgPack, string name, ref Vec4<Key>? rgba)
{
if (!rgba.HasValue) return msgPack;
Vec4<Key> rgbav = rgba.Value;
msgPack = msgPack.Add(new MsgPack(name).Add("R", ref rgbav.X).Add("G", ref rgbav.Y)
.Add("B", ref rgbav.Z).Add("A", ref rgbav.W));
rgba = rgbav;
return msgPack;
}
public static MsgPack Add(this MsgPack msgPack, string name, ref Vec3<Key> key) =>
msgPack.Add(new MsgPack(name).Add("X", ref key.X).Add("Y", ref key.Y).Add("Z", ref key.Z));
public static MsgPack Add(this MsgPack msgPack, string name, ref Vec2<Key> uv) =>
(uv.X.Type == null && uv.Y.Type == null) ? msgPack :
msgPack.Add(new MsgPack(name).Add("U", ref uv.X).Add("V", ref uv.Y));
public static MsgPack Add(this MsgPack msgPack, string name, ref Vec2<Key?> uv)
{
if (!uv.X.HasValue && !uv.Y.HasValue) return msgPack;
MsgPack m = new MsgPack(name);
if (uv.X.HasValue) m = m.Add("U", ref uv.X);
if (uv.Y.HasValue) m = m.Add("V", ref uv.Y);
return msgPack.Add(m);
}
public static MsgPack Add(this MsgPack msgPack, string name, ref Key? key)
{
if (!key.HasValue) return msgPack;
Key k = key.Value;
msgPack = msgPack.Add(name, ref k);
key = k;
return msgPack;
}
public static MsgPack Add(this MsgPack msgPack, string name, ref Key key)
{
if (key.Type == null) return msgPack;
MsgPack keys = new MsgPack(name).Add("Type", key.Type.ToString());
if (key.Keys != null && key.Type != KeyType.Null)
{
@@ -2639,7 +2678,8 @@ namespace KKdMainLib
keys.Add(Trans);
}
else if (key.Value != 0) keys.Add("Value", key.Value);
return msgPack.Add(keys);
msgPack.Add(keys);
return msgPack;
}
}
+19 -19
View File
@@ -6,25 +6,25 @@ namespace KKdMainLib
public unsafe struct AddParam : System.IDisposable
{
private long i;
private Stream _IO;
private Stream s;
public HeaderData Header;
public void MotHeadReader(string file)
public void AddParamReader(string file)
{
Header = new HeaderData();
_IO = File.OpenReader(file + ".adp");
Header.Count = _IO.RI64();
Header.DataLength = _IO.RI64();
Header.DataOffset = _IO.RI64();
s = File.OpenReader(file + ".adp");
Header.Count = s.RI64();
Header.DataLength = s.RI64();
Header.DataOffset = s.RI64();
if (Header.Count < 1 || Header.DataOffset > _IO.P || Header.DataLength > _IO.LI64
- Header.DataOffset || Header.Count * 0x20 > _IO.LI64 - Header.DataOffset) { _IO.C(); return; }
if (Header.Count < 1 || Header.DataOffset > s.P || Header.DataLength > s.LI64
- Header.DataOffset || Header.Count * 0x20 > s.LI64 - Header.DataOffset) { s.C(); return; }
Header.Data = new HeaderData.Sub[Header.Count];
byte[] data = _IO.RBy(Header.DataLength, Header.DataOffset);
_IO.C();
byte[] data = s.RBy(Header.DataLength, Header.DataOffset);
s.C();
fixed (byte* ptr = data)
{
@@ -36,7 +36,7 @@ namespace KKdMainLib
data = null;
}
public void MotHeadWriter(string file)
public void AddParamWriter(string file)
{
if (Header.Data == null || Header.Data.LongLength < 1) return;
@@ -52,12 +52,12 @@ namespace KKdMainLib
hPtr[i] = Header.Data[i];
}
_IO = File.OpenWriter(file + ".adp", true);
_IO.W(Header.Count);
_IO.W(Header.DataLength);
_IO.W(Header.DataOffset);
_IO.W(data);
_IO.C();
s = File.OpenWriter(file + ".adp", true);
s.W(Header.Count);
s.W(Header.DataLength);
s.W(Header.DataOffset);
s.W(data);
s.C();
data = null;
}
@@ -116,11 +116,11 @@ namespace KKdMainLib
addParam[i] = addParam[i].Add("Value", sub.Value);
}
addParam.WriteAfterAll(true, file, json);
addParam.WriteAfterAll(false, true, file, json);
}
public void Dispose()
{ if (_IO != null) _IO.D(); _IO = null; Header = default; }
{ if (s != null) s.D(); s = null; Header = default; }
public struct HeaderData
{
+423 -424
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -213,7 +213,7 @@ namespace KKdMainLib.DB
for (i = 0; i < AetSets.Length; i++)
AetDB[i] = AetSets[i].WriteMsgPack();
AetDB.Write(true, file, json);
AetDB.Write(false, true, file, json);
}
private bool disposed = false;
+1 -1
View File
@@ -146,7 +146,7 @@ namespace KKdMainLib.DB
authDB.Add(uid);
}
authDB.Write(true, file, json);
authDB.Write(false, true, file, json);
}
private bool disposed = false;
+1 -1
View File
@@ -251,7 +251,7 @@ namespace KKdMainLib.DB
for (i = 0; i < SpriteSets.Length; i++)
sprDB[i] = SpriteSets[i].WriteMsgPack();
sprDB.Write(true, file, json);
sprDB.Write(false, true, file, json);
}
private bool disposed = false;
+84 -81
View File
@@ -8,7 +8,7 @@ namespace KKdMainLib
{
private int i, i0, i1;
private Header header;
private Stream _IO;
private Stream s;
public EXP[] Dex;
@@ -16,150 +16,153 @@ namespace KKdMainLib
{
Dex = null;
header = new Header();
_IO = File.OpenReader(filepath + ext);
s = File.OpenReader(filepath + ext);
header.Format = Format.F;
header.SectionSignature = _IO.RI32();
header.SectionSignature = s.RU32();
if (header.SectionSignature == 0x43505845)
header = _IO.ReadHeader(true, true);
header = s.ReadHeader(true, true);
if (header.SectionSignature != 0x64) return;
_IO.O = _IO.P - 0x4;
Dex = new EXP[_IO.RI32()];
int DEXOffset = _IO.RI32();
int DEXNameOffset = _IO.RI32();
if (DEXNameOffset == 0x00) { _IO.Format = header.Format = Format.X; DEXNameOffset = (int)_IO.RIX(); }
s.O = s.P - 0x4;
Dex = new EXP[s.RI32()];
int DEXOffset = s.RI32();
int DEXNameOffset = s.RI32();
if (DEXNameOffset == 0x00) { s.Format = header.Format = Format.X; DEXNameOffset = (int)s.RIX(); }
_IO.P = DEXOffset;
s.P = DEXOffset;
for (i = 0; i < Dex.Length; i++)
{
Dex[i].MainOffset = (int)_IO.RIX();
Dex[i].EyesOffset = (int)_IO.RIX();
Dex[i].MainOffset = (int)s.RIX();
Dex[i].EyesOffset = (int)s.RIX();
}
_IO.P = DEXNameOffset;
s.P = DEXNameOffset;
for (i = 0; i < Dex.Length; i++)
Dex[i].NameOffset = (int)_IO.RIX();
Dex[i].NameOffset = (int)s.RIX();
for (i = 0; i < Dex.Length; i++)
{
EXPElement element = new EXPElement();
Dex[i].Main = KKdList<EXPElement>.New;
_IO.P = Dex[i].MainOffset;
s.P = Dex[i].MainOffset;
while (true)
{
element.Frame = _IO.RF32();
element.Both = _IO.RU16();
element.ID = _IO.RU16();
element.Value = _IO.RF32();
element.Trans = _IO.RF32();
element.Frame = s.RF32();
element.Both = s.RU16();
element.ID = s.RU16();
element.Value = s.RF32();
element.Trans = s.RF32();
if (element.Frame == 999999 || element.Both == 0xFFFF) break;
Dex[i].Main.Add(element);
}
Dex[i].Eyes = KKdList<EXPElement>.New;
_IO.P = Dex[i].EyesOffset;
s.P = Dex[i].EyesOffset;
while(true)
{
element.Frame = _IO.RF32();
element.Both = _IO.RU16();
element.ID = _IO.RU16();
element.Value = _IO.RF32();
element.Trans = _IO.RF32();
element.Frame = s.RF32();
element.Both = s.RU16();
element.ID = s.RU16();
element.Value = s.RF32();
element.Trans = s.RF32();
if (element.Frame == 999999 || element.Both == 0xFFFF) break;
Dex[i].Eyes.Add(element);
}
Dex[i].Name = _IO.RSaO(Dex[i].NameOffset);
Dex[i].Name = s.RSaO(Dex[i].NameOffset);
}
_IO.C();
s.C();
}
public void DEXWriter(string filepath, Format Format)
public void DEXWriter(string filepath, Format format)
{
if (Dex == null || Dex.Length < 1) return;
header = new Header();
_IO = File.OpenWriter(filepath + (Format > Format.F && Format < Format.FT ? ".dex" : ".bin"), true);
header.Format = _IO.Format = Format;
s = File.OpenWriter(filepath + (format > Format.F && format < Format.FT ? ".dex" : ".bin"), true);
header.Format = s.Format = format;
_IO.O = Format > Format.F ? 0x20 : 0;
_IO.W(0x64);
_IO.W(Dex.Length);
s.Format = format;
s.O = format > Format.F ? 0x20 : 0;
s.P = 0;
s.W(0x64);
s.W(Dex.Length);
_IO.WX(header.IsX ? 0x28 : 0x20);
_IO.WX(0x00);
s.WX(header.IsX ? 0x28 : 0x20);
s.WX(0x00);
int Position0 = _IO.P;
_IO.W(0x00L);
_IO.W(0x00L);
int Position0 = s.P;
s.W(0x00L);
s.W(0x00L);
for (i = 0; i < Dex.Length * 3; i++) _IO.WX(0x00);
_IO.A(0x20);
for (i = 0; i < Dex.Length * 3; i++) s.WX(0x00);
s.A(0x20);
for (i0 = 0; i0 < Dex.Length; i0++)
{
Dex[i0].MainOffset = _IO.P;
Dex[i0].MainOffset = s.P;
for (i1 = 0; i1 < Dex[i0].Main.Count; i1++)
{
_IO.W(Dex[i0].Main[i1].Frame);
_IO.W(Dex[i0].Main[i1].Both );
_IO.W(Dex[i0].Main[i1].ID );
_IO.W(Dex[i0].Main[i1].Value);
_IO.W(Dex[i0].Main[i1].Trans);
s.W(Dex[i0].Main[i1].Frame);
s.W(Dex[i0].Main[i1].Both );
s.W(Dex[i0].Main[i1].ID );
s.W(Dex[i0].Main[i1].Value);
s.W(Dex[i0].Main[i1].Trans);
}
_IO.W(999999f);
_IO.W(0xFFFF);
_IO.W(0x0L);
_IO.A(0x20);
s.W(999999f);
s.W(0xFFFF);
s.W(0x0L);
s.A(0x20);
Dex[i0].EyesOffset = _IO.P;
Dex[i0].EyesOffset = s.P;
for (i1 = 0; i1 < Dex[i0].Eyes.Count; i1++)
{
_IO.W(Dex[i0].Eyes[i1].Frame);
_IO.W(Dex[i0].Eyes[i1].Both );
_IO.W(Dex[i0].Eyes[i1].ID );
_IO.W(Dex[i0].Eyes[i1].Value);
_IO.W(Dex[i0].Eyes[i1].Trans);
s.W(Dex[i0].Eyes[i1].Frame);
s.W(Dex[i0].Eyes[i1].Both );
s.W(Dex[i0].Eyes[i1].ID );
s.W(Dex[i0].Eyes[i1].Value);
s.W(Dex[i0].Eyes[i1].Trans);
}
_IO.W(999999f);
_IO.W(0xFFFF);
_IO.W(0x0L);
_IO.A(0x20);
s.W(999999f);
s.W(0xFFFF);
s.W(0x0L);
s.A(0x20);
}
for (i = 0; i < Dex.Length; i++)
{
Dex[i].NameOffset = _IO.P;
_IO.W(Dex[i].Name + "\0");
Dex[i].NameOffset = s.P;
s.W(Dex[i].Name + "\0");
}
_IO.A(0x10, true);
s.A(0x10, true);
_IO.P = header.IsX ? 0x28 : 0x20;
s.P = header.IsX ? 0x28 : 0x20;
for (i = 0; i < Dex.Length; i++)
{
_IO.WX(Dex[i].MainOffset);
_IO.WX(Dex[i].EyesOffset);
s.WX(Dex[i].MainOffset);
s.WX(Dex[i].EyesOffset);
}
int namesPosition = _IO.P;
int namesPosition = s.P;
for (i = 0; i < Dex.Length; i++)
_IO.WX(Dex[i].NameOffset);
s.WX(Dex[i].NameOffset);
_IO.P = Position0 - (header.IsX ? 8 : 4);
_IO.W(namesPosition);
s.P = Position0 - (header.IsX ? 8 : 4);
s.W(namesPosition);
if (Format > Format.F)
if (format > Format.F)
{
int offset = _IO.L;
_IO.O = 0;
_IO.P = _IO.L;
_IO.WEOFC(0);
_IO.P = 0;
uint offset = s.LU32;
s.O = 0;
s.P = s.L;
s.WEOFC(0);
s.P = 0;
header.DataSize = offset;
header.SectionSize = offset;
header.Signature = 0x43505845;
_IO.W(header, true);
header.UseSectionSize = true;
s.W(header);
}
_IO.C();
s.C();
}
public void MsgPackReader(string file, bool json)
@@ -218,12 +221,12 @@ namespace KKdMainLib
dex[i0] = exp;
}
dex.Write(true, file, json);
dex.Write(false, true, file, json);
}
private bool disposed;
public void Dispose()
{ if (!disposed) { if (_IO != null) _IO.D(); _IO = null; Dex = null; header = default; disposed = true; } }
{ if (!disposed) { if (s != null) s.D(); s = null; Dex = null; header = default; disposed = true; } }
public struct EXP
{
+1 -3
View File
@@ -8,9 +8,7 @@ namespace KKdMainLib
{
public static class DIVAFILE
{
private static readonly byte[] Key = new byte[]
{ 0x66, 0x69, 0x6C, 0x65, 0x20, 0x61, 0x63, 0x63,
0x65, 0x73, 0x73, 0x20, 0x64, 0x65, 0x6E, 0x79 };
private static readonly byte[] Key = "file access deny".ToASCII();
public static void Decrypt(this string file)
{
+58 -45
View File
@@ -7,8 +7,8 @@ namespace KKdMainLib
{
public struct DataBank : IDisposable
{
private Stream _IO;
private int i;
private Stream s;
public PvList[] pvList;
public PsrData[] psrData;
@@ -44,29 +44,41 @@ namespace KKdMainLib
else if (file.Contains("PvList")) Success = true;
}
public void DBWriter(string file, uint num2)
public byte[] DBWriter(string file)
{
if (!Success) return;
if (!Success) return null;
_IO = File.OpenWriter();
s = File.OpenWriter();
if (file.Contains("psrData"))
{
if (psrData != null && psrData.Length > 0)
for (i = 0; i < psrData.Length; i++)
_IO.W(psrData[i].ToString() + c);
if (psrData[i].PV_ID == 92)
s.W(psrData[i].ToString() + c);
else
s.W(psrData[i].ToString() + c);
}
else if (file.Contains("PvList"))
{
if (pvList != null && pvList.Length > 0)
{
for (i = 0; i < pvList.Length - 1; i++)
_IO.W(UrlEncode(pvList[i].ToString() + c));
_IO.W(UrlEncode(pvList[i].ToString()));
s.W(UrlEncode(pvList[i].ToString() + c));
s.W(UrlEncode(pvList[i].ToString()));
}
else _IO.W("%2A%2A%2A");
else s.W("%2A%2A%2A");
}
return s.ToArray(true);
}
public void DBWriter(string file, uint num2)
{
if (!Success) return;
byte[] data = DBWriter(file);
if (data == null) return;
byte[] data = _IO.ToArray(true);
ushort num = DCC.CalculateChecksum(data);
File.WriteAllBytes(file + "_" + num + "_" + num2 + ".dat", data);
}
@@ -133,15 +145,15 @@ namespace KKdMainLib
}
else msgPack.Add(new MsgPack("PvList", null));
}
msgPack.Write(file, json).Dispose();
msgPack.Write(file, false, json).Dispose();
}
public static string UrlEncode(string value) =>
WebUtility.UrlEncode(value).Replace("+", "%20");
WebUtility.UrlEncode(value).Replace("+", "%20").Replace("!", "%21").Replace("*", "%2A");
private bool disposed;
public void Dispose()
{ if (!disposed) { if (_IO != null) _IO.D(); _IO = null; psrData = null;
{ if (!disposed) { if (s != null) s.D(); s = null; psrData = null;
pvList = null; Success = false; disposed = true; } }
public struct PsrData
@@ -166,9 +178,9 @@ namespace KKdMainLib
else { id = msg.RnI32("ID"); if (id != null) PV_ID = (int)id; }
MsgPack temp;
if ((temp = msg["P1", true]).NotNull) p1.SetValue(temp);
if ((temp = msg["P2", true]).NotNull) p2.SetValue(temp);
if ((temp = msg["P3", true]).NotNull) p3.SetValue(temp);
if ((temp = msg["P1"]).NotNull) p1.SetValue(temp);
if ((temp = msg["P2"]).NotNull) p2.SetValue(temp);
if ((temp = msg["P3"]).NotNull) p3.SetValue(temp);
temp.Dispose();
}
@@ -177,35 +189,35 @@ namespace KKdMainLib
.Add(p2.WriteMP("P2")).Add(p3.WriteMP("P3"));
public override string ToString() =>
UrlEncode($"{p1.ToString()},{p2.ToString()},{p3.ToString()},{PV_ID}");
UrlEncode($"{p1},{p2},{p3},{PV_ID}");
}
public struct Player
{
public int Score0;
public int Score1;
public string Name0;
public string Name1;
public string Name;
public string NameExtra;
public int Score;
public int ScoreExtra;
public Difficulty Diff;
public bool Has2P => Name1 != null;
public bool HasExtra => NameExtra != null;
public void SetValue(string[] data, int i = 0, int offset = 0)
{
string[] array = data[i * 13 + offset * 4].Split('.');
Score0 = int.Parse(array[0]);
if (array.Length > 1) Score1 = int.Parse(array[1]);
Score = int.Parse(array[0]);
if (array.Length > 1) ScoreExtra = int.Parse(array[1]);
string text = "";
for (int j = 0; j < data[i * 13 + 1 + offset * 4].Length; j++)
{
text += data[i * 13 + 1 + offset * 4][j].ToString();
if (text.EndsWith("xxx"))
{
Name0 = text.Remove(text.Length - 3);
Name = text.Remove(text.Length - 3);
text = "";
}
}
if (array.Length == 1) Name0 = text;
else Name1 = text;
if (array.Length == 1) Name = text;
else NameExtra = text;
if (int.TryParse(data[i * 13 + 2 + offset * 4], out int Diff))
this.Diff = (Difficulty)Diff;
else
@@ -215,28 +227,29 @@ namespace KKdMainLib
public void SetValue(MsgPack msg)
{
Diff = (Difficulty)msg.RI32("Diff");
Score0 = msg.RI32 ("Score");
Name0 = msg.RS( "Name");
if (Name0 == null)
Name = msg.RS ( "Name");
NameExtra = msg.RS ( "NameExtra");
Score = msg.RI32("Score");
ScoreExtra = msg.RI32("ScoreExtra");
if (Name == null)
{
Score0 = msg.RI32("Score0");
Score1 = msg.RI32("Score1");
Name0 = msg.RS ( "Name0");
Name1 = msg.RS ( "Name1");
Name = msg.RS ( "Name0");
NameExtra = msg.RS ( "Name1");
Score = msg.RI32("Score0");
ScoreExtra = msg.RI32("Score1");
}
else Name1 = null;
}
public MsgPack WriteMP(string name) =>
Has2P ? new MsgPack(name).Add("Diff", (int)Diff).Add("Score0", Score0)
.Add("Score1", Score1).Add("Name0", Name0).Add("Name1", Name1) :
new MsgPack(name).Add("Diff", (int)Diff)
.Add("Score" , Score0).Add("Name" , Name0);
HasExtra ? new MsgPack(name).Add("Diff", (int)Diff).Add("Name", Name)
.Add("NameExtra", NameExtra).Add("Score", Score).Add("ScoreExtra", ScoreExtra) :
new MsgPack(name).Add("Diff", (int)Diff).Add("Name" , Name) .Add("Score" , Score);
public override string ToString() =>
(Score0 + (Has2P ? (d + Score1) : "") + c + UrlEncode(Name0) +
(Has2P ? ("xxx" + UrlEncode(Name1)) : "") + c +
Diff + c + (Has2P ? "0.1" : "0")).Replace("*", "%2A");
Score + (HasExtra ? (d + ScoreExtra) : "") + c + UrlEncode(Name) +
(HasExtra ? ("xxx" + UrlEncode(NameExtra)) : "") + c +
(int)Diff + c + (HasExtra ? "0.1" : "0");
}
public struct PvList
@@ -290,9 +303,9 @@ namespace KKdMainLib
public MsgPack WriteMP()
{
MsgPack msgPack = MsgPack.New.Add("ID" , PV_ID )
.Add("Version", Version)
.Add("Edition", Edition);
MsgPack msgPack = MsgPack.New.Add("ID" , PV_ID );
if (Version != 1) msgPack.Add("Version", Version);
if (Edition != 0) msgPack.Add("Edition", Edition);
if (AdvDemoStart.WU) msgPack.Add("AdvDemoStart", AdvDemoStart.Int);
if (AdvDemoEnd .WL) msgPack.Add("AdvDemoEnd" , AdvDemoEnd .Int);
if (StartShow .WL) msgPack.Add("StartShow" , StartShow .Int);
@@ -375,7 +388,7 @@ namespace KKdMainLib
}
public override string ToString() =>
$"{Year.ToString("d4")}-{Month.ToString("d2")}-{Day.ToString("d2")}";
$"{Year:d4}-{Month:d2}-{Day:d2}";
}
public enum Difficulty
+61 -63
View File
@@ -16,31 +16,35 @@ namespace KKdMainLib
public static Header ReadHeader(this Stream stream, bool readSectionSignature = true)
{
Header header = new Header { Format = Format.F2LE, Signature = stream.RI32(),
DataSize = stream.RI32(), Length = stream.RI32(), Flags = stream.RI32(),
Depth = stream.RI32(), SectionSize = stream.RI32(),
Mode = stream.RI32() };
Header header = new Header { Format = Format.F2 };
header.Signature = stream.RU32();
header.DataSize = stream.RU32();
header.Length = stream.RU32();
header.Flags = stream.RU32();
header.Depth = stream.RU32();
header.SectionSize = stream.RU32();
header.Version = stream.RU32();
stream.RI32();
if ((header.Flags & 0x08000000) == 0x08000000) header.Format = Format.F2BE;
header.NotUseDataSizeAsSectionSize = (header.Flags & 0x10000000) != 0x10000000;
header.UseBigEndian = (header.Flags & 0x08000000) != 0;
header.UseSectionSize = (header.Flags & 0x10000000) != 0;
if (header.Length == 0x40)
{
stream.RI64();
stream.RI64();
header.InnerSignature = stream.RI32();
header.InnerSignature = stream.RU32();
stream.RI32();
stream.RI64();
}
stream.Format = header.Format;
if (readSectionSignature) header.SectionSignature = stream.RI32E();
if (readSectionSignature) header.SectionSignature = stream.RU32E();
return header;
}
public static void W(this Stream stream, Header header, bool extended = false)
{
header.Length = (header.Format < Format.X && extended) ? 0x40 : 0x20;
header.Flags = (!header.NotUseDataSizeAsSectionSize ? 0x10000000 : 0) |
(header.Format == Format.F2BE ? 0x08000000 : 0);
header.Length = (header.Format < Format.X && extended) ? 0x40u : 0x20u;
header.Flags = (header.UseSectionSize ? 0x10000000 : 0u) |
(header.UseBigEndian ? 0x08000000 : 0u);
stream.W(header.Signature);
stream.W(header.DataSize);
@@ -48,13 +52,11 @@ namespace KKdMainLib
stream.W(header.Flags);
stream.W(header.Depth);
stream.W(header.SectionSize);
stream.W(header.Mode);
stream.W(header.Version);
stream.W(0x00);
if (header.Length == 0x40)
{
stream.W(header.Format < Format.MGF ? (int)((header.SectionSignature ^
(header.DataSize * (long)header.Signature)) - header.Depth + header.SectionSize) : 0);
stream.W(0x00);
stream.W(0x00L);
stream.W(0x00L);
stream.W(header.InnerSignature);
stream.W(0x00);
@@ -62,31 +64,33 @@ namespace KKdMainLib
}
}
public static void WEOFC(this Stream stream, int depth = 0) =>
stream.W(new Header { Depth = depth, Length = 0x20, Signature = 0x43464F45 });
public static void WEOFC(this Stream stream, uint depth = 0) =>
stream.W(new Header { Depth = depth, Length = 0x20, Signature = 0x43464F45, UseSectionSize = true });
}
public static class POFExtensions
{
public static void W(this Stream stream, POF pof, bool shiftX = false, int depth = 0)
public static void W(this Stream stream, POF pof, bool shiftX = false, uint depth = 0)
{
byte[] data = pof.Write(shiftX);
Header header = new Header { Depth = depth, Format = Format.F2LE,
Length = 0x20, Signature = shiftX ? 0x31464F50 : 0x30464F50 };
header.DataSize = header.SectionSize = data.Length;
Header header = new Header { Depth = depth, Format = Format.F2, Length = 0x20,
Signature = shiftX ? 0x31464F50u : 0x30464F50u, UseSectionSize = true };
header.DataSize = header.SectionSize = (uint)data.Length.A(0x10);
stream.W(header);
stream.W(data);
for (int c = data.Length.A(0x10) - data.Length; c > 0; c--)
stream.W((byte)0);
}
}
public static class ENRSExtensions
{
public static void W(this Stream stream, ENRS enrs, int depth = 0)
public static void W(this Stream stream, ENRS enrs, uint depth = 0)
{
byte[] data = enrs.Write();
Header header = new Header { Depth = depth, Format = Format.F2LE,
Length = 0x20, Signature = 0x53524E45 };
header.DataSize = header.SectionSize = data.Length;
Header header = new Header { Depth = depth, Format = Format.F2,
Length = 0x20, Signature = 0x53524E45, UseSectionSize = true };
header.DataSize = header.SectionSize = (uint)data.Length;
stream.W(header);
stream.W(data);
}
@@ -105,11 +109,12 @@ namespace KKdMainLib
public static Struct RSt(this Stream stream, Header header)
{
uint l = header.UseSectionSize ? header.SectionSize : header.DataSize;
Struct @struct = new Struct { Header = header, DataOffset =
stream.P, Data = stream.RBy(header.SectionSize) };
int depth = header.Depth;
stream.P, Data = stream.RBy(l) };
uint depth = header.Depth;
int lastSig = 0, sig;
uint lastSig = 0, sig;
long length = stream.L - stream.P;
long position = 0;
KKdList<Struct> subStructs = KKdList<Struct>.New;
@@ -117,19 +122,19 @@ namespace KKdMainLib
{
header = stream.ReadHeader(false);
sig = header.Signature;
position += header.Length + header.SectionSize;
l = header.UseSectionSize ? header.SectionSize : header.DataSize;
position += header.Length + l;
if (sig == 0x43464F45 && header.Depth == depth + 1) break;
else if (sig == 0x53524E45 || (sig & 0xF0FFFFFF) == 0x30464F50)
{
byte[] Data = stream.RBy(header.SectionSize);
byte[] Data = stream.RBy(l);
if (sig == 0x53524E45) @struct.ENRS.Read(Data);
else @struct.POF .Read(Data, sig == 0x31464F50);
}
else if (header.Depth == 0 && sig == 0x43505854)
{ subStructs.Add(new Struct { Header = header, DataOffset =
stream.P, Data = stream.RBy(header.SectionSize) }); }
else if (header.Depth <= depth) { stream.PI64 -= header.Length; break; }
else subStructs.Add(stream.RSt(header));
subStructs.Add(new Struct { Header = header, DataOffset = stream.P, Data = stream.RBy(l) });
else if (header.Depth > depth) subStructs.Add(stream.RSt(header));
else { stream.PI64 -= header.Length; break; }
lastSig = sig;
}
@@ -137,20 +142,22 @@ namespace KKdMainLib
return @struct;
}
public static byte[] W(this Struct Struct, bool shiftX = false, bool useDepth = true)
public static byte[] W(this Struct @struct, bool shiftX = false, bool useDepth = true)
{
byte[] Data;
using (Stream stream = File.OpenWriter()) { Struct.Update(shiftX);
stream.W(Struct, shiftX, useDepth); stream.WEOFC(); Data = stream.ToArray(); }
using (Stream stream = File.OpenWriter())
{ stream.W(@struct, shiftX, useDepth); stream.WEOFC(); Data = stream.ToArray(); }
return Data;
}
public static void W(this Stream stream, Struct @struct, bool shiftX = false, bool useDepth = true)
{
@struct.Update(shiftX);
stream.W(@struct.Header);
stream.W(@struct.Data );
if (@struct.HasPOF ) stream.W(@struct.POF , shiftX, useDepth ? @struct.Depth + 1 : 0);
if (@struct.HasENRS) stream.W(@struct.ENRS, useDepth ? @struct.Depth + 1 : 0);
if (@struct.Data != null) stream.W(@struct.Data);
if (@struct.HasPOF ) stream.W(@struct.POF , shiftX, useDepth ? @struct.Depth + 1 : 0u);
if (@struct.HasENRS) stream.W(@struct.ENRS, useDepth ? @struct.Depth + 1 : 0u);
if (@struct.HasSubStructs)
{
for (int i = 0; i < @struct.SubStructs.Length; i++)
@@ -186,35 +193,35 @@ namespace KKdMainLib
return MsgPack;
}
public static void Write(this MsgPack mp, bool temp, string file, bool json = false)
{ if (temp) MsgPack.New.Add(mp).Write(file, json).Dispose();
else mp .Write(file, json); }
public static void Write(this MsgPack mp, bool ignoreNull, bool temp, string file, bool json = false)
{ if (temp) MsgPack.New.Add(mp).Write(file, ignoreNull, json).Dispose();
else mp .Write(file, ignoreNull, json); }
public static MsgPack Write(this MsgPack mp, string file, bool json = false)
public static MsgPack Write(this MsgPack mp, string file, bool ignoreNull, bool json = false)
{
if (json) using (JSON _IO = new JSON(File.OpenWriter(file + ".json", true))) _IO.W(mp, "\n", " ");
else using ( MP _IO = new MP(File.OpenWriter(file + ".mp" , true))) _IO.W(mp);
if (json) using (JSON _IO = new JSON(File.OpenWriter(file + ".json", true))) _IO.W(mp, ignoreNull, "\n", " ");
else using ( MP _IO = new MP(File.OpenWriter(file + ".mp" , true))) _IO.W(mp, ignoreNull);
return mp;
}
public static void WriteAfterAll(this MsgPack mp, bool temp, string file, bool json = false)
{ if (temp) MsgPack.New.Add(mp).WriteAfterAll(file, json).Dispose();
else mp .WriteAfterAll(file, json); }
public static void WriteAfterAll(this MsgPack mp, bool ignoreNull, bool temp, string file, bool json = false)
{ if (temp) MsgPack.New.Add(mp).WriteAfterAll(file, ignoreNull, json).Dispose();
else mp .WriteAfterAll(file, ignoreNull, json); }
public static MsgPack WriteAfterAll(this MsgPack mp, string file, bool json = false)
public static MsgPack WriteAfterAll(this MsgPack mp, string file, bool ignoreNull, bool json = false)
{
byte[] data = null;
if (json) using (JSON _IO = new JSON(File.OpenWriter())) { _IO.W(mp, true); data = _IO.ToArray(); }
else using ( MP _IO = new MP(File.OpenWriter())) { _IO.W(mp ); data = _IO.ToArray(); }
if (json) using (JSON _IO = new JSON(File.OpenWriter())) { _IO.W(mp, ignoreNull, true); data = _IO.ToArray(); }
else using ( MP _IO = new MP(File.OpenWriter())) { _IO.W(mp, ignoreNull ); data = _IO.ToArray(); }
File.WriteAllBytes(file + (json ? ".json" : ".mp"), data);
return mp;
}
public static void ToJSON (this string file) =>
file.ReadMP( ).Write(file, true).Dispose();
file.ReadMP( ).Write(file, false, true).Dispose();
public static void ToMsgPack(this string file) =>
file.ReadMP(true).Write(file ).Dispose();
file.ReadMP(true).Write(file, false ).Dispose();
}
public static class IKFExt
@@ -230,13 +237,4 @@ namespace KKdMainLib
return kf;
}
}
public static class LibDeflate
{
public static void Extract()
{
if (!File.Exists("libdeflate.dll"))
File.WriteAllBytes("libdeflate.dll", Properties.Resources.libdeflate);
}
}
}
+22 -22
View File
@@ -7,7 +7,7 @@ namespace KKdMainLib.F2
public struct Bloom : System.IDisposable
{
private int i;
private Stream _IO;
private Stream s;
private Header header;
public CountPointer<BLT> BLTs;
@@ -15,15 +15,15 @@ namespace KKdMainLib.F2
public void BLTReader(string file)
{
BLTs = default;
_IO = File.OpenReader(file + ".blt", true);
header = _IO.ReadHeader();
s = File.OpenReader(file + ".blt", true);
header = s.ReadHeader();
if (header.Signature != 0x544D4C42 || header.InnerSignature != 0x3) return;
_IO.P -= 0x4;
s.P -= 0x4;
BLTs = _IO.RCPE<BLT>();
if (BLTs.C < 1) { _IO.C(); BLTs.C = -1; return; }
BLTs = s.RCPE<BLT>();
if (BLTs.C < 1) { s.C(); BLTs.C = -1; return; }
if (BLTs.C > 0 && BLTs.O == 0) { _IO.C(); BLTs.C = -1; return; }
if (BLTs.C > 0 && BLTs.O == 0) { s.C(); BLTs.C = -1; return; }
/*{
_IO.Format = Header.Format = Format.X;
_IO.Offset = Header.Length;
@@ -31,36 +31,36 @@ namespace KKdMainLib.F2
BLTs = _IO.ReadCountPointerX<BLT>();
}*/
_IO.P = BLTs.O;
s.P = BLTs.O;
for (i = 0; i < BLTs.C; i++)
{
ref BLT blt = ref BLTs.E[i];
_IO.RI32E();
blt.Color .X = _IO.RF32E();
blt.Color .Y = _IO.RF32E();
blt.Color .Z = _IO.RF32E();
blt.Brightpass.X = _IO.RF32E();
blt.Brightpass.Y = _IO.RF32E();
blt.Brightpass.Z = _IO.RF32E();
blt.Range = _IO.RF32E();
s.RI32E();
blt.Color .X = s.RF32E();
blt.Color .Y = s.RF32E();
blt.Color .Z = s.RF32E();
blt.Brightpass.X = s.RF32E();
blt.Brightpass.Y = s.RF32E();
blt.Brightpass.Z = s.RF32E();
blt.Range = s.RF32E();
}
_IO.C();
s.C();
}
public void TXTWriter(string file)
{
if (BLTs.C < 1) return;
_IO = File.OpenWriter();
_IO.WPSSJIS("ID,ColorR,ColorG,ColorB,BrightpassR,BrightpassG,BrightpassB,Range\n");
s = File.OpenWriter();
s.WPSSJIS("ID,ColorR,ColorG,ColorB,BrightpassR,BrightpassG,BrightpassB,Range\n");
for (i = 0; i < BLTs.C; i++)
_IO.W(i + "," + BLTs[i] + "\n");
File.WriteAllBytes(file + "_bloom.txt", _IO.ToArray(true));
s.W(i + "," + BLTs[i] + "\n");
File.WriteAllBytes(file + "_bloom.txt", s.ToArray(true));
}
private bool disposed;
public void Dispose()
{ if (!disposed) { if (_IO != null) _IO.D(); _IO = null; BLTs = default; header = default; disposed = true; } }
{ if (!disposed) { if (s != null) s.D(); s = null; BLTs = default; header = default; disposed = true; } }
public struct BLT
{
+23 -23
View File
@@ -7,7 +7,7 @@ namespace KKdMainLib.F2
public struct ColorCorrection : System.IDisposable
{
private int i;
private Stream _IO;
private Stream s;
private Header header;
public CountPointer<CCT> CCTs;
@@ -15,15 +15,15 @@ namespace KKdMainLib.F2
public void CCTReader(string file)
{
CCTs = default;
_IO = File.OpenReader(file + ".cct", true);
header = _IO.ReadHeader();
s = File.OpenReader(file + ".cct", true);
header = s.ReadHeader();
if (header.Signature != 0x54524343 || header.InnerSignature != 0x3) return;
_IO.P -= 0x4;
s.P -= 0x4;
CCTs = _IO.RCPE<CCT>();
if (CCTs.C < 1) { _IO.C(); CCTs.C = -1; return; }
CCTs = s.RCPE<CCT>();
if (CCTs.C < 1) { s.C(); CCTs.C = -1; return; }
if (CCTs.C > 0 && CCTs.O == 0) { _IO.C(); CCTs.C = -1; return; }
if (CCTs.C > 0 && CCTs.O == 0) { s.C(); CCTs.C = -1; return; }
/*{
_IO.Format = Header.Format = Format.X;
_IO.Offset = Header.Length;
@@ -31,38 +31,38 @@ namespace KKdMainLib.F2
CCTs = _IO.ReadCountPointerX<CCT>();
}*/
_IO.P = CCTs.O;
s.P = CCTs.O;
for (i = 0; i < CCTs.C; i++)
{
ref CCT cct = ref CCTs.E[i];
_IO.RI32E();
cct.Hue = _IO.RF32E();
cct.Saturation = _IO.RF32E();
cct.Lightness = _IO.RF32E();
cct.Exposure = _IO.RF32E();
cct.Gamma.X = _IO.RF32E();
cct.Gamma.Y = _IO.RF32E();
cct.Gamma.Z = _IO.RF32E();
cct.Contrast = _IO.RF32E();
s.RI32E();
cct.Hue = s.RF32E();
cct.Saturation = s.RF32E();
cct.Lightness = s.RF32E();
cct.Exposure = s.RF32E();
cct.Gamma.X = s.RF32E();
cct.Gamma.Y = s.RF32E();
cct.Gamma.Z = s.RF32E();
cct.Contrast = s.RF32E();
}
_IO.C();
s.C();
}
public void TXTWriter(string file)
{
if (CCTs.C < 1) return;
_IO = File.OpenWriter();
_IO.WPSSJIS("ID,Hue,Saturation,Lightness,Exposure,GammaR,GammaG,GammaB,Contrast\n");
s = File.OpenWriter();
s.WPSSJIS("ID,Hue,Saturation,Lightness,Exposure,GammaR,GammaG,GammaB,Contrast\n");
for (i = 0; i < CCTs.C; i++)
_IO.W(i + "," + CCTs[i] + "\n");
File.WriteAllBytes(file + "_cc.txt", _IO.ToArray(true));
s.W(i + "," + CCTs[i] + "\n");
File.WriteAllBytes(file + "_cc.txt", s.ToArray(true));
}
private bool disposed;
public void Dispose()
{ if (!disposed) { if (_IO != null) _IO.D(); _IO = null; CCTs = default; header = default; disposed = true; } }
{ if (!disposed) { if (s != null) s.D(); s = null; CCTs = default; header = default; disposed = true; } }
public struct CCT
{
+21 -21
View File
@@ -7,7 +7,7 @@ namespace KKdMainLib.F2
public struct DOF : System.IDisposable
{
private int i;
private Stream _IO;
private Stream s;
private Header header;
public CountPointer<DFT> DFTs;
@@ -15,15 +15,15 @@ namespace KKdMainLib.F2
public void DFTReader(string file)
{
DFTs = default;
_IO = File.OpenReader(file + ".dft", true);
header = _IO.ReadHeader();
s = File.OpenReader(file + ".dft", true);
header = s.ReadHeader();
if (header.Signature != 0x54464F44 || header.InnerSignature != 0x3) return;
_IO.P -= 0x4;
s.P -= 0x4;
DFTs = _IO.RCPE<DFT>();
if (DFTs.C < 1) { _IO.C(); DFTs.C = -1; return; }
DFTs = s.RCPE<DFT>();
if (DFTs.C < 1) { s.C(); DFTs.C = -1; return; }
if (DFTs.C > 0 && DFTs.O == 0) { _IO.C(); DFTs.C = -1; return; }
if (DFTs.C > 0 && DFTs.O == 0) { s.C(); DFTs.C = -1; return; }
/*{
_IO.Format = Header.Format = Format.X;
_IO.Offset = Header.Length;
@@ -31,36 +31,36 @@ namespace KKdMainLib.F2
DFTs = _IO.ReadCountPointerX<DFT>();
}*/
_IO.P = DFTs.O;
s.P = DFTs.O;
for (i = 0; i < DFTs.C; i++)
{
ref DFT DFT = ref DFTs.E[i];
_IO.RI32E();
DFT. Focus = _IO.RF32E();
DFT. FocusRange = _IO.RF32E();
DFT.FuzzingRange = _IO.RF32E();
DFT.Ratio = _IO.RF32E();
DFT.Quality = _IO.RF32E();
if (_IO.IsX) _IO.RI32();
s.RI32E();
DFT. Focus = s.RF32E();
DFT. FocusRange = s.RF32E();
DFT.FuzzingRange = s.RF32E();
DFT.Ratio = s.RF32E();
DFT.Quality = s.RF32E();
if (s.IsX) s.RI32();
}
_IO.C();
s.C();
}
public void TXTWriter(string file)
{
if (DFTs.C < 1) return;
_IO = File.OpenWriter();
_IO.WPSSJIS("ID,Focus,FocusRange,FuzzingRange,Ratio,Quality\n");
s = File.OpenWriter();
s.WPSSJIS("ID,Focus,FocusRange,FuzzingRange,Ratio,Quality\n");
for (i = 0; i < DFTs.C; i++)
_IO.W(i + "," + DFTs[i] + "\n");
File.WriteAllBytes(file + "_dof.txt", _IO.ToArray(true));
s.W(i + "," + DFTs[i] + "\n");
File.WriteAllBytes(file + "_dof.txt", s.ToArray(true));
}
private bool disposed;
public void Dispose()
{ if (!disposed) { if (_IO != null) _IO.D(); _IO = null; DFTs = default; header = default; disposed = true; } }
{ if (!disposed) { if (s != null) s.D(); s = null; DFTs = default; header = default; disposed = true; } }
public struct DFT
{
+39 -39
View File
@@ -7,7 +7,7 @@ namespace KKdMainLib.F2
public struct Light : System.IDisposable
{
private int i, i0;
private Stream _IO;
private Stream s;
private Header header;
public CountPointer<CountPointer<LIT>> LITs;
@@ -15,19 +15,19 @@ namespace KKdMainLib.F2
public void LITReader(string file)
{
LITs = default;
_IO = File.OpenReader(file + ".lit", true);
header = _IO.ReadHeader();
s = File.OpenReader(file + ".lit", true);
header = s.ReadHeader();
if (header.Signature != 0x4354494C || header.InnerSignature != 0x2 ||
header.SectionSignature != 0x2) return;
LITs = _IO.RCPE<CountPointer<LIT>>();
if (LITs.C < 1) { _IO.C(); LITs.C = -1; return; }
LITs = s.RCPE<CountPointer<LIT>>();
if (LITs.C < 1) { s.C(); LITs.C = -1; return; }
_IO.P = LITs.O;
s.P = LITs.O;
for (i = 0; i < LITs.C; i++)
{
LITs[i] = _IO.RCPX<LIT>();
if ((LITs[i].C > 0 || LITs[i].O == 0) && !_IO.IsX) { _IO.C(); LITs.C = -1; return; }
LITs[i] = s.RCPX<LIT>();
if ((LITs[i].C > 0 || LITs[i].O == 0) && !s.IsX) { s.C(); LITs.C = -1; return; }
/*{
_IO.Format = Header.Format = Format.X;
_IO.Offset = Header.Length;
@@ -39,37 +39,37 @@ namespace KKdMainLib.F2
for (i = 0; i < LITs.C; i++)
{
_IO.P = LITs[i].O;
s.P = LITs[i].O;
for (i0 = 0; i0 < LITs[i].C; i0++)
{
ref LIT lit = ref LITs.E[i].E[i0];
lit.Id = (Id )_IO.RI32E();
lit.Flags = (Flags)_IO.RI32E();
lit.Type = (Type )_IO.RI32E();
if (_IO.IsX) { _IO.RI64(); _IO.RI64(); _IO.RI64(); }
lit.Ambient .X = _IO.RF32E();
lit.Ambient .Y = _IO.RF32E();
lit.Ambient .Z = _IO.RF32E();
lit.Ambient .W = _IO.RF32E();
lit.Diffuse .X = _IO.RF32E();
lit.Diffuse .Y = _IO.RF32E();
lit.Diffuse .Z = _IO.RF32E();
lit.Diffuse .W = _IO.RF32E();
lit.Specular .X = _IO.RF32E();
lit.Specular .Y = _IO.RF32E();
lit.Specular .Z = _IO.RF32E();
lit.Specular .W = _IO.RF32E();
lit.Position .X = _IO.RF32E();
lit.Position .Y = _IO.RF32E();
lit.Position .Z = _IO.RF32E();
lit.ToneCurve.X = _IO.RF32E();
lit.ToneCurve.Y = _IO.RF32E();
lit.ToneCurve.Z = _IO.RF32E();
if (_IO.IsX) { _IO.RI64(); _IO.RI64(); _IO.RI64();
_IO.RI64(); _IO.RI64(); _IO.RI32(); }
lit.Id = (Id )s.RI32E();
lit.Flags = (Flags)s.RI32E();
lit.Type = (Type )s.RI32E();
if (s.IsX) { s.RI64(); s.RI64(); s.RI64(); }
lit.Ambient .X = s.RF32E();
lit.Ambient .Y = s.RF32E();
lit.Ambient .Z = s.RF32E();
lit.Ambient .W = s.RF32E();
lit.Diffuse .X = s.RF32E();
lit.Diffuse .Y = s.RF32E();
lit.Diffuse .Z = s.RF32E();
lit.Diffuse .W = s.RF32E();
lit.Specular .X = s.RF32E();
lit.Specular .Y = s.RF32E();
lit.Specular .Z = s.RF32E();
lit.Specular .W = s.RF32E();
lit.Position .X = s.RF32E();
lit.Position .Y = s.RF32E();
lit.Position .Z = s.RF32E();
lit.ToneCurve.X = s.RF32E();
lit.ToneCurve.Y = s.RF32E();
lit.ToneCurve.Z = s.RF32E();
if (s.IsX) { s.RI64(); s.RI64(); s.RI64();
s.RI64(); s.RI64(); s.RI32(); }
}
}
_IO.C();
s.C();
}
public void TXTWriter(string file)
@@ -77,13 +77,13 @@ namespace KKdMainLib.F2
i = 0;
if (LITs.C < 1) return;
_IO = File.OpenWriter();
_IO.WPSSJIS("Type,AmbientR,AmbientG,AmbientB,DiffuseR,DiffuseG,DiffuseB,SpecularR,SpecularG," +
s = File.OpenWriter();
s.WPSSJIS("Type,AmbientR,AmbientG,AmbientB,DiffuseR,DiffuseG,DiffuseB,SpecularR,SpecularG," +
"SpecularB,SpecularA,PosX,PosY,PosZ,ToneCurveBegin,ToneCurveEnd,ToneCurveBlendRate," +
(file.EndsWith("_chara") ? "コメント" : "ID") + "\n");
for (i0 = 0; i0 < LITs[i].C; i0++)
_IO.W(LITs[i][i0] + "," + i + "\n");
File.WriteAllBytes(file + "_light.txt", _IO.ToArray(true));
s.W(LITs[i][i0] + "," + i + "\n");
File.WriteAllBytes(file + "_light.txt", s.ToArray(true));
}
public struct LIT
@@ -107,7 +107,7 @@ namespace KKdMainLib.F2
private bool disposed;
public void Dispose()
{ if (!disposed) { if (_IO != null) _IO.D(); _IO = null; LITs = default; header = default; disposed = true; } }
{ if (!disposed) { if (s != null) s.D(); s = null; LITs = default; header = default; disposed = true; } }
public enum Id : int
{
+12 -16
View File
@@ -14,9 +14,7 @@ namespace KKdMainLib
public FARC(string file, bool isDirectory = false)
{ if (isDirectory) DirectoryPath = file; else FilePath = file; NewFARC(); }
private void NewFARC() { if (!MSIO.File.Exists("libdeflate.dll"))
File.WriteAllBytes("libdeflate.dll", Properties.Resources.libdeflate);
Files = KKdList<FARCFile>.New; Signature = Farc.FArC; Format = Format.DT; }
private void NewFARC() { Files = KKdList<FARCFile>.New; Signature = Farc.FArC; Format = Format.DT; }
public KKdList<FARCFile> Files = KKdList<FARCFile>.New;
public Type FARCType;
@@ -26,7 +24,7 @@ namespace KKdMainLib
public bool HasFiles => Files.IsNull ? false : Files.Count > 0;
public int CompressionLevel = 12;
private readonly byte[] key = Text.ToASCII("project_diva.bin");
private readonly byte[] key = "project_diva.bin".ToASCII();
private readonly byte[] keyFT = { 0x13, 0x72, 0xD5, 0x7B, 0x6E, 0x9E,
0x31, 0xEB, 0xA2, 0x39, 0xB8, 0x3C, 0x15, 0x57, 0xC6, 0xBB };
@@ -57,9 +55,9 @@ namespace KKdMainLib
reader.RI32();
int farcMode = reader.RI32E(true);
Format = (FARCType & Type.ECB) != 0 && (farcMode & (farcMode - 1)) != 0 ? Format.FT : Format.DT;
Format = (FARCType & Type.Enc) != 0 && (farcMode & (farcMode - 1)) != 0 ? Format.FT : Format.DT;
if (Format == Format.FT && (FARCType & Type.ECB) != 0)
if (Format == Format.FT && (FARCType & Type.Enc) != 0)
{
reader.Dispose();
byte[] header = new byte[headerLength - 0x08];
@@ -155,18 +153,17 @@ namespace KKdMainLib
return file.Data;
}
int FileSize = (FARCType & Type.ECB) != 0 || (file.Type & Type.ECB) != 0 ?
file.SizeComp.A(0x10) : ((FARCType & Type.GZip) != 0 || (file.Type & Type.GZip) != 0 ? file.SizeComp : file.SizeUnc);
int FileSize = ((FARCType | file.Type) & Type.Enc) != 0 ? file.SizeComp.A(0x10)
: (((FARCType | file.Type) & Type.GZip) != 0 ? file.SizeComp : file.SizeUnc);
using (Stream stream = File.OpenReader(FilePath))
{
stream.S(file.Offset, 0);
file.Data = stream.RBy(FileSize);
}
if ((FARCType & Type.ECB) != 0)
if ((FARCType & Type.Enc) != 0)
{
if (Format == Format.FT && (file.Type & Type.ECB) != 0)
if (Format == Format.FT && (file.Type & Type.Enc) != 0)
{
using (AesManaged aes = GetAes(true, null))
using (CryptoStream cryptoStream = new CryptoStream(new MSIO.MemoryStream(file.Data),
@@ -181,8 +178,7 @@ namespace KKdMainLib
cryptoStream.Read(file.Data, 0, FileSize);
}
if (((Format == Format.FT && (file.Type & Type.GZip) != 0) ||
(FARCType & Type.GZip) != 0) && file.SizeUnc > 0)
if (((file.Type | FARCType) & Type.GZip) != 0 && file.SizeUnc > 0)
file.Data = file.Data.InflateGZip(file.SizeUnc);
Files[i] = file;
@@ -223,7 +219,7 @@ namespace KKdMainLib
public void Save()
{
if (!HasFiles) return;
if (!HasFiles || (Signature != Farc.FArc && Signature != Farc.FArC && Signature != Farc.FARC)) return;
for (int i = 0; i < Files.Count; i++)
{
@@ -292,7 +288,7 @@ namespace KKdMainLib
file.SizeComp = data.Length;
}
if (Signature == Farc.FARC && (FARCType & Type.ECB) != 0)
if (Signature == Farc.FARC && (FARCType & Type.Enc) != 0)
{
int alignLength = data.Length.A(0x40);
byte[] tempData = new byte[alignLength];
@@ -347,7 +343,7 @@ namespace KKdMainLib
{
None = 0b000,
GZip = 0b010,
ECB = 0b100,
Enc = 0b100,
}
}
}
+32 -16
View File
@@ -8,8 +8,17 @@ namespace KKdMainLib.IO
private const string libDeflateString = "libdeflate.dll";
public static void CheckLib()
{
if (!File.Exists(libDeflateString))
File.WriteAllBytes(libDeflateString, Properties.Resources.libdeflate);
HasFile = true;
}
public static byte[] Deflate(this byte[] data, long compressionLevel)
{
CheckLib();
void* c = libdeflate_alloc_compressor((int)compressionLevel);
int maxOutBytes = libdeflate_deflate_compress_bound(c, data.Length);
byte[] outData = new byte[maxOutBytes];
@@ -24,18 +33,19 @@ namespace KKdMainLib.IO
public static byte[] Inflate(this byte[] data, long length)
{
CheckLib();
byte[] outData = new byte[length];
int actualOut = 0;
void* d = libdeflate_alloc_decompressor();
fixed (byte* inPtr = data)
fixed (byte* outPtr = outData)
libdeflate_deflate_decompress(d, inPtr, data.Length, outPtr, (int)length, (byte*)&actualOut);
libdeflate_deflate_decompress(d, inPtr, data.Length, outPtr, (int)length, &actualOut);
libdeflate_free_decompressor(d);
if (actualOut == 0 || actualOut > length)
throw new System.Exception("DeflateInflate Error: specified input length" +
" is less than it should be for current Deflate data");
return data.Inflate(length * 2);
else if (actualOut < length)
System.Array.Resize(ref outData, (int)actualOut);
return outData;
@@ -43,8 +53,10 @@ namespace KKdMainLib.IO
public static byte[] DeflateGZip(this byte[] data, long compressionLevel)
{
CheckLib();
void* c = libdeflate_alloc_compressor((int)compressionLevel);
int maxOutBytes = libdeflate_deflate_compress_bound(c, data.Length);
int maxOutBytes = libdeflate_gzip_compress_bound(c, data.Length);
byte[] outData = new byte[maxOutBytes];
int actualOut = 0;
fixed (byte* inPtr = data)
@@ -57,18 +69,19 @@ namespace KKdMainLib.IO
public static byte[] InflateGZip(this byte[] data, long length)
{
CheckLib();
byte[] outData = new byte[length];
int actualOut = 0;
void* d = libdeflate_alloc_decompressor();
fixed (byte* inPtr = data)
fixed (byte* outPtr = outData)
libdeflate_gzip_decompress(d, inPtr, data.Length, outPtr, (int)length, (byte*)&actualOut);
libdeflate_gzip_decompress(d, inPtr, data.Length, outPtr, (int)length, &actualOut);
libdeflate_free_decompressor(d);
if (actualOut == 0 || actualOut > length)
throw new System.Exception("DeflateInflate Error: specified input length" +
" is less than it should be for current Deflate data");
return data.InflateGZip(length * 2);
else if (actualOut < length)
System.Array.Resize(ref outData, (int)actualOut);
return outData;
@@ -76,8 +89,10 @@ namespace KKdMainLib.IO
public static byte[] DeflateZLib(this byte[] data, long compressionLevel)
{
CheckLib();
void* c = libdeflate_alloc_compressor((int)compressionLevel);
int maxOutBytes = libdeflate_deflate_compress_bound(c, data.Length);
int maxOutBytes = libdeflate_zlib_compress_bound(c, data.Length);
byte[] outData = new byte[maxOutBytes];
int actualOut = 0;
fixed (byte* inPtr = data)
@@ -90,18 +105,19 @@ namespace KKdMainLib.IO
public static byte[] InflateZLib(this byte[] data, long length)
{
CheckLib();
byte[] outData = new byte[length];
int actualOut = 0;
void* d = libdeflate_alloc_decompressor();
fixed (byte* inPtr = data)
fixed (byte* outPtr = outData)
libdeflate_zlib_decompress(d, inPtr, data.Length, outPtr, (int)length, (byte*)&actualOut);
libdeflate_zlib_decompress(d, inPtr, data.Length, outPtr, (int)length, &actualOut);
libdeflate_free_decompressor(d);
if (actualOut == 0 || actualOut > length)
throw new System.Exception("DeflateInflate Error: specified input length" +
" is less than it should be for current Deflate data");
return data.InflateZLib(length * 2);
else if (actualOut < length)
System.Array.Resize(ref outData, (int)actualOut);
return outData;
@@ -122,11 +138,11 @@ namespace KKdMainLib.IO
[DllImport(libDeflateString)]
private static extern void libdeflate_deflate_decompress(void* d, byte* inData, int inBytes,
byte* outData, int outBytesAvail, byte* actualOutBytes);
byte* outData, int outBytesAvail, int* actualOutBytes);
[DllImport(libDeflateString)]
private static extern void libdeflate_deflate_decompress_ex(void* d, byte* inData, int inBytes,
byte* outData, int outBytesAvail, byte* actualInBytes, byte* actualOutBytes);
byte* outData, int outBytesAvail, int* actualInBytes, int* actualOutBytes);
[DllImport(libDeflateString)]
private static extern int libdeflate_gzip_compress_bound(void* c, int length);
@@ -137,11 +153,11 @@ namespace KKdMainLib.IO
[DllImport(libDeflateString)]
private static extern void libdeflate_gzip_decompress(void* d, byte* inData, int inBytes,
byte* outData, int outBytesAvail, byte* actualOutBytes);
byte* outData, int outBytesAvail, int* actualOutBytes);
[DllImport(libDeflateString)]
private static extern void libdeflate_gzip_decompress_ex(void* d, byte* inData, int inBytes,
byte* outData, int outBytesAvail, byte* actualInBytes, byte* actualOutBytes);
byte* outData, int outBytesAvail, int* actualInBytes, int* actualOutBytes);
[DllImport(libDeflateString)]
private static extern int libdeflate_zlib_compress_bound(void* c, int length);
@@ -152,7 +168,7 @@ namespace KKdMainLib.IO
[DllImport(libDeflateString)]
private static extern void libdeflate_zlib_decompress(void* d, byte* inData, int inBytes,
byte* outData, int outBytesAvail, byte* actualOutBytes);
byte* outData, int outBytesAvail, int* actualOutBytes);
[DllImport(libDeflateString)]
private static extern void libdeflate_free_compressor(void* c);
+24 -9
View File
@@ -64,10 +64,10 @@ namespace KKdMainLib.IO
return true;
}
public static long RIX(this Stream stream ) => stream.IsX ?
stream.RI64() : stream.RU32E( );
public static long RIX(this Stream stream, bool isBE) => stream.IsX ?
stream.RI64() : stream.RU32E(isBE);
public static long RIX(this Stream stream ) =>
stream.IsX ? stream.RI64() : stream.RI32E( );
public static long RIX(this Stream stream, bool isBE) =>
stream.IsX ? stream.RI64() : stream.RI32E(isBE);
public static void WX(this Stream stream, long val, ref POF pof)
{ if (stream.IsX) stream.W ( val);
@@ -95,14 +95,29 @@ namespace KKdMainLib.IO
return arr;
}
public static string RSaO(this Stream stream, long offset = -1, long length = -1)
public static string RSaO(this Stream stream)
{
long Position = stream.PI64 + (stream.IsX ? 8 : 4);
stream.PI64 = stream.RIX();
string s = stream.NTUTF8();
stream.PI64 = Position;
return s;
}
public static string RSaO(this Stream stream, long offset)
{
string s = null;
long Position = stream.PI64;
if (offset == -1) { Position += stream.IsX ? 8 : 4; offset = stream.RIX(); }
stream.PI64 = offset;
if (length == -1) s = stream.NTUTF8();
else s = stream.RSUTF8(length);
string s = stream.NTUTF8();
stream.PI64 = Position;
return s;
}
public static string RSaO(this Stream stream, long offset, long length)
{
long Position = stream.PI64;
stream.PI64 = offset;
string s = stream.RSUTF8(length);
stream.PI64 = Position;
return s;
}
+4 -4
View File
@@ -59,8 +59,8 @@ namespace KKdMainLib.IO
public static void WriteAllLines(string file, string[] data)
{ using Stream _IO = OpenWriter(file, true);
if (data != null) for (int i = 0; i < data.Length; i++)
{ if (data[i] != null) _IO.W(data[i]); } _IO.W("\r\n"); }
if (data != null) { int c = data.Length; for (int i = 0; i < c; i++)
{ if (data[i] != null) _IO.W(data[i]); if (i + 1 < c) _IO.W("\n"); } } }
public static void WriteAllBytes(string file, byte[] data, long length)
{ using Stream _IO = OpenWriter(file, true); if (data != null) { _IO.W(data); _IO.LI64 = length; } }
@@ -70,8 +70,8 @@ namespace KKdMainLib.IO
public static void WriteAllLines(string file, string[] data, long length)
{ using Stream _IO = OpenWriter(file, true);
if (data != null) for (int i = 0; i < data.Length; i++)
{ if (data[i] != null) _IO.W(data[i]); _IO.W("\r\n"); } _IO.LI64 = length; }
if (data != null) { int c = data.Length; for (int i = 0; i < c; i++)
{ if (data[i] != null) _IO.W(data[i]); if (i + 1 < c) _IO.W("\n"); } _IO.LI64 = length; } }
public static bool Exists(string file) =>
MSIOF.Exists(file);
+13 -12
View File
@@ -175,18 +175,19 @@ namespace KKdMainLib.IO
{ string s = ""; while (char.IsDigit(_IO.SW().
PCUTF8())) s += _IO.RCUTF8(); return s; }
public JSON W(MsgPack msgPack, string end = "\n", string tabChar = " ") =>
W(msgPack, end, tabChar, "", true);
public JSON W(MsgPack msgPack, bool ignoreNull, string end = "\n", string tabChar = " ") =>
W(msgPack, ignoreNull, end, tabChar, "", true);
public JSON W(MsgPack msgPack, bool style = false) =>
W(msgPack, "\n", " ", "", style);
public JSON W(MsgPack msgPack, bool ignoreNull, bool style = false) =>
W(msgPack, ignoreNull, "\n", " ", "", style);
private JSON W(MsgPack msgPack, string end, string tabChar, string tab, bool style, bool isArray = false)
private JSON W(MsgPack msgPack, bool ignoreNull, string end,
string tabChar, string tab, bool style, bool isArray = false)
{
string oldTab = tab;
tab += tabChar;
if (msgPack.Name != null && !isArray) _IO.W("\"" + msgPack.Name + "\":" + (style ? " " : ""));
if (msgPack.Object == null) { WN(); return this; }
if (msgPack.Name != null && !isArray ) _IO.W("\"" + msgPack.Name + "\":" + (style ? " " : ""));
if (msgPack.Object == null) { if (!ignoreNull) WN(); return this; }
if (msgPack.List.NotNull)
{
@@ -196,14 +197,14 @@ namespace KKdMainLib.IO
for (int i = 0; i < msgPack.List.Count; i++)
{
if (style) _IO.W(tab);
W(msgPack.List[i], end, tabChar, tab, style);
W(msgPack.List[i], ignoreNull, end, tabChar, tab, style);
if (i + 1 < msgPack.List.Count) _IO.W(',');
if (style) _IO.W(end);
}
else if (msgPack.List.Count == 1)
{
if (style) _IO.W(tab);
W(msgPack.List[0], end, tabChar, tab, style);
W(msgPack.List[0], ignoreNull, end, tabChar, tab, style);
if (style) _IO.W(end);
}
if (style) _IO.W(oldTab);
@@ -217,20 +218,20 @@ namespace KKdMainLib.IO
for (int i = 0; i < msgPack.Array.Length; i++)
{
if (style) _IO.W(tab);
W(msgPack.Array[i], end, tabChar, tab, style, true);
W(msgPack.Array[i], ignoreNull, end, tabChar, tab, style, true);
if (i + 1 < msgPack.Array.Length) _IO.W(',');
if (style) _IO.W(end);
}
else if (msgPack.Array.Length == 1)
{
if (style) _IO.W(tab);
W(msgPack.Array[0], end, tabChar, tab, style, true);
W(msgPack.Array[0], ignoreNull, end, tabChar, tab, style, true);
if (style) _IO.W(end);
}
if (style) _IO.W(oldTab);
WA(true);
}
else if (msgPack.Object is MsgPack msg) W(msg, end, tabChar, tab, style);
else if (msgPack.Object is MsgPack msg) W(msg, ignoreNull, end, tabChar, tab, style);
else if (msgPack.Object is string str) W(str);
else _IO.W(BaseExtensions.ToS(msgPack.Object));
+7 -7
View File
@@ -166,23 +166,23 @@ namespace KKdMainLib.IO
return true;
}
public MP W(MsgPack msgPack, bool IsArray = false)
public MP W(MsgPack msgPack, bool ignoreNull, bool IsArray = false)
{
if (msgPack.Name != null && !IsArray) W(msgPack.Name);
Write(msgPack.Object);
Write(msgPack.Object, ignoreNull);
return this;
}
private void Write(object obj)
private void Write(object obj, bool ignoreNull)
{
if (obj == null) { WN(); return; }
if (obj == null) { if (!ignoreNull) WN(); return; }
switch (obj)
{
case KKdList<MsgPack> val: WM(val.Count );
for (int i = 0; i < val.Count ; i++) W(val[i]); break;
for (int i = 0; i < val.Count ; i++) W(val[i], ignoreNull); break;
case MsgPack[] val: WA(val.Length);
for (int i = 0; i < val.Length; i++) W(val[i]); break;
case MsgPack val: W(val); break;
for (int i = 0; i < val.Length; i++) W(val[i], ignoreNull); break;
case MsgPack val: W(val, ignoreNull); break;
case byte[] val: W(val); break;
case bool val: W(val); break;
case sbyte val: W(val); break;
+66 -66
View File
@@ -1,7 +1,7 @@
using System;
using KKdBaseLib;
using MSIO = System.IO;
using ENRSDict = System.Collections.Generic.Dictionary<long, int>;
using ENRSDict = System.Collections.Generic.Dictionary<long, byte>;
namespace KKdMainLib.IO
{
@@ -19,10 +19,8 @@ namespace KKdMainLib.IO
private Format format = Format.NULL;
public Format Format
{ get => format;
set { format = value;
IsBE = format == Format.F2BE;
IsX = format == Format.X || format == Format.XHD; } }
{ get => format;
set { format = value; IsX = format == Format.X || format == Format.XHD; } }
public ENRSDict ENRSDict;
@@ -97,12 +95,12 @@ namespace KKdMainLib.IO
if (P % align != 0) s.Seek(P + O + Al, 0);
}
public void A(long align, bool SetLength)
public void A(long align, bool setLength)
{
if (SetLength) s.SetLength(P + O);
if (setLength) s.SetLength(P + O);
long Al = align - P % align;
if (P % align != 0) s.Seek(P + O + Al, 0);
if (SetLength) s.SetLength(P + O);
if (setLength) s.SetLength(P + O);
}
public void A(long align, bool setLength0, bool setLength1)
@@ -201,65 +199,65 @@ namespace KKdMainLib.IO
public void WE( float val, bool isBE) { cW(); b.GBy(val); b.E(4, isBE); s.Write(b, 0, 4); }
public void WE(double val, bool isBE) { cW(); b.GBy(val); b.E(8, isBE); s.Write(b, 0, 8); }
private void RENRS(byte[] b, int c)
private void RENRS(byte c)
{ cR(); if (getENRS) ENRSDict.Add(P, c); s.Read(b, 0, c); }
public short RI16ENRS() { RENRS(b, 2); return b.TI16(); }
public ushort RU16ENRS() { RENRS(b, 2); return b.TU16(); }
public int RI32ENRS() { RENRS(b, 4); return b.TI32(); }
public uint RU32ENRS() { RENRS(b, 4); return b.TU32(); }
public long RI64ENRS() { RENRS(b, 8); return b.TI64(); }
public ulong RU64ENRS() { RENRS(b, 8); return b.TU64(); }
public float RF32ENRS() { RENRS(b, 4); return b.TF32(); }
public double RF64ENRS() { RENRS(b, 8); return b.TF64(); }
public short RI16ENRS() { RENRS((byte)2); return b.TI16(); }
public ushort RU16ENRS() { RENRS((byte)2); return b.TU16(); }
public int RI32ENRS() { RENRS((byte)4); return b.TI32(); }
public uint RU32ENRS() { RENRS((byte)4); return b.TU32(); }
public long RI64ENRS() { RENRS((byte)8); return b.TI64(); }
public ulong RU64ENRS() { RENRS((byte)8); return b.TU64(); }
public float RF32ENRS() { RENRS((byte)4); return b.TF32(); }
public double RF64ENRS() { RENRS((byte)8); return b.TF64(); }
public short RI16ENRSE() { RENRS(b, 2); b.E(2, IsBE); return b.TI16(); }
public ushort RU16ENRSE() { RENRS(b, 2); b.E(2, IsBE); return b.TU16(); }
public int RI32ENRSE() { RENRS(b, 4); b.E(4, IsBE); return b.TI32(); }
public uint RU32ENRSE() { RENRS(b, 4); b.E(4, IsBE); return b.TU32(); }
public long RI64ENRSE() { RENRS(b, 8); b.E(8, IsBE); return b.TI64(); }
public ulong RU64ENRSE() { RENRS(b, 8); b.E(8, IsBE); return b.TU64(); }
public float RF32ENRSE() { RENRS(b, 4); b.E(4, IsBE); return b.TF32(); }
public double RF64ENRSE() { RENRS(b, 8); b.E(8, IsBE); return b.TF64(); }
public short RI16ENRSE() { RENRS((byte)2); b.E(2, IsBE); return b.TI16(); }
public ushort RU16ENRSE() { RENRS((byte)2); b.E(2, IsBE); return b.TU16(); }
public int RI32ENRSE() { RENRS((byte)4); b.E(4, IsBE); return b.TI32(); }
public uint RU32ENRSE() { RENRS((byte)4); b.E(4, IsBE); return b.TU32(); }
public long RI64ENRSE() { RENRS((byte)8); b.E(8, IsBE); return b.TI64(); }
public ulong RU64ENRSE() { RENRS((byte)8); b.E(8, IsBE); return b.TU64(); }
public float RF32ENRSE() { RENRS((byte)4); b.E(4, IsBE); return b.TF32(); }
public double RF64ENRSE() { RENRS((byte)8); b.E(8, IsBE); return b.TF64(); }
public short RI16ENRSE(bool isBE) { RENRS(b, 2); b.E(2, isBE); return b.TI16(); }
public ushort RU16ENRSE(bool isBE) { RENRS(b, 2); b.E(2, isBE); return b.TU16(); }
public int RI32ENRSE(bool isBE) { RENRS(b, 4); b.E(4, isBE); return b.TI32(); }
public uint RU32ENRSE(bool isBE) { RENRS(b, 4); b.E(4, isBE); return b.TU32(); }
public long RI64ENRSE(bool isBE) { RENRS(b, 8); b.E(8, isBE); return b.TI64(); }
public ulong RU64ENRSE(bool isBE) { RENRS(b, 8); b.E(8, isBE); return b.TU64(); }
public float RF32ENRSE(bool isBE) { RENRS(b, 4); b.E(4, isBE); return b.TF32(); }
public double RF64ENRSE(bool isBE) { RENRS(b, 8); b.E(8, isBE); return b.TF64(); }
public short RI16ENRSE(bool isBE) { RENRS((byte)2); b.E(2, isBE); return b.TI16(); }
public ushort RU16ENRSE(bool isBE) { RENRS((byte)2); b.E(2, isBE); return b.TU16(); }
public int RI32ENRSE(bool isBE) { RENRS((byte)4); b.E(4, isBE); return b.TI32(); }
public uint RU32ENRSE(bool isBE) { RENRS((byte)4); b.E(4, isBE); return b.TU32(); }
public long RI64ENRSE(bool isBE) { RENRS((byte)8); b.E(8, isBE); return b.TI64(); }
public ulong RU64ENRSE(bool isBE) { RENRS((byte)8); b.E(8, isBE); return b.TU64(); }
public float RF32ENRSE(bool isBE) { RENRS((byte)4); b.E(4, isBE); return b.TF32(); }
public double RF64ENRSE(bool isBE) { RENRS((byte)8); b.E(8, isBE); return b.TF64(); }
private void WENRS(byte[] b, int c)
{ if (getENRS) ENRSDict.Add(P, c); cR(); s.Write(b, 0, c); }
private void WENRS(byte c)
{ if (getENRS) ENRSDict.Add(P, c); cW(); s.Write(b, 0, c); }
public void WENRS( short val) { b.GBy(val); WENRS(b, 2); }
public void WENRS(ushort val) { b.GBy(val); WENRS(b, 2); }
public void WENRS( int val) { b.GBy(val); WENRS(b, 4); }
public void WENRS( uint val) { b.GBy(val); WENRS(b, 4); }
public void WENRS( long val) { b.GBy(val); WENRS(b, 8); }
public void WENRS( ulong val) { b.GBy(val); WENRS(b, 8); }
public void WENRS( float val) { b.GBy(val); WENRS(b, 4); }
public void WENRS(double val) { b.GBy(val); WENRS(b, 8); }
public void WENRS( short val) { b.GBy(val); WENRS((byte)2); }
public void WENRS(ushort val) { b.GBy(val); WENRS((byte)2); }
public void WENRS( int val) { b.GBy(val); WENRS((byte)4); }
public void WENRS( uint val) { b.GBy(val); WENRS((byte)4); }
public void WENRS( long val) { b.GBy(val); WENRS((byte)8); }
public void WENRS( ulong val) { b.GBy(val); WENRS((byte)8); }
public void WENRS( float val) { b.GBy(val); WENRS((byte)4); }
public void WENRS(double val) { b.GBy(val); WENRS((byte)8); }
public void WENRSE( short val) { b.GBy(val); b.E(2, IsBE); WENRS(b, 2); }
public void WENRSE(ushort val) { b.GBy(val); b.E(2, IsBE); WENRS(b, 2); }
public void WENRSE( int val) { b.GBy(val); b.E(4, IsBE); WENRS(b, 4); }
public void WENRSE( uint val) { b.GBy(val); b.E(4, IsBE); WENRS(b, 4); }
public void WENRSE( long val) { b.GBy(val); b.E(8, IsBE); WENRS(b, 8); }
public void WENRSE( ulong val) { b.GBy(val); b.E(8, IsBE); WENRS(b, 8); }
public void WENRSE( float val) { b.GBy(val); b.E(4, IsBE); WENRS(b, 4); }
public void WENRSE(double val) { b.GBy(val); b.E(8, IsBE); WENRS(b, 8); }
public void WENRSE( short val) { b.GBy(val); b.E(2, IsBE); WENRS((byte)2); }
public void WENRSE(ushort val) { b.GBy(val); b.E(2, IsBE); WENRS((byte)2); }
public void WENRSE( int val) { b.GBy(val); b.E(4, IsBE); WENRS((byte)4); }
public void WENRSE( uint val) { b.GBy(val); b.E(4, IsBE); WENRS((byte)4); }
public void WENRSE( long val) { b.GBy(val); b.E(8, IsBE); WENRS((byte)8); }
public void WENRSE( ulong val) { b.GBy(val); b.E(8, IsBE); WENRS((byte)8); }
public void WENRSE( float val) { b.GBy(val); b.E(4, IsBE); WENRS((byte)4); }
public void WENRSE(double val) { b.GBy(val); b.E(8, IsBE); WENRS((byte)8); }
public void WENRSE( short val, bool isBE) { b.GBy(val); b.E(2, isBE); WENRS(b, 2); }
public void WENRSE(ushort val, bool isBE) { b.GBy(val); b.E(2, isBE); WENRS(b, 2); }
public void WENRSE( int val, bool isBE) { b.GBy(val); b.E(4, isBE); WENRS(b, 4); }
public void WENRSE( uint val, bool isBE) { b.GBy(val); b.E(4, isBE); WENRS(b, 4); }
public void WENRSE( long val, bool isBE) { b.GBy(val); b.E(8, isBE); WENRS(b, 8); }
public void WENRSE( ulong val, bool isBE) { b.GBy(val); b.E(8, isBE); WENRS(b, 8); }
public void WENRSE( float val, bool isBE) { b.GBy(val); b.E(4, isBE); WENRS(b, 4); }
public void WENRSE(double val, bool isBE) { b.GBy(val); b.E(8, isBE); WENRS(b, 8); }
public void WENRSE( short val, bool isBE) { b.GBy(val); b.E(2, isBE); WENRS((byte)2); }
public void WENRSE(ushort val, bool isBE) { b.GBy(val); b.E(2, isBE); WENRS((byte)2); }
public void WENRSE( int val, bool isBE) { b.GBy(val); b.E(4, isBE); WENRS((byte)4); }
public void WENRSE( uint val, bool isBE) { b.GBy(val); b.E(4, isBE); WENRS((byte)4); }
public void WENRSE( long val, bool isBE) { b.GBy(val); b.E(8, isBE); WENRS((byte)8); }
public void WENRSE( ulong val, bool isBE) { b.GBy(val); b.E(8, isBE); WENRS((byte)8); }
public void WENRSE( float val, bool isBE) { b.GBy(val); b.E(4, isBE); WENRS((byte)4); }
public void WENRSE(double val, bool isBE) { b.GBy(val); b.E(8, isBE); WENRS((byte)8); }
public int RI24 ( ) { cR(); s.Read(b, 0, 3); return b.TI24(); }
public uint RU24 ( ) { cR(); s.Read(b, 0, 3); return b.TU24(); }
@@ -308,31 +306,33 @@ namespace KKdMainLib.IO
cR();
int sizeOfT = sizeof(T);
if (offset > -1) s.Position = offset;
T[] arr = new T[length];
T[] array = new T[length];
byte[] buf = new byte[sizeOfT];
fixed (byte* ptr = buf)
for (i = 0; i < length; i++)
{
cR(); s.Read(buf, 0, sizeOfT);
arr[i] = *(T*)ptr;
array[i] = *(T*)ptr;
}
return arr;
if (IsBE) array = array.ReverseEndian();
return array;
}
public T[] WA<T>(T[] array, long length, long offset = -1) where T : unmanaged
public void WA<T>(T[] array, long length, long offset = -1) where T : unmanaged
{
if (IsBE) array = array.ReverseEndian();
cW();
int sizeOfT = sizeof(T);
if (offset > -1) s.Position = offset;
T[] arr = new T[length];
byte[] buf = new byte[sizeOfT];
fixed (byte* ptr = buf)
for (i = 0; i < length; i++)
{
*(T*)ptr = arr[i];
*(T*)ptr = array[i];
s.Write(buf, 0, sizeOfT);
}
return arr;
}
public char RC(bool utf8 = true)
+20 -7
View File
@@ -1,17 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<Authors>korenkonder</Authors>
<Company></Company>
<Configuration></Configuration>
<Copyright>korenkonder © 2018-2020</Copyright>
<Copyright>korenkonder (C) 2018-2020</Copyright>
<Description>A simple library for working with Project Diva AC/DT/F/AFT/F2/X/FT/M39 files</Description>
<FileVersion>0.4.9.2</FileVersion>
<FileVersion>0.4.9.5</FileVersion>
<PackageId>KKdMainLib</PackageId>
<Product>KKdMainLib</Product>
<TargetFramework>netstandard2.0</TargetFramework>
<TargetFramework>net461</TargetFramework>
<Title>KKdMainLib</Title>
<Version>0.4.9.2</Version>
<Version>0.4.9.5</Version>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
@@ -24,7 +24,7 @@
<WarningLevel>4</WarningLevel>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<LangVersion>8.0</LangVersion>
<NoWarn>IDE0004, IDE0044, IDE0045, IDE0046, IDE0055, IDE0059, IDE0069, IDE1006</NoWarn>
<NoWarn>IDE0004, IDE0032, IDE0044, IDE0045, IDE0046, IDE0055, IDE0059, IDE0066, IDE0069, IDE1006</NoWarn>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
@@ -37,9 +37,22 @@
<DebugSymbols>true</DebugSymbols>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<LangVersion>8.0</LangVersion>
<NoWarn>IDE0004, IDE0044, IDE0045, IDE0046, IDE0055, IDE0059, IDE0069, IDE1006</NoWarn>
<NoWarn>IDE0004, IDE0032, IDE0044, IDE0045, IDE0046, IDE0055, IDE0059, IDE0066, IDE0069, IDE1006</NoWarn>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\KKdBaseLib\KKdBaseLib.csproj" />
</ItemGroup>
<ItemGroup>
<Compile Update="Properties\Resources.Designer.cs">
<DesignTime>True</DesignTime>
<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Update="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
</ItemGroup>
</Project>
+63 -63
View File
@@ -9,28 +9,28 @@ namespace KKdMainLib
{
private int i, i0, i1;
public MotHeader[] MOT;
private Stream _IO;
private Stream s;
public void MOTReader(string file)
{
_IO = File.OpenReader(file + ".bin");
s = File.OpenReader(file + ".bin");
i = 0;
while (true)
if (_IO.RI64() == 0) break;
else { _IO.RI64(); i++; }
if (s.RI64() == 0) break;
else { s.RI64(); i++; }
if (i == 0) return;
_IO.P = 0;
s.P = 0;
int motCount = i;
MOT = new MotHeader[motCount];
for (i = 0; i < motCount; i++)
{
ref MotHeader mot = ref MOT[i];
mot.KeySet .O = _IO.RI32();
mot.KeySetTypesOffset = _IO.RI32();
mot. KeySetOffset = _IO.RI32();
mot.BoneInfo .O = _IO.RI32();
mot.KeySet .O = s.RI32();
mot.KeySetTypesOffset = s.RI32();
mot. KeySetOffset = s.RI32();
mot.BoneInfo .O = s.RI32();
}
for (i = 0; i < motCount; i++)
@@ -38,128 +38,128 @@ namespace KKdMainLib
ref MotHeader mot = ref MOT[i];
i0 = 1;
_IO.P = mot.BoneInfo.O;
_IO.RU16();
while (_IO.RU16() != 0) i0++;
s.P = mot.BoneInfo.O;
s.RU16();
while (s.RU16() != 0) i0++;
mot.BoneInfo.V = new BoneInfo[i0];
_IO.P = mot.BoneInfo.O;
s.P = mot.BoneInfo.O;
for (i0 = 0; i0 < mot.BoneInfo.V.Length; i0++)
mot.BoneInfo.V[i0].Id = _IO.RU16();
mot.BoneInfo.V[i0].Id = s.RU16();
_IO.P = mot.KeySet.O;
int info = _IO.RU16();
s.P = mot.KeySet.O;
int info = s.RU16();
mot.HighBits = info >> 14;
mot.FrameCount = _IO.RU16();
mot.FrameCount = s.RU16();
mot.KeySet.V = new KeySet[info & 0x3FFF];
_IO.P = mot.KeySetTypesOffset;
s.P = mot.KeySetTypesOffset;
for (i0 = 0; i0 < mot.KeySet.V.Length; i0++)
{
if (i0 % 8 == 0) i1 = _IO.RU16();
if (i0 % 8 == 0) i1 = s.RU16();
mot.KeySet.V[i0] = new KeySet { Type = (KeySetType)((i1 >> (i0 % 8 * 2)) & 0b11) };
}
_IO.P = mot.KeySetOffset;
s.P = mot.KeySetOffset;
for (i0 = 0; i0 < mot.KeySet.V.Length; i0++)
{
ref KeySet key = ref mot.KeySet.V[i0];
if (key.Type == KeySetType.Static)
{ key.Keys = new KFT2[1];
key.Keys[0].V = _IO.RF32(); }
key.Keys[0].V = s.RF32(); }
else if (key.Type == KeySetType.Linear)
{
key.Keys = new KFT2[_IO.RU16()];
key.Keys = new KFT2[s.RU16()];
for (i1 = 0; i1 < key.Keys.Length; i1++)
key.Keys[i1].F = _IO.RU16();
_IO.A(0x4);
key.Keys[i1].F = s.RU16();
s.A(0x4);
for (i1 = 0; i1 < key.Keys.Length; i1++)
key.Keys[i1].V = _IO.RF32();
key.Keys[i1].V = s.RF32();
}
else if (key.Type == KeySetType.Interpolated)
{
key.Keys = new KFT2[_IO.RU16()];
key.Keys = new KFT2[s.RU16()];
for (i1 = 0; i1 < key.Keys.Length; i1++)
key.Keys[i1].F = _IO.RU16();
_IO.A(0x4);
key.Keys[i1].F = s.RU16();
s.A(0x4);
for (i1 = 0; i1 < key.Keys.Length; i1++)
{ key.Keys[i1].V = _IO.RF32(); key.Keys[i1].T = _IO.RF32(); }
{ key.Keys[i1].V = s.RF32(); key.Keys[i1].T = s.RF32(); }
}
}
}
_IO.C();
s.C();
}
public void MOTWriter(string file)
{
if (MOT == null) return;
_IO = File.OpenWriter(file + ".bin", true);
s = File.OpenWriter(file + ".bin", true);
int MOTCount = MOT.Length;
_IO.P = (MOTCount + 1) << 4;
s.P = (MOTCount + 1) << 4;
for (i = 0; i < MOTCount; i++)
{
ref MotHeader mot = ref MOT[i];
mot.KeySet.O = _IO.P;
_IO.W((ushort)((mot.HighBits << 14) | (mot.KeySet.V.Length & 0x3FFF)));
_IO.W((ushort)mot.FrameCount);
mot.KeySet.O = s.P;
s.W((ushort)((mot.HighBits << 14) | (mot.KeySet.V.Length & 0x3FFF)));
s.W((ushort)mot.FrameCount);
mot.KeySetTypesOffset = _IO.P;
mot.KeySetTypesOffset = s.P;
for (i0 = 0, i1 = 0; i0 < mot.KeySet.V.Length; i0++)
{
i1 |= ((byte)mot.KeySet.V[i0].Type << (i0 % 8 * 2)) & (0b11 << (i0 % 8 * 2));
if (i0 % 8 == 7) { _IO.W((ushort)i1); i1 = 0; }
if (i0 % 8 == 7) { s.W((ushort)i1); i1 = 0; }
}
_IO.W((ushort)i1);
if (_IO.P % 4 != 0) _IO.W((ushort)0x00);
s.W((ushort)i1);
if (s.P % 4 != 0) s.W((ushort)0x00);
mot.KeySetOffset = _IO.P;
mot.KeySetOffset = s.P;
for (i0 = 0; i0 < mot.KeySet.V.Length; i0++)
{
ref KeySet key = ref mot.KeySet.V[i0];
if (key.Type == KeySetType.Static)
_IO.W(key.Keys[0].V);
s.W(key.Keys[0].V);
else if (key.Type == KeySetType.Linear)
{
_IO.W((ushort)key.Keys.Length);
s.W((ushort)key.Keys.Length);
for (i1 = 0; i1 < key.Keys.Length; i1++)
_IO.W((ushort)key.Keys[i1].F);
if (_IO.P % 4 != 0) _IO.W((ushort)0x00);
s.W((ushort)key.Keys[i1].F);
if (s.P % 4 != 0) s.W((ushort)0x00);
for (i1 = 0; i1 < key.Keys.Length; i1++)
_IO.W(key.Keys[i1].V);
s.W(key.Keys[i1].V);
}
else if (key.Type == KeySetType.Interpolated)
{
_IO.W((ushort)key.Keys.Length);
s.W((ushort)key.Keys.Length);
for (i1 = 0; i1 < key.Keys.Length; i1++)
_IO.W((ushort)key.Keys[i1].F);
if (_IO.P % 4 != 0) _IO.W((ushort)0x00);
s.W((ushort)key.Keys[i1].F);
if (s.P % 4 != 0) s.W((ushort)0x00);
for (i1 = 0; i1 < key.Keys.Length; i1++)
{ _IO.W(key.Keys[i1].V); _IO.W(key.Keys[i1].T); }
{ s.W(key.Keys[i1].V); s.W(key.Keys[i1].T); }
}
}
if (_IO.P % 4 != 0) _IO.W((ushort)0x00);
if (s.P % 4 != 0) s.W((ushort)0x00);
mot.BoneInfo.O = _IO.P;
mot.BoneInfo.O = s.P;
for (i0 = 0; i0 < mot.BoneInfo.V.Length; i0++)
_IO.W((ushort)mot.BoneInfo.V[i0].Id);
_IO.W((ushort)0);
s.W((ushort)mot.BoneInfo.V[i0].Id);
s.W((ushort)0);
}
if (_IO.P % 4 != 0) _IO.W((ushort)0x00);
_IO.A(0x4, true);
if (s.P % 4 != 0) s.W((ushort)0x00);
s.A(0x4, true);
_IO.P = 0;
s.P = 0;
for (i = 0; i < MOTCount; i++)
{
ref MotHeader mot = ref MOT[i];
_IO.W(mot.KeySet .O );
_IO.W(mot.KeySetTypesOffset);
_IO.W(mot. KeySetOffset);
_IO.W(mot.BoneInfo .O );
s.W(mot.KeySet .O );
s.W(mot.KeySetTypesOffset);
s.W(mot. KeySetOffset);
s.W(mot.BoneInfo .O );
}
_IO.C();
s.C();
}
public void MsgPackReader(string file, bool json)
@@ -184,7 +184,7 @@ namespace KKdMainLib
MsgPack mot = new MsgPack(motCount, "MOT");
for (i = 0; i < motCount; i++)
mot[i] = MsgPackWriter(ref MOT[i]);
mot.Write(true, file, json);
mot.Write(false, true, file, json);
}
public void MsgPackReader(MsgPack msgPack, ref MotHeader mot)
@@ -315,7 +315,7 @@ namespace KKdMainLib
public void Dispose()
{
_IO = null;
s = null;
MOT = null;
}
+92 -92
View File
@@ -6,58 +6,58 @@ namespace KKdMainLib
public struct MotHead : System.IDisposable
{
private int i, i0, i1;
private Stream _IO;
private Stream s;
public HeaderData Header;
public void MotHeadReader(string file)
{
_IO = File.OpenReader(file + ".bin");
_IO.RI32();
s = File.OpenReader(file + ".bin");
s.RI32();
Header = new HeaderData();
int offset = _IO.RI32();
int offset = s.RI32();
if (offset < 0x10) goto RETURN;
_IO.O = offset;
_IO.P = 0;
s.O = offset;
s.P = 0;
Header. MotionSetID = _IO.RI32();
Header.StartMotionID = _IO.RI32();
Header. EndMotionID = _IO.RI32();
Header.SubHeaderOffset = _IO.RI32();
Header. MotionSetID = s.RI32();
Header.StartMotionID = s.RI32();
Header. EndMotionID = s.RI32();
Header.SubHeaderOffset = s.RI32();
if (Header.SubHeaderOffset < 0x10) goto RETURN;
i0 = Header.EndMotionID - Header.StartMotionID;
if (i0 < 0) goto RETURN;
_IO.P = Header.SubHeaderOffset;
s.P = Header.SubHeaderOffset;
Header.Data = new HeaderData.Sub[++i0];
for (i = 0; i < Header.Data.Length; i++) Header.Data[i].Offset = _IO.RI32();
for (i = 0; i < Header.Data.Length; i++) Header.Data[i].Offset = s.RI32();
for (i = 0; i < Header.Data.Length; i++)
{
if (Header.Data[i].Offset < 0x10) continue;
_IO.P = Header.Data[i].Offset;
s.P = Header.Data[i].Offset;
Header.Data[i].MotionID = Header.StartMotionID + i;
Header.Data[i].SomeData = _IO.RI32();
_IO.RI64();
_IO.RI64();
Header.Data[i].Offset2 = _IO.RI32();
Header.Data[i].DataHeaderOffset = _IO.RI32();
Header.Data[i].SomeData = s.RI32();
s.RI64();
s.RI64();
Header.Data[i].Offset2 = s.RI32();
Header.Data[i].DataHeaderOffset = s.RI32();
if (Header.Data[i].DataHeaderOffset < 0x10) goto RETURN;
_IO.P = Header.Data[i].DataHeaderOffset;
s.P = Header.Data[i].DataHeaderOffset;
i0 = 0;
while (_IO.RI32() != -1) { _IO.RI32(); _IO.RI32(); i0++; }
_IO.P = Header.Data[i].DataHeaderOffset;
while (s.RI32() != -1) { s.RI32(); s.RI32(); i0++; }
s.P = Header.Data[i].DataHeaderOffset;
Header.Data[i].Array = new HeaderData.Sub.Data[i0];
for (i0 = 0; i0 < Header.Data[i].Array.Length; i0++)
{
Header.Data[i].Array[i0].Type = _IO.RI32();
Header.Data[i].Array[i0].Frame = _IO.RI32();
Header.Data[i].Array[i0].Offset = _IO.RI32();
Header.Data[i].Array[i0].Type = s.RI32();
Header.Data[i].Array[i0].Frame = s.RI32();
Header.Data[i].Array[i0].Offset = s.RI32();
}
}
@@ -65,25 +65,25 @@ namespace KKdMainLib
{
if (Header.Data[i].Offset2 > 0x10)
{
_IO.P = Header.Data[i].Offset2;
s.P = Header.Data[i].Offset2;
i0 = 0;
while (_IO.RI32() != -1) { _IO.RI32(); i0++; }
_IO.P = Header.Data[i].Offset2;
while (s.RI32() != -1) { s.RI32(); i0++; }
s.P = Header.Data[i].Offset2;
Header.Data[i].Array2 = new HeaderData.Sub.Data2[i0];
for (i0 = 0; i0 < Header.Data[i].Array2.Length; i0++)
{
Header.Data[i].Array2[i0].Frame = _IO.RI32();
Header.Data[i].Array2[i0].Offset = _IO.RI32();
Header.Data[i].Array2[i0].Frame = s.RI32();
Header.Data[i].Array2[i0].Offset = s.RI32();
}
for (i0 = 0; i0 < Header.Data[i].Array2.Length; i0++)
{
if (Header.Data[i].Array2[i0].Offset < 0x10) goto RETURN;
_IO.P = Header.Data[i].Array2[i0].Offset;
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] = _IO.RI32();
Header.Data[i].Array2[i0].Array[i1] = s.RI32();
}
}
@@ -97,20 +97,20 @@ namespace KKdMainLib
if (Data.Offset > 0)
{
_IO.P = Data.Offset;
if (i1 == 0x01) Data.Array = new int[] { _IO.RU8 () };
else if (i1 == 0x02) Data.Array = new int[] { _IO.RU16() };
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] = _IO.RI32();
for (i1 = 0; i1 < Data.Array.Length; i1++) Data.Array[i1] = s.RI32();
}
}
}
}
RETURN:
_IO.C();
s.C();
}
public void MotHeadWriter(string file)
@@ -127,28 +127,28 @@ RETURN:
Header. EndMotionID = Header.Data[i].MotionID;
}
_IO = File.OpenWriter(file + ".bin");
_IO.W(0x01);
_IO.W(0x20);
_IO.A(0x20, true);
_IO.O = 0x20;
_IO.P = 0;
_IO.W(0);
s = File.OpenWriter(file + ".bin", true);
s.W(0x01);
s.W(0x20);
s.A(0x20, true);
s.O = 0x20;
s.P = 0;
s.W(0);
for (int I = Header.EndMotionID - Header.StartMotionID; I > -1; I--)
for (i = 0; i < Header.Data.Length; i++)
if (Header.StartMotionID + I == Header.Data[i].MotionID)
{
_IO.A(0x20, true);
Header.Data[i].Offset = _IO.P;
s.A(0x20, true);
Header.Data[i].Offset = s.P;
Header.Data[i].DataHeaderOffset = Header.Data[i].Offset + 0x20;
_IO.W(0L);
_IO.W(0L);
_IO.W(0L);
_IO.W(0L);
s.W(0L);
s.W(0L);
s.W(0L);
s.W(0L);
for (i0 = 0; i0 < Header.Data[i].Array.Length; i0++)
{ _IO.W( 0); _IO.W( 0); _IO.W(0); }
_IO.W(-1); _IO.W(-1); _IO.W(0);
{ s.W( 0); s.W( 0); s.W(0); }
s.W(-1); s.W(-1); s.W(0);
for (i0 = Header.Data[i].Array.Length - 1; i0 > -1; i0--)
{
@@ -156,46 +156,46 @@ RETURN:
int Size = GetSize(data.Type);
if (data.Array == null || data.Array.Length < 1 || Size < 1) continue;
if (data.Type == 0x3E) _IO.A(0x20, true);
data.Offset = _IO.P;
if (data.Type == 0x3E) s.A(0x20, true);
data.Offset = s.P;
if (Size == 0x01) _IO.W(( byte)data.Array[0]);
else if (Size == 0x02) _IO.W((short)data.Array[0]);
if (Size == 0x01) s.W(( byte)data.Array[0]);
else if (Size == 0x02) s.W((short)data.Array[0]);
else
{
if (_IO.P % 0x4 != 0) _IO.A(0x04, true);
if (s.P % 0x4 != 0) s.A(0x04, true);
Size /= 4;
data.Offset = _IO.P;
data.Offset = s.P;
for (i1 = 0; i1 < data.Array.Length && i1 < Size; i1++)
_IO.W(data.Array[i1]);
s.W(data.Array[i1]);
for (; i1 < Size; i1++) _IO.W(0);
for (; i1 < Size; i1++) s.W(0);
}
}
if (Header.Data[i].Array2 != null)
if (Header.Data[i].Array2.Length > 0)
{
Header.Data[i].Offset2 = _IO.P;
Header.Data[i].Offset2 = s.P;
for (i0 = 0; i0 < Header.Data[i].Array2.Length; i0++)
{ _IO.W( 0); _IO.W(0); }
_IO.W(-1); _IO.W(0);
{ 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].Array2[i0].Offset = _IO.P;
Header.Data[i].Array2[i0].Offset = s.P;
for (i1 = 0; i1 < Header.Data[i].Array2[i0].Array.Length && i1 < 7; i1++)
_IO.W(Header.Data[i].Array2[i0].Array[i1]);
s.W(Header.Data[i].Array2[i0].Array[i1]);
for (; i1 < 7; i1++) _IO.W(0);
for (; i1 < 7; i1++) s.W(0);
}
}
break;
}
_IO.A(0x20, true);
Header.SubHeaderOffset = _IO.P;
s.A(0x20, true);
Header.SubHeaderOffset = s.P;
i1 = Header.EndMotionID - Header.StartMotionID;
int offset = 0;
@@ -205,44 +205,44 @@ RETURN:
for (i0 = 0; i0 < Header.Data.Length; i0++)
if (Header.StartMotionID + i == Header.Data[i0].MotionID)
{ offset = Header.Data[i0].Offset; break; }
_IO.W(offset);
s.W(offset);
}
_IO.A(0x20, true);
s.A(0x20, true);
for (i = 0; i < Header.Data.Length; i++)
{
_IO.P = Header.Data[i].Offset;
_IO.W(Header.Data[i].SomeData);
_IO.W(0);
_IO.W(0L);
_IO.W(0x040004);
_IO.W(Header.Data[i].Offset2);
_IO.W(Header.Data[i].DataHeaderOffset);
_IO.W(0);
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].Offset2);
s.W(Header.Data[i].DataHeaderOffset);
s.W(0);
_IO.P = Header.Data[i].DataHeaderOffset;
s.P = Header.Data[i].DataHeaderOffset;
for (i0 = 0; i0 < Header.Data[i].Array.Length; i0++)
{
_IO.W(Header.Data[i].Array[i0].Type );
_IO.W(Header.Data[i].Array[i0].Frame );
_IO.W(Header.Data[i].Array[i0].Offset);
s.W(Header.Data[i].Array[i0].Type );
s.W(Header.Data[i].Array[i0].Frame );
s.W(Header.Data[i].Array[i0].Offset);
}
_IO.P = Header.Data[i].Offset2;
s.P = Header.Data[i].Offset2;
if (Header.Data[i].Array2 != null)
for (i0 = 0; i0 < Header.Data[i].Array2.Length; i0++)
{
_IO.W(Header.Data[i].Array2[i0].Frame );
_IO.W(Header.Data[i].Array2[i0].Offset);
s.W(Header.Data[i].Array2[i0].Frame );
s.W(Header.Data[i].Array2[i0].Offset);
}
}
_IO.P = 0;
_IO.W(Header.MotionSetID );
_IO.W(Header.StartMotionID );
_IO.W(Header. EndMotionID );
_IO.W(Header.SubHeaderOffset);
_IO.C();
s.P = 0;
s.W(Header.MotionSetID );
s.W(Header.StartMotionID );
s.W(Header. EndMotionID );
s.W(Header.SubHeaderOffset);
s.C();
}
public void MsgPackReader(string file, bool json)
@@ -674,7 +674,7 @@ RETURN:
I++;
}
motHead.Add(motions);
motHead.WriteAfterAll(true, file, json);
motHead.WriteAfterAll(false, true, file, json);
}
private static int GetSize(int Type) =>
@@ -721,7 +721,7 @@ RETURN:
};
public void Dispose()
{ if (_IO != null) _IO.D(); _IO = null; Header = default; }
{ if (s != null) s.D(); s = null; Header = default; }
public struct HeaderData
{
+1 -1
View File
@@ -1,4 +1,4 @@
using System.Reflection;
using System.Reflection;
using System.Runtime.InteropServices;
[assembly: AssemblyTrademark("")]
+9 -9
View File
@@ -1,4 +1,4 @@
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
@@ -10,8 +10,8 @@
namespace KKdMainLib.Properties {
using System;
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
@@ -23,15 +23,15 @@ namespace KKdMainLib.Properties {
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources() {
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
@@ -45,7 +45,7 @@ namespace KKdMainLib.Properties {
return resourceMan;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
@@ -59,7 +59,7 @@ namespace KKdMainLib.Properties {
resourceCulture = value;
}
}
/// <summary>
/// Looks up a localized resource of type System.Byte[].
/// </summary>
+78 -69
View File
@@ -8,148 +8,156 @@ namespace KKdMainLib
{
private POF pof;
private Header header;
private Stream _IO;
private Stream s;
public String[] Strings;
public int STRReader(string filepath, string ext)
{
_IO = File.OpenReader(filepath + ext);
s = File.OpenReader(filepath + ext);
header = new Header();
_IO.Format = Format.F;
header.Signature = _IO.RI32();
s.Format = Format.F;
header.Signature = s.RU32();
if (header.Signature == 0x41525453)
{
header = _IO.ReadHeader(true, false);
header = s.ReadHeader(true, false);
s.IsBE = header.UseBigEndian;
s.Format = header.Format;
int count = _IO.RI32E();
int offset = _IO.RI32E();
int count = s.RI32E();
int offset = s.RI32E();
_IO.P = offset;
s.P = offset;
Strings = new String[count];
for (int i = 0; i < count; i++)
{
Strings[i].Str.O = _IO.RI32E();
Strings[i].ID = _IO.RI32E();
Strings[i].Str.O = s.RI32E();
Strings[i].ID = s.RI32E();
}
_IO.O = 0;
s.O = 0;
for (int i = 0; i < count; i++)
Strings[i].Str.V = Strings[i].Str.O > 0 ?
_IO.RSaO(Strings[i].Str.O) : null;
s.RSaO(Strings[i].Str.O) : null;
}
else
{
_IO.P -= 4;
if ((header.Signature >> 24) > 0) { header.Format = Format.DT; s.IsBE = true; }
else header.Format = Format.F;
int count = 0;
for (int a = 0, i = 0; _IO.P > 0 && _IO.P < _IO.L; i++, count++)
{
a = _IO.RI32();
if (a == 0) break;
}
for (uint i = header.Signature; i != 0 && s.P >= 0 && s.P < s.L; count++)
i = s.RU32();
Strings = new String[count];
s.P = 0;
for (int i = 0; i < count; i++)
{
_IO.PI64 = Strings[i].Str.O;
Strings[i].ID = i;
Strings[i].Str.V = _IO.NTUTF8();
Strings[i].Str.V = s.RSaO();
}
}
_IO.C();
s.C();
return 1;
}
public void STRWriter(string filepath)
{
if (Strings == null || Strings.Length == 0 || header.Format > Format.F2BE) return;
if (Strings == null || Strings.Length == 0 || header.Format > Format.F2) return;
uint offset = 0;
uint currentOffset = 0;
_IO = File.OpenWriter(filepath + (header.Format > Format.AFT &&
Format format = header.Format;
s = File.OpenWriter(filepath + (header.Format > Format.AFT &&
header.Format < Format.FT ? ".str" : ".bin"), true);
_IO.Format = header.Format;
s.Format = header.Format;
s.IsBE = header.UseBigEndian;
pof.Offsets = KKdList<long>.New;
long count = Strings.LongLength;
if (_IO.Format > Format.AFT && _IO.Format < Format.FT)
if (s.Format > Format.AFT && s.Format < Format.FT)
{
_IO.P = 0x40;
_IO.WX(count, ref pof);
_IO.WX(0x80);
_IO.P = 0x80;
for (int i = 0; i < count; i++) _IO.W(0x00L);
_IO.A(0x10);
s.P = 0x40;
s.WX(count, ref pof);
s.WX(0x80);
s.P = 0x80;
for (int i = 0; i < count; i++) s.W(0x00L);
}
else
{
for (int i = 0; i < count; i++) _IO.W(0x00);
_IO.A(0x20);
}
for (int i = 0; i < count; i++) s.W(0x00);
s.A(0x10);
KKdList<string> usedSTR = KKdList<string>.New;
KKdList<int> usedSTRPos = KKdList<int>.New;
int[] STRPos = new int[count];
usedSTRPos.Add(_IO.P);
usedSTR.Add("");
_IO.W(0);
for (int i = 0; i < count; i++)
{
if (!usedSTR.Contains(Strings[i].Str.V))
if (usedSTR.Contains(Strings[i].Str.V))
{
STRPos[i] = _IO.P;
usedSTRPos.Add(STRPos[i]);
usedSTR.Add(Strings[i].Str.V);
_IO.W(Strings[i].Str.V);
_IO.W(0);
for (int i2 = 0; i2 < count; i2++)
if (usedSTR[i2] == Strings[i].Str.V)
{ STRPos[i] = usedSTRPos[i2]; break; }
}
else
for (int i2 = 0; i2 < count; i2++)
if (usedSTR[i2] == Strings[i].Str.V) { STRPos[i] = usedSTRPos[i2]; break; }
{
usedSTRPos.Add(STRPos[i] = s.P);
usedSTR.Add(Strings[i].Str.V);
s.W(Strings[i].Str.V);
s.W((byte)0);
if (format < Format.F) s.A(0x8);
}
}
s.A(0x4);
s.L = s.P;
if (_IO.Format > Format.AFT)
if (s.Format > Format.AFT)
{
_IO.A(0x10);
offset = _IO.PU32;
_IO.P = 0x80;
s.A(0x10);
offset = s.PU32;
s.P = 0x80;
for (int i = 0; i < count; i++)
{
pof.Offsets.Add(_IO.P);
_IO.WE(STRPos[i]);
_IO.WE(Strings[i].ID);
pof.Offsets.Add(s.P);
s.WE(STRPos[i]);
s.WE(Strings[i].ID);
}
_IO.PU32 = offset;
_IO.W(pof, false, 1);
currentOffset = _IO.PU32;
_IO.WEOFC();
header.DataSize = (int)(currentOffset - 0x40);
s.PU32 = offset;
s.W(pof, false, 1);
s.WEOFC(1);
currentOffset = s.PU32;
s.WEOFC();
header.DataSize = currentOffset - 0x40;
header.Signature = 0x41525453;
header.SectionSize = (int)(offset - 0x40);
_IO.P = 0;
_IO.W(header, true);
header.SectionSize = offset - 0x40;
header.UseSectionSize = true;
s.P = 0;
s.W(header, true);
}
else
{
_IO.P = 0;
for (int i = 0; i < count; i++) _IO.W(STRPos[i]);
s.P = 0;
s.IsBE = header.Format < Format.F;
for (int i = 0; i < count; i++) s.WE(STRPos[i]);
}
_IO.C();
s.C();
}
public void MsgPackReader(string file, bool json)
{
header = default;
Strings = default;
MsgPack temp;
MsgPack msgPack = file.ReadMPAllAtOnce(json);
if ((temp = msgPack["STR"]).NotNull) return;
if ((temp = msgPack["STR"]).IsNull) return;
header = new Header();
System.Enum.TryParse(temp.RS("Format"), out header.Format);
if (!System.Enum.TryParse(temp.RS("Format"), out header.Format)) return;
bool? isBE = temp.RnB("UseBigEndian");
if (isBE.HasValue) header.UseBigEndian = isBE.Value;
if ((temp = msgPack["Strings", true]).IsNull) return;
if ((temp = temp["Strings", true]).IsNull) return;
Strings = new String[temp.Array.Length];
for (int i = 0; i < Strings.Length; i++)
@@ -166,6 +174,7 @@ namespace KKdMainLib
{
if (Strings == null || Strings.Length == 0) return;
MsgPack str = new MsgPack("STR").Add("Format", header.Format.ToString());
if (header.UseBigEndian) str.Add("UseBigEndian", header.UseBigEndian);
MsgPack strings = new MsgPack(Strings.Length, "Strings");
for (int i = 0; i < Strings.Length; i++)
{
@@ -176,12 +185,12 @@ namespace KKdMainLib
}
str.Add(strings);
str.WriteAfterAll(true, file, json);
str.WriteAfterAll(false, true, file, json);
}
private bool disposed;
public void Dispose()
{ if (!disposed) { if (_IO != null) _IO.D(); _IO = null; Strings = default;
{ if (!disposed) { if (s != null) s.D(); s = null; Strings = default;
pof = default; header = default; disposed = true; } }
public struct String
+87 -97
View File
@@ -1,5 +1,6 @@
using KKdBaseLib;
using KKdMainLib.IO;
using KKdBaseLib.Tables;
using TableDict = System.Collections.Generic.Dictionary<string, object>;
namespace KKdMainLib
@@ -7,8 +8,8 @@ namespace KKdMainLib
public struct Tables : System.IDisposable
{
private int i0;
private Stream _IO;
private TableDict dict;
private Stream s;
public ButtonSE[] ButtonSETable;
public ChainSlideSE[] ChainSlideSETable;
@@ -19,21 +20,10 @@ namespace KKdMainLib
public CustomizeItem[] CustomizeItemTable;
public Module[] ModuleTable;
public Plate[] PlateTable;
public PV[] PVList;
public PV[] PVListTable;
private const string c = ".";
public Tables(bool def = true)
{
i0 = 0;
_IO = null;
dict = null;
disposed = false;
ButtonSETable = null; ChainSlideSETable = null; SlideSETable = null; SliderTouchSETable = null;
CollectionCardTable = null; CustomizeItemTable = null;
ModuleTable = null; PlateTable = null; PVList = null;
}
public void BINReader(string file) =>
BINReader(File.ReadAllBytes(file + ".bin"));
@@ -41,7 +31,7 @@ namespace KKdMainLib
{
ButtonSETable = null; ChainSlideSETable = null; SlideSETable = null; SliderTouchSETable = null;
CollectionCardTable = null; CustomizeItemTable = null;
ModuleTable = null; PlateTable = null; PVList = null;
ModuleTable = null; PlateTable = null; PVListTable = null;
dict = new TableDict();
string[] strData = data.ToUTF8().Replace("\r\n", "\n").Replace("\r", "\n").Split('\n');
@@ -181,12 +171,12 @@ namespace KKdMainLib
}
else if (dict.FV(out length, "pv_list.data_list.length"))
{
PVList = new PV[length];
PVListTable = new PV[length];
for (i0 = 0; i0 < length; i0++)
{
name = "pv_list" + c + i0 + c;
ref PV pv = ref PVList[i0];
ref PV pv = ref PVListTable[i0];
dict.FV(out pv.ID , name + "id" );
dict.FV(out pv.Ignore, name + "ignore");
dict.FV(out pv.Name , name + "name" );
@@ -256,18 +246,18 @@ namespace KKdMainLib
static TableDate GetStartTableDate(TableDict dict, string name)
{
TableDate date = default; date.SDL(); int val;
if (dict.FV(out val, name + "st_day" )) date.Day = val;
if (dict.FV(out val, name + "st_month")) date.Month = val;
if (dict.FV(out val, name + "st_year" )) date.Year = val;
if (dict.FV(out val, name + "st_month")) date.Month = val;
if (dict.FV(out val, name + "st_day" )) date.Day = val;
return date;
}
static TableDate GetEndTableDate(TableDict dict, string name)
{
TableDate date = default; date.SDU(); int val;
if (dict.FV(out val, name + "ed_day" )) date.Day = val;
if (dict.FV(out val, name + "ed_month")) date.Month = val;
if (dict.FV(out val, name + "ed_year" )) date.Year = val;
if (dict.FV(out val, name + "ed_month")) date.Month = val;
if (dict.FV(out val, name + "ed_day" )) date.Day = val;
return date;
}
}
@@ -280,57 +270,57 @@ namespace KKdMainLib
if (ButtonSETable != null)
{
_IO = File.OpenWriter(file + ".bin", true);
s = File.OpenWriter(file + ".bin", true);
length = ButtonSETable.Length;
so = length.SW();
WriteEmptyLines(_IO, length);
WriteEmptyLines(s, length);
for (i0 = 0; i0 < length; i0++)
{
name = "btn_se" + c + so[i0] + c;
ref ButtonSE btn = ref ButtonSETable[so[i0]];
WriteEndTableDate(_IO, name, btn.End);
WriteEndTableDate(s, name, btn.End);
W(name + "id" , btn. ID );
W(name + "name" , btn. Name );
W(name + "se_name" , btn. SEName );
W(name + "sort_index", btn.SortIndex);
WriteStartTableDate(_IO, name, btn.Start);
WriteStartTableDate(s, name, btn.Start);
}
W("btn_se.data_list.length", length);
_IO.W("kind=0\n");
_IO.D();
s.W("kind=0\n");
s.D();
}
else if (ChainSlideSETable != null)
{
_IO = File.OpenWriter(file + ".bin", true);
s = File.OpenWriter(file + ".bin", true);
length = ChainSlideSETable.Length;
so = length.SW();
WriteEmptyLines(_IO, length);
WriteEmptyLines(s, length);
for (i0 = 0; i0 < length; i0++)
{
name = "chainslide_se" + c + so[i0] + c;
ref ChainSlideSE csld = ref ChainSlideSETable[so[i0]];
WriteEndTableDate(_IO, name, csld.End);
WriteEndTableDate(s, name, csld.End);
W(name + "failure_se_name" , csld.FailureSEName );
W(name + "first_se_name" , csld. FirstSEName );
W(name + "id" , csld. ID );
W(name + "name" , csld. Name );
W(name + "sort_index", csld. SortIndex);
WriteStartTableDate(_IO, name, csld.Start);
WriteStartTableDate(s, name, csld.Start);
W(name + "sub_se_name" , csld. SubSEName );
W(name + "success_se_name" , csld.SuccessSEName );
}
W("chainslide_se.data_list.length", length);
_IO.W("kind=2\n");
_IO.D();
s.W("kind=2\n");
s.D();
}
else if (CollectionCardTable != null)
{
_IO = File.OpenWriter(file + ".bin", true);
s = File.OpenWriter(file + ".bin", true);
length = CollectionCardTable.Length;
so = length.SW();
WriteEmptyLines(_IO, length);
WriteEmptyLines(s, length);
for (i0 = 0; i0 < length; i0++)
{
name = "collection_card" + c + so[i0] + c;
@@ -339,29 +329,29 @@ namespace KKdMainLib
W(name + "chara" , clcrd.Chara );
W(name + "disp_num" , clcrd.DispNum );
W(name + "divapro_param", clcrd.DivaProParam);
WriteEndTableDate(_IO, name, clcrd.End);
WriteEndTableDate(s, name, clcrd.End);
W(name + "id" , clcrd.ID );
W(name + "module_author", clcrd.ModuleAuthor);
W(name + "name" , clcrd.Name );
W(name + "name_reading" , clcrd.NameReading );
W(name + "ng" , clcrd.NG );
W(name + "sort_idx" , clcrd.SortIndex );
WriteStartTableDate(_IO, name, clcrd.Start);
WriteStartTableDate(s, name, clcrd.Start);
W(name + "type" , clcrd.Type );
W(name + "type_param" , clcrd.TypeParam );
W(name + "wall_param" , clcrd.WallParam );
}
W("collection_card.data_list.length", length);
_IO.W("patch=0\n");
_IO.W("version=0\n");
_IO.D();
s.W("patch=0\n");
s.W("version=0\n");
s.D();
}
else if (CustomizeItemTable != null)
{
_IO = File.OpenWriter(file + ".bin", true);
s = File.OpenWriter(file + ".bin", true);
length = CustomizeItemTable.Length;
so = length.SW();
WriteEmptyLines(_IO, length);
WriteEmptyLines(s, length);
for (i0 = 0; i0 < length; i0++)
{
name = "cstm_item" + c + so[i0] + c;
@@ -374,22 +364,22 @@ namespace KKdMainLib
W(name + "obj_id" , czitm.ObjID );
W(name + "parts" , czitm.Parts );
W(name + "sell_type" , czitm.SellType );
WriteEndTableDate(_IO, name + "shop_", czitm.ShopEnd);
WriteEndTableDate(s, name + "shop_", czitm.ShopEnd);
W(name + "shop_price", czitm.ShopPrice);
WriteStartTableDate(_IO, name + "shop_", czitm.ShopStart);
WriteStartTableDate(s, name + "shop_", czitm.ShopStart);
W(name + "sort_index", czitm.SortIndex);
}
W("cstm_item.data_list.length", length);
_IO.W("patch=0\n");
_IO.W("version=0\n");
_IO.D();
s.W("patch=0\n");
s.W("version=0\n");
s.D();
}
else if (ModuleTable != null)
{
_IO = File.OpenWriter(file + ".bin", true);
s = File.OpenWriter(file + ".bin", true);
length = ModuleTable.Length;
so = length.SW();
WriteEmptyLines(_IO, length);
WriteEmptyLines(s, length);
for (i0 = 0; i0 < length; i0++)
{
name = "module" + c + so[i0] + c;
@@ -401,20 +391,20 @@ namespace KKdMainLib
W(name + "id" , mdl.ID );
W(name + "name" , mdl.Name );
W(name + "ng" , mdl.NG );
WriteEndTableDate(_IO, name + "shop_", mdl.ShopEnd);
WriteEndTableDate(s, name + "shop_", mdl.ShopEnd);
W(name + "shop_price", mdl.ShopPrice);
WriteStartTableDate(_IO, name + "shop_", mdl.ShopStart);
WriteStartTableDate(s, name + "shop_", mdl.ShopStart);
W(name + "sort_index", mdl.SortIndex);
}
W("module.data_list.length", length);
_IO.D();
s.D();
}
else if (PlateTable != null)
{
_IO = File.OpenWriter(file + ".bin", true);
s = File.OpenWriter(file + ".bin", true);
length = PlateTable.Length;
so = length.SW();
WriteEmptyLines(_IO, length);
WriteEmptyLines(s, length);
for (i0 = 0; i0 < length; i0++)
{
name = "plate" + c + so[i0] + c;
@@ -435,37 +425,37 @@ namespace KKdMainLib
W(name + "shadow_color_r", plt.ShadowColorR);
}
W("plate.data_list.length", length);
_IO.D();
s.D();
}
else if (PVList != null)
else if (PVListTable != null)
{
_IO = File.OpenWriter(file + ".bin", true);
length = PVList.Length;
s = File.OpenWriter(file + ".bin", true);
length = PVListTable.Length;
so = length.SW();
WriteEmptyLines(_IO, length);
WriteEmptyLines(s, length);
for (i0 = 0; i0 < length; i0++)
{
name = "pv_list" + c + so[i0] + c;
ref PV pv = ref PVList[so[i0]];
WriteEndTableDate(_IO, name + "adv_demo_", pv.AdvEnd );
WriteStartTableDate(_IO, name + "adv_demo_", pv.AdvStart);
ref PV pv = ref PVListTable[so[i0]];
WriteEndTableDate(s, name + "adv_demo_", pv.AdvEnd );
WriteStartTableDate(s, name + "adv_demo_", pv.AdvStart);
WriteDifficulty(_IO, name + "easy.", pv.Easy );
WriteDifficulty(_IO, name + "encore.", pv.Encore );
WriteDifficulty(_IO, name + "extreme.", pv.Extreme);
WriteDifficulty(_IO, name + "hard.", pv.Hard );
WriteDifficulty(s, name + "easy.", pv.Easy );
WriteDifficulty(s, name + "encore.", pv.Encore );
WriteDifficulty(s, name + "extreme.", pv.Extreme);
WriteDifficulty(s, name + "hard.", pv.Hard );
W(name + "id" , pv.ID );
W(name + "ignore", pv.Ignore);
W(name + "name" , pv.Name );
WriteDifficulty(_IO, name + "extreme.", pv.Normal );
WriteDifficulty(s, name + "normal.", pv.Normal );
}
W("pv_list.data_list.length", length);
_IO.D();
s.D();
static void WriteDifficulty(Stream _IO, string name, PV.Difficulty[] arr)
{
if (arr == null) { _IO.W($"{name}.length=0\n"); return; }
if (arr == null) { _IO.W($"{name}length=0\n"); return; }
int length = arr.Length;
int[] so = length.SW();
@@ -473,57 +463,57 @@ namespace KKdMainLib
{
ref PV.Difficulty diff = ref arr[so[i]];
WriteStartTableDate(_IO, $"{name}{i}.", diff.Start);
_IO.W($"{name}{i}.edition" + $"={diff.Edition}\n");
WriteEndTableDate(_IO, $"{name}{i}.", diff.End );
_IO.W($"{name}{i}.edition" + $"={diff.Edition}\n");
WriteStartTableDate(_IO, $"{name}{i}.", diff.Start);
_IO.W($"{name}{i}.ver" + $"={diff.Version}\n");
}
_IO.W($"{name}.length={length}\n");
_IO.W($"{name}length={length}\n");
}
}
else if (SlideSETable != null)
{
_IO = File.OpenWriter(file + ".bin", true);
s = File.OpenWriter(file + ".bin", true);
length = SlideSETable.Length;
so = length.SW();
WriteEmptyLines(_IO, length);
_IO.W("kind=1\n");
WriteEmptyLines(s, length);
s.W("kind=1\n");
for (i0 = 0; i0 < length; i0++)
{
name = "slide_se" + c + so[i0] + c;
ref SlideSE sld = ref SlideSETable[so[i0]];
WriteEndTableDate(_IO, name, sld.End);
WriteEndTableDate(s, name, sld.End);
W(name + "id" , sld. ID );
W(name + "name" , sld. Name );
W(name + "se_name" , sld. SEName );
W(name + "sort_index", sld.SortIndex);
WriteStartTableDate(_IO, name, sld.Start);
WriteStartTableDate(s, name, sld.Start);
}
W("slide_se.data_list.length", length);
_IO.D();
s.D();
}
else if (SliderTouchSETable != null)
{
_IO = File.OpenWriter(file + ".bin", true);
s = File.OpenWriter(file + ".bin", true);
length = SliderTouchSETable.Length;
so = length.SW();
WriteEmptyLines(_IO, length);
_IO.W("kind=3\n");
WriteEmptyLines(s, length);
s.W("kind=3\n");
for (i0 = 0; i0 < length; i0++)
{
name = "slidertouch_se" + c + so[i0] + c;
ref SliderTouchSE sldt = ref SliderTouchSETable[so[i0]];
WriteEndTableDate(_IO, name, sldt.End);
WriteEndTableDate(s, name, sldt.End);
W(name + "id" , sldt. ID );
W(name + "name" , sldt. Name );
W(name + "se_name" , sldt. SEName );
W(name + "sort_index", sldt.SortIndex);
WriteStartTableDate(_IO, name, sldt.Start);
WriteStartTableDate(s, name, sldt.Start);
}
W("slidertouch_se.data_list.length", length);
_IO.D();
s.D();
}
static void WriteEmptyLines(Stream _IO, int count)
@@ -545,15 +535,15 @@ namespace KKdMainLib
}
private void W(string Data, long val) =>
_IO.W(Data + "=" + val + "\n");
s.W(Data + "=" + val + "\n");
private void W(string Data, string val)
{ if (val != null) _IO.W(Data + "=" + val + "\n"); }
{ if (val != null) s.W(Data + "=" + val + "\n"); }
public void MsgPackReader(string file, bool json)
{
ButtonSETable = null; ChainSlideSETable = null; SlideSETable = null; SliderTouchSETable = null;
CollectionCardTable = null; CustomizeItemTable = null;
ModuleTable = null; PlateTable = null; PVList = null;
ModuleTable = null; PlateTable = null; PVListTable = null;
MsgPack msgPack = file.ReadMPAllAtOnce(json);
MsgPack temp;
@@ -679,13 +669,13 @@ namespace KKdMainLib
pltMP.R("ShadowColorR", out plt.ShadowColorR);
}
}
else if ((temp = msgPack["PV", true]).NotNull)
else if ((temp = msgPack["PVList", true]).NotNull)
{
PVList = new PV[temp.Array.Length];
for (i0 = 0; i0 < PVList.Length; i0++)
PVListTable = new PV[temp.Array.Length];
for (i0 = 0; i0 < PVListTable.Length; i0++)
{
MsgPack pvMP = temp[i0];
ref PV pv = ref PVList[i0];
ref PV pv = ref PVListTable[i0];
pv.AdvEnd .SV(pvMP.RnI32("AdvEnd" ), true);
pv.AdvStart.SV(pvMP.RnI32("AdvStart"), false);
@@ -875,12 +865,12 @@ namespace KKdMainLib
}
msgPack.Add(plateTable);
}
else if (PVList != null)
else if (PVListTable != null)
{
MsgPack pvList = new MsgPack(PVList.Length, "PVList");
for (i0 = 0; i0 < PVList.Length; i0++)
MsgPack pvList = new MsgPack(PVListTable.Length, "PVList");
for (i0 = 0; i0 < PVListTable.Length; i0++)
{
ref PV pv = ref PVList[i0];
ref PV pv = ref PVListTable[i0];
MsgPack mp = MsgPack.New.Add("AdvEnd" , pv.AdvEnd .Int)
.Add("AdvStart", pv.AdvStart.Int);
@@ -942,18 +932,18 @@ namespace KKdMainLib
}
msgPack.Add(sliderTouchSETable);
}
if (msgPack.List.Count == 1) msgPack.Write(file, json);
if (msgPack.List.Count == 1) msgPack.Write(file, false, json);
}
private bool disposed;
public void Dispose()
{
if (disposed) return;
if (_IO != null) _IO.D(); _IO = null;
if (s != null) s.D(); s = null;
if (dict != null) { dict.Clear(); dict = null; }
ButtonSETable = null; ChainSlideSETable = null; SlideSETable = null; SliderTouchSETable = null;
CollectionCardTable = null; CustomizeItemTable = null;
ModuleTable = null; PlateTable = null; PVList = null;
ModuleTable = null; PlateTable = null; PVListTable = null; disposed = true;
}
}
}
+5 -5
View File
@@ -1,15 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<Authors>korenkonder</Authors>
<Company></Company>
<Configuration></Configuration>
<Copyright>korenkonder © 2019-2020</Copyright>
<Copyright>korenkonder (C) 2019-2020</Copyright>
<Description>A simple library for working with Project Diva F/AFT/F2/X/FT audio files</Description>
<FileVersion>0.1.2.0</FileVersion>
<PackageId>KKdSoundLib</PackageId>
<Product>KKdSoundLib</Product>
<TargetFramework>netstandard2.0</TargetFramework>
<TargetFramework>net461</TargetFramework>
<Title>KKdSoundLib</Title>
<Version>0.1.2.0</Version>
</PropertyGroup>
@@ -24,7 +24,7 @@
<WarningLevel>4</WarningLevel>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<LangVersion>8.0</LangVersion>
<NoWarn>IDE0004, IDE0044, IDE0045, IDE0046, IDE0055, IDE0059, IDE0069, IDE1006</NoWarn>
<NoWarn>IDE0004, IDE0032, IDE0044, IDE0045, IDE0046, IDE0055, IDE0059, IDE0066, IDE0069, IDE1006</NoWarn>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
@@ -37,7 +37,7 @@
<DebugSymbols>true</DebugSymbols>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<LangVersion>8.0</LangVersion>
<NoWarn>IDE0004, IDE0044, IDE0045, IDE0046, IDE0055, IDE0059, IDE0069, IDE1006</NoWarn>
<NoWarn>IDE0004, IDE0032, IDE0044, IDE0045, IDE0046, IDE0055, IDE0059, IDE0066, IDE0069, IDE1006</NoWarn>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\KKdBaseLib\KKdBaseLib.csproj" />
+1 -1
View File
@@ -1,4 +1,4 @@
using System.Reflection;
using System.Reflection;
using System.Runtime.InteropServices;
[assembly: AssemblyTrademark("")]
+83 -183
View File
@@ -1,184 +1,84 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{7B5D5A3A-A6F8-4813-C97D-ACFC98F7397E}</ProjectGuid>
<OutputType>Exe</OutputType>
<RootNamespace>PD_Tool</RootNamespace>
<AssemblyName>PD_Tool</AssemblyName>
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<RunPostBuildEvent>Always</RunPostBuildEvent>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>..\build\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<LangVersion>8.0</LangVersion>
<NoWarn>IDE0004, IDE0044, IDE0045, IDE0046, IDE0055, IDE0059, IDE0069, IDE1006</NoWarn>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>embedded</DebugType>
<Optimize>true</Optimize>
<OutputPath>..\build\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<DebugSymbols>true</DebugSymbols>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<LangVersion>8.0</LangVersion>
<NoWarn>IDE0004, IDE0044, IDE0045, IDE0046, IDE0055, IDE0059, IDE0069, IDE1006</NoWarn>
</PropertyGroup>
<ItemGroup>
<Compile Include="classes\A3D.cs" />
<Compile Include="classes\ADP.cs" />
<Compile Include="classes\AET.cs" />
<Compile Include="classes\BLT.cs" />
<Compile Include="classes\CCT.cs" />
<Compile Include="classes\DataBase.cs" />
<Compile Include="classes\DB.cs" />
<Compile Include="classes\DEX.cs" />
<Compile Include="classes\DFT.cs" />
<Compile Include="classes\DIV.cs" />
<Compile Include="classes\DIVAFILE.cs" />
<Compile Include="classes\FARC.cs" />
<Compile Include="classes\LIT.cs" />
<Compile Include="classes\MHD.cs" />
<Compile Include="classes\MOT.cs" />
<Compile Include="classes\STR.cs" />
<Compile Include="classes\TBL.cs" />
<Compile Include="classes\VAG.cs" />
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Drawing" />
<Reference Include="System.Numerics" />
<Reference Include="System.Windows.Forms" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\KKdBaseLib\KKdBaseLib.csproj">
<Project>{437f63f1-8c23-429e-ab14-38b85c9edb16}</Project>
<Name>KKdBaseLib</Name>
</ProjectReference>
<ProjectReference Include="..\KKdMainLib\KKdMainLib.csproj">
<Project>{2ba7efc6-91d1-8bbc-c487-06c7f36cc789}</Project>
<Name>KKdMainLib</Name>
</ProjectReference>
<ProjectReference Include="..\KKdSoundLib\KKdSoundLib.csproj">
<Project>{d8a3f2d7-10cc-5723-ec9a-45d3b9c2df77}</Project>
<Name>KKdSoundLib</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<PropertyGroup>
<PostBuildEvent>del Microsoft.Win32.Primitives.dll
del netstandard.dll
del PD_Tool.exe.config
del System.AppContext.dll
del System.Collections.Concurrent.dll
del System.Collections.dll
del System.Collections.NonGeneric.dll
del System.Collections.Specialized.dll
del System.ComponentModel.dll
del System.ComponentModel.EventBasedAsync.dll
del System.ComponentModel.Primitives.dll
del System.ComponentModel.TypeConverter.dll
del System.Console.dll
del System.Data.Common.dll
del System.Diagnostics.Contracts.dll
del System.Diagnostics.Debug.dll
del System.Diagnostics.FileVersionInfo.dll
del System.Diagnostics.Process.dll
del System.Diagnostics.StackTrace.dll
del System.Diagnostics.TextWriterTraceListener.dll
del System.Diagnostics.Tools.dll
del System.Diagnostics.TraceSource.dll
del System.Diagnostics.Tracing.dll
del System.Drawing.Primitives.dll
del System.Dynamic.Runtime.dll
del System.Globalization.Calendars.dll
del System.Globalization.dll
del System.Globalization.Extensions.dll
del System.IO.Compression.dll
del System.IO.Compression.ZipFile.dll
del System.IO.dll
del System.IO.FileSystem.dll
del System.IO.FileSystem.DriveInfo.dll
del System.IO.FileSystem.Primitives.dll
del System.IO.FileSystem.Watcher.dll
del System.IO.IsolatedStorage.dll
del System.IO.MemoryMappedFiles.dll
del System.IO.Pipes.dll
del System.IO.UnmanagedMemoryStream.dll
del System.Linq.dll
del System.Linq.Expressions.dll
del System.Linq.Parallel.dll
del System.Linq.Queryable.dll
del System.Net.Http.dll
del System.Net.NameResolution.dll
del System.Net.NetworkInformation.dll
del System.Net.Ping.dll
del System.Net.Primitives.dll
del System.Net.Requests.dll
del System.Net.Security.dll
del System.Net.Sockets.dll
del System.Net.WebHeaderCollection.dll
del System.Net.WebSockets.Client.dll
del System.Net.WebSockets.dll
del System.ObjectModel.dll
del System.Reflection.dll
del System.Reflection.Extensions.dll
del System.Reflection.Primitives.dll
del System.Resources.Reader.dll
del System.Resources.ResourceManager.dll
del System.Resources.Writer.dll
del System.Runtime.CompilerServices.VisualC.dll
del System.Runtime.dll
del System.Runtime.Extensions.dll
del System.Runtime.Handles.dll
del System.Runtime.InteropServices.dll
del System.Runtime.InteropServices.RuntimeInformation.dll
del System.Runtime.Numerics.dll
del System.Runtime.Serialization.Formatters.dll
del System.Runtime.Serialization.Json.dll
del System.Runtime.Serialization.Primitives.dll
del System.Runtime.Serialization.Xml.dll
del System.Security.Claims.dll
del System.Security.Cryptography.Algorithms.dll
del System.Security.Cryptography.Csp.dll
del System.Security.Cryptography.Encoding.dll
del System.Security.Cryptography.Primitives.dll
del System.Security.Cryptography.X509Certificates.dll
del System.Security.Principal.dll
del System.Security.SecureString.dll
del System.Text.Encoding.dll
del System.Text.Encoding.Extensions.dll
del System.Text.RegularExpressions.dll
del System.Threading.dll
del System.Threading.Overlapped.dll
del System.Threading.Tasks.dll
del System.Threading.Tasks.Parallel.dll
del System.Threading.Thread.dll
del System.Threading.ThreadPool.dll
del System.Threading.Timer.dll
del System.ValueTuple.dll
del System.Xml.ReaderWriter.dll
del System.Xml.XDocument.dll
del System.Xml.XmlDocument.dll
del System.Xml.XmlSerializer.dll
del System.Xml.XPath.dll
del System.Xml.XPath.XDocument.dll</PostBuildEvent>
</PropertyGroup>
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{7B5D5A3A-A6F8-4813-C97D-ACFC98F7397E}</ProjectGuid>
<OutputType>Exe</OutputType>
<RootNamespace>PD_Tool</RootNamespace>
<AssemblyName>PD_Tool</AssemblyName>
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<RunPostBuildEvent>Always</RunPostBuildEvent>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>..\build\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<LangVersion>8.0</LangVersion>
<NoWarn>IDE0004, IDE0032, IDE0044, IDE0045, IDE0046, IDE0055, IDE0059, IDE0066, IDE0069, IDE1006</NoWarn>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>embedded</DebugType>
<Optimize>true</Optimize>
<OutputPath>..\build\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<DebugSymbols>true</DebugSymbols>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<LangVersion>8.0</LangVersion>
<NoWarn>IDE0004, IDE0032, IDE0044, IDE0045, IDE0046, IDE0055, IDE0059, IDE0066, IDE0069, IDE1006</NoWarn>
</PropertyGroup>
<ItemGroup>
<Compile Include="classes\A3D.cs" />
<Compile Include="classes\ADP.cs" />
<Compile Include="classes\AET.cs" />
<Compile Include="classes\BLT.cs" />
<Compile Include="classes\CCT.cs" />
<Compile Include="classes\DataBase.cs" />
<Compile Include="classes\DB.cs" />
<Compile Include="classes\DEX.cs" />
<Compile Include="classes\DFT.cs" />
<Compile Include="classes\DIV.cs" />
<Compile Include="classes\DIVAFILE.cs" />
<Compile Include="classes\FARC.cs" />
<Compile Include="classes\LIT.cs" />
<Compile Include="classes\MHD.cs" />
<Compile Include="classes\MOT.cs" />
<Compile Include="classes\STR.cs" />
<Compile Include="classes\TBL.cs" />
<Compile Include="classes\VAG.cs" />
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Drawing" />
<Reference Include="System.Numerics" />
<Reference Include="System.Windows.Forms" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\KKdBaseLib\KKdBaseLib.csproj">
<Project>{437f63f1-8c23-429e-ab14-38b85c9edb16}</Project>
<Name>KKdBaseLib</Name>
</ProjectReference>
<ProjectReference Include="..\KKdMainLib\KKdMainLib.csproj">
<Project>{2ba7efc6-91d1-8bbc-c487-06c7f36cc789}</Project>
<Name>KKdMainLib</Name>
</ProjectReference>
<ProjectReference Include="..\KKdSoundLib\KKdSoundLib.csproj">
<Project>{d8a3f2d7-10cc-5723-ec9a-45d3b9c2df77}</Project>
<Name>KKdSoundLib</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>
+60 -46
View File
@@ -1,4 +1,4 @@
using System;
using System;
using System.Windows.Forms;
using KKdMainLib;
using KKdMainLib.IO;
@@ -29,7 +29,8 @@ namespace PD_Tool
foreach (string arg in args)
{
GC.Collect();
if (Directory.Exists(arg)) using (KKdFARC FARC = new KKdFARC(arg, true)) FARC.Pack();
if (Directory.Exists(arg))
using (KKdFARC FARC = new KKdFARC(arg, true) { CompressionLevel = 9 }) FARC.Pack();
else if (File.Exists(arg) && Path.GetExtension(arg) == ".farc")
using (KKdFARC farc = new KKdFARC(arg)) farc.Unpack(true);
else if (File.Exists(arg))
@@ -46,21 +47,22 @@ namespace PD_Tool
private static void MainMenu()
{
Console.Title = "PD_Tool v0.4.9.2";
Console.Title = "PD_Tool v0.4.9.4";
Console.Clear();
ConsoleDesign(true);
ConsoleDesign(" Choose action:");
ConsoleDesign(false);
ConsoleDesign("1. Extract FARC Archive");
ConsoleDesign("2. Create FARC Archive");
ConsoleDesign("3. Decrypt/Encrypt from/to DIVAFILE");
ConsoleDesign("4. DB_Tools");
ConsoleDesign("5. AC/DT/F/AFT Converting Tools");
ConsoleDesign("6. F/F2/FT Converting Tools");
ConsoleDesign("7. X/XHD Converting Tools");
ConsoleDesign("8. FT/M39 Converting Tools");
ConsoleDesign(json ? "9. MsgPack to JSON" : "9. JSON to MsgPack");
ConsoleDesign("2. Create FARC Archive");
ConsoleDesign("3. Decrypt from DIVAFILE");
ConsoleDesign("4. Encrypt to DIVAFILE");
ConsoleDesign("5. DB_Tools");
ConsoleDesign("6. AC/DT/F/AFT Converting Tools");
ConsoleDesign("7. F/F2/FT Converting Tools");
ConsoleDesign("8. X/XHD Converting Tools");
ConsoleDesign("9. FT/M39 Converting Tools");
ConsoleDesign(json ? "A. MsgPack to JSON" : "A. JSON to MsgPack");
ConsoleDesign(false);
ConsoleDesign(json ? "M. MessagePack" : "J. JSON");
ConsoleDesign("Q. Quit");
@@ -88,8 +90,13 @@ namespace PD_Tool
Choose(1, "", out string[] FileNames);
foreach (string FileName in FileNames) DIVAFILE.Decrypt(FileName);
}
else if (choose[0] == '4') DataBase.Processor(json);
else if (choose[0] == '5')
else if (choose[0] == '4')
{
Choose(1, "", out string[] FileNames);
foreach (string FileName in FileNames) DIVAFILE.Encrypt(FileName);
}
else if (choose[0] == '5') DataBase.Processor(json);
else if (choose[0] == '6')
{
string localChoose = "";
if (choose.Length == 1)
@@ -106,8 +113,8 @@ namespace PD_Tool
ConsoleDesign("5. DIVA" );
ConsoleDesign("6. MotHead" );
ConsoleDesign("7. MOT" );
ConsoleDesign("8. Table" );
ConsoleDesign("9. STR" );
ConsoleDesign("8. STR" );
ConsoleDesign("9. Table" );
ConsoleDesign(false);
ConsoleDesign("R. Return to Main Menu");
ConsoleDesign(false);
@@ -123,11 +130,11 @@ namespace PD_Tool
else if (localChoose == "5") DIV.Processor();
else if (localChoose == "6") MHD.Processor(json);
else if (localChoose == "7") MOT.Processor(json);
else if (localChoose == "8") TBL.Processor(json);
else if (localChoose == "9") STR.Processor(json);
else if (localChoose == "8") STR.Processor(json);
else if (localChoose == "9") TBL.Processor(json);
else choose = localChoose;
}
else if (choose[0] == '6')
else if (choose[0] == '7')
{
string localChoose = "";
if (choose.Length == 1)
@@ -163,13 +170,13 @@ namespace PD_Tool
else if (localChoose == "8") VAG.Processor();
else choose = localChoose;
}
else if (choose[0] == '7')
else if (choose[0] == '8')
{
string localChoose = "";
if (choose.Length == 1)
{
Console.Clear();
Console.Title = "X Converting Tools";
Console.Title = "X/XHD Converting Tools";
ConsoleDesign(true);
ConsoleDesign(" Choose converter:");
ConsoleDesign(false);
@@ -189,28 +196,33 @@ namespace PD_Tool
else if (localChoose == "3") VAG.Processor();
else choose = localChoose;
}
else if (choose[0] == '8')
else if (choose[0] == '9')
{
Console.Clear();
Console.Title = "FT/M39 Converting Tools";
ConsoleDesign(true);
ConsoleDesign(" Choose converter:");
ConsoleDesign(false);
ConsoleDesign("1. A3DA" );
ConsoleDesign("2. AddParam");
ConsoleDesign("3. AET" );
ConsoleDesign("4. DEX" );
ConsoleDesign("5. DIVA" );
ConsoleDesign("6. MotHead" );
ConsoleDesign("7. MOT" );
ConsoleDesign("8. Table" );
ConsoleDesign("9. STR" );
ConsoleDesign(false);
ConsoleDesign("R. Return to Main Menu");
ConsoleDesign(false);
ConsoleDesign(true);
Console.WriteLine();
string localChoose = Console.ReadLine().ToUpper();
string localChoose = "";
if (choose.Length == 1)
{
Console.Clear();
Console.Title = "FT/M39 Converting Tools";
ConsoleDesign(true);
ConsoleDesign(" Choose converter:");
ConsoleDesign(false);
ConsoleDesign("1. A3DA" );
ConsoleDesign("2. AddParam");
ConsoleDesign("3. AET" );
ConsoleDesign("4. DEX" );
ConsoleDesign("5. DIVA" );
ConsoleDesign("6. MotHead" );
ConsoleDesign("7. MOT" );
ConsoleDesign("8. STR" );
ConsoleDesign("9. Table" );
ConsoleDesign(false);
ConsoleDesign("R. Return to Main Menu");
ConsoleDesign(false);
ConsoleDesign(true);
Console.WriteLine();
localChoose = Console.ReadLine().ToUpper();
}
else localChoose = choose[1].ToString();
if (localChoose == "1") A3D.Processor(json);
else if (localChoose == "2") ADP.Processor(json);
else if (localChoose == "3") AET.Processor(json);
@@ -218,11 +230,11 @@ namespace PD_Tool
else if (localChoose == "5") DIV.Processor();
else if (localChoose == "6") MHD.Processor(json);
else if (localChoose == "7") MOT.Processor(json);
else if (localChoose == "8") TBL.Processor(json);
else if (localChoose == "9") STR.Processor(json);
else if (localChoose == "8") STR.Processor(json);
else if (localChoose == "9") TBL.Processor(json);
else choose = localChoose;
}
else if (choose == "9")
else if (choose[0] == 'A')
{
Console.Title = json ? "MsgPack to JSON" : "JSON to MsgPack";
Choose(1, json ? "mp" : "json", out string[] fileNames);
@@ -241,7 +253,7 @@ namespace PD_Tool
}
public static void Exit() => Environment.Exit(0);
public static void ConsoleDesign(string text, params string[] args)
{
text = string.Format(text, args);
@@ -289,6 +301,8 @@ namespace PD_Tool
string Filter = GetArgs("All;", false, "*");
if (filetype == "a3da") Filter = GetArgs("A3DA", "a3da", "farc", "json", "mp") +
GetArgs("A3DA", true, "a3da") + GetArgs("FARC", true, "farc") + json + mp;
else if (filetype == "adp" ) Filter = GetArgs("ADP" , "adp", "json", "mp") +
GetArgs("ADP", true, "adp" ) + json + mp;
else if (filetype == "bin" ) Filter = GetArgs("BIN" , "bin", "json", "mp") +
bin + json + mp;
else if (filetype == "blt" ) Filter = GetArgs("BLT" , "blt");
@@ -312,7 +326,7 @@ namespace PD_Tool
bin + GetArgs("FARC Archives", true, "farc") + json + mp;
else if (filetype == "vag" ) Filter = GetArgs("VAG" , "vag", "wav") +
GetArgs("VAG", true, "vag") + wav;
using OpenFileDialog ofd = new OpenFileDialog { //InitialDirectory = Application.StartupPath,
Filter = Filter, Multiselect = true, Title = "Choose file(s) to open:" };
if (ofd.ShowDialog() == DialogResult.OK) FileNames = ofd.FileNames;
+4 -4
View File
@@ -1,4 +1,4 @@
using System.Reflection;
using System.Reflection;
using System.Runtime.InteropServices;
[assembly: AssemblyTitle("PD_Tool")]
@@ -6,10 +6,10 @@ using System.Runtime.InteropServices;
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("PD_Tool")]
[assembly: AssemblyCopyright("korenkonder © 2017-2020")]
[assembly: AssemblyCopyright("korenkonder (C) 2017-2020")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
[assembly: ComVisible(false)]
[assembly: Guid("7B5D5A3A-A6F8-4813-C97D-ACFC98F7397E")]
[assembly: AssemblyVersion("0.4.9.2")]
[assembly: AssemblyFileVersion("0.4.9.2")]
[assembly: AssemblyVersion("0.4.9.4")]
[assembly: AssemblyFileVersion("0.4.9.4")]
+51 -46
View File
@@ -20,36 +20,36 @@ namespace PD_Tool
Format format = Format.NULL;
string choose = "";
if (mp)
{
Console.Clear();
Program.ConsoleDesign(true);
Program.ConsoleDesign(" Choose type of format to export:");
Program.ConsoleDesign(false);
Program.ConsoleDesign("1. A3DA [DT/AC/F]");
Program.ConsoleDesign("2. A3DC [DT/AC/F]");
Program.ConsoleDesign("3. A3DA [AFT/FT] ");
Program.ConsoleDesign("4. A3DC [AFT/FT] ");
Program.ConsoleDesign("5. A3DC [F2] ");
Program.ConsoleDesign("6. A3DC [MGF] ");
Program.ConsoleDesign("7. A3DC [X] ");
Program.ConsoleDesign(false);
Program.ConsoleDesign(true);
Console.WriteLine();
choose = Console.ReadLine().ToUpper();
if (choose == "1") format = Format.DT ;
else if (choose == "2") format = Format.F ;
else if (choose == "3") format = Format.AFT ;
else if (choose == "4") format = Format.AFT ;
else if (choose == "5") format = Format.F2LE;
else if (choose == "6") format = Format.MGF ;
else if (choose == "7") format = Format.X ;
else return;
}
Console.Clear();
Program.ConsoleDesign(true);
Program.ConsoleDesign(" Choose type of format to export:");
Program.ConsoleDesign(false);
Program.ConsoleDesign("1. A3DA [DT/AC/F]");
Program.ConsoleDesign("2. A3DC [DT/AC/F]");
Program.ConsoleDesign("3. A3DA [AFT/FT/M39]");
Program.ConsoleDesign("4. A3DC [AFT/FT/M39]");
Program.ConsoleDesign("5. A3DC [F2]");
Program.ConsoleDesign("6. A3DC [MGF]");
Program.ConsoleDesign("7. A3DC [X]");
if (!mp) Program.ConsoleDesign($"8. {(json ? "JSON" : "MsgPack")}");
Program.ConsoleDesign(false);
Program.ConsoleDesign(true);
Console.WriteLine();
choose = Console.ReadLine().ToUpper();
if (choose == "1") format = Format.DT ;
else if (choose == "2") format = Format.F ;
else if (choose == "3") format = Format.AFT;
else if (choose == "4") format = Format.AFT;
else if (choose == "5") format = Format.F2;
else if (choose == "6") format = Format.MGF;
else if (choose == "7") format = Format.X ;
else if (choose == "8") format = Format.NULL;
else return;
int state;
string filepath, ext;
KKdA3DA a3da;
KKdFARC farc;
foreach (string file in fileNames)
{
ext = Path.GetExtension(file);
@@ -58,13 +58,21 @@ namespace PD_Tool
Console.Title = "A3DA Converter: " + Path.GetFileNameWithoutExtension(file);
if (ext == ".farc")
using (KKdFARC farc = new KKdFARC(file))
using (farc = new KKdFARC(file))
FARCProcessor(farc, choose, format);
else if (ext == ".a3da")
using (a3da = new KKdA3DA(true))
{
state = a3da.A3DAReader(filepath);
if (state == 1) a3da.MsgPackWriter(filepath, json);
if (state == 1)
if (choose == "8") a3da.MsgPackWriter(filepath, json);
else
{
a3da.Head.Format = format;
File.WriteAllBytes(filepath + ".a3da", (choose == "1" ||
choose == "3") ? a3da.A3DAWriter() : a3da.A3DCWriter());
}
}
else if (ext == ".mp" || ext == ".json")
using (a3da = new KKdA3DA(true))
@@ -72,26 +80,21 @@ namespace PD_Tool
a3da.MsgPackReader(filepath, ext == ".json");
a3da.Head.Format = format;
File.WriteAllBytes(filepath + ".a3da", (choose != "1" &&
choose != "3") ? a3da.A3DCWriter() : a3da.A3DAWriter());
File.WriteAllBytes(filepath + ".a3da", (choose == "1" ||
choose == "3") ? a3da.A3DAWriter() : a3da.A3DCWriter());
}
}
}
private static void FARCProcessor(KKdFARC farc, string choose, Format format)
{
if (!farc.HeaderReader()) return;
if (!farc.HasFiles) return;
if (!farc.HeaderReader() || !farc.HasFiles) return;
KKdList<string> list = KKdList<string>.New;
for (int i = 0; i < farc.Files.Count; i++)
{
string file = farc.Files[i].Name.ToLower();
bool div = false;
for (int i0 = 0; i0 < 159 && !div; i0++)
if (file.Contains("div_" + i0)) div = true;
if (!div && file.EndsWith(".a3da")) list.Add(file);
if (!file.Contains("_div_") && file.EndsWith(".a3da")) list.Add(file);
}
KKdList<string> A3DAlist = KKdList<string>.New;
@@ -100,7 +103,7 @@ namespace PD_Tool
A3DAlist.Add(farc.Files[i].Name);
byte[] data = null;
if (list.Count == A3DAlist.Count || (format > Format.AFT && format < Format.FT))
if (list.Count == A3DAlist.Count)
{
KKdA3DA a3da;
for (int i = 0; i < A3DAlist.Count; i++)
@@ -112,7 +115,7 @@ namespace PD_Tool
{
KKdFARC.FARCFile file = farc.Files[i];
a3da.Head.Format = format;
file.Data = (choose != "1" && choose != "3") ? a3da.A3DCWriter() : a3da.A3DAWriter();
file.Data = (choose == "1"|| choose == "3") ? a3da.A3DAWriter() : a3da.A3DCWriter();
farc.Files[i] = file;
}
}
@@ -121,7 +124,7 @@ namespace PD_Tool
}
KKdA3DA[] a3daArray;
using (KKdList<KKdA3DA> a3daList = KKdList<KKdA3DA>.New)
using (KKdList<KKdA3DA> a3daList = KKdList<KKdA3DA>.NewReserve(list.Count))
{
for (int i = 0; i < list.Count; i++)
{
@@ -139,27 +142,29 @@ namespace PD_Tool
for (int i = 0; i < list.Count; i++)
{
if (a3daArray[i].Data.PlayControl.Div == null) continue;
float Div = a3daArray[i].Data.PlayControl.Div.Value;
int div = a3daArray[i].Data.PlayControl.Div.Value;
string filename = Path.GetFileNameWithoutExtension(list[i]);
string ext = Path.GetExtension(list[i]);
KKdA3DA a3da;
for (int i1 = 1; i1 < Div; i1++)
for (int i1 = 1; i1 < div; i1++)
using (a3da = new KKdA3DA(true))
{
string file = Path.GetFileNameWithoutExtension(list[i]) +
"_div_" + i1 + Path.GetExtension(list[i]);
string file = filename + "_div_" + i1 + ext;
data = farc.FileReader(file);
int state = a3da.A3DAReader(data);
if (state == 1) a3daArray[i].A3DAMerger(ref a3da.Data);
}
a3daArray[i].Data.PlayControl.Div = null;
}
farc.Files.Capacity = 0;
farc.Files.Capacity = list.Count;
for (int i = 0; i < list.Count; i++)
{
KKdFARC.FARCFile file = default;
file.Name = list[i];
a3daArray[i].Head.Format = format;
file.Data = (choose != "1" && choose != "3") ? a3daArray[i].A3DCWriter() : a3daArray[i].A3DAWriter();
file.Data = (choose == "1" || choose == "3") ? a3daArray[i].A3DAWriter() : a3daArray[i].A3DCWriter();
farc.Files.Add(file);
}
farc.Save();
+16 -17
View File
@@ -15,25 +15,24 @@ namespace PD_Tool
string filepath, ext;
AddParam adp;
foreach (string file in fileNames)
{
adp = new AddParam();
ext = Path.GetExtension(file);
filepath = file.Replace(ext, "");
ext = ext.ToLower();
using (adp = new AddParam())
{
ext = Path.GetExtension(file);
filepath = file.Replace(ext, "");
ext = ext.ToLower();
Console.Title = "Add Param Converter: " + Path.GetFileNameWithoutExtension(file);
if (ext == ".adp")
{
adp.MotHeadReader(filepath);
adp.MsgPackWriter(filepath, json);
Console.Title = "Add Param Converter: " + Path.GetFileNameWithoutExtension(file);
if (ext == ".adp")
{
adp.AddParamReader(filepath);
adp. MsgPackWriter(filepath, json);
}
else if (ext == ".mp" || ext == ".json")
{
adp. MsgPackReader(filepath, ext == ".json");
adp.AddParamWriter(filepath);
}
}
else if (ext == ".mp" || ext == ".json")
{
adp.MsgPackReader(filepath, ext == ".json");
adp.MotHeadWriter(filepath);
}
adp.Dispose();
}
}
}
}
+10 -2
View File
@@ -22,8 +22,16 @@ namespace PD_Tool
ext = ext.ToLower();
Console.Title = "Bloom Converter: " + Path.GetFileNameWithoutExtension(file);
if (ext == ".blt") { blt.BLTReader(filepath); blt.TXTWriter(filepath); }
//else if (ext == ".txt") { blt.TXTReader(filepath); blt.BLTWriter(filepath); }
if (ext == ".blt")
{
blt.BLTReader(filepath);
blt.TXTWriter(filepath);
}
/*else if (ext == ".txt")
{
blt.TXTReader(filepath);
blt.BLTWriter(filepath);
}*/
}
}
}
+10 -2
View File
@@ -22,8 +22,16 @@ namespace PD_Tool
ext = ext.ToLower();
Console.Title = "Color Correction Converter: " + Path.GetFileNameWithoutExtension(file);
if (ext == ".cct") { cct.CCTReader(filepath); cct.TXTWriter(filepath); }
//else if (ext == ".txt") { cct.TXTReader(filepath); cct.BLTWriter(filepath); }
if (ext == ".cct")
{
cct.CCTReader(filepath);
cct.TXTWriter(filepath);
}
/*else if (ext == ".txt")
{
blt.TXTReader(filepath);
blt.CCTWriter(filepath);
}*/
}
}
}
+1 -1
View File
@@ -16,7 +16,7 @@ namespace PD_Tool
if (file.EndsWith(".mp" )) { mp = false; break; }
else if (file.EndsWith(".json")) { mp = false; break; }
uint num2 = (uint)(DateTime.Now.Ticks / 10000000);
uint num2 = (uint)((DateTime.Now.Ticks - 621355968000000000) / 10000000);
string[] file_split;
string filepath, ext;
KKdMainLib.DataBank db;
+12 -12
View File
@@ -24,9 +24,9 @@ namespace PD_Tool
Program.ConsoleDesign(true);
Program.ConsoleDesign(" Choose type of exporting file:");
Program.ConsoleDesign(false);
Program.ConsoleDesign("1. F/FT PS3/PS4/PSVita");
Program.ConsoleDesign("2. F2 PS3/PSVita");
Program.ConsoleDesign("3. X PS4/PSVita");
Program.ConsoleDesign("1. F/AFT/FT/M39 PS3/PS4/PSV/AC/NSW");
Program.ConsoleDesign("2. F2 PS3/PSV");
Program.ConsoleDesign("3. X PS4/PSV");
if ( mp && !json) Program.ConsoleDesign("9. MessagePack");
if (_json && json) Program.ConsoleDesign("9. JSON");
Program.ConsoleDesign(false);
@@ -35,27 +35,27 @@ namespace PD_Tool
choose = Console.ReadLine().ToUpper();
Format format = Format.NULL;
if (choose == "1") format = Format.F ;
else if (choose == "2") format = Format.F2LE;
else if (choose == "3") format = Format.X ;
if (choose == "1") format = Format.F ;
else if (choose == "2") format = Format.F2;
else if (choose == "3") format = Format.X ;
else if (choose == "9" && mp && _json) format = Format.NULL;
else return;
string filepath, ext;
KKdDEX DEX;
KKdDEX dex;
foreach (string file in fileNames)
using (DEX = new KKdDEX())
using (dex = new KKdDEX())
{
ext = Path.GetExtension(file);
filepath = file.Replace(ext, "");
ext = ext.ToLower();
Console.Title = "DEX Converter: " + Path.GetFileNameWithoutExtension(file);
if (ext == ".bin" || ext == ".dex") DEX. DEXReader(filepath, ext );
else DEX.MsgPackReader(filepath, json);
if (ext == ".bin" || ext == ".dex") dex. DEXReader(filepath, ext );
else dex.MsgPackReader(filepath, json);
if (format > Format.NULL) DEX. DEXWriter(filepath, format);
else DEX.MsgPackWriter(filepath, json);
if (format > Format.NULL) dex. DEXWriter(filepath, format);
else dex.MsgPackWriter(filepath, json);
}
}
}
+10 -2
View File
@@ -22,8 +22,16 @@ namespace PD_Tool
ext = ext.ToLower();
Console.Title = "DOF Converter: " + Path.GetFileNameWithoutExtension(file);
if (ext == ".dft") { dft.DFTReader(filepath); dft.TXTWriter(filepath); }
//else if (ext == ".txt") { dft.TXTReader(filepath); dft.DFTWriter(filepath); }
if (ext == ".dft")
{
dft.DFTReader(filepath);
dft.TXTWriter(filepath);
}
/*else if (ext == ".txt")
{
dft.TXTReader(filepath);
dft.DFTWriter(filepath);
}*/
}
}
}
+1 -1
View File
@@ -64,7 +64,7 @@ namespace PD_Tool
Console.WriteLine();
choose = Console.ReadLine().ToUpper();
if (choose == "2" || choose == "4") farc.FARCType |= KKdFARC.Type.GZip;
if (choose == "3" || choose == "4") farc.FARCType |= KKdFARC.Type.ECB ;
if (choose == "3" || choose == "4") farc.FARCType |= KKdFARC.Type.Enc ;
}
else if (choose == "R") return;
else farc.Signature = KKdFARC.Farc.FArC;
+10 -2
View File
@@ -22,8 +22,16 @@ namespace PD_Tool
ext = ext.ToLower();
Console.Title = "Light Converter: " + Path.GetFileNameWithoutExtension(file);
if (ext == ".lit") { lit.LITReader(filepath); lit.TXTWriter(filepath); }
//else if (ext == ".txt") { lit.TXTReader(filepath); lit.LITWriter(filepath); }
if (ext == ".lit")
{
lit.LITReader(filepath);
lit.TXTWriter(filepath);
}
/*else if (ext == ".txt")
{
lit.TXTReader(filepath);
lit.LITWriter(filepath);
}*/
}
}
}
+16 -17
View File
@@ -15,25 +15,24 @@ namespace PD_Tool
string filepath, ext;
MotHead mhd;
foreach (string file in fileNames)
{
mhd = new MotHead();
ext = Path.GetExtension(file);
filepath = file.Replace(ext, "");
ext = ext.ToLower();
using (mhd = new MotHead())
{
ext = Path.GetExtension(file);
filepath = file.Replace(ext, "");
ext = ext.ToLower();
Console.Title = "MotHead Converter: " + Path.GetFileNameWithoutExtension(file);
if (ext == ".bin")
{
mhd.MotHeadReader(filepath);
mhd.MsgPackWriter(filepath, json);
Console.Title = "MotHead Converter: " + Path.GetFileNameWithoutExtension(file);
if (ext == ".bin")
{
mhd.MotHeadReader(filepath);
mhd.MsgPackWriter(filepath, json);
}
else if (ext == ".mp" || ext == ".json")
{
mhd.MsgPackReader(filepath, ext == ".json");
mhd.MotHeadWriter(filepath);
}
}
else if (ext == ".mp" || ext == ".json")
{
mhd.MsgPackReader(filepath, ext == ".json");
mhd.MotHeadWriter(filepath);
}
mhd.Dispose();
}
}
}
}
+72
View File
@@ -24,6 +24,78 @@ namespace PD_Tool
Console.Title = "MOT Converter: " + Path.GetFileNameWithoutExtension(file);
if (ext == ".bin")
{
/*KKdBaseLib.KKdDict<int, int> a = KKdBaseLib.KKdDict<int, int>.New;
while (true)
{
string b = Console.ReadLine();
if (b == "") break;
string[] c = b.Split(' ');
if (c.Length == 2)
a.Add(int.Parse(c[0]), int.Parse(c[1]));
}
a.Add(0, 1);
a.Add(1648, 3);
a.Add(2139, 2);
a.Add(5416, 4);
a.Add(6589, 5);
a.Add(7783, 1);
mot.MOTReader(filepath);
Mot.KeySet[] oks = mot.MOT[1].KeySet.V;
Mot.MotHeader mh = mot.MOT[1];
mh.KeySet.V = new Mot.KeySet[mh.KeySet.V.Length];
Mot.KeySet[] ok = mh.KeySet.V;
for (int i = 0; i < mh.KeySet.V.Length; i++)
{
KKdBaseLib.Interpolation.PDI[] pdi = new KKdBaseLib.Interpolation.PDI[mot.MOT.Length];
for (int h = 0; h < mot.MOT.Length; h++)
pdi[h] = new KKdBaseLib.Interpolation.PDI(mot.MOT[h].KeySet.V[i].Keys);
KKdBaseLib.KKdList<KKdBaseLib.KFT2> kf = KKdBaseLib.KKdList<KKdBaseLib.KFT2>.New;
bool old = false;
KKdBaseLib.KFT2 v = default;
KKdBaseLib.KFT2 ov = default;
int k = -1;
for (int h = 0; h < mh.FrameCount; h++)
{
if (a.ContainsKey(h))
k = a[h];
else if (k == -1) continue;
ref KKdBaseLib.Interpolation.PDI pdil = ref pdi[k];
v.F = h;
v.V = pdil.SetFrame(h);
if (h == 0 || ov.V != v.V)
{
if (old) { old = false; kf.Add(ov); }
kf.Add(v);
}
else old = true;
ov = v;
}
kf.Capacity = kf.Count;
ok[i].Keys = kf.ToArray();
ok[i].Type = Mot.KeySetType.Linear;
for (int h = 0; h < mot.MOT.Length; h++)
pdi[h] = default;
}
for (int i = 0; i < mh.KeySet.V.Length; i++)
{
if (ok[i].Keys.Length != 1) continue;
if (ok[i].Keys[0].V == 0)
{
ok[i].Keys[0].F = 0;
ok[i].Type = Mot.KeySetType.None;
}
else ok[i].Type = Mot.KeySetType.Static;
}
mot.MOT[1].KeySet.V = ok;
Array.Resize(ref mot.MOT, 2);
mot.MOTWriter(filepath + "_mod");*/
mot. MOTReader(filepath);
mot.MsgPackWriter(filepath, json);
}
+1 -1
View File
@@ -23,7 +23,7 @@ namespace PD_Tool
Console.Title = "STR Converter: " + Path.GetFileNameWithoutExtension(file);
if (ext == ".str" || ext == ".bin")
{
str.STRReader (filepath, ext);
str.STRReader (filepath, ext);
str.MsgPackWriter(filepath, json);
}
else if (ext == ".json" || ext == ".mp")
+19 -3
View File
@@ -1,5 +1,5 @@
# PD_Tool
A simple tool for working with Project Diva AC/DT/F/AFT/F2/X/FT files
A simple tool for working with Project Diva AC/DT/F/AFT/F2/X/FT/M39 files
# Dependencies:
+ `.NET Standard 2.0`: Required to build KKdBaseLib, KKdMainLib and KKdSoundLib C# projects.
@@ -12,15 +12,17 @@ A simple tool for working with Project Diva AC/DT/F/AFT/F2/X/FT files
- `Aet DB Converter`
- `Auth DB Converter`
- `Spr DB Converter`
- `AC/DT/F/AFT/FT Converting Tools`
- `AC/DT/F/AFT Converting Tools`
- `A3DA Converter`
- `AET Converter`
- `DataBank Converter`
- `DEX Converter`
- `DIVA Converter`
- `MotHead Converter`
- `MOT Converter`
- `Table Converter`
- `STR Converter`
- `F/F2/X/FT Converting Tools`
- `F/F2/FT Converting Tools`
- `A3DA Converter`
- `Bloom Converter`
- `Color Correction Converter`
@@ -29,3 +31,17 @@ A simple tool for working with Project Diva AC/DT/F/AFT/F2/X/FT files
- `Light Converter`
- `STR Converter`
- `VAG Converter`
- `X/XHD Converting Tools`
- `A3DA Converter`
- `DEX Converter`
- `VAG Converter`
- `FT/M39 Converting Tools`
- `A3DA Converter`
- `AddParam Converter`
- `AET Converter`
- `DEX Converter`
- `DIVA Converter`
- `MotHead Converter`
- `MOT Converter`
- `Table Converter`
- `STR Converter`