Compare commits

...
Author SHA1 Message Date
korenkonder a1c18941a1 Patch for release v0.4.10.16 2023-05-29 22:53:10 +03:00
korenkonder c95a116297 Release v0.4.10.16
JSON
2023-05-29 12:49:13 +03:00
korenkonder 139fbf307f Release v0.4.10.15
MotHead
2023-05-18 18:06:08 +03:00
korenkonder 1d5c88f39f Release v0.4.10.14
A3DA
2022-08-11 00:07:13 +03:00
korenkonder 786dca23fd Release v0.4.10.13
A3DA
2022-05-30 22:28:33 +03:00
korenkonder 7046e3cfc2 Release v0.4.10.12
A3DA, MotHead
2022-05-12 10:43:46 +03:00
korenkonder ec5f8c803e Release v0.4.10.11
A3DA, DIVAFILE, MotHead
2022-03-10 21:29:09 +03:00
korenkonder 310d637072 Release v0.4.10.10
DEX, MotHead
2022-01-13 14:44:23 +03:00
korenkonder 4d05f6a878 Release v0.4.10.9
A3DA
2021-12-22 16:37:31 +03:00
korenkonder 35d7712d8f Release v0.4.10.8
A3DA, MotHead
2021-11-09 14:34:27 +03:00
korenkonder df92e13d2c Release v0.4.10.7
A3DA, AuthDB
2021-10-03 18:32:46 +03:00
korenkonder 803f64e333 Release v0.4.10.6
A3DA
2021-09-26 19:16:56 +03:00
korenkonder a7e14e22ad Release v0.4.10.5
A3DA
2021-09-17 21:00:31 +03:00
korenkonder d94f45870d Release v0.4.10.4
A3DA
2021-05-26 22:43:16 +03:00
korenkonder 2b46e0f4bd Release v0.4.10.3
A3DA
2021-05-24 04:02:18 +03:00
korenkonder f1547f78b2 Release v0.4.10.2.1
A3DA
2021-05-23 21:11:34 +03:00
korenkonder 6c35326dda v0.4.10.2
A3DA
2021-05-22 14:13:54 +03:00
korenkonder 30a51f6bc4 Release v0.4.10.1
A3DA
2021-04-30 03:10:49 +03:00
korenkonder 54af060c13 Release v0.4.10.0
A3DA, AET, FARC
2021-04-29 07:41:23 +03:00
korenkonder 84fd22b548 Release v0.4.9.11
A3DA, Light
2021-03-11 08:59:44 +03:00
korenkonder 798b055756 Update DataBank.cs 2021-01-03 08:42:54 +03:00
korenkonder 30de413922 Release v0.4.9.10
A3DA, Bloom, Color Correction DataBank, DOF, Light
2021-01-03 06:22:48 +03:00
korenkonder 85a22ea0f7 Release v0.4.9.9
A3DA, Bloom, Color Correction, DOF, Light, MotHead
2020-11-19 23:22:25 +03:00
korenkonder 99bb4e3571 Release v0.4.9.8.1 (Hotfix)
Library fixes
2020-09-16 05:40:23 +03:00
korenkonder 036863a5a6 Update README.md 2020-09-16 04:11:30 +03:00
korenkonder b6017d1d70 Release v0.4.9.8
A3DA, Bloom, Color Correction, DOF, Light
2020-09-16 04:07:06 +03:00
korenkonder 5de5d23e94 Release 0.4.9.7
Library fixes
2020-08-21 02:33:45 +03:00
korenkonder df0cb255fc Release v0.4.9.6
DEX
2020-08-13 06:57:46 +03:00
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
Kuji Kitamura e75c7e6742 Release v0.4.9.2 2020-05-17 14:57:58 +03:00
97 changed files with 9943 additions and 5404 deletions
+33 -8
View File
@@ -1,4 +1,4 @@
using KKdBaseLib.Auth3D;
using KKdBaseLib.Auth3D;
namespace KKdBaseLib
{
@@ -11,16 +11,41 @@ namespace KKdBaseLib
public EPType EPTypePost;
public float FrameDelta;
public float ValueDelta;
public int Unk1C;
public int Unk20;
public int Unk24;
public int Unk28;
public int Unk2C;
public int Unk30;
public int Unk34;
public int Padding;
public long FirstKey;
public long SecondKey;
public long AfterLastKey;
public long Length;
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;
FirstKey = SecondKey = AfterLastKey = Padding = 0;
Length = DataOffset = 0; Keys = null;
MaxFrames = k.Max ?? 0;
if (k.Type > KeyType.Static && k.Keys != null && k.Keys.Length > 1)
{
Type = k.Type;
Length = k.Keys.Length;
Keys = k.Keys;
EPTypePost = k.EPTypePost;
EPTypePre = k.EPTypePre;
FrameDelta = k.Keys[Length - 1].F - k.Keys[0].F;
ValueDelta = k.Keys[Length - 1].V - k.Keys[0].V;
}
else
{
Type = k.Type;
Value = k.Type > 0 ? k.Value : 0.0f;
EPTypePost = 0;
EPTypePre = 0;
FrameDelta = 0;
ValueDelta = Value;
}
}
}
}
+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 { }
}
+10 -10
View File
@@ -1,4 +1,4 @@
//Original: AetSet.bt Version: 5.0 by samyuu
//Original: AetSet.bt Version: 5.0 by samyuu
namespace KKdBaseLib.Auth2D
{
@@ -16,10 +16,10 @@ namespace KKdBaseLib.Auth2D
public uint BackColor;
public uint Width;
public uint Height;
public Pointer<Vector2<CountPointer<KFT2>>> Camera;
public CountPointer<Composition> Compositions;
public CountPointer<Video > Videos;
public CountPointer<Audio > Audios;
public Pointer<Vec2<CountPointer<KFT2>>> Camera;
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;
+126 -138
View File
@@ -1,7 +1,8 @@
namespace KKdBaseLib.Auth3D
namespace KKdBaseLib.Auth3D
{
public struct Data
{
public string[] Auth2D;
public string[] Motion;
public string[] ObjectList;
public string[] ObjectHRCList;
@@ -9,9 +10,11 @@
public _ _;
public DOF? DOF;
public Fog[] Fog;
public Chara[] Chara;
public Curve[] Curve;
public Event[] Event;
public Light[] Light;
public Point[] Point;
public Object[] Object;
public Ambient[] Ambient;
public ObjectHRC[] ObjectHRC;
@@ -20,8 +23,6 @@
public PlayControl PlayControl;
public PostProcess? PostProcess;
public MaterialList[] MaterialList;
public ModelTransform[] Chara;
public ModelTransform[] Point;
public CameraAuxiliary? CameraAuxiliary;
}
@@ -36,17 +37,18 @@
public struct Ambient
{
public string Name;
public Vector4<Key> LightDiffuse;
public Vector4<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? ExposureRate;
public Key? AutoExposure;
}
public struct CameraRoot
@@ -57,17 +59,23 @@
public struct ViewPoint
{
public bool FOVHorizontal;
public float? Aspect;
public float? CameraApertureH;
public float? CameraApertureW;
public Key FOV;
public Key Roll;
public Key FocalLength;
public bool FOVIsHorizontal;
public float Aspect;
public float CameraApertureH;
public float CameraApertureW;
public Key? FocalLength;
public Key? FOV;
public Key? Roll;
public ModelTransform MT;
}
}
public struct Chara
{
public ModelTransform MT;
public string Name;
}
public struct Curve
{
public string Name;
@@ -76,18 +84,17 @@
public struct DOF
{
public string Name;
public ModelTransform MT;
}
public struct Event
{
public int? Type;
public float? End;
public float? Begin;
public float? ClipEnd;
public float? ClipBegin;
public float? TimeRefScale;
public int Type;
public float End;
public float Begin;
public float ClipEnd;
public float ClipBegin;
public float TimeRefScale;
public string Name;
public string Param1;
public string Ref;
@@ -95,118 +102,87 @@
public struct Fog
{
public int? Id;
public Key End;
public Key Start;
public Key Density;
public Vector4<Key> Diffuse;
public int Id;
public Key? End;
public Key? Start;
public Key? Density;
public Vec4<Key?>? Color;
}
public enum CompressF16 : int
{
F32F32F32F32 = 0,
I16F16F32F32 = 1,
I16F16F16F16 = 2,
Type0 = 0,
Type1 = 1,
Type2 = 2,
}
public enum EPType : int
public enum EPType : int // Pre/Post Infinity
{
EP_1 = 1,
EP_2 = 2,
EP_3 = 3,
None = 0,
Linear = 1,
Cycle = 2,
CycleOffset = 3,
}
public enum KeyType : int
{
Null = 0,
Value = 1,
Lerp = 2,
None = 0,
Static = 1,
Linear = 2,
Hermite = 3,
Hold = 4,
}
public struct Key
{
public KeyType? Type;
public int Length;
public KeyType Type;
public int? BinOffset;
public EPType EPTypePre;
public EPType EPTypePost;
public float? Max;
public float? Value;
public RawD RawData;
public float Value;
public bool RawData;
public KFT3[] Keys;
public struct RawD
public Key(A3DAKey k)
{
public int KeyType;
public int ValueListSize;
public string ValueType;
public string[] ValueList;
}
Type = 0;
Value = 0;
BinOffset = null;
RawData = default;
Keys = null;
public static Vector3<A3DAKey> ToA3DAKey(Vector3< Key> k) =>
new Vector3<A3DAKey> { X = (A3DAKey)k.X, Y = (A3DAKey)k.Y, Z = (A3DAKey)k.Z };
public static Vector3< Key> ToKey (Vector3<A3DAKey> k) =>
new Vector3< 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;
EPTypePost = k.EPTypePost;
EPTypePre = k.EPTypePre;
Max = k.MaxFrames;
if (k.Length > 1)
{
key.Type = k.Type;
key.Length = (int)k.Length;
key.Keys = k.Keys;
Type = k.Type;
Keys = k.Keys;
}
else if (k.Length == 1)
{
key.Type = KeyType.Value;
key.Value = k.Keys[0].V;
Type = KeyType.Static;
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
{
public int? Id;
public string Name;
public int Id;
public string Type;
public Vector4<Key> Ambient;
public Vector4<Key> Diffuse;
public Vector4<Key> Specular;
public Vector4<Key> Incandescence;
public Key? ConeAngle;
public Key? Constant;
public Key? DropOff;
public Key? Far;
public Key? Intensity;
public Key? Linear;
public Key? Quadratic;
public Vec4<Key?>? Ambient;
public Vec4<Key?>? Diffuse;
public Vec4<Key?>? Specular;
public Vec4<Key?>? ToneCurve;
public ModelTransform Position;
public ModelTransform SpotDirection;
}
@@ -214,23 +190,21 @@
public struct MaterialList
{
public string Name;
public string HashName;
public Key GlowIntensity;
public Vector4<Key> BlendColor;
public Vector4<Key> Incandescence;
public Key? GlowIntensity;
public Vec4<Key?>? BlendColor;
public Vec4<Key?>? Incandescence;
}
public struct MObjectHRC
{
public string Name;
public Node[] Node;
public Vector3<float?> JointOrient;
public ObjectNode[] Node;
public Instance[] Instances;
public ModelTransform MT;
public struct Instance
{
public int? Shadow;
public bool Shadow;
public string Name;
public string UIDName;
public ModelTransform MT;
@@ -239,35 +213,30 @@
public struct ModelTransform
{
public bool Writed;
public int? BinOffset;
public Key Visibility;
public Vector3<Key> Rot;
public Vector3<Key> Scale;
public Vector3<Key> Trans;
}
public struct Node
{
public int? Parent;
public string Name;
public ModelTransform MT;
public Vec3<Key> Rot;
public Vec3<Key> Scale;
public Vec3<Key> Trans;
}
public struct Object
{
public int? MorphOffset;
public float PatOffset;
public float MorphOffset;
public string Name;
public string Pat;
public string Morph;
public string UIDName;
public string ParentName;
public string ParentNode;
public ModelTransform MT;
public TexturePattern[] TexPat;
public TextureTransform[] TexTrans;
public struct TexturePattern
{
public int? PatOffset;
public float PatOffset;
public string Pat;
public string Name;
}
@@ -275,40 +244,59 @@
public struct TextureTransform
{
public string Name;
public Key Rotate;
public Key RotateFrame;
public Vector2<Key> Offset;
public Vector2<Key> Repeat;
public Vector2<Key> Coverage;
public Vector2<Key> TranslateFrame;
public Key? Rotate;
public Key? RotateFrame;
public Key? OffsetU;
public Key? OffsetV;
public Key? RepeatU;
public Key? RepeatV;
public Key? CoverageU;
public Key? CoverageV;
public Key? TranslateFrameU;
public Key? TranslateFrameV;
}
}
public struct ObjectHRC
{
public int? Shadow;
public bool Shadow;
public string Name;
public string UIDName;
public Node[] Node;
public Vector3<float?> JointOrient;
public string ParentName;
public string ParentNode;
public ObjectNode[] Node;
}
public struct ObjectNode
{
public Vec3? JointOrient;
public int Parent;
public string Name;
public ModelTransform MT;
}
public struct PlayControl
{
public int Begin;
public float Begin;
public int? Div;
public int FPS;
public int? Offset;
public int Size;
public float FPS;
public float? Offset;
public float Size;
}
public struct Point
{
public ModelTransform MT;
public string Name;
}
public struct PostProcess
{
public Key LensFlare;
public Key LensGhost;
public Key LensShaft;
public Vector4<Key> Ambient;
public Vector4<Key> Diffuse;
public Vector4<Key> Specular;
public Key? LensFlare;
public Key? LensGhost;
public Key? LensShaft;
public Vec4<Key?>? Intensity;
public Vec4<Key?>? Radius;
public Vec4<Key?>? SceneFade;
}
}
-90
View File
@@ -1,90 +0,0 @@
//Original research by Samyuu
namespace KKdBaseLib
{
public static class DCC //Databank Checksum Calculator
{
private static readonly ushort[] ChecksumLookupTable = {
0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7,
0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF,
0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6,
0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE,
0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485,
0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D,
0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4,
0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC,
0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823,
0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B,
0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12,
0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A,
0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41,
0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49,
0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70,
0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78,
0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F,
0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067,
0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E,
0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256,
0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D,
0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C,
0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634,
0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB,
0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3,
0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A,
0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92,
0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9,
0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1,
0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8,
0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0,
};
public static ushort CalculateChecksum(this byte[] data)
{
ushort result = 0xFFFF;
for (int i = 0; i < data.Length; i++)
result = (ushort)(ChecksumLookupTable[(result >> 8) ^ data[i]] ^ (result << 8));
return result;
}
public static uint CalculateChecksumUInt(this byte[] data)
{
uint result = 0xFFFFFFFF;
for (int i = 0; i < data.Length; i++)
result = ChecksumLookupTable[(byte)(result >> 8) ^ data[i]] ^ (result << 8);
return result;
}
public static ulong CalculateChecksumULong(this byte[] data)
{
ulong result = 0xFFFFFFFFFFFFFFFF;
for (int i = 0; i < data.Length; i++)
result = ChecksumLookupTable[(byte)(result >> 8) ^ data[i]] ^ (result << 8);
return result;
}
public static unsafe ushort CalculateChecksum(byte* data, int length)
{
ushort result = 0xFFFF;
for (int i = 0; i < length; i++)
result = (ushort)(ChecksumLookupTable[(result >> 8) ^ data[i]] ^ (result << 8));
return result;
}
public static unsafe uint CalculateChecksumUInt(byte* data, int length)
{
uint result = 0xFFFFFFFF;
for (int i = 0; i < length; i++)
result = ChecksumLookupTable[(byte)(result >> 8) ^ data[i]] ^ (result << 8);
return result;
}
public static unsafe ulong CalculateChecksumULong(byte* data, int length)
{
ulong result = 0xFFFFFFFFFFFFFFFF;
for (int i = 0; i < length; i++)
result = ChecksumLookupTable[(byte)(result >> 8) ^ data[i]] ^ (result << 8);
return result;
}
}
}
+129 -48
View File
@@ -1,17 +1,13 @@
using System;
using System;
namespace KKdBaseLib
{
public static unsafe class Extensions
{
private const double RadPi = 180 / Math.PI;
public static double ToDegrees(this double val) => val * RadPi;
public static double ToRadians(this double val) => val / RadPi;
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 );
@@ -30,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 );
@@ -38,13 +33,10 @@ namespace KKdBaseLib
public static double Pow (this double x , double y ) => Math.Pow (x , y );
public static double Round(this double val , int d ) => Math.Round(val , d );
public static float ToDegrees(this float val) => (float)(val * RadPi);
public static float ToRadians(this float val) => (float)(val / RadPi);
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 ) ;
@@ -62,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 );
@@ -96,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; }
@@ -116,39 +126,73 @@ namespace KKdBaseLib
{ if (isBE) { 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 TI16(this byte[] arr)
{ short val; fixed (byte* ptr = arr) val = *( short*)ptr; return val; }
public static ushort TU16(this byte[] arr)
{ ushort val; fixed (byte* ptr = arr) val = *(ushort*)ptr; return val; }
public static int TI32(this byte[] arr)
{ int val; fixed (byte* ptr = arr) val = *( int*)ptr; return val; }
public static uint TU32(this byte[] arr)
{ uint val; fixed (byte* ptr = arr) val = *( uint*)ptr; return val; }
public static long TI64(this byte[] arr)
{ long val; fixed (byte* ptr = arr) val = *( long*)ptr; return val; }
public static ulong TU64(this byte[] arr)
{ ulong val; fixed (byte* ptr = arr) val = *( ulong*)ptr; return val; }
public static float TF32(this byte[] arr)
{ float val; fixed (byte* ptr = arr) val = *( float*)ptr; return val; }
public static double TF64(this byte[] arr)
{ double val; fixed (byte* ptr = arr) val = *(double*)ptr; return val; }
public static sbyte TI8(this byte[] arr, int offset = 0)
{ sbyte val; fixed (byte* ptr = arr) val = *( sbyte*)(ptr + offset); return val; }
public static byte TU8(this byte[] arr, int offset = 0)
{ byte val; fixed (byte* ptr = arr) val = *( byte*)(ptr + offset); return val; }
public static short TI16(this byte[] arr, int offset = 0)
{ short val; fixed (byte* ptr = arr) val = *( short*)(ptr + offset); return val; }
public static ushort TU16(this byte[] arr, int offset = 0)
{ ushort val; fixed (byte* ptr = arr) val = *(ushort*)(ptr + offset); return val; }
public static int TI24(this byte[] arr, int offset = 0)
{ int val; fixed (byte* ptr = arr) val = (*(ushort*)(ptr + offset))
| ((( short)*(sbyte*)(ptr + offset + 2)) << 16); return val; }
public static uint TU24(this byte[] arr, int offset = 0)
{ uint val; fixed (byte* ptr = arr) val = (*(ushort*)(ptr + offset))
| ((( uint)*( byte*)(ptr + offset + 2)) << 16); return val; }
public static int TI32(this byte[] arr, int offset = 0)
{ int val; fixed (byte* ptr = arr) val = *( int*)(ptr + offset); return val; }
public static uint TU32(this byte[] arr, int offset = 0)
{ uint val; fixed (byte* ptr = arr) val = *( uint*)(ptr + offset); return val; }
public static long TI64(this byte[] arr, int offset = 0)
{ long val; fixed (byte* ptr = arr) val = *( long*)(ptr + offset); return val; }
public static ulong TU64(this byte[] arr, int offset = 0)
{ ulong val; fixed (byte* ptr = arr) val = *( ulong*)(ptr + offset); return val; }
public static Half TF16(this byte[] arr, int offset = 0)
{ Half val; fixed (byte* ptr = arr) val = *( Half*)(ptr + offset); return val; }
public static float TF32(this byte[] arr, int offset = 0)
{ float val; fixed (byte* ptr = arr) val = *( float*)(ptr + offset); return val; }
public static double TF64(this byte[] arr, int offset = 0)
{ double val; fixed (byte* ptr = arr) val = *(double*)(ptr + offset); return val; }
public static Vec2 TV2 (this byte[] arr, int offset = 0)
{ Vec2 val; fixed (byte* ptr = arr) val = *( Vec2*)(ptr + offset); return val; }
public static Vec3 TV3 (this byte[] arr, int offset = 0)
{ Vec3 val; fixed (byte* ptr = arr) val = *( Vec3*)(ptr + offset); return val; }
public static Vec4 TV4 (this byte[] arr, int offset = 0)
{ Vec4 val; fixed (byte* ptr = arr) val = *( Vec4*)(ptr + offset); return val; }
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, 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, sbyte val, int offset = 0)
{ fixed (byte* ptr = arr) *( sbyte*)(ptr + offset) = val; }
public static void GBy(this byte[] arr, byte val, int offset = 0)
{ fixed (byte* ptr = arr) *( byte*)(ptr + offset) = 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 ?
@@ -203,7 +247,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)
@@ -237,7 +284,7 @@ namespace KKdBaseLib
public static string ToS(this ulong? d) => (d ?? default).ToString();
public static string ToS(this ulong d) => d.ToString();
public static string ToS(this float? d, int round) => (d ?? default).ToS(round);
public static string ToS(this float? d) => (d ?? default).ToS();
public static string ToS(this float? d) => (d ?? default).ToS(15);
public static string ToS(this float d, int round)
{ string s = (d.ToU32() & 0x80000000) != 0 ? "-" : ""; d = (d.ToU32() & 0x7FFFFFFF).ToF32();
return s + Math.Round(d, round).ToString().ToLower().Replace(NDS, "."); }
@@ -270,5 +317,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;
}
}
}
+96 -82
View File
@@ -1,4 +1,4 @@
namespace KKdBaseLib.F2
namespace KKdBaseLib.F2
{
public struct ENRS : INull
{
@@ -24,12 +24,10 @@
for (i = 0; i < ENRSCount; i++)
{
enrsEntry = default;
enrsEntry.Offset = ReadENRSValue(ref localPtr);
enrsEntry.Count = ReadENRSValue(ref localPtr);
enrsEntry.Size = ReadENRSValue(ref localPtr);
enrsEntry.Repeat = ReadENRSValue(ref localPtr);
if (i > 0) enrsEntry.Offset += Array[i - 1].Offset;
if (ReadENRSValue(ref localPtr, out enrsEntry.Offset)) return;
if (ReadENRSValue(ref localPtr, out enrsEntry.Count )) return;
if (ReadENRSValue(ref localPtr, out enrsEntry.Size )) return;
if (ReadENRSValue(ref localPtr, out enrsEntry.Repeat)) return;
if (enrsEntry.Repeat < 1) { enrsEntry.Sub = null; Array[i] = enrsEntry; continue; }
@@ -37,9 +35,8 @@
for (i0 = 0; i0 < enrsEntry.Count; i0++)
{
sub = default;
sub.Skip = ReadENRSValue(ref localPtr, out sub.Type);
sub.Reverse = ReadENRSValue(ref localPtr);
if (i0 > 0) sub.Skip += enrsEntry.Sub[i0 - 1].SizeSkip;
if (ReadENRSValue(ref localPtr, out sub.Skip, out sub.Type)) return;
if (ReadENRSValue(ref localPtr, out sub.Reverse )) return;
enrsEntry.Sub[i0] = sub;
if (enrsEntry.Sub[i0].Type == ENRSEntry.Type.Invalid) { Array = null; return; }
@@ -65,41 +62,41 @@
for (i = 0; i < Array.Length; i++)
{
ENRSEntry enrsEntry = Array[i];
WriteENRSValue(ref localPtr, i > 0 ? enrsEntry.Offset -
Array[i - 1].Offset : enrsEntry.Offset);
WriteENRSValue(ref localPtr, enrsEntry.Count > enrsEntry.Sub.Length ?
enrsEntry.Sub.Length : enrsEntry.Count);
WriteENRSValue(ref localPtr, enrsEntry.Size );
WriteENRSValue(ref localPtr, enrsEntry.Repeat);
if (WriteENRSValue(ref localPtr, enrsEntry.Offset)) goto End;
if (WriteENRSValue(ref localPtr, enrsEntry.Count )) goto End;
if (WriteENRSValue(ref localPtr, enrsEntry.Size )) goto End;
if (WriteENRSValue(ref localPtr, enrsEntry.Repeat)) goto End;
if (enrsEntry.Repeat < 1) continue;
for (i0 = 0; i0 < enrsEntry.Count && i0 < enrsEntry.Sub.Length; i0++)
{
if (enrsEntry.Sub[i0].Type < ENRSEntry.Type. WORD ||
enrsEntry.Sub[i0].Type > ENRSEntry.Type.QWORD)
if (enrsEntry.Sub[i0].Type > ENRSEntry.Type.QWORD)
return data;
WriteENRSValue(ref localPtr, i0 > 0 ? enrsEntry.Sub[i0].Skip -
enrsEntry.Sub[i0 - 1].SizeSkip : enrsEntry.Sub[i0].Skip, enrsEntry.Sub[i0].Type);
WriteENRSValue(ref localPtr, enrsEntry.Sub[i0].Reverse);
if (WriteENRSValue(ref localPtr, enrsEntry.Sub[i0].Skip, enrsEntry.Sub[i0].Type)) goto End;
if (WriteENRSValue(ref localPtr, enrsEntry.Sub[i0].Reverse )) goto End;
}
}
}
End:
return data;
}
private int length()
{
if (Array == null)
return 0;
int i, i0;
int length = 0x10;
for (i = 0; i < Array.Length; i++)
{
ENRSEntry enrs = Array[i];
length += GetSize(i > 0 ? enrs.Offset - Array[i - 1].Offset : enrs.Offset);
length += GetSize(enrs.Count );
length += GetSize(enrs.Size );
length += GetSize(enrs.Repeat);
if (GetSize(enrs.Offset, ref length)) goto End;
if (GetSize(enrs.Count , ref length)) goto End;
if (GetSize(enrs.Size , ref length)) goto End;
if (GetSize(enrs.Repeat, ref length)) goto End;
if (enrs.Repeat < 1) continue;
@@ -108,15 +105,24 @@
if (enrs.Sub[i0].Type < ENRSEntry.Type. WORD ||
enrs.Sub[i0].Type > ENRSEntry.Type.QWORD) return length.A(0x10);
length += GetSizeType(i0 > 0 ? enrs.Sub[i0].Skip -
enrs.Sub[i0 - 1].SizeSkip : enrs.Sub[i0].Skip);
length += GetSize(enrs.Sub[i0].Reverse);
if (GetSizeType(enrs.Sub[i0].Skip , ref length)) goto End;
if (GetSize (enrs.Sub[i0].Reverse, ref length)) goto End;
}
}
End:
return length.A(0x10);
static int GetSizeType(int val) => val < 0x00000010 ? 1 : val < 0x00001000 ? 2 : 4;
static int GetSize (int val) => val < 0x00000040 ? 1 : val < 0x00004000 ? 2 : 4;
static bool GetSizeType(int val, ref int length)
{
length += val < 0x00000010 ? 1 : val < 0x00001000 ? 2 : val < 0x10000000 ? 4 : 1;
return val >= 0x10000000;
}
static bool GetSize (int val, ref int length)
{
length += val < 0x00000040 ? 1 : val < 0x00004000 ? 2 : val < 0x40000000 ? 4 : 1;
return val >= 0x40000000;
}
}
/*private static KKdList<ENRS.SubENRS> Optimize(KKdList<ENRS.SubENRS> Sub)
@@ -138,73 +144,76 @@
[System.ThreadStatic] private static ENRSEntry.Value value;
private unsafe static int ReadENRSValue(ref byte* ptr, out ENRSEntry.Type type)
private unsafe static bool ReadENRSValue(ref byte* ptr, out int v, out ENRSEntry.Type type)
{
int V = *ptr & 0xF;
v = *ptr & 0xF;
type = (ENRSEntry. Type)((*ptr & 0x30) >> 4);
value = (ENRSEntry.Value)((*ptr & 0xC0) >> 6);
ptr++;
if (value == ENRSEntry.Value.Int32 )
{ V = (V << 24) | (ptr[0] << 16) | (ptr[1] << 8) | ptr[2]; ptr += 3; }
else if (value == ENRSEntry.Value.Int16 )
{ V = (V << 8) | ptr[0]; ptr += 1; }
else if (value == ENRSEntry.Value.Invalid) V = 0;
return V;
if (value == ENRSEntry.Value.Int32 ) v = (((((v << 8) | *ptr++) << 8) | *ptr++) << 8) | *ptr++;
else if (value == ENRSEntry.Value.Int16 ) v = (v << 8) | *ptr++;
else if (value == ENRSEntry.Value.Invalid) { v = 0; return true; }
return false;
}
private unsafe static int ReadENRSValue(ref byte* ptr)
private unsafe static bool ReadENRSValue(ref byte* ptr, out int v)
{
int V = *ptr & 0x3F;
v = *ptr & 0x3F;
value = (ENRSEntry.Value)((*ptr & 0xC0) >> 6);
ptr++;
if (value == ENRSEntry.Value.Int32 )
{ V = (V << 24) | (ptr[0] << 16) | (ptr[1] << 8) | ptr[2]; ptr += 3; }
else if (value == ENRSEntry.Value.Int16 )
{ V = (V << 8) | ptr[0]; ptr += 1; }
else if (value == ENRSEntry.Value.Invalid) V = 0;
return V;
if (value == ENRSEntry.Value.Int32 ) v = (((((v << 8) | *ptr++) << 8) | *ptr++) << 8) | *ptr++;
else if (value == ENRSEntry.Value.Int16 ) v = (v << 8) | *ptr++;
else if (value == ENRSEntry.Value.Invalid) { v = 0; return true; }
return false;
}
private unsafe static void WriteENRSValue(ref byte* ptr, int val, ENRSEntry.Type type)
private unsafe static bool WriteENRSValue(ref byte* ptr, int val, ENRSEntry.Type type)
{
value = ENRSEntry.Value.Invalid;
if (val < 0x00000040) value = ENRSEntry.Value.Int8 ;
else if (val < 0x00004000) value = ENRSEntry.Value.Int16;
else if (val < 0x40000000) value = ENRSEntry.Value.Int32;
*ptr = (byte)((((byte)value << 6) & 0xC0) | (((byte)type << 4) & 0x30));
if (val < 0x00000010)
{ *ptr |= (byte)( val & 0x0F); }
byte t = (byte)(((byte)type & 0x3) << 4);
if (val < 0x00000010)
*ptr++ = (byte)(((byte)ENRSEntry.Value.Int8 << 6) | t | ( val & 0xF));
else if (val < 0x00001000)
{ *ptr |= (byte)((val >> 8) & 0x0F); ptr++;
*ptr = (byte)( val & 0xFF); }
{
*ptr++ = (byte)(((byte)ENRSEntry.Value.Int16 << 6) | t | ((val >> 8) & 0xF));
*ptr++ = (byte)(val & 0xFF);
}
else if (val < 0x10000000)
{ *ptr |= (byte)((val >> 24) & 0x0F); ptr++;
*ptr = (byte)((val >> 16) & 0xFF); ptr++;
*ptr = (byte)((val >> 8) & 0xFF); ptr++;
*ptr = (byte)( val & 0xFF); }
ptr++;
{
*ptr++ = (byte)(((byte)ENRSEntry.Value.Int32 << 6) | t | ((val >> 24) & 0xF));
*ptr++ = (byte)((val >> 16) & 0xFF);
*ptr++ = (byte)((val >> 8) & 0xFF);
*ptr++ = (byte)( val & 0xFF);
}
else
{
*ptr++ = (byte)ENRSEntry.Value.Invalid << 6;
return true;
}
return false;
}
private unsafe static void WriteENRSValue(ref byte* ptr, int val)
private unsafe static bool WriteENRSValue(ref byte* ptr, int val)
{
value = ENRSEntry.Value.Invalid;
if (val < 0x00000040) value = ENRSEntry.Value.Int8 ;
else if (val < 0x00004000) value = ENRSEntry.Value.Int16;
else if (val < 0x40000000) value = ENRSEntry.Value.Int32;
*ptr = (byte)(((byte)value << 6) & 0xC0);
if (val < 0x00000040)
{ *ptr |= (byte)( val & 0x3F); }
if (val < 0x00000040)
*ptr++ = (byte)(((byte)ENRSEntry.Value.Int8 << 6) | ( val & 0x3F));
else if (val < 0x00004000)
{ *ptr |= (byte)((val >> 8) & 0x3F); ptr++;
*ptr = (byte)( val & 0xFF); }
{
*ptr++ = (byte)(((byte)ENRSEntry.Value.Int16 << 6) | ((val >> 8) & 0x3F));
*ptr++ = (byte)(val & 0xFF);
}
else if (val < 0x40000000)
{ *ptr |= (byte)((val >> 24) & 0x3F); ptr++;
*ptr = (byte)((val >> 16) & 0xFF); ptr++;
*ptr = (byte)((val >> 8) & 0xFF); ptr++;
*ptr = (byte)( val & 0xFF); }
ptr++;
{
*ptr++ = (byte)(((byte)ENRSEntry.Value.Int32 << 6) | ((val >> 24) & 0x3F));
*ptr++ = (byte)((val >> 16) & 0xFF);
*ptr++ = (byte)((val >> 8) & 0xFF);
*ptr++ = (byte)( val & 0xFF);
}
else
{
*ptr++ = (byte)ENRSEntry.Value.Invalid << 6;
return true;
}
return false;
}
public struct ENRSEntry
@@ -215,6 +224,9 @@
public int Repeat;
public SubENRSEntry[] Sub;
public ENRSEntry(int offset, int count, int size, int repeat)
{ Offset = offset; Count = count; Size = size; Repeat = repeat; Sub = new SubENRSEntry[count]; }
public enum Type : byte
{
WORD = 0b00,
@@ -237,16 +249,18 @@
public int Reverse;
public Type Type;
public SubENRSEntry(int skip, int reverse, Type type)
{ Skip = skip; Reverse = reverse; Type = type; }
public int SizeSkip => Skip + Reverse * (2 << (byte)Type);
public int Size => Reverse * (2 << (byte)Type);
public override string ToString() => "Skip: " + Skip +
"; Reverse: " + Reverse + "; Type: " + Type;
public override string ToString() =>
$"Skip: {Skip}; Reverse: {Reverse}; Type: {Type}";
}
public override string ToString() =>
"Offset: " + Offset + "; Count: " + Count + "; " +
"Size: " + Size + "; Repeat: " + Repeat;
$"Offset: {Offset}; Count: {Count}; Size: {Size}; Repeat: {Repeat}";
}
public override string ToString() =>
+12 -13
View File
@@ -1,23 +1,22 @@
namespace KKdBaseLib.F2
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 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);
}
}
+76 -38
View File
@@ -1,4 +1,4 @@
namespace KKdBaseLib.F2
namespace KKdBaseLib.F2
{
public struct POF : INull
{
@@ -12,72 +12,109 @@
public unsafe void Read(byte[] data, bool shiftX)
{
Value Val = 0;
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;
if (ReadPOFValue(ref l, out v)) break;
j++;
offset += v;
Offsets.Add(offset << bitShift);
}
Offsets.Capacity = j;
}
}
public unsafe byte[] Write(bool shiftX)
{
Offsets.Sort();
long offset = 0;
byte bitShift = (byte)(shiftX ? 3 : 2);
int max1 = 0x00100 >> bitShift;
int max2 = 0x10000 >> bitShift;
long j, k, o;
byte bitShift, v;
bitShift = (byte)(shiftX ? 3 : 2);
v = (byte)((1 << bitShift) - 1);
j = 0;
byte[] data = new byte[length(shiftX)];
fixed (byte* ptr = data)
{
byte Val = 0;
*(int*)ptr = length(shiftX);
byte* localPtr = ptr + 4;
byte* l = ptr + 4;
for (int i = 0; i < Offsets.Count; i++)
{
offset = Offsets[i];
if (i > 0) { offset -= Offsets[i - 1]; if (offset == 0) continue; }
o = Offsets[i];
if ((o & v) != 0)
{
WritePOFValue(ref l, 0x7FFFFFFF);
break;
}
offset >>= bitShift;
Val = (byte)(offset > max2 ? Value.Int32 : offset > max1 ? Value.Int16 : Value.Int8);
if (offset < max1) *localPtr = (byte)(Val | offset );
else if (offset < max2) { *localPtr = (byte)(Val | (offset >> 8)); localPtr++;
*localPtr = (byte) offset ; }
else { *localPtr = (byte)(Val | (offset >> 24)); localPtr++;
*localPtr = (byte) (offset >> 16) ; localPtr++;
*localPtr = (byte) (offset >> 8) ; localPtr++;
*localPtr = (byte) offset ; }
localPtr++;
k = o - j;
if (i > 0 & k == 0)
continue;
j = o;
o = k;
WritePOFValue(ref l, o >> bitShift);
}
}
return data;
}
[System.ThreadStatic] private static Value value;
private unsafe static bool ReadPOFValue(ref byte* ptr, out int v)
{
v = *ptr & 0x3F;
value = (Value)((*ptr & 0xC0) >> 6);
ptr++;
if (value == Value.Int32 ) v = (((((v << 8) | *ptr++) << 8) | *ptr++) << 8) | *ptr++;
else if (value == Value.Int16 ) v = (v << 8) | *ptr++;
else if (value == Value.Invalid) { v = 0; return true; }
return false;
}
private unsafe static bool WritePOFValue(ref byte* ptr, long val)
{
if (val < 0x00000040)
*ptr++ = (byte)(((byte)Value.Int8 << 6) | ( val & 0x3F));
else if (val < 0x00004000)
{
*ptr++ = (byte)(((byte)Value.Int16 << 6) | ((val >> 8) & 0x3F));
*ptr++ = (byte)(val & 0xFF);
}
else if (val < 0x40000000)
{
*ptr++ = (byte)(((byte)Value.Int32 << 6) | ((val >> 24) & 0x3F));
*ptr++ = (byte)((val >> 16) & 0xFF);
*ptr++ = (byte)((val >> 8) & 0xFF);
*ptr++ = (byte)( val & 0xFF);
}
else
{
*ptr++ = (byte)Value.Invalid << 6;
return true;
}
return false;
}
private int length(bool shiftX = false)
{
int length = 5;
if (Offsets.IsNull)
return 0;
int length = 4;
long offset = 0;
byte bitShift = (byte)(shiftX ? 3 : 2);
int max1 = 0x00100 >> bitShift;
int max2 = 0x10000 >> bitShift;
int max1 = 0x00000040;
int max2 = 0x00004000;
int max3 = 0x40000000;
for (int i = 0; i < Offsets.Count; i++)
{
offset = Offsets[i];
@@ -86,17 +123,18 @@
offset >>= bitShift;
if (offset < max1) length += 1;
else if (offset < max2) length += 2;
else length += 4;
else if (offset < max3) length += 4;
else length += 1;
}
return length;
}
public enum Value : byte
{
Invalid = 0b00000000,
Int8 = 0b01000000,
Int16 = 0b10000000,
Int32 = 0b11000000,
Invalid = 0b00,
Int8 = 0b01,
Int16 = 0b10,
Int32 = 0b11,
}
public override string ToString() =>
+18 -21
View File
@@ -1,4 +1,4 @@
namespace KKdBaseLib.F2
namespace KKdBaseLib.F2
{
public struct Struct
{
@@ -9,10 +9,8 @@
public ENRS ENRS;
public POF POF;
public int Length => length(false);
public int LengthX => length( true);
public int Depth => Header.Depth;
public uint Length => length(false);
public uint LengthX => length( true);
public bool HasPOF => POF .NotNull;
public bool HasENRS => ENRS.NotNull;
@@ -20,29 +18,28 @@
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;
if (HasPOF || HasENRS || HasSubStructs)
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" : "")}";
}
}
+7 -7
View File
@@ -1,4 +1,4 @@
namespace KKdBaseLib
namespace KKdBaseLib
{
public enum Format : byte
{
@@ -9,11 +9,11 @@
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,
}
}
+60 -34
View File
@@ -1,70 +1,96 @@
using System;
using System;
namespace KKdBaseLib
{
public struct Half : IFormattable
{
private ushort _value;
private ushort value;
public static Half NaN => new Half { _value = 0x7FFF };
public static Half PositiveNaN => new Half { _value = 0x7FFF };
public static Half NegativeNaN => new Half { _value = 0xFFFF };
public static Half PositiveZero => new Half { _value = 0x0000 };
public static Half NegativeZero => new Half { _value = 0x8000 };
public static Half PositiveInfinity => new Half { _value = 0x7C00 };
public static Half NegativeInfinity => new Half { _value = 0xFC00 };
public static Half NaN => new Half { value = 0x7FFF };
public static Half PositiveNaN => new Half { value = 0x7FFF };
public static Half NegativeNaN => new Half { value = 0xFFFF };
public static Half PositiveZero => new Half { value = 0x0000 };
public static Half NegativeZero => new Half { value = 0x8000 };
public static Half PositiveInfinity => new Half { value = 0x7C00 };
public static Half NegativeInfinity => new Half { value = 0xFC00 };
public static explicit operator Half(ushort bits) => new Half() { _value = bits };
public static explicit operator Half(ushort bits) => new Half() { value = bits };
public static explicit operator ushort(Half bits) => bits._value;
public static explicit operator ushort(Half bits) => bits.value;
public static unsafe implicit operator float(Half h)
{
int sign = (h._value >> 15) & 0x001;
int exponent = ((h._value >> 10) & 0x01F) + 127 - 15;
int mantissa = h._value & 0x3FF;
int si32;
int sign = (h.value >> 15) & 0x001;
int exponent = (h.value >> 10) & 0x01F;
int mantissa = h.value & 0x3FF;
unchecked { si32 = sign != 0 ? (int)0x80000000 : 0x00000000; }
int si32 = (sign << 31) | (exponent << 23) | (mantissa << 13);
if (exponent == 0x1F) si32 |= 0x7F800000;
else if (exponent != 0x00) si32 |= (exponent - 15 + 127) << 23;
si32 |= mantissa << 13;
return *(float*)&si32;
}
public static unsafe explicit operator Half(float val)
{
int si32 = *(int*)&val;
ushort sign = (ushort)( (si32 >> 16) & 0x8000);
short exponent = ( short)(((si32 >> 23) & 0x00FF) - 127 + 15);
ushort mantissa = (ushort)( (si32 >> 13) & 0x03FF);
if ( si32 == 0x00000000) return new Half { value = 0x0000 };
else if ((uint)si32 == 0x80000000) return new Half { value = 0x8000 };
else
{
ushort sign = (ushort)((si32 >> 31) & 0x001);
ushort exponent = (ushort)((si32 >> 23) & 0x0FF);
ushort mantissa = (ushort)((si32 >> 13) & 0x3FF);
if (exponent < 0) { exponent = 0; mantissa = 0; }
else if (exponent > 30) exponent = 31;
return new Half { _value = (ushort)(sign | (exponent << 10) | mantissa) };
if (exponent == 0xFF) exponent = 31;
else if (exponent != 0x00)
{
exponent -= 127 - 15;
if (exponent < 0) exponent = mantissa = 0;
else if (exponent > 30) exponent = 31;
}
return new Half { value = (ushort)((sign << 15) | (exponent << 10) | mantissa) };
}
}
public static unsafe implicit operator double(Half h)
{
int sign = (h._value >> 15) & 0x001;
int exponent = ((h._value >> 10) & 0x01F) + 1023 - 15;
int mantissa = h._value & 0x3FF;
long si64;
long sign = (h.value >> 15) & 0x001;
long exponent = (h.value >> 10) & 0x01F;
long mantissa = h.value & 0x3FF;
unchecked { si64 = sign != 0 ? (long)0x8000000000000000 : 0x0000000000000000; }
long si64 = ((long)sign << 63) | ((long)exponent << 52) | ((long)mantissa << 42);
if (exponent == 0x1F) si64 |= 0x7FF0000000000000;
else if (exponent != 0x00) si64 |= (exponent - 15 + 1023) << 52;
si64 |= mantissa << 42;
return *(double*)&si64;
}
public static unsafe explicit operator Half(double val)
{
long si64 = *(long*)&val;
ushort sign = (ushort) ((si64 >> 48) & 0x8000);
short exponent = ( short)(((si64 >> 52) & 0x07FF) - 1023 + 15);
ushort mantissa = (ushort) ((si64 >> 42) & 0x03FF);
if ( si64 == 0x0000000000000000) return new Half { value = 0x0000 };
else if ((ulong)si64 == 0x8000000000000000) return new Half { value = 0x8000 };
else
{
ushort sign = (ushort)((si64 >> 63) & 0x001);
ushort exponent = (ushort)((si64 >> 52) & 0x7FF);
ushort mantissa = (ushort)((si64 >> 42) & 0x3FF);
if (exponent < 0) { exponent = 0; mantissa = 0; }
else if (exponent > 30) exponent = 31;
return new Half { _value = (ushort)(sign | (exponent << 10) | mantissa) };
if (exponent == 0x7FF) exponent = 31;
else if (exponent != 0x00)
{
exponent -= 1023 - 15;
if (exponent < 0) exponent = mantissa = 0;
else if (exponent > 30) exponent = 31;
}
return new Half { value = (ushort)((sign << 15) | (exponent << 10) | mantissa) };
}
}
public static Half operator - (Half a ) => new Half() { _value = (ushort)(a._value ^ 0x8000) };
public static Half operator - (Half a ) => new Half() { value = (ushort)(a.value ^ 0x8000) };
public static Half operator + (Half a, Half b) => (Half)((float)a + (float)b);
public static Half operator - (Half a, Half b) => (Half)((float)a - (float)b);
public static Half operator * (Half a, Half b) => (Half)((float)a * (float)b);
+1 -1
View File
@@ -1,4 +1,4 @@
namespace KKdBaseLib
namespace KKdBaseLib
{
public interface IKF
{
+105 -99
View File
@@ -1,50 +1,49 @@
using KKdBaseLib.Auth3D;
using KKdBaseLib.Auth3D;
namespace KKdBaseLib.Interpolation
{
public struct A3DAI //A3DA Interpolation
public class A3DAI : IInterpolation<float>, System.IDisposable // A3DA Interpolation
{
private A3DAKey a3daKey;
private float f;
private float last;
private float t;
private float v;
private float df;
private float @if;
private float rf;
private float lastTime;
private KFT3 firstKey;
private KFT3 lastKey;
public float InterpolationFramerate { get => @if; set { @if = value; df = @if / rf; } }
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 Value => last;
public bool IsNull => a3daKey.Keys == null ? true : a3daKey.Length < 1;
public bool NotNull => a3daKey.Keys == null ? false : a3daKey.Length > 0;
public float Time => t;
public float Value => v;
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)
{
lastTime = 0;
a3daKey = (A3DAKey)key; f = -1; df = last = rf = @if = 0;
a3daKey = new A3DAKey(key); f = -1; df = @if = rf = t = v = 0;
@if = a3daFramerate;
firstKey = lastKey = default;
RequestedFramerate = requestedFramerate;
f = -df;
ResetFrameCount();
if (key.Keys != null && key.Length > 0)
if (key.Keys != null && key.Keys.Length > 0)
{
firstKey = key.Keys[0];
lastKey = key.Keys[key.Length - 1];
lastKey = key.Keys[key.Keys.Length - 1];
}
}
public A3DAI(A3DAKey key, float a3daFramerate = 60, float requestedFramerate = 60)
{
lastTime = 0;
a3daKey = key; f = -1; df = last = rf = @if = 0;
t = 0;
a3daKey = key; f = -1; df = v = rf = @if = 0;
@if = a3daFramerate;
firstKey = lastKey = default;
RequestedFramerate = requestedFramerate;
@@ -60,130 +59,137 @@ namespace KKdBaseLib.Interpolation
public float SetTime(float time)
{
if ((int)a3daKey.Type < 0 || (int)a3daKey.Type > 4) return 0.0f;
else if ((int)a3daKey.Type < 2) return a3daKey.Value;
else if (a3daKey.Length < 1) return 0.0f;
lastTime = time;
t = time;
f = time * @if;
last = Interpolate(f);
return last;
int type = (int)a3daKey.Type;
if (type < 0 || type > 4) v = 0.0f;
else if (type < 2) v = a3daKey.Value;
else if (a3daKey.Length < 1) v = 0.0f;
else v = Interpolate(f);
return v;
}
public float SetFrame(float frame)
{
if ((int)a3daKey.Type < 0 || (int)a3daKey.Type > 4) return 0.0f;
else if ((int)a3daKey.Type < 2) return a3daKey.Value;
else if (a3daKey.Length < 1) return 0.0f;
lastTime = frame / rf;
t = frame / rf;
f = frame * df;
last = Interpolate(f);
return last;
int type = (int)a3daKey.Type;
if (type < 0 || type > 4) v = 0.0f;
else if (type < 2) v = a3daKey.Value;
else if (a3daKey.Length < 1) v = 0.0f;
else v = Interpolate(f);
return v;
}
public float NextFrame(float time)
{
if ((int)a3daKey.Type < 0 || (int)a3daKey.Type > 4) return 0.0f;
else if ((int)a3daKey.Type < 2) return a3daKey.Value;
else if (a3daKey.Length < 1) return 0.0f;
t += time;
f = t * @if;
lastTime += time;
f = lastTime * @if;
last = Interpolate(f);
return last;
int type = (int)a3daKey.Type;
if (type < 0 || type > 4) v = 0.0f;
else if (type < 2) v = a3daKey.Value;
else if (a3daKey.Length < 1) v = 0.0f;
else v = Interpolate(f);
return v;
}
public float NextFrame()
{
if ((int)a3daKey.Type < 0 || (int)a3daKey.Type > 4) return 0.0f;
else if ((int)a3daKey.Type < 2) return a3daKey.Value;
else if (a3daKey.Length < 1) return 0.0f;
f += df;
lastTime = f / @if;
last = Interpolate(f);
return last;
t = f / @if;
int type = (int)a3daKey.Type;
if (type < 0 || type > 4) v = 0.0f;
else if (type < 2) v = a3daKey.Value;
else if (a3daKey.Length < 1) v = 0.0f;
else v = Interpolate(f);
return v;
}
private float Interpolate(float frame)
{
float df = 0;
float ep = 0;
float f = (int)frame;
if (f < firstKey.F)
if (frame < firstKey.F)
{
if (a3daKey.EPTypePost < EPType.EP_1 || a3daKey.EPTypePost > EPType.EP_3) return firstKey.V;
if (a3daKey.EPTypePost < EPType.Linear || a3daKey.EPTypePost > EPType.CycleOffset)
return firstKey.V;
df = firstKey.F - frame;
if (a3daKey.EPTypePre == EPType.EP_1) return firstKey.V - df * firstKey.T1;
float df = firstKey.F - frame;
if (a3daKey.EPTypePre == EPType.Linear)
return firstKey.V - df * firstKey.T1;
frame = lastKey.F - df % a3daKey.FrameDelta;
f = (int)frame;
if (a3daKey.EPTypePre == EPType.EP_3)
{
ep = df / a3daKey.FrameDelta;
ep = (ep > 0 && ep != (int)ep) ? (ep - (int)ep > 0 ? 1 : 0) : ep;
ep = -(ep + 1) * a3daKey.ValueDelta;
}
if (a3daKey.EPTypePre == EPType.CycleOffset)
ep = -(float)((int)(df / a3daKey.FrameDelta) + 1) * a3daKey.ValueDelta;
}
else if (f >= lastKey.F)
else if (frame >= lastKey.F)
{
if (a3daKey.EPTypePost < EPType.EP_1 || a3daKey.EPTypePost > EPType.EP_3) return lastKey.V;
if (a3daKey.EPTypePost < EPType.Linear || a3daKey.EPTypePost > EPType.CycleOffset)
return lastKey.V;
df = frame - lastKey.F;
if (a3daKey.EPTypePost == EPType.EP_1) return lastKey.V + df * lastKey.T2;
float df = frame - lastKey.F;
if (a3daKey.EPTypePost == EPType.Linear)
return lastKey.V + df * lastKey.T2;
frame = firstKey.F + df % a3daKey.FrameDelta;
f = (int)frame;
if (a3daKey.EPTypePost == EPType.EP_3)
{
ep = df / a3daKey.FrameDelta;
ep = (ep > 0 && ep != (int)ep) ? (ep - (int)ep > 0 ? 1 : 0) : ep;
ep = (ep + 1) * a3daKey.ValueDelta;
}
if (a3daKey.EPTypePost == EPType.CycleOffset)
ep = (float)((int)(df / a3daKey.FrameDelta) + 1) * a3daKey.ValueDelta;
}
if (f <= firstKey.F) return firstKey.V + ep;
else if (f >= lastKey.F) return lastKey.V + ep;
KFT3 c, n;
long key = 0;
long length = a3daKey.Length;
long temp;
while (length > 0)
if (f > a3daKey.Keys[key + (temp = length >> 1)].F)
{
key += temp + 1;
length -= temp + 1;
}
else length = temp;
ref KFT3 c = ref a3daKey.Keys[key - 1];
ref KFT3 n = ref a3daKey.Keys[key];
float result;
if (frame > c.F && frame < n.F)
unsafe
{
if (a3daKey.Type == KeyType.Lerp)
fixed (KFT3* ptr = a3daKey.Keys)
{
float t = (frame - c.F) / (n.F - c.F);
result = (1 - t) * c.V + t * n.V;
long length = a3daKey.Length;
long temp;
while (length > 0)
if (frame >= ptr[key + (temp = length >> 1)].F)
{
key += temp + 1;
length -= temp + 1;
}
else length = temp;
c = ptr[key - 1];
n = ptr[key];
}
else if (a3daKey.Type == KeyType.Hermite)
{
float t = (frame - c.F) / (n.F - c.F);
float t_2 = (1 - t) * (1 - t);
result = t_2 * c.V * (1 + 2 * t) + (t * n.V * (3 - 2 * t) +
(t_2 * c.T2 + t * (t - 1) * n.T1) * (n.F - c.F)) * t;
}
else result = c.V;
}
else result = frame > c.F ? n.V : c.V;
return result + ep;
float v;
if (frame <= c.F || frame >= n.F)
v = frame > c.F ? n.V : c.V;
else if (a3daKey.Type == KeyType.Linear)
{
float t = (frame - c.F) / (n.F - c.F);
v = (1.0f - t) * c.V + t * n.V;
}
else if (a3daKey.Type == KeyType.Hermite)
{
float df = f - c.F;
float t = df / (n.F - c.F);
float t_1 = t - 1.0f;
return c.V + t * t * (3.0f - 2.0f * t) * (n.V - c.V) + (t_1 * c.T2 + t * n.T1) * df * t_1;
}
else v = c.V;
return v + ep;
}
public void ResetFrameCount() => f = -df;
public void ResetFrameCount() { f = -df; t = f / rf; }
public override string ToString() => $"Frame: {f}, Value: {last}";
public override string ToString() => $"F: {f}; T: {t}; V: {v}";
public void Dispose()
{
a3daKey.Keys = null;
a3daKey = default;
f = t = v = df = @if = rf = default;
firstKey = lastKey = default;
}
}
}
+9 -9
View File
@@ -1,17 +1,17 @@
namespace KKdBaseLib.Interpolation
namespace KKdBaseLib.Interpolation
{
public interface IInterpolation : INull
public interface IInterpolation<T> : INull
{
float RequestedFramerate { get; set; }
float InterpolationFramerate { get; set; }
float RequestedFramerate { get; set; }
float Frame { get; }
float Value { get; }
float Time { get; }
T Value { get; }
float SetTime (float time);
float SetFrame(float frame);
float NextFrame(float time);
float NextFrame();
T SetTime (float time);
T SetFrame(float frame);
T NextFrame(float time);
T NextFrame();
void ResetFrameCount();
}
}
+131
View File
@@ -0,0 +1,131 @@
namespace KKdBaseLib.Interpolation
{
public class MOTI : IInterpolation<float> // MOT Interpolation
{
private KFT2[] array;
private int length;
private float f;
private float t;
private float v;
private float df;
private float @if;
private float rf;
private KFT2 firstKey;
private KFT2 lastKey;
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 => array == null || array.Length < 1;
public bool NotNull => array != null && array.Length > 0;
public MOTI(KFT2[] array, float interpolationFramerate = 60, float requestedFramerate = 60)
{
length = 0;
this.array = array; f = -1; df = @if = rf = t = v = 0;
@if = interpolationFramerate;
firstKey = lastKey = default;
RequestedFramerate = requestedFramerate;
f = -df;
ResetFrameCount();
if (array != null && array.Length > 0)
{
firstKey = array[0];
lastKey = array[array.Length - 1];
length = array.Length;
}
}
public float SetTime(float time)
{
t = time;
f = time * @if;
if (array == null || length < 1) v = 0.0f;
else v = Interpolate(f);
return v;
}
public float SetFrame(float frame)
{
t = frame / rf;
f = frame * df;
if (array == null || length < 1) v = 0.0f;
else v = Interpolate(f);
return v;
}
public float NextFrame(float time)
{
t += time;
f = t * @if;
if (array == null || length < 1) v = 0.0f;
else v = Interpolate(f);
return v;
}
public float NextFrame()
{
f += df;
t = f / @if;
if (array == null || length < 1) v = 0.0f;
else v = Interpolate(f);
return v;
}
private float Interpolate(float frame)
{
if (frame <= firstKey.F) return firstKey.V;
else if (frame >= lastKey.F) return lastKey.V;
KFT2 c, n;
unsafe
{
fixed (KFT2* ptr = array)
{
long key = 0;
long length = this.length;
long temp;
while (length > 0)
if (frame >= ptr[key + (temp = length >> 1)].F)
{
key += temp + 1;
length -= temp + 1;
}
else length = temp;
c = ptr[key - 1];
n = ptr[key];
}
}
float v;
if (frame <= c.F || frame >= n.F)
v = frame > c.F ? n.V : c.V;
else
{
float df = f - c.F;
float t = df / (n.F - c.F);
float t_1 = t - 1.0f;
return c.V + t * t * (3.0f - 2.0f * t) * (n.V - c.V) + (t_1 * c.T + t * n.T) * df * t_1;
}
return v;
}
public void ResetFrameCount() { f = -df; t = f / rf; }
public override string ToString() => $"F: {f}; T: {t}; V: {v}";
}
}
-118
View File
@@ -1,118 +0,0 @@
namespace KKdBaseLib.Interpolation
{
public struct PDI : IInterpolation //Project DIVA Interpolation
{
private KFT2[] array;
private float f;
private float last;
private float df;
private float @if;
private float rf;
private float lastTime;
private KFT2 firstKey;
private KFT2 lastKey;
public float InterpolationFramerate { get => @if; set { @if = value; df = @if / rf; } }
public float RequestedFramerate { get => rf; set { rf = value; df = @if / rf; } }
public float Frame => f;
public float Value => last;
public bool IsNull => array == null ? true : array.Length < 1;
public bool NotNull => array == null ? false : array.Length > 0;
public PDI(KFT2[] array, float interpolationFramerate = 60, float requestedFramerate = 60)
{
lastTime = 0;
this.array = array; f = -1; df = last = rf = @if = 0;
@if = interpolationFramerate;
firstKey = lastKey = default;
RequestedFramerate = requestedFramerate;
f = -df;
ResetFrameCount();
if (array != null && array.Length > 0)
{
firstKey = array[0];
lastKey = array[array.Length - 1];
}
}
public float SetTime(float time)
{
if (array == null || array.Length < 1) return 0;
lastTime = time;
f = time * @if;
last = Interpolate(f);
return last;
}
public float SetFrame(float frame)
{
if (array == null || array.Length < 1) return 0;
lastTime = frame / rf;
f = frame * df;
last = Interpolate(f);
return last;
}
public float NextFrame(float time)
{
if (array == null || array.Length < 1) return 0;
lastTime += time;
f = lastTime * @if;
last = Interpolate(f);
return last;
}
public float NextFrame()
{
if (array == null || array.Length < 1) return 0;
f += df;
lastTime = f / @if;
last = Interpolate(f);
return last;
}
private float Interpolate(float frame)
{
float f = (int)frame;
if (f <= firstKey.F) return firstKey.V;
else if (f >= lastKey.F) return lastKey.V;
int key = 0;
int length = array.Length;
int temp;
while (length > 0)
if (f > array[key + (temp = length >> 1)].F)
{
key += temp + 1;
length -= temp + 1;
}
else length = temp;
ref KFT2 c = ref array[key - 1];
ref KFT2 n = ref array[key];
float result;
if (frame > c.F && frame < n.F)
{
float t = (this.f - c.F) / (n.F - c.F);
float t_1 = t - 1;
result = (t_1 * 2 - 1) * (c.V - n.V) * t * t +
(t_1 * c.T + t * n.T) * t_1 * (this.f - c.F) + c.V;
}
else result = frame > c.F ? n.V : c.V;
return result;
}
public void ResetFrameCount() => f = -df;
public override string ToString() => $"Frame: {f}, Value: {last}";
}
}
+29 -9
View File
@@ -1,10 +1,10 @@
namespace KKdBaseLib
namespace KKdBaseLib
{
public struct KFT0 : IKF
{
public float F;
public KFT0(float F = 0)
public KFT0(float F)
{ this.F = F; }
public KFT0 ToT0() => this;
@@ -55,7 +55,10 @@
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() =>
@@ -67,7 +70,7 @@
new KFT3(F, V);
public IKF Check() =>
V == 0 ? (KFT0)this : (IKF)this;
V.ToU32() == 0x00000000 ? (KFT0)this : (IKF)this;
public override string ToString() => ToString(true, 7);
public string ToString(int round = 7, bool brackets = true) =>
@@ -109,7 +112,13 @@
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 @@
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 ?
@@ -126,7 +135,7 @@
new KFT3(F, V, T, T);
public IKF Check() =>
T == 0 ? (V == 0 ? (IKF)ToT0() : ToT1()) : this;
T.ToU32() == 0x00000000 ? (V.ToU32() == 0x00000000 ? (IKF)ToT0() : ToT1()) : this;
public override string ToString() => ToString(true, 7);
public string ToString(int round = 7, bool brackets = true) =>
@@ -169,7 +178,16 @@
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() =>
@@ -181,7 +199,9 @@
public KFT3 ToT3() => this;
public IKF Check() =>
T1 == 0 && T2 == 0 ? (V == 0 ? (IKF)(KFT0)this : (KFT1)this) : T1 == T2 ? (KFT2)this : (IKF)this;
T1.ToU32() == 0x00000000 && T2.ToU32() == 0x00000000
? (V.ToU32() == 0x00000000 ? (IKF)(KFT0)this : (KFT1)this)
: T1.ToU32() == T2.ToU32() ? (KFT2)this : (IKF)this;
public override string ToString() => ToString(true, 7);
public string ToString(int round = 7, bool brackets = true) =>
+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-2022</Copyright>
<Description>A base library</Description>
<FileVersion>0.4.9.1</FileVersion>
<FileVersion>0.4.10.12</FileVersion>
<PackageId>KKdBaseLib</PackageId>
<Product>KKdBaseLib</Product>
<TargetFramework>netstandard2.0</TargetFramework>
<TargetFramework>net461</TargetFramework>
<Title>KKdBaseLib</Title>
<Version>0.4.9.1</Version>
<Version>0.4.10.12</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, IDE0018, IDE0032, IDE0044, IDE0045, IDE0046, IDE0051, IDE0055, IDE0059, IDE0063, 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, IDE0018, IDE0032, IDE0044, IDE0045, IDE0046, IDE0051, IDE0055, IDE0059, IDE0063, IDE0066, IDE0069, IDE1006</NoWarn>
</PropertyGroup>
<ItemGroup>
<Reference Include="System.Windows.Forms" />
</ItemGroup>
</Project>
+35 -21
View File
@@ -1,11 +1,11 @@
namespace KKdBaseLib
namespace KKdBaseLib
{
public struct KKdDict<TKey, TValue> : System.IDisposable, System.Collections.IEnumerator, INull
{
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;
@@ -27,7 +27,13 @@
{
this.keyArray = null; this.valArray = null; count = 0; index = 0;
if (keyArray == null || valArray == null || keyArray.Length != valArray.Length) return;
count = valArray.Length; this.keyArray = keyArray; this.valArray = valArray; }
count = this.keyArray.Length;
this.keyArray = new TKey [count];
this.valArray = new TValue[count];
System.Array.Copy(keyArray, this.keyArray, count);
System.Array.Copy(valArray, this.valArray, count);
}
public KeyValuePair<TKey, TValue> Current => index < count ?
new KeyValuePair<TKey, TValue>(keyArray[index], valArray[index]) : default;
@@ -56,8 +62,10 @@
index < valArray.Length) { keyArray[index] = value.Key; valArray[index] = value.Value; } } }
public TValue this[TKey key]
{ get => valArray != null && valArray.Length > 0 && CK(key, out int index) ? valArray[index] : default;
set { if (valArray != null && valArray.Length > 0) if (CK(key, out int index)) valArray[index] = value; else Add(key, value); } }
{ get => valArray != null && valArray.Length > 0
&& CK(key, out int index) ? valArray[index] : default;
set { if (valArray != null && valArray.Length > 0)
if (CK(key, out int index)) valArray[index] = value; else Add(key, value); } }
public bool MoveNext()
{ if (index == count - 1) { index = 0; return false; }
@@ -71,22 +79,22 @@
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;
}
@@ -99,8 +107,8 @@
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;
}
@@ -113,8 +121,8 @@
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;
}
@@ -124,8 +132,8 @@
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--;
}
@@ -190,9 +198,9 @@
{
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;
}
@@ -215,6 +223,9 @@
else if (valArray[i].Equals(val)) return i;
return -1;
}
public override string ToString() =>
$"(Count: {Count}; Capacity: {Capacity}; Current: {Current})";
}
public struct KeyValuePair<TKey, TValue>
@@ -224,5 +235,8 @@
public KeyValuePair(TKey key, TValue value)
{ Key = key; Value = value; }
public override string ToString() =>
$"(Key: {Key}; Value: {Value})";
}
}
+31 -12
View File
@@ -1,4 +1,4 @@
using System.Collections;
using System.Collections;
using System.Collections.Generic;
namespace KKdBaseLib
@@ -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;
@@ -26,7 +26,21 @@ namespace KKdBaseLib
public KKdList(T[] array)
{ index = -1; count = array.Length; this.array = array; enumerator = new Enumerator(this.array); }
{
index = -1;
if (array != null)
{
count = array.Length;
this.array = new T[count];
System.Array.Copy(array, this.array, count);
}
else
{
count = 0;
this.array = null;
}
enumerator = new Enumerator(this.array);
}
public T Current => index > -1 && index < Count ? array[index] : default;
@@ -61,7 +75,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 +84,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--;
}
@@ -107,13 +121,18 @@ namespace KKdBaseLib
}
public void Sort()
{ List<T> List = (List<T>)this; List.Sort(); array = List.ToArray(); count = List.Count; }
{ Capacity = Count; List<T> List = (List<T>)this; List.Sort();
array = List.ToArray(); count = List.Count; }
public static explicit operator KKdList<T>( List<T> list) =>
new KKdList<T> { array = list.ToArray(), count = list.Count };
public static explicit operator List<T>(KKdList<T> list)
{ List<T> outList = new List<T>(); for (int i = 0; i < list.Count; i++) outList.Add(list[i]); return outList; }
{ list.Capacity = list.Count; List<T> outList = new List<T>();
for (int i = 0; i < list.Count; i++) outList.Add(list[i]); return outList; }
public override string ToString() =>
$"(Count: {Count}; Capacity: {Capacity}; Current: {Current})";
public struct Enumerator : IEnumerator<T>, IEnumerator
{
@@ -121,14 +140,14 @@ namespace KKdBaseLib
private int index;
private int count;
private T current;
internal Enumerator(T[] array)
internal Enumerator(T[] array)
{ this.array = array; count = index = 0; current = default;
if (array != null && array.Length > 0) { current = array[0]; count = array.Length; } }
public void Dispose()
{ array = null; count = index = 0; current = default; }
public bool MoveNext()
{
if (index < count) { current = array[index]; index++; return true; }
@@ -136,7 +155,7 @@ namespace KKdBaseLib
}
public T Current => current;
object IEnumerator.Current =>
(index == 0 || index == array.Length + 1) ? default : current;
+283
View File
@@ -0,0 +1,283 @@
using System;
using System.Linq;
using System.Globalization;
using System.Collections.Generic;
using A3DADict = System.Collections.Generic.Dictionary<string, object>;
namespace KKdBaseLib
{
public static unsafe class Main
{
public const string TimeFormatHHmmssfff = "{0:d2}:{1:d2}:{2:d2}.{3:d3}";
public static void WT(this TimeSpan time, bool writeLine = false)
{
if (writeLine) Console.WriteLine(TimeFormatHHmmssfff,
time.Hours, time.Minutes, time.Seconds, time.Milliseconds);
else Console.Write (TimeFormatHHmmssfff,
time.Hours, time.Minutes, time.Seconds, time.Milliseconds);
}
public static void WT(this TimeSpan time, string text, bool writeLine = true)
{
if (writeLine) Console.WriteLine(TimeFormatHHmmssfff + " - " + text,
time.Hours, time.Minutes, time.Seconds, time.Milliseconds);
else Console.Write (TimeFormatHHmmssfff + " - " + text,
time.Hours, time.Minutes, time.Seconds, time.Milliseconds);
}
public static string NT(this string source, ref int i, byte end)
{
string s = "";
while (true)
{
if (source[i] == end) break;
else s += source[i];
i++;
}
return s;
}
public static bool SW(this A3DADict dict, string args, char split = '.') =>
dict.SW(args.Split(split));
public static bool SW(this A3DADict dict, string[] args)
{
if (dict == null || args.Length < 1) return false;
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 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);
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 uint value, char split, string args) =>
dict.FV(out string val, args.Split(split)) && uint.TryParse(val, out value);
public static bool FV (this A3DADict dict, ref long value, char split, string args) =>
dict.FV(out string val, args.Split(split)) && long.TryParse(val, out value);
public static bool FV (this A3DADict dict, ref ulong value, char split, string args) =>
dict.FV(out string val, args.Split(split)) && ulong.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);
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)
{ if (dict.FV(out string val , args.Split(split)))
{ value = val; return true; } return false; }
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)
{ if (dict.FV(out string val , args.Split('.' )))
return int.TryParse(val, out value); value = 0; return false; }
public static bool FV (this A3DADict dict, out uint value, string args)
{ if (dict.FV(out string val , args.Split('.' )))
return uint.TryParse(val, out value); value = 0; return false; }
public static bool FV (this A3DADict dict, out long value, string args)
{ if (dict.FV(out string val , args.Split('.' )))
return long.TryParse(val, out value); value = 0; return false; }
public static bool FV (this A3DADict dict, out ulong value, string args)
{ if (dict.FV(out string val , args.Split('.' )))
return ulong.TryParse(val, out value); value = 0; return false; }
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; }
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; }
public static bool FV<T>(this A3DADict dict, out T value, string args) where T : struct, Enum
{ if (dict.FV(out string val , args.Split('.' )))
{ bool Val = Enum.TryParse(val, out T _value); value = _value; return Val; }
value = default; return false; }
public static bool FV (this A3DADict dict, out int? value, string args)
{ if (dict.FV(out string val , args.Split('.' )))
{ bool Val = int.TryParse(val, out int _value); value = _value; return Val; }
value = null; return false; }
public static bool FV (this A3DADict dict, out uint? value, string args)
{ if (dict.FV(out string val , args.Split('.' )))
{ bool Val = uint.TryParse(val, out uint _value); value = _value; return Val; }
value = null; return false; }
public static bool FV (this A3DADict dict, out long? value, string args)
{ if (dict.FV(out string val , args.Split('.' )))
{ bool Val = long.TryParse(val, out long _value); value = _value; return Val; }
value = null; return false; }
public static bool FV (this A3DADict dict, out ulong? value, string args)
{ if (dict.FV(out string val , args.Split('.' )))
{ bool Val = ulong.TryParse(val, out ulong _value); value = _value; return Val; }
value = null; return false; }
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 = null; return false; }
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)
{
value = null;
if (dict == null || args.Length < 1) return false;
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]]).FV(out value, newArgs);
}
else if (args.Length == 1)
{
if (dict[args[0]].GetType() == dict.GetType())
return ((A3DADict)dict[args[0]]).FV(out value, args);
else if (dict[args[0]].GetType() != typeof(string)) return false;
}
value = (string)dict[args[0]];
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('=');
if (dataArray.Length == 2)
dict.GD(dataArray[0].Split(split), dataArray[1]);
dataArray = null;
}
public static void GD(this A3DADict dict, string args, string value, char split = '.') =>
dict.GD(args.Split(split), value);
public static void GD(this A3DADict dict, string[] args, string value)
{
if (dict == null) dict = new A3DADict();
else if (args.Length < 1) return;
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];
if (!dict.ContainsKey(args[0])) dict.Add(args[0], null);
if (dict[args[0]] != null)
{
if (dict[args[0]].GetType() == typeof(string))
dict[args[0]] = new A3DADict { { "", dict[args[0]] } };
}
else dict[args[0]] = new A3DADict();
A3DADict bufDict = (A3DADict)dict[args[0]];
bufDict.GD(newArgs, value);
dict[args[0]] = bufDict;
}
else if (!dict.ContainsKey(args[0])) dict.Add(args[0], value);
}
public static TKey GK<TKey, TVal>(this Dictionary<TKey, TVal> dict, TVal val) =>
dict.First((System.Collections.Generic.KeyValuePair<TKey, TVal> x) => x.Value.Equals(val)).Key;
public static string TTC(this string s) =>
CultureInfo.CurrentCulture.TextInfo.ToTitleCase(s);
public static int[] SW(this int length)
{
int i, j, m;
if (length <= 0) return new int[0];
if (length == 1) return new int[1] { 0 };
int[] sort = new int[length];
sort[0] = 0;
i = 1;
j = 1;
m = 1;
while (m < length)
m *= 10;
while (i < length)
{
if (j * 10 < m)
{
sort[i++] = j;
j *= 10;
}
else if (j >= length)
{
m /= 10;
j /= 10;
while (j % 10 == 9) j /= 10;
j++;
}
else if (j % 10 != 9)
sort[i++] = j++;
if (i < length)
if (j == length && j % 10 != 9)
{
m /= 10;
j /= 10;
while (j % 10 == 9) j /= 10;
j++;
}
else if (j < length && j % 10 == 9)
{
sort[i++] = j;
while (j % 10 == 9) j /= 10;
j++;
}
}
return sort;
}
}
}
+130
View File
@@ -0,0 +1,130 @@
using System.Runtime.InteropServices;
namespace KKdBaseLib
{
[StructLayout(LayoutKind.Explicit)]
public struct Mat2
{
[FieldOffset(0x00)] public Vec2 Row0;
[FieldOffset(0x08)] public Vec2 Row1;
public Vec2 Column0 { get => new Vec2(Row0.X, Row1.X);
set { Row0.X = value.X; Row1.X = value.Y; } }
public Vec2 Column1 { get => new Vec2(Row0.Y, Row1.Y);
set { Row0.Y = value.X; Row1.Y = value.Y; } }
public static Mat2 Identity => new Mat2(new Vec2(1.0f, 0.0f),
new Vec2(0.0f, 1.0f));
public Mat2(Vec2 row0, Vec2 row1)
{ Row0 = row0; Row1 = row1; }
public Mat2 Invert() => -this;
public static Mat2 operator +(Mat2 left, Mat2 right)
{ left.Row0 += right.Row0; left.Row1 += right.Row1; return left; }
public static Mat2 operator -(Mat2 left, Mat2 right)
{ left.Row0 -= right.Row0; left.Row1 -= right.Row1; return left; }
public static Mat2 operator -(Mat2 mat)
{
int[] colIdx = { 0, 0 };
int[] rowIdx = { 0, 0 };
int[] pivotIdx = { -1, -1 };
Mat2 result = mat;
float[,] inverse =
{
{ mat.Row0.X, mat.Row0.Y },
{ mat.Row1.X, mat.Row1.Y }
};
int icol = 0;
int irow = 0;
for (int i = 0; i < 2; i++)
{
float maxPivot = 0.0f;
for (int j = 0; j < 2; j++)
{
if (pivotIdx[j] == 0) continue;
for (int k = 0; k < 2; k++)
{
if (pivotIdx[k] == -1)
{
float absVal = System.Math.Abs(inverse[j, k]);
if (absVal > maxPivot)
{
maxPivot = absVal;
irow = j;
icol = k;
}
}
else if (pivotIdx[k] > 0)
return result;
}
}
pivotIdx[icol]++;
if (irow != icol)
for (int k = 0; k < 2; k++)
{ float t = inverse[irow, k]; inverse[irow, k] = inverse[icol, k]; inverse[icol, k] = t; }
rowIdx[i] = irow;
colIdx[i] = icol;
float pivot = inverse[icol, icol];
float oneOverPivot = 1.0f / pivot;
inverse[icol, icol] = 1.0f;
for (int k = 0; k < 2; k++)
inverse[icol, k] *= oneOverPivot;
for (int j = 0; j < 2; j++)
{
if (icol == j) continue;
float f = inverse[j, icol];
inverse[j, icol] = 0.0f;
for (int k = 0; k < 3; k++)
inverse[j, k] -= inverse[icol, k] * f;
}
}
for (int j = 1; j >= 0; j--)
{
int ir = rowIdx[j];
int ic = colIdx[j];
for (int k = 0; k < 2; k++)
{ 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.Row1.X = inverse[1, 0]; result.Row1.Y = inverse[1, 1];
return result;
}
public static Mat2 operator *(Mat2 left, Mat2 right)
{
Mat2 result = default;
result.Row0 = left.Row0.X * right.Row0 + left.Row0.Y * right.Row1;
result.Row1 = left.Row1.X * right.Row0 + left.Row1.Y * right.Row1;
return result;
}
public static Mat2 operator *(Mat2 mat, float scale) =>
new Mat2(mat.Row0 * scale, mat.Row1 * scale);
public static bool operator ==(Mat2 A, Mat2 B) => A.Equals(B);
public static bool operator !=(Mat2 A, Mat2 B) => !A.Equals(B);
public bool Equals(Mat2 other) =>
Row0 == other.Row0 && Row1 == other.Row1;
public override bool Equals(object obj) => base.Equals(obj);
public override int GetHashCode() => base.GetHashCode();
public override string ToString() => $"({Row0}; {Row1})";
public string ToString(int d) => $"({Row0.ToString(d)}; {Row1.ToString(d)})";
}
}
+217
View File
@@ -0,0 +1,217 @@
using System.Runtime.InteropServices;
namespace KKdBaseLib
{
[StructLayout(LayoutKind.Explicit)]
public struct Mat3
{
[FieldOffset(0x00)] public Vec3 Row0;
[FieldOffset(0x0C)] public Vec3 Row1;
[FieldOffset(0x18)] public Vec3 Row2;
public Vec3 Column0 { get => new Vec3(Row0.X, Row1.X, Row2.X);
set { Row0.X = value.X; Row1.X = value.Y; Row2.X = value.Z; } }
public Vec3 Column1 { get => new Vec3(Row0.Y, Row1.Y, Row2.Y);
set { Row0.Y = value.X; Row1.Y = value.Y; Row2.Y = value.Z; } }
public Vec3 Column2 { get => new Vec3(Row0.Z, Row1.Z, Row2.Z);
set { Row0.Z = value.X; Row1.Z = value.Y; Row2.Z = value.Z;} }
public static Mat3 Identity => new Mat3(new Vec3(1.0f, 0.0f, 0.0f),
new Vec3(0.0f, 1.0f, 0.0f),
new Vec3(0.0f, 0.0f, 1.0f));
public Mat3(float m00, float m01, float m02, float m10, float m11, float m12, float m20, float m21, float m22)
{ Row0 = new Vec3(m00, m01, m02); Row1 = new Vec3(m10, m11, m12); Row2 = new Vec3(m20, m21, m22);}
public Mat3(Vec3 row0, Vec3 row1, Vec3 row2)
{ Row0 = row0; Row1 = row1; Row2 = row2; }
public Mat3(Mat4 mat)
{ Row0 = new Vec3(mat.Row0); Row1 = new Vec3(mat.Row1); Row2 = new Vec3(mat.Row2); }
public Mat3(Quat q)
{
float qx = q.X;
float qy = q.Y;
float qz = q.Z;
float qw = q.W;
float g = qx + qx;
float h = qy + qy;
float k = qz + qz;
float a = qx * g;
float l = qx * h;
float m = qy * h;
qx *= k;
qy *= k;
qz *= k;
Row0 = new Vec3(1.0f - qz - m, l - qw * k, qx + qw * h);
Row1 = new Vec3( l + qw * k, 1.0f - qz - a, qy - qw * g);
Row2 = new Vec3( qx - qw * h, qy + qw * g, 1.0f - m - a);
}
public Quat ToQuat()
{
Vec3 row0 = Row0;
Vec3 row1 = Row1;
Vec3 row2 = Row2;
Quat q = default;
var trace = 0.25 * (row0.X + row1.Y + row2.Z+ 1.0);
if (trace > 0)
{
double sq = System.Math.Sqrt(trace);
q.W = (float)sq;
sq = 1.0 / (4.0 * sq);
q.X = (float)((row1.Z - row2.Y) * sq);
q.Y = (float)((row2.X - row0.Z) * sq);
q.Z = (float)((row0.Y - row1.X) * sq);
}
else if (row0.X > row1.Y && row0.X > row2.Z)
{
double sq = 2.0 * System.Math.Sqrt(1.0 + row0.X - row1.Y - row2.Z);
q.X = (float)(0.25 * sq);
sq = 1.0 / sq;
q.W = (float)((row2.Y - row1.Z) * sq);
q.Y = (float)((row1.X + row0.Y) * sq);
q.Z = (float)((row2.X + row0.Z) * sq);
}
else if (row1.Y > row2.Z)
{
double sq = 2.0 * System.Math.Sqrt(1.0 + row1.Y - row0.X - row2.Z);
q.Y = (float)(0.25 * sq);
sq = 1.0 / sq;
q.W = (float)((row2.X - row0.Z) * sq);
q.X = (float)((row1.X + row0.Y) * sq);
q.Z = (float)((row2.Y + row1.Z) * sq);
}
else
{
double sq = 2.0 * System.Math.Sqrt(1.0 + row2.Z - row0.X - row1.Y);
q.Z = (float)(0.25 * sq);
sq = 1.0 / sq;
q.W = (float)((row1.X - row0.Y) * sq);
q.X = (float)((row2.X + row0.Z) * sq);
q.Y = (float)((row2.Y + row1.Z) * sq);
}
return q.Normalized;
}
public Mat3 Invert() => -this;
public static Mat3 operator +(Mat3 left, Mat3 right)
{ left.Row0 += right.Row0; left.Row1 += right.Row1; left.Row2 += right.Row2; return left; }
public static Mat3 operator -(Mat3 left, Mat3 right)
{ left.Row0 -= right.Row0; left.Row1 -= right.Row1; left.Row2 -= right.Row2; return left; }
public static Mat3 operator -(Mat3 mat)
{
int[] colIdx = { 0, 0, 0 };
int[] rowIdx = { 0, 0, 0 };
int[] pivotIdx = { -1, -1, -1 };
Mat3 result = mat;
float[,] inverse =
{
{ mat.Row0.X, mat.Row0.Y, mat.Row0.Z },
{ mat.Row1.X, mat.Row1.Y, mat.Row1.Z },
{ mat.Row2.X, mat.Row2.Y, mat.Row2.Z }
};
int icol = 0;
int irow = 0;
for (int i = 0; i < 3; i++)
{
float maxPivot = 0.0f;
for (int j = 0; j < 3; j++)
{
if (pivotIdx[j] == 0) continue;
for (int k = 0; k < 3; k++)
{
if (pivotIdx[k] == -1)
{
float absVal = System.Math.Abs(inverse[j, k]);
if (absVal > maxPivot)
{
maxPivot = absVal;
irow = j;
icol = k;
}
}
else if (pivotIdx[k] > 0)
return result;
}
}
pivotIdx[icol]++;
if (irow != icol)
for (int k = 0; k < 3; k++)
{ float t = inverse[irow, k]; inverse[irow, k] = inverse[icol, k]; inverse[icol, k] = t; }
rowIdx[i] = irow;
colIdx[i] = icol;
float pivot = inverse[icol, icol];
float oneOverPivot = 1.0f / pivot;
inverse[icol, icol] = 1.0f;
for (int k = 0; k < 3; k++)
inverse[icol, k] *= oneOverPivot;
for (int j = 0; j < 3; j++)
{
if (icol == j) continue;
float f = inverse[j, icol];
inverse[j, icol] = 0.0f;
for (int k = 0; k < 3; k++)
inverse[j, k] -= inverse[icol, k] * f;
}
}
for (int j = 2; j >= 0; j--)
{
int ir = rowIdx[j];
int ic = colIdx[j];
for (int k = 0; k < 3; k++)
{ 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];
result.Row1.X = inverse[1, 0]; result.Row1.Y = inverse[1, 1]; result.Row1.Z = inverse[1, 2];
result.Row2.X = inverse[2, 0]; result.Row2.Y = inverse[2, 1]; result.Row2.Z = inverse[2, 2];
return result;
}
public static Mat3 operator *(Mat3 left, Mat3 right)
{
Mat3 result = default;
result.Row0 = left.Row0.X * right.Row0 + left.Row0.Y * right.Row1 + left.Row0.Z * right.Row2;
result.Row1 = left.Row1.X * right.Row0 + left.Row1.Y * right.Row1 + left.Row1.Z * right.Row2;
result.Row2 = left.Row2.X * right.Row0 + left.Row2.Y * right.Row1 + left.Row2.Z * right.Row2;
return result;
}
public static Mat3 operator *(Mat3 mat, float scale) =>
new Mat3(mat.Row0 * scale, mat.Row1 * scale, mat.Row2 * scale);
public static bool operator ==(Mat3 A, Mat3 B) => A.Equals(B);
public static bool operator !=(Mat3 A, Mat3 B) => !A.Equals(B);
public bool Equals(Mat3 other) =>
Row0 == other.Row0 && Row1 == other.Row1 && Row2 == other.Row2;
public override bool Equals(object obj) => base.Equals(obj);
public override int GetHashCode() => base.GetHashCode();
public override string ToString() => $"({Row0}; {Row1}; {Row2})";
public string ToString(int d) => $"({Row0.ToString(d)}; {Row1.ToString(d)}; {Row2.ToString(d)})";
}
}
+254
View File
@@ -0,0 +1,254 @@
using System.Runtime.InteropServices;
namespace KKdBaseLib
{
[StructLayout(LayoutKind.Explicit)]
public struct Mat4
{
[FieldOffset(0x00)] public Vec4 Row0;
[FieldOffset(0x10)] public Vec4 Row1;
[FieldOffset(0x20)] public Vec4 Row2;
[FieldOffset(0x30)] public Vec4 Row3;
public Vec4 Column0 { get => new Vec4(Row0.X, Row1.X, Row2.X, Row3.X);
set { Row0.X = value.X; Row1.X = value.Y; Row2.X = value.Z; Row3.X = value.W; } }
public Vec4 Column1 { get => new Vec4(Row0.Y, Row1.Y, Row2.Y, Row3.Y);
set { Row0.Y = value.X; Row1.Y = value.Y; Row2.Y = value.Z; Row3.Y = value.W; } }
public Vec4 Column2 { get => new Vec4(Row0.Z, Row1.Z, Row2.Z, Row3.Z);
set { Row0.Z = value.X; Row1.Z = value.Y; Row2.Z = value.Z; Row3.Z = value.W; } }
public Vec4 Column3 { get => new Vec4(Row0.W, Row1.W, Row2.W, Row3.W);
set { Row0.W = value.X; Row1.W = value.Y; Row2.W = value.Z; Row3.W = value.W; } }
public static Mat4 Identity => new Mat4(new Vec4(1.0f, 0.0f, 0.0f, 0.0f),
new Vec4(0.0f, 1.0f, 0.0f, 0.0f),
new Vec4(0.0f, 0.0f, 1.0f, 0.0f),
new Vec4(0.0f, 0.0f, 0.0f, 1.0f));
public Mat4(float m00, float m01, float m02, float m03, float m10, float m11, float m12, float m13,
float m20, float m21, float m22, float m23, float m30, float m31, float m32, float m33)
{ Row0 = new Vec4(m00, m01, m02, m03); Row1 = new Vec4(m10, m11, m12, m13);
Row2 = new Vec4(m20, m21, m22, m23); Row3 = new Vec4(m30, m31, m32, m33); }
public Mat4(Vec4 row0, Vec4 row1, Vec4 row2, Vec4 row3)
{ Row0 = row0; Row1 = row1; Row2 = row2; Row3 = row3; }
public Mat4(Mat3 mat)
{ Row0 = new Vec4(mat.Row0); Row1 = new Vec4(mat.Row1);
Row2 = new Vec4(mat.Row2); Row3 = new Vec4(0.0f, 0.0f, 0.0f, 1.0f); }
public Mat4(Quat q)
{ Row0 = Row1 = Row2 = Row3 = default; FromQuat(q); }
public Mat4(Quat q, Vec3 t)
{ Row0 = Row1 = Row2 = Row3 = default; FromQuat(q); Row3 = new Vec4(t, 1.0f); }
public Mat4(Quat q, Vec4 t)
{ Row0 = Row1 = Row2 = Row3 = default; FromQuat(q); Row3 = t; }
private void FromQuat(Quat q)
{
float qx = q.X;
float qy = q.Y;
float qz = q.Z;
float qw = q.W;
float g = qx + qx;
float h = qy + qy;
float k = qz + qz;
float a = qx * g;
float l = qx * h;
float m = qy * h;
qx *= k;
qy *= k;
qz *= k;
Row0 = new Vec4(1.0f - (qz + m), l - qw * k , qx + qw * h , 0.0f);
Row1 = new Vec4( l + qw * k , 1.0f - (qz + a), qy - qw * g , 0.0f);
Row2 = new Vec4( qx - qw * h , qy + qw * g , 1.0f - (a + m), 0.0f);
Row3 = new Vec4(0.0f , 0.0f , 0.0f , 1.0f);
}
public Quat ToQuat()
{
Vec4 row0 = Row0;
Vec4 row1 = Row1;
Vec4 row2 = Row2;
Quat q = default;
var trace = 0.25 * (row0.X + row1.Y + row2.Z+ 1.0);
if (trace > 0)
{
double sq = System.Math.Sqrt(trace);
q.W = (float)sq;
sq = 1.0 / (4.0 * sq);
q.X = (float)((row1.Z - row2.Y) * sq);
q.Y = (float)((row2.X - row0.Z) * sq);
q.Z = (float)((row0.Y - row1.X) * sq);
}
else if (row0.X > row1.Y && row0.X > row2.Z)
{
double sq = 2.0 * System.Math.Sqrt(1.0 + row0.X - row1.Y - row2.Z);
q.X = (float)(0.25 * sq);
sq = 1.0 / sq;
q.W = (float)((row2.Y - row1.Z) * sq);
q.Y = (float)((row1.X + row0.Y) * sq);
q.Z = (float)((row2.X + row0.Z) * sq);
}
else if (row1.Y > row2.Z)
{
double sq = 2.0 * System.Math.Sqrt(1.0 + row1.Y - row0.X - row2.Z);
q.Y = (float)(0.25 * sq);
sq = 1.0 / sq;
q.W = (float)((row2.X - row0.Z) * sq);
q.X = (float)((row1.X + row0.Y) * sq);
q.Z = (float)((row2.Y + row1.Z) * sq);
}
else
{
double sq = 2.0 * System.Math.Sqrt(1.0 + row2.Z - row0.X - row1.Y);
q.Z = (float)(0.25 * sq);
sq = 1.0 / sq;
q.W = (float)((row1.X - row0.Y) * sq);
q.X = (float)((row2.X + row0.Z) * sq);
q.Y = (float)((row2.Y + row1.Z) * sq);
}
return q.Normalized;
}
public Mat4 Invert() => -this;
public Mat4 Translate(Vec3 vec)
{ Row3 = new Vec4(vec, 1.0f) * this; return this; }
public Mat4 Translate(Vec4 vec)
{ Row3 = vec * this; return this; }
public static Mat4 operator +(Mat4 left, Mat4 right)
{ left.Row0 += right.Row0; left.Row1 += right.Row1;
left.Row2 += right.Row2; left.Row3 += right.Row3; return left; }
public static Mat4 operator -(Mat4 left, Mat4 right)
{ left.Row0 -= right.Row0; left.Row1 -= right.Row1;
left.Row2 -= right.Row2; left.Row3 -= right.Row3; return left; }
public static Mat4 operator -(Mat4 mat)
{
int[] colIdx = { 0, 0, 0, 0 };
int[] rowIdx = { 0, 0, 0, 0 };
int[] pivotIdx = { -1, -1, -1, -1 };
Mat4 result = mat;
float[,] inverse =
{
{ mat.Row0.X, mat.Row0.Y, mat.Row0.Z, mat.Row0.W },
{ mat.Row1.X, mat.Row1.Y, mat.Row1.Z, mat.Row1.W },
{ mat.Row2.X, mat.Row2.Y, mat.Row2.Z, mat.Row2.W },
{ mat.Row3.X, mat.Row3.Y, mat.Row3.Z, mat.Row3.W }
};
int icol = 0;
int irow = 0;
for (int i = 0; i < 4; i++)
{
float maxPivot = 0.0f;
for (int j = 0; j < 4; j++)
{
if (pivotIdx[j] == 0) continue;
for (int k = 0; k < 4; k++)
{
if (pivotIdx[k] == -1)
{
float absVal = System.Math.Abs(inverse[j, k]);
if (absVal > maxPivot)
{
maxPivot = absVal;
irow = j;
icol = k;
}
}
else if (pivotIdx[k] > 0)
return result;
}
}
pivotIdx[icol]++;
if (irow != icol)
for (int k = 0; k < 4; k++)
{ float t = inverse[irow, k]; inverse[irow, k] = inverse[icol, k]; inverse[icol, k] = t; }
rowIdx[i] = irow;
colIdx[i] = icol;
float pivot = inverse[icol, icol];
float oneOverPivot = 1.0f / pivot;
inverse[icol, icol] = 1.0f;
for (int k = 0; k < 4; k++)
inverse[icol, k] *= oneOverPivot;
for (int j = 0; j < 4; j++)
{
if (icol == j) continue;
float f = inverse[j, icol];
inverse[j, icol] = 0.0f;
for (int k = 0; k < 4; k++)
inverse[j, k] -= inverse[icol, k] * f;
}
}
for (int j = 3; j >= 0; j--)
{
int ir = rowIdx[j];
int ic = colIdx[j];
for (int k = 0; k < 4; k++)
{ 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]; result.Row0.W = inverse[0, 3];
result.Row1.X = inverse[1, 0]; result.Row1.Y = inverse[1, 1];
result.Row1.Z = inverse[1, 2]; result.Row1.W = inverse[1, 3];
result.Row2.X = inverse[2, 0]; result.Row2.Y = inverse[2, 1];
result.Row2.Z = inverse[2, 2]; result.Row2.W = inverse[2, 3];
result.Row3.X = inverse[3, 0]; result.Row3.Y = inverse[3, 1];
result.Row3.Z = inverse[3, 2]; result.Row3.W = inverse[3, 3];
return result;
}
public static Mat4 operator *(Mat4 left, Mat4 right)
{
Mat4 result = default;
result.Row0 = left.Row0.X * right.Row0 + left.Row0.Y * right.Row1
+ left.Row0.Z * right.Row2 + left.Row0.W * right.Row3;
result.Row1 = left.Row1.X * right.Row0 + left.Row1.Y * right.Row1
+ left.Row1.Z * right.Row2 + left.Row1.W * right.Row3;
result.Row2 = left.Row2.X * right.Row0 + left.Row2.Y * right.Row1
+ left.Row2.Z * right.Row2 + left.Row2.W * right.Row3;
result.Row3 = left.Row3.X * right.Row0 + left.Row3.Y * right.Row1
+ left.Row3.Z * right.Row2 + left.Row3.W * right.Row3;
return result;
}
public static Mat4 operator *(Mat4 mat, float scale) =>
new Mat4(mat.Row0 * scale, mat.Row1 * scale, mat.Row2 * scale, mat.Row3 * scale);
public static bool operator ==(Mat4 A, Mat4 B) => A.Equals(B);
public static bool operator !=(Mat4 A, Mat4 B) => !A.Equals(B);
public bool Equals(Mat4 other) =>
Row0 == other.Row0 && Row1 == other.Row1 && Row2 == other.Row2 && Row3 == other.Row3;
public override bool Equals(object obj) => base.Equals(obj);
public override int GetHashCode() => base.GetHashCode();
public override string ToString() => $"({Row0}; {Row1}; {Row2}; {Row3})";
public string ToString(int d) => $"({Row0.ToString(d)}; {Row1.ToString(d)}; {Row2.ToString(d)}; {Row3.ToString(d)})";
}
}
+25 -5
View File
@@ -1,4 +1,4 @@
using System;
using System;
namespace KKdBaseLib
{
@@ -26,8 +26,6 @@ namespace KKdBaseLib
public MsgPack(string name, object @object)
{ Name = name; Object = @object; }
public static MsgPack Null => new MsgPack();
public MsgPack this[ int index]
{ get => Object is MsgPack[] Array ? Array[index] : default;
set { if (Object is MsgPack[] Array) { Array[index] = value; Object = Array; } } }
@@ -42,12 +40,17 @@ namespace KKdBaseLib
public MsgPack this[string key]
{ get => Object is KKdList<MsgPack> List ? List[ElementIndex(key)] : default;
set { if (Object is KKdList<MsgPack> List && value.Object != null)
set { if (Object is KKdList<MsgPack> List && value.Object != null)
{ List.Add(value); Object = List; } } }
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 +380,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 +398,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 @@
namespace KKdBaseLib
namespace KKdBaseLib
{
public struct Pointer<T>
{
+1 -1
View File
@@ -1,4 +1,4 @@
using System.Reflection;
using System.Reflection;
using System.Runtime.InteropServices;
[assembly: AssemblyTrademark("")]
+171
View File
@@ -0,0 +1,171 @@
using System.Runtime.InteropServices;
namespace KKdBaseLib
{
[StructLayout(LayoutKind.Explicit)]
public struct Quat
{
[FieldOffset(0x00)] public float X;
[FieldOffset(0x04)] public float Y;
[FieldOffset(0x08)] public float Z;
[FieldOffset(0x0C)] public float W;
public static Quat Identity => new Quat(0.0f, 0.0f, 0.0f, 1.0f);
public Quat(float x, float y, float z)
{
x *= 0.5f;
y *= 0.5f;
z *= 0.5f;
var c1 = (float)System.Math.Cos(x);
var c2 = (float)System.Math.Cos(y);
var c3 = (float)System.Math.Cos(z);
var s1 = (float)System.Math.Sin(x);
var s2 = (float)System.Math.Sin(y);
var s3 = (float)System.Math.Sin(z);
X = s1 * c2 * c3 + c1 * s2 * s3;
Y = c1 * s2 * c3 - s1 * c2 * s3;
Z = c1 * c2 * s3 + s1 * s2 * c3;
W = c1 * c2 * c3 - s1 * s2 * s3;
}
public Quat(Vec3 vec) : this(vec.X, vec.Y, vec.Z)
{ }
public Quat(float x, float y, float z, float w)
{ X = x; Y = y; Z = z; W = w; }
public Quat(Vec3 vec, float w)
{ X = vec.X; Y = vec.Y; Z = vec.Z; W = w; }
public Quat(Vec4 vec)
{ X = vec.X; Y = vec.Y; Z = vec.Z; W = vec.W; }
public Vec3 XYZ { get => new Vec3(X, Y, Z); set { X = value.X; Y = value.Y; Z = value.Z; } }
public float Length => (X * X + Y * Y + Z * Z + W * W).Sqrt();
public float LengthSquared => X * X + Y * Y + Z * Z + W * W;
public Quat Normalized => new Quat(X, Y, Z, W) * (Length == 0.0f ? 1.0f : (1.0f / Length));
public Vec3 Euler { get
{
if (LengthSquared == 0) return default;
const float SINGULARITY_THRESHOLD = 0.4999995f;
const float HalfPI = (float)(System.Math.PI * 0.5);
float sqx = X * X, sqy = Y * Y, sqz = Z * Z, sqw = W * W;
float unit = sqx + sqy + sqz + sqw;
float singularityTest = X * Z + Y * W;
if (singularityTest > SINGULARITY_THRESHOLD * unit)
return new Vec3(0.0f, HalfPI, (float)(System.Math.Atan2(X, W) * 2.0));
else if (singularityTest < -SINGULARITY_THRESHOLD * unit)
return new Vec3(0.0f, -HalfPI, -(float)(System.Math.Atan2(X, W) * 2.0));
else
return new Vec3((float)System.Math.Atan2(2 * (X * W - Y * Z), sqw - sqx - sqy + sqz),
(float)System.Math.Asin (2 * singularityTest / unit),
(float)System.Math.Atan2(2 * (Z * W - X * Y), sqw + sqx - sqy - sqz));
}
}
public Vec3 EulerDeg { get
{
if (LengthSquared == 0) return default;
const float SINGULARITY_THRESHOLD = 0.4999995f;
const float HalfPI = (float)(System.Math.PI * 0.5);
float sqx = X * X, sqy = Y * Y, sqz = Z * Z, sqw = W * W;
float unit = sqx + sqy + sqz + sqw;
float singularityTest = X * Z + Y * W;
if (singularityTest > SINGULARITY_THRESHOLD * unit)
return new Vec3(0.0f, HalfPI, (float)(System.Math.Atan2(X, W) * 2.0));
else if (singularityTest < -SINGULARITY_THRESHOLD * unit)
return new Vec3(0.0f, -HalfPI, -(float)(System.Math.Atan2(X, W) * 2.0));
else
return new Vec3((float)System.Math.Atan2(2 * (X * W - Y * Z), sqw - sqx - sqy + sqz),
(float)System.Math.Asin (2 * singularityTest / unit),
(float)System.Math.Atan2(2 * (Z * W - X * Y), sqw + sqx - sqy - sqz))
* (float)(180.0 / System.Math.PI);
}
}
public static Quat operator +(Quat left, Quat right)
{ left.X += right.X; left.Y += right.Y; left.Z += right.Z; left.W += right.W; return left; }
public static Quat operator -(Quat left, Quat right)
{ left.X -= right.X; left.Y -= right.Y; left.Z -= right.Z; left.W -= right.W; return left; }
public static Quat operator -(Quat quat) =>
new Quat(-quat.X, -quat.Y, -quat.Z, -quat.W);
public static Quat operator *( Quat quat, float scale)
{ quat.X *= scale ; quat.Y *= scale ; quat.Z *= scale ; quat.W *= scale ; return quat; }
public static Quat operator *(float scale, Quat quat)
{ quat.X *= scale ; quat.Y *= scale ; quat.Z *= scale ; quat.W *= scale ; return quat; }
public static Quat operator *( Quat quat, Vec4 scale)
{ quat.X *= scale.X; quat.Y *= scale.Y; quat.Z *= scale.Z; quat.W *= scale.W; return quat; }
public static Quat operator *( Quat left, Quat right) =>
new Quat(right.W * left.XYZ + left.W * right.XYZ + Vec3.Cross(left.XYZ, right.XYZ),
left.W * right.W - Vec3.Dot(left.XYZ, right.XYZ)).Normalized;
public static Quat operator /( Quat left, Quat right) =>
left * -right;
public static bool operator ==(Quat A, Quat B) => A.Equals(B);
public static bool operator !=(Quat A, Quat B) => !A.Equals(B);
public static float Distance (Quat left, Quat right) =>
((right.X - left.X) * (right.X - left.X) + (right.Y - left.Y) * (right.Y - left.Y) +
(right.Z - left.Z) * (right.Z - left.Z) + (right.W - left.W) * (right.W - left.W)).Sqrt();
public static float DistanceSquared(Quat left, Quat right) =>
(right.X - left.X) * (right.X - left.X) + (right.Y - left.Y) * (right.Y - left.Y) +
(right.Z - left.Z) * (right.Z - left.Z) + (right.W - left.W) * (right.W - left.W);
public static float Dot(Quat left, Quat right) =>
left.X * right.X + left.Y * right.Y + left.Z * right.Z + left.W * right.W;
public Quat Round( ) =>
new Quat { X = X.Round( ), Y = Y.Round( ), Z = Z.Round( ), W = W.Round( ) };
public Quat Round(int d) =>
new Quat { X = X.Round(d), Y = Y.Round(d), Z = Z.Round(d), W = W.Round(d) };
public static Quat Slerp(Quat q1, Quat q2, float blend)
{
q1 = q1.Normalized;
q2 = q2.Normalized;
float dot = Dot(q1, q2);
if (dot < 0.0f)
{
q2 = -q2;
dot = -dot;
}
Quat result;
const float DOT_THRESHOLD = 0.9995f;
if (dot <= DOT_THRESHOLD)
{
float theta_0 = (float)System.Math.Acos(dot);
float theta = theta_0 * blend;
float sin_theta = (float)System.Math.Sin(theta);
float sin_theta_0 = (float)System.Math.Sin(theta_0);
float s0 = (float)System.Math.Cos(theta) - dot * sin_theta / sin_theta_0;
float s1 = sin_theta / sin_theta_0;
result = s0 * q1 + s1 * q2;
}
else
result = (1.0f - blend) * q1 + blend * q2;
return result.Normalized;
}
public static explicit operator Vec4(Quat quat) =>
new Vec4(quat.XYZ, quat.W);
public static explicit operator Quat(Vec4 vec) =>
new Quat( vec.XYZ, vec.W);
public bool Equals(Quat other) =>
X == other.X && Y == other.Y && Z == other.Z && W == other.W;
public override bool Equals(object obj) => base.Equals(obj);
public override int GetHashCode() => base.GetHashCode();
public override string ToString() => $"({X}; {Y}; {Z}; {W})";
public string ToString(int d) => $"({X.Round(d)}; {Y.Round(d)}; {Z.Round(d)}; {W.Round(d)})";
}
}
+8 -8
View File
@@ -1,4 +1,4 @@
namespace KKdBaseLib
namespace KKdBaseLib.Tables
{
public struct ButtonSE
{
@@ -137,13 +137,13 @@
public string Name;
public string SEName;
}
public struct TableDate : INull
{
private int year;
private int month;
private int day;
public int Year { get => year; set { year = value; CheckDate(); } }
public int Month { get => month; set { month = value; CheckDate(); } }
public int Day { get => day; set { day = value; CheckDate(); } }
@@ -157,7 +157,7 @@
public void SN () => Year = -1;
public void SDL() => Year = 2000;
public void SDU() => Year = 2029;
public void SV(int? ymd, bool setDefaultUpper)
{
if (!setDefaultUpper) SDL();
@@ -170,9 +170,9 @@
CheckDate();
}
}
public int Int => NotNull ? (Year * 100 + Month) * 100 + Day : -1;
private void CheckDate()
{
if (year == -1 || month == -1 || day == -1) { year = -1; month = -1; day = -1; return; }
@@ -188,8 +188,8 @@
else if (day > 29 && month == 2 && year % 4 == 0) day = 29;
else if (day > 28 && month == 2 && year % 4 != 0) day = 28;
}
public override string ToString() =>
$"{Year.ToString("d4")}-{Month.ToString("d2")}-{Day.ToString("d2")}";
$"{Year:d4}-{Month:d2}-{Day:d2}";
}
}
+6 -3
View File
@@ -1,4 +1,4 @@
using System.Text;
using System.Text;
namespace KKdBaseLib
{
@@ -7,10 +7,13 @@ namespace KKdBaseLib
public readonly static Encoding ShiftJIS = Encoding.GetEncoding(932);
public static string ToASCII(this byte[] Array) => Encoding.ASCII.GetString(Array ?? new byte[0]);
public static string ToUTF8 (this byte[] Array) => Encoding.UTF8 .GetString(Array ?? new byte[0]);
public static byte[] ToASCII(this string Data ) => Encoding.ASCII.GetBytes (Data ?? "" );
public static byte[] ToUTF8 (this string Data ) => Encoding.UTF8 .GetBytes (Data ?? "" );
public static byte[] ToASCII(this char[] Data ) => Encoding.ASCII.GetBytes (Data ?? new char[0]);
public static string ToSJIS (this byte[] Array) => ShiftJIS.GetString(Array ?? new byte[0]);
public static byte[] ToSJIS (this string Data ) => ShiftJIS.GetBytes (Data ?? "" );
public static byte[] ToSJIS (this char[] Data ) => ShiftJIS.GetBytes (Data ?? new char[0]);
public static string ToUTF8 (this byte[] Array) => Encoding.UTF8 .GetString(Array ?? new byte[0]);
public static byte[] ToUTF8 (this string Data ) => Encoding.UTF8 .GetBytes (Data ?? "" );
public static byte[] ToUTF8 (this char[] Data ) => Encoding.UTF8 .GetBytes (Data ?? new char[0]);
}
}
+7 -7
View File
@@ -1,11 +1,11 @@
namespace KKdBaseLib
namespace KKdBaseLib
{
public struct Vector2<T> : INull
public struct Vec2<T> : INull
{
public T X;
public T Y;
public Vector2(T x, T y)
public Vec2(T x, T y)
{ X = x; Y = y; }
public bool IsNull => X == null && Y == null;
@@ -14,13 +14,13 @@
public override string ToString() => $"({X}; {Y})";
}
public struct Vector3<T> : INull
public struct Vec3<T> : INull
{
public T X;
public T Y;
public T Z;
public Vector3(T x, T y, T z)
public Vec3(T x, T y, T z)
{ X = x; Y = y; Z = z; }
public bool IsNull => X == null && Y == null && Z == null;
@@ -29,14 +29,14 @@
public override string ToString() => $"({X}; {Y}; {Z})";
}
public struct Vector4<T> : INull
public struct Vec4<T> : INull
{
public T X;
public T Y;
public T Z;
public T W;
public Vector4(T x, T y, T z, T w)
public Vec4(T x, T y, T z, T w)
{ X = x; Y = y; Z = z; W = w; }
public bool IsNull => X == null && Y == null && Z == null && W == null;
+70
View File
@@ -0,0 +1,70 @@
using System.Runtime.InteropServices;
namespace KKdBaseLib
{
[StructLayout(LayoutKind.Explicit)]
public struct Vec2
{
[FieldOffset(0x00)] public float X;
[FieldOffset(0x04)] public float Y;
public Vec2(float val)
{ X = val; Y = val; }
public Vec2(float X, float Y)
{ this.X = X; this.Y = Y; }
public Vec2(Vec4 vec)
{ X = vec.X; Y = vec.Y; }
public float Length => (X * X + Y * Y).Sqrt();
public float LengthSquared => X * X + Y * Y;
public Vec2 Normalized => this = Length == 0.0f ? new Vec2() : this * (1.0f / Length);
public static Vec2 operator +(Vec2 left, Vec2 right)
{ left.X += right.X; left.Y += right.Y; return left; }
public static Vec2 operator -(Vec2 left, Vec2 right)
{ left.X -= right.X; left.Y -= right.Y; return left; }
public static Vec2 operator -(Vec2 vec)
{ vec.X = -vec.X; vec.Y = -vec.Y; return vec; }
public static Vec2 operator *(Vec2 vec, float scale)
{ vec.X *= scale ; vec.Y *= scale ; return vec; }
public static Vec2 operator *( float scale, Vec2 vec)
{ vec.X *= scale ; vec.Y *= scale ; return vec; }
public static Vec2 operator *(Vec2 vec, Vec2 scale)
{ vec.X *= scale.X; vec.Y *= scale.Y; return vec; }
public static Vec2 operator /(Vec2 vec, float scale)
{ vec.X /= scale ; vec.Y /= scale ; return vec; }
public static Vec2 operator /(Vec2 vec, Vec2 scale)
{ vec.X /= scale.X; vec.Y /= scale.Y; return vec; }
public static bool operator ==(Vec2 A, Vec2 B) => A.X == B.X && A.Y == B.Y;
public static bool operator !=(Vec2 A, Vec2 B) => A.X != B.X || A.Y != B.Y;
public static Vec2 operator *(Vec2 vec, Mat2 mat) =>
new Vec2(vec.X * mat.Row0.X + vec.Y * mat.Row1.X,
vec.X * mat.Row0.Y + vec.Y * mat.Row1.Y);
public static float Distance (Vec2 left, Vec2 right) =>
(right.X - left.X) * (right.X - left.X) + (right.Y - left.Y) * (right.Y - left.Y).Sqrt();
public static float DistanceSquared(Vec2 left, Vec2 right) =>
(right.X - left.X) * (right.X - left.X) + (right.Y - left.Y) * (right.Y - left.Y);
public static float Dot(Vec2 left, Vec2 right) =>
left.X * right.X + left.Y * right.Y;
public static Vec2 Lerp(Vec2 a, Vec2 b, float blend) =>
new Vec2 { X = blend * (b.X - a.X) + a.X, Y = blend * (b.Y - a.Y) + a.Y };
public static Vec2 Lerp(Vec2 a, Vec2 b, Vec2 blend) =>
new Vec2 { X = blend.X * (b.X - a.X) + a.X, Y = blend.Y * (b.Y - a.Y) + a.Y };
public Vec2 Round( ) =>
new Vec2 { X = X.Round( ), Y = Y.Round( ) };
public Vec2 Round(int d) =>
new Vec2 { X = X.Round(d), Y = Y.Round(d) };
public bool Equals(Vec2 other) =>
X == other.X && Y == other.Y;
public override bool Equals(object obj) => base.Equals(obj);
public override int GetHashCode() => base.GetHashCode();
public override string ToString() => $"({X}; {Y})";
public string ToString(int d) => $"({X.Round(d)}; {Y.Round(d)})";
}
}
+93
View File
@@ -0,0 +1,93 @@
using System.Runtime.InteropServices;
namespace KKdBaseLib
{
[StructLayout(LayoutKind.Explicit)]
public struct Vec3
{
[FieldOffset(0x00)] public float X;
[FieldOffset(0x04)] public float Y;
[FieldOffset(0x08)] public float Z;
public Vec3(float val)
{ X = val; Y = val; Z = val; }
public Vec3(float X, float Y)
{ this.X = X; this.Y = Y; Z = 0.0f; }
public Vec3(float X, float Y, float Z)
{ this.X = X; this.Y = Y; this.Z = Z; }
public Vec3(Vec2 vec)
{ X = vec.X; Y = vec.Y; Z = 0.0f; }
public Vec3(Vec2 vec, float Z)
{ X = vec.X; Y = vec.Y; this.Z = Z; }
public Vec3(Vec4 vec)
{ X = vec.X; Y = vec.Y; Z = vec.Z; }
public Vec2 XY => new Vec2(X, Y);
public float Length => (X * X + Y * Y + Z * Z).Sqrt();
public float LengthSquared => X * X + Y * Y + Z * Z;
public Vec3 Normalized => this = Length == 0.0f ? new Vec3() : this * (1.0f / Length);
public static Vec3 operator +(Vec3 left, Vec3 right)
{ left.X += right.X; left.Y += right.Y; left.Z += right.Z; return left; }
public static Vec3 operator -(Vec3 left, Vec3 right)
{ left.X -= right.X; left.Y -= right.Y; left.Z -= right.Z; return left; }
public static Vec3 operator -(Vec3 vec)
{ vec.X = -vec.X; vec.Y = -vec.Y; vec.Z = -vec.Z; return vec; }
public static Vec3 operator *( Vec3 vec, float scale)
{ vec.X *= scale ; vec.Y *= scale ; vec.Z *= scale ; return vec; }
public static Vec3 operator *(float scale, Vec3 vec)
{ vec.X *= scale ; vec.Y *= scale ; vec.Z *= scale ; return vec; }
public static Vec3 operator *( Vec3 vec, Vec3 scale)
{ vec.X *= scale.X; vec.Y *= scale.Y; vec.Z *= scale.Z; return vec; }
public static Vec3 operator /( Vec3 vec, float scale)
{ vec.X /= scale ; vec.Y /= scale ; vec.Z /= scale ; return vec; }
public static Vec3 operator /( Vec3 vec, Vec3 scale)
{ vec.X /= scale.X; vec.Y /= scale.Y; vec.Z /= scale.Z; return vec; }
public static bool operator ==(Vec3 A, Vec3 B) => A.X == B.X && A.Y == B.Y && A.Z == B.Z;
public static bool operator !=(Vec3 A, Vec3 B) => A.X != B.X || A.Y != B.Y || A.Z != B.Z;
public static Vec3 operator *(Vec3 vec, Mat3 mat) =>
new Vec3(vec.X * mat.Row0.X + vec.Y * mat.Row1.X + vec.Z * mat.Row2.X,
vec.X * mat.Row0.Y + vec.Y * mat.Row1.Y + vec.Z * mat.Row2.Y,
vec.X * mat.Row0.Z + vec.Y * mat.Row1.Z + vec.Z * mat.Row2.Z);
public static float Distance (Vec3 left, Vec3 right) =>
((right.X - left.X) * (right.X - left.X) + (right.Y - left.Y) *
(right.Y - left.Y) + (right.Z - left.Z) * (right.Z - left.Z)).Sqrt();
public static float DistanceSquared(Vec3 left, Vec3 right) =>
(right.X - left.X) * (right.X - left.X) + (right.Y - left.Y) *
(right.Y - left.Y) + (right.Z - left.Z) * (right.Z - left.Z);
public static float Dot(Vec3 left, Vec3 right) =>
left.X * right.X + left.Y * right.Y + left.Z * right.Z;
public static Vec3 Cross(Vec3 left, Vec3 right) =>
new Vec3 { X = left.Y * right.Z - left.Z * right.Y,
Y = left.Z * right.X - left.X * right.Z,
Z = left.X * right.Y - left.Y * right.X, };
public static Vec3 Lerp(Vec3 a, Vec3 b, float blend) =>
new Vec3 { X = blend * (b.X - a.X) + a.X,
Y = blend * (b.Y - a.Y) + a.Y,
Z = blend * (b.Z - a.Z) + a.Z };
public static Vec3 Lerp(Vec3 a, Vec3 b, Vec3 blend) =>
new Vec3 { X = blend.X * (b.X - a.X) + a.X,
Y = blend.Y * (b.Y - a.Y) + a.Y,
Z = blend.Z * (b.Z - a.Z) + a.Z };
public Vec3 Round( ) =>
new Vec3 { X = X.Round( ), Y = Y.Round( ), Z = Z.Round( ) };
public Vec3 Round(int d) =>
new Vec3 { X = X.Round(d), Y = Y.Round(d), Z = Z.Round(d) };
public bool Equals(Vec3 other) =>
X == other.X && Y == other.Y && Z == other.Z;
public override bool Equals(object obj) => base.Equals(obj);
public override int GetHashCode() => base.GetHashCode();
public override string ToString() => $"({X}; {Y}; {Z})";
public string ToString(int d) => $"({X.Round(d)}; {Y.Round(d)}; {Z.Round(d)})";
}
}
+108
View File
@@ -0,0 +1,108 @@
using System.Runtime.InteropServices;
namespace KKdBaseLib
{
[StructLayout(LayoutKind.Explicit)]
public struct Vec4
{
[FieldOffset(0x00)] public float X;
[FieldOffset(0x04)] public float Y;
[FieldOffset(0x08)] public float Z;
[FieldOffset(0x0C)] public float W;
public Vec4(float val)
{ X = val; Y = val; Z = val; W = 0.0f; }
public Vec4(float X, float Y)
{ this.X = X; this.Y = Y; Z = 0.0f; W = 0.0f; }
public Vec4(float X, float Y, float Z)
{ this.X = X; this.Y = Y; this.Z = Z; W = 0.0f; }
public Vec4(float X, float Y, float Z, float W)
{ this.X = X; this.Y = Y; this.Z = Z; this.W = W; }
public Vec4(Vec2 vec)
{ X = vec.X; Y = vec.Y; Z = 0.0f; W = 0.0f; }
public Vec4(Vec2 vec, float Z)
{ X = vec.X; Y = vec.Y; this.Z = Z; W = 0.0f; }
public Vec4(Vec2 vec, float Z, float W)
{ X = vec.X; Y = vec.Y; this.Z = Z; this.W = W; }
public Vec4(Vec3 vec)
{ X = vec.X; Y = vec.Y; Z = vec.Z; W = 0.0f; }
public Vec4(Vec3 vec, float W)
{ X = vec.X; Y = vec.Y; Z = vec.Z; this.W = W; }
public Vec2 XY { get => new Vec2(X, Y ); set { X = value.X; Y = value.Y; } }
public Vec3 XYZ { get => new Vec3(X, Y, Z); set { X = value.X; Y = value.Y; Z = value.Z; } }
public float Length => (X * X + Y * Y + Z * Z + W * W).Sqrt();
public float LengthSquared => X * X + Y * Y + Z * Z + W * W;
public Vec4 Normalized => new Vec4(X, Y, Z, W) * (Length == 0.0f ? 1.0f : (1.0f / Length));
public static Vec4 operator +(Vec4 left, Vec4 right)
{ left.X += right.X; left.Y += right.Y; left.Z += right.Z; left.W += right.W; return left; }
public static Vec4 operator -(Vec4 left, Vec4 right)
{ left.X -= right.X; left.Y -= right.Y; left.Z -= right.Z; left.W -= right.W; return left; }
public static Vec4 operator -(Vec4 vec)
{ vec.X = -vec.X; vec.Y = -vec.Y; vec.Z = -vec.Z; vec.W = -vec.W; return vec; }
public static Vec4 operator *( Vec4 vec, float scale)
{ vec.X *= scale ; vec.Y *= scale ; vec.Z *= scale ; vec.W *= scale ; return vec; }
public static Vec4 operator *(float scale, Vec4 vec)
{ vec.X *= scale ; vec.Y *= scale ; vec.Z *= scale ; vec.W *= scale ; return vec; }
public static Vec4 operator *( Vec4 vec, Vec4 scale)
{ vec.X *= scale.X; vec.Y *= scale.Y; vec.Z *= scale.Z; vec.W *= scale.W; return vec; }
public static Vec4 operator /( Vec4 vec, float scale)
{ vec.X /= scale ; vec.Y /= scale ; vec.Z /= scale ; vec.W /= scale ; return vec; }
public static Vec4 operator /( Vec4 vec, Vec4 scale)
{ vec.X /= scale.X; vec.Y /= scale.Y; vec.Z /= scale.Z; vec.W /= scale.W; return vec; }
public static bool operator ==(Vec4 A, Vec4 B) => A.Equals(B);
public static bool operator !=(Vec4 A, Vec4 B) => !A.Equals(B);
public static Vec4 operator +(Vec4 left, Vec3 right)
{ left.X += right.X; left.Y += right.Y; left.Z += right.Z; return left; }
public static Vec4 operator -(Vec4 left, Vec3 right)
{ left.X -= right.X; left.Y -= right.Y; left.Z -= right.Z; return left; }
public static Vec4 operator *( Vec4 vec, Vec3 scale)
{ vec.X *= scale.X; vec.Y *= scale.Y; vec.Z *= scale.Z; return vec; }
public static Vec4 operator /( Vec4 vec, Vec3 scale)
{ vec.X /= scale.X; vec.Y /= scale.Y; vec.Z /= scale.Z; return vec; }
public static Vec4 operator *(Vec4 vec, Mat4 mat) =>
new Vec4(vec.X * mat.Row0.X + vec.Y * mat.Row1.X + vec.Z * mat.Row2.X + vec.W * mat.Row3.X,
vec.X * mat.Row0.Y + vec.Y * mat.Row1.Y + vec.Z * mat.Row2.Y + vec.W * mat.Row3.Y,
vec.X * mat.Row0.Z + vec.Y * mat.Row1.Z + vec.Z * mat.Row2.Z + vec.W * mat.Row3.Z,
vec.X * mat.Row0.W + vec.Y * mat.Row1.W + vec.Z * mat.Row2.W + vec.W * mat.Row3.W);
public static float Distance (Vec4 left, Vec4 right) =>
((right.X - left.X) * (right.X - left.X) + (right.Y - left.Y) * (right.Y - left.Y) +
(right.Z - left.Z) * (right.Z - left.Z) + (right.W - left.W) * (right.W - left.W)).Sqrt();
public static float DistanceSquared(Vec4 left, Vec4 right) =>
(right.X - left.X) * (right.X - left.X) + (right.Y - left.Y) * (right.Y - left.Y) +
(right.Z - left.Z) * (right.Z - left.Z) + (right.W - left.W) * (right.W - left.W);
public static float Dot(Vec4 left, Vec4 right) =>
left.X * right.X + left.Y * right.Y + left.Z * right.Z + left.W * right.W;
public static Vec4 Lerp(Vec4 a, Vec4 b, float blend) =>
new Vec4 { X = blend * (b.X - a.X) + a.X, Y = blend * (b.Y - a.Y) + a.Y,
Z = blend * (b.Z - a.Z) + a.Z, W = blend * (b.W - a.W) + a.W };
public static Vec4 Lerp(Vec4 a, Vec4 b, Vec4 blend) =>
new Vec4 { X = blend.X * (b.X - a.X) + a.X, Y = blend.Y * (b.Y - a.Y) + a.Y,
Z = blend.Z * (b.Z - a.Z) + a.Z, W = blend.W * (b.W - a.W) + a.W };
public Vec4 Round( ) =>
new Vec4 { X = X.Round( ), Y = Y.Round( ), Z = Z.Round( ), W = W.Round( ) };
public Vec4 Round(int d) =>
new Vec4 { X = X.Round(d), Y = Y.Round(d), Z = Z.Round(d), W = W.Round(d) };
public bool Equals(Vec4 other) =>
X == other.X && Y == other.Y && Z == other.Z && W == other.W;
public override bool Equals(object obj) => base.Equals(obj);
public override int GetHashCode() => base.GetHashCode();
public override string ToString() => $"({X}; {Y}; {Z}; {W})";
public string ToString(int d) => $"({X.Round(d)}; {Y.Round(d)}; {Z.Round(d)}; {W.Round(d)})";
}
}
-77
View File
@@ -1,77 +0,0 @@
namespace KKdBaseLib
{
public struct Vector3
{
public float X;
public float Y;
public float Z;
public Vector3(float X, float Y, float Z)
{ this.X = X; this.Y = Y; this.Z = Z; }
public float Length => (X * X + Y * Y + Z * Z).Sqrt();
public Vector3 Normalized => this = Length == 0 ? new Vector3() : this / Length;
public static Vector3 operator +(Vector3 left, Vector3 right)
{ left.X += right.X; left.Y += right.Y; left.Z += right.Z; return left; }
public static Vector3 operator -(Vector3 left, Vector3 right)
{ left.X -= right.X; left.Y -= right.Y; left.Z -= right.Z; return left; }
public static Vector3 operator -(Vector3 vec)
{ vec.X = -vec.X; vec.Y = -vec.Y; vec.Z = -vec.Z; return vec; }
public static Vector3 operator *(Vector3 vec, float scale)
{ vec.X *= scale ; vec.Y *= scale ; vec.Z *= scale ; return vec; }
public static Vector3 operator *( float scale, Vector3 vec)
{ vec.X *= scale ; vec.Y *= scale ; vec.Z *= scale ; return vec; }
public static Vector3 operator *(Vector3 vec, Vector3 scale)
{ vec.X *= scale.X; vec.Y *= scale.Y; vec.Z *= scale.Z; return vec; }
public static Vector3 operator /(Vector3 vec, float scale)
{ vec.X /= scale ; vec.Y /= scale ; vec.Z /= scale ; return vec; }
public static Vector3 operator /(Vector3 vec, Vector3 scale)
{ vec.X /= scale.X; vec.Y /= scale.Y; vec.Z /= scale.Z; return vec; }
public static bool operator ==(Vector3 A, Vector3 B) => A.X == B.X && A.Y == B.Y && A.Z == B.Z;
public static bool operator !=(Vector3 A, Vector3 B) => A.X != B.X || A.Y != B.Y || A.Z != B.Z;
public static double Distance (Vector3 left, Vector3 right) =>
(right.X - left.X) * (right.X - left.X) + (right.Y - left.Y) *
(right.Y - left.Y) + (right.Z - left.Z) * (right.Z - left.Z).Sqrt();
public static double DistanceSquared(Vector3 left, Vector3 right) =>
(right.X - left.X) * (right.X - left.X) + (right.Y - left.Y) *
(right.Y - left.Y) + (right.Z - left.Z) * (right.Z - left.Z);
public static double Dot(Vector3 left, Vector3 right) =>
left.X * right.X + left.Y * right.Y + left.Z * right.Z;
public static Vector3 Cross(Vector3 left, Vector3 right) =>
new Vector3 { X = left.Y * right.Z - left.Z * right.Y,
Y = left.Z * right.X - left.X * right.Z,
Z = left.X * right.Y - left.Y * right.X, };
public static Vector3 Lerp(Vector3 a, Vector3 b, float blend) =>
new Vector3 { X = blend * (b.X - a.X) + a.X,
Y = blend * (b.Y - a.Y) + a.Y,
Z = blend * (b.Z - a.Z) + a.Z };
public static Vector3 Lerp(Vector3 a, Vector3 b, Vector3 blend) =>
new Vector3 { X = blend.X * (b.X - a.X) + a.X,
Y = blend.Y * (b.Y - a.Y) + a.Y,
Z = blend.Z * (b.Z - a.Z) + a.Z };
public Vector3 Round( ) =>
new Vector3 { X = X.Round( ), Y = Y.Round( ), Z = Z.Round( ) };
public Vector3 Round(int d) =>
new Vector3 { X = X.Round(d), Y = Y.Round(d), Z = Z.Round(d) };
public override int GetHashCode()
{
unchecked
{
int hashCode = X.GetHashCode();
hashCode = (hashCode * 397) ^ Y.GetHashCode();
hashCode = (hashCode * 397) ^ Z.GetHashCode();
return hashCode;
}
}
public override bool Equals(object obj) =>
obj is Vector3 vec ? Equals(vec) : false;
public bool Equals(Vector3 other) =>
X == other.X && Y == other.Y && Z == other.Z;
public override string ToString() => $"({X}; {Y}, {Z})";
public string ToString(int d) => $"({X.Round(d)}; {Y.Round(d)}, {Z.Round(d)})";
}
}
-77
View File
@@ -1,77 +0,0 @@
namespace KKdBaseLib
{
public struct Vector4
{
public float X;
public float Y;
public float Z;
public float W;
public Vector4(float X, float Y, float Z, float W)
{ this.X = X; this.Y = Y; this.Z = Z; this.W = W; }
public float Length => (X * X + Y * Y + Z * Z + W * W).Sqrt();
public Vector4 Normalized => this = Length == 0 ? new Vector4() : this / Length;
public static Vector4 operator +(Vector4 left, Vector4 right)
{ left.X += right.X; left.Y += right.Y; left.Z += right.Z; left.W += right.W; return left; }
public static Vector4 operator -(Vector4 left, Vector4 right)
{ left.X -= right.X; left.Y -= right.Y; left.Z -= right.Z; left.W -= right.W; return left; }
public static Vector4 operator -(Vector4 vec)
{ vec.X = -vec.X; vec.Y = -vec.Y; vec.Z = -vec.Z; vec.W = -vec.W; return vec; }
public static Vector4 operator *(Vector4 vec, float scale)
{ vec.X *= scale ; vec.Y *= scale ; vec.Z *= scale ; vec.W *= scale ; return vec; }
public static Vector4 operator *( float scale, Vector4 vec)
{ vec.X *= scale ; vec.Y *= scale ; vec.Z *= scale ; vec.W *= scale ; return vec; }
public static Vector4 operator *(Vector4 vec, Vector4 scale)
{ vec.X *= scale.X; vec.Y *= scale.Y; vec.Z *= scale.Z; vec.W *= scale.W; return vec; }
public static Vector4 operator /(Vector4 vec, float scale)
{ vec.X /= scale ; vec.Y /= scale ; vec.Z /= scale ; vec.W /= scale ; return vec; }
public static Vector4 operator /(Vector4 vec, Vector4 scale)
{ vec.X /= scale.X; vec.Y /= scale.Y; vec.Z /= scale.Z; vec.W /= scale.W; return vec; }
public static bool operator ==(Vector4 A, Vector4 B) => A.Equals(B);
public static bool operator !=(Vector4 A, Vector4 B) => !A.Equals(B);
public static double Distance (Vector4 left, Vector4 right) =>
((right.X - left.X) * (right.X - left.X) + (right.Y - left.Y) * (right.Y - left.Y) +
(right.Z - left.Z) * (right.Z - left.Z) + (right.W - left.W) * (right.W - left.W)).Sqrt();
public static double DistanceSquared(Vector4 left, Vector4 right) =>
(right.X - left.X) * (right.X - left.X) + (right.Y - left.Y) * (right.Y - left.Y) +
(right.Z - left.Z) * (right.Z - left.Z) + (right.W - left.W) * (right.W - left.W);
public static double Dot(Vector4 left, Vector4 right) =>
left.X * right.X + left.Y * right.Y + left.Z * right.Z + left.W * right.W;
public static Vector4 Lerp(Vector4 a, Vector4 b, float blend) =>
new Vector4 { X = blend * (b.X - a.X) + a.X,
Y = blend * (b.Y - a.Y) + a.Y,
Z = blend * (b.Z - a.Z) + a.Z,
W = blend * (b.W - a.W) + a.W };
public static Vector4 Lerp(Vector4 a, Vector4 b, Vector4 blend) =>
new Vector4 { X = blend.X * (b.X - a.X) + a.X,
Y = blend.Y * (b.Y - a.Y) + a.Y,
Z = blend.Z * (b.Z - a.Z) + a.Z,
W = blend.W * (b.W - a.W) + a.W };
public Vector4 Round( ) =>
new Vector4 { X = X.Round( ), Y = Y.Round( ), Z = Z.Round( ), W = W.Round( ) };
public Vector4 Round(int d) =>
new Vector4 { X = X.Round(d), Y = Y.Round(d), Z = Z.Round(d), W = W.Round(d) };
public override int GetHashCode()
{
unchecked
{
int hashCode = X.GetHashCode();
hashCode = (hashCode * 397) ^ Y.GetHashCode();
hashCode = (hashCode * 397) ^ Z.GetHashCode();
hashCode = (hashCode * 397) ^ W.GetHashCode();
return hashCode;
}
}
public override bool Equals(object obj) =>
obj is Vector4 vec ? Equals(vec) : false;
public bool Equals(Vector4 other) =>
X == other.X && Y == other.Y && Z == other.Z && W == other.W;
public override string ToString() => $"({X}; {Y}, {Z}, {W})";
public string ToString(int d) => $"({X.Round(d)}; {Y.Round(d)}, {Z.Round(d)}, {W.Round(d)})";
}
}
+1315 -950
View File
File diff suppressed because it is too large Load Diff
-146
View File
@@ -1,146 +0,0 @@
using KKdBaseLib;
using KKdMainLib.IO;
namespace KKdMainLib
{
public unsafe struct AddParam : System.IDisposable
{
private long i;
private Stream _IO;
public HeaderData Header;
public void MotHeadReader(string file)
{
Header = new HeaderData();
_IO = File.OpenReader(file + ".adp");
Header.Count = _IO.RI64();
Header.DataLength = _IO.RI64();
Header.DataOffset = _IO.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; }
Header.Data = new HeaderData.Sub[Header.Count];
byte[] data = _IO.RBy(Header.DataLength, Header.DataOffset);
_IO.C();
fixed (byte* ptr = data)
{
HeaderData.Sub* hPtr = (HeaderData.Sub*)ptr;
for (i = 0; i < Header.Count; i++)
Header.Data[i] = hPtr[i];
}
data = null;
}
public void MotHeadWriter(string file)
{
if (Header.Data == null || Header.Data.LongLength < 1) return;
Header.Count = Header.Data.LongLength;
Header.DataLength = Header.Count * 0x20;
Header.DataOffset = 0x18L;
byte[] data = new byte[Header.DataLength];
fixed (byte* ptr = data)
{
HeaderData.Sub* hPtr = (HeaderData.Sub*)ptr;
for (i = 0; i < Header.Count; i++)
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();
data = null;
}
public void MsgPackReader(string file, bool json)
{
Header = new HeaderData();
MsgPack addParam;
MsgPack msgPack = file.ReadMPAllAtOnce(json);
if ((addParam = msgPack["AddParam", true]).IsNull) return;
Header.Count = addParam.Array.LongLength;
Header.Data = new HeaderData.Sub[Header.Count];
for (i = 0; i < Header.Count; i++)
{
ref HeaderData.Sub sub = ref Header.Data[i];
sub.Time = addParam[i].RF32("Time");
sub.Flags = addParam[i].RI32("Flags");
sub.Frame = addParam[i].RI32("Frame");
sub.ID = addParam[i].RI32("ID");
sub.Value = addParam[i].RF32("Value");
sub.PVBranch = addParam[i].RnI32("PVBranch") ?? 0;
float? f = addParam[i].RnF32("Value");
if (f.HasValue)
{
if (sub.ID == 0) { float v = 0; *(uint*)&v = addParam[i].RU32("Value"); sub.Value = v; }
else sub.Value = f.Value;
}
else { float v = 0; *(uint*)&v = 0xFFFFFFFF; sub.Value = v; }
}
msgPack.Dispose();
}
public void MsgPackWriter(string file, bool json)
{
if (Header.Data == null || Header.Data.LongLength < 1) return;
MsgPack addParam = new MsgPack(Header.Data.LongLength, "AddParam");
fixed (HeaderData.Sub* ptr = Header.Data)
for (i = 0; i < Header.Count; i++)
{
ref HeaderData.Sub sub = ref Header.Data[i];
addParam[i] = MsgPack.New.Add("Time", sub.Time).Add("Flags", sub.Flags).Add("Frame", sub.Frame);
if (sub.PVBranch > 0)
addParam[i] = addParam[i].Add("PVBranch", sub.PVBranch);
addParam[i] = addParam[i].Add("ID", sub.ID);
if (sub.ID == 0)
addParam[i] = addParam[i].Add("Value", *(uint*)&ptr[i].Value);
else if (*(uint*)&ptr[i].Value != 0xFFFFFFFF)
addParam[i] = addParam[i].Add("Value", sub.Value);
}
addParam.WriteAfterAll(true, file, json);
}
public void Dispose()
{ if (_IO != null) { if (_IO.CanRead || _IO.CanWrite) _IO.D(); _IO = null; } Header = default; }
public struct HeaderData
{
public long Count;
public long DataLength;
public long DataOffset;
public Sub[] Data;
public struct Sub
{
public float Time;
public int Flags;
public int Frame;
public int Pad0C;
public int PVBranch;
public int ID;
public float Value;
public int Pad1C;
}
}
}
}
+429 -428
View File
File diff suppressed because it is too large Load Diff
+79 -79
View File
@@ -1,6 +1,5 @@
//Original: https://github.com/blueskythlikesclouds/MikuMikuLibrary/
//Original: https://github.com/blueskythlikesclouds/MikuMikuLibrary/
using System.Collections.Generic;
using KKdBaseLib;
using KKdMainLib.IO;
@@ -9,39 +8,39 @@ namespace KKdMainLib.DB
public class Aet : System.IDisposable
{
private int i, i0, i1, i2;
private Stream _IO;
private Stream s;
public AetSet[] AetSets;
public void BINReader(string file)
{
_IO = File.OpenReader(file + ".bin");
s = File.OpenReader(file + ".bin");
int aetSetsLength = _IO.RI32();
int aetSetsOffset = _IO.RI32();
int aetsLength = _IO.RI32();
int aetsOffset = _IO.RI32();
int aetSetsLength = s.RI32();
int aetSetsOffset = s.RI32();
int aetsLength = s.RI32();
int aetsOffset = s.RI32();
_IO.P = aetSetsOffset;
s.P = aetSetsOffset;
AetSets = new AetSet[aetSetsLength];
for (i = 0; i < aetSetsLength; i++)
{
AetSets[i].Id = _IO.RI32();
AetSets[i].Name = _IO.RSaO();
AetSets[i].FileName = _IO.RSaO();
_IO.RI32();
AetSets[i].SpriteSetId = _IO.RI32();
AetSets[i].Id = s.RI32();
AetSets[i].Name = s.RSaO();
AetSets[i].FileName = s.RSaO();
s.RI32();
AetSets[i].SpriteSetId = s.RI32();
}
int setIndex;
AET aet = new AET();
int[] AetCount = new int[aetSetsLength];
_IO.P = aetsOffset;
s.P = aetsOffset;
for (i = 0; i < aetsLength; i++)
{
_IO.PI64 += 10;
setIndex = _IO.RI16();
s.PI64 += 10;
setIndex = s.RI16();
AetCount[setIndex]++;
}
@@ -51,18 +50,18 @@ namespace KKdMainLib.DB
AetCount[i] = 0;
}
_IO.P = aetsOffset;
s.P = aetsOffset;
for (i = 0; i < aetsLength; i++)
{
aet.Id = _IO.RI32();
aet.Name = _IO.RSaO();
_IO.RI16();
setIndex = _IO.RI16();
aet.Id = s.RI32();
aet.Name = s.RSaO();
s.RI16();
setIndex = s.RI16();
AetSets[setIndex].Aets[AetCount[setIndex]] = aet; AetCount[setIndex]++;
}
_IO.C();
s.C();
}
@@ -71,13 +70,13 @@ namespace KKdMainLib.DB
if (AetSets == null) return;
if (AetSets.Length == 0) return;
List<string> SetName = new List<string>();
List<string> SetFileName = new List<string>();
KKdList<string> setName = KKdList<string>.New;
KKdList<string> setFileName = KKdList<string>.New;
List<int> Ids = new List<int>();
List<int> SetIds = new List<int>();
KKdList<int> ids = KKdList<int>.New;
KKdList<int> setIds = KKdList<int>.New;
List<int> NotAdd = new List<int>();
KKdList<int> notAdd = KKdList<int>.New;
AET temp;
AetSet set;
@@ -85,11 +84,11 @@ namespace KKdMainLib.DB
{
set = AetSets[i];
if (set. Name != null)
if (SetName .Contains(set. Name)) { NotAdd.Add(i); continue; }
else SetName .Add (set. Name);
if (setName .Contains(set. Name)) { notAdd.Add(i); continue; }
else setName .Add (set. Name);
if (set.FileName != null)
if (SetFileName.Contains(set.FileName)) { NotAdd.Add(i); continue; }
else SetFileName.Add (set.FileName);
if (setFileName.Contains(set.FileName)) { notAdd.Add(i); continue; }
else setFileName.Add (set.FileName);
if (set.NewId)
{
@@ -99,93 +98,94 @@ namespace KKdMainLib.DB
}
if (set.Id != null)
if (SetIds.Contains((int)set.Id)) { NotAdd.Add(i); continue; }
else SetIds.Add ((int)set.Id);
if (setIds.Contains((int)set.Id)) { notAdd.Add(i); continue; }
else setIds.Add ((int)set.Id);
for (i0 = 0; i0 < set.Aets.Length; i0++)
{
temp = set.Aets[i0];
if (temp.Id != null)
if ( Ids.Contains((int)temp.Id)) { NotAdd.Add(i); break; }
else Ids.Add ((int)temp.Id);
if ( ids.Contains((int)temp.Id)) { notAdd.Add(i); break; }
else ids.Add ((int)temp.Id);
}
}
SetName = null;
SetFileName = null;
setName .Dispose();
setFileName.Dispose();
for (i = 0; i < AetSets.Length; i++)
{
set = AetSets[i];
if (NotAdd.Contains(i)) continue;
if (notAdd.Contains(i)) continue;
if (!set.NewId) continue;
i1 = 0;
if (set.Id == null) while (true)
{ if (!SetIds.Contains(i1)) { AetSets[i].Id = i1; SetIds.Add(i1); break; } i1++; }
{ if (!setIds.Contains(i1)) { AetSets[i].Id = i1; setIds.Add(i1); break; } i1++; }
for (i0 = 0, i1 = 0; i0 < set.Aets.Length; i0++)
if (set.Aets[i0].Id == null) while (true) { if (!Ids.Contains(i1))
{ AetSets[i].Aets[i0].Id = i1; Ids.Add(i1); break; } i1++; }
if (set.Aets[i0].Id == null) while (true) { if (!ids.Contains(i1))
{ AetSets[i].Aets[i0].Id = i1; ids.Add(i1); break; } i1++; }
}
Ids = null;
SetIds = null;
ids.Dispose();
setIds.Dispose();
for (i = 0, i0 = 0, i2 = 0; i < AetSets.Length; i++)
if (!NotAdd.Contains(i)) { i0 += AetSets[i].Aets.Length; i2++; }
if (!notAdd.Contains(i)) { i0 += AetSets[i].Aets.Length; i2++; }
i1 = i0 * 12;
i1 = i1.A(0x20) + 0x20;
_IO = File.OpenWriter(file + ".bin", true);
_IO.W(i2);
_IO.W(i1);
_IO.W(i0);
_IO.W(0x20);
_IO.W(0x9066906690669066);
_IO.W(0x9066906690669066);
s = File.OpenWriter(file + ".bin", true);
s.W(i2);
s.W(i1);
s.W(i0);
s.W(0x20);
s.W(0x9066906690669066);
s.W(0x9066906690669066);
_IO.P = (i1 + i2 * 0x14).A(0x20);
s.P = (i1 + i2 * 0x14).A(0x20);
for (i = 0; i < AetSets.Length; i++)
{
if (NotAdd.Contains(i)) continue;
AetSets[i]. NameOffset = _IO.P; _IO.W(AetSets[i]. Name + "\0");
AetSets[i].FileNameOffset = _IO.P; _IO.W(AetSets[i].FileName + "\0");
if (notAdd.Contains(i)) continue;
AetSets[i]. NameOffset = s.P; s.W(AetSets[i]. Name + "\0");
AetSets[i].FileNameOffset = s.P; s.W(AetSets[i].FileName + "\0");
}
for (i = 0; i < AetSets.Length; i++)
{
if (NotAdd.Contains(i)) continue;
if (notAdd.Contains(i)) continue;
for (i0 = 0; i0 < AetSets[i].Aets.Length; i0++)
{ AetSets[i].Aets[i0].NameOffset = _IO.P; _IO.W(AetSets[i].Aets[i0].Name + "\0"); }
{ AetSets[i].Aets[i0].NameOffset = s.P; s.W(AetSets[i].Aets[i0].Name + "\0"); }
}
_IO.A(0x08, true);
s.A(0x08, true);
_IO.P = 0x20;
s.P = 0x20;
for (i = 0, i2 = 0; i < AetSets.Length; i++)
{
if (NotAdd.Contains(i)) { i2++; continue; }
if (notAdd.Contains(i)) { i2++; continue; }
for (i0 = 0; i0 < AetSets[i].Aets.Length; i0++)
{
_IO.W(AetSets[i].Aets[i0].Id );
_IO.W(AetSets[i].Aets[i0].NameOffset);
_IO.W((ushort) i0 );
_IO.W((ushort)(i - i2));
s.W(AetSets[i].Aets[i0].Id );
s.W(AetSets[i].Aets[i0].NameOffset);
s.W((ushort) i0 );
s.W((ushort)(i - i2));
}
}
_IO.A(0x20);
s.A(0x20);
for (i = 0, i2 = 0; i < AetSets.Length; i++)
{
if (NotAdd.Contains(i)) { i2++; continue; }
if (notAdd.Contains(i)) { i2++; continue; }
_IO.W(AetSets[i].Id );
_IO.W(AetSets[i]. NameOffset);
_IO.W(AetSets[i].FileNameOffset);
_IO.W(i - i2);
_IO.W(AetSets[i].SpriteSetId );
s.W(AetSets[i].Id );
s.W(AetSets[i]. NameOffset);
s.W(AetSets[i].FileNameOffset);
s.W(i - i2);
s.W(AetSets[i].SpriteSetId );
}
_IO.C();
notAdd.Dispose();
s.C();
}
public void MsgPackReader(string file, bool json)
@@ -213,12 +213,12 @@ 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;
public void Dispose()
{ if (!disposed) { if (_IO != null) _IO.D(); AetSets = null; disposed = true; } }
{ if (!disposed) { if (s != null) s.D(); s = null; AetSets = null; disposed = true; } }
public struct AET
{
@@ -246,10 +246,10 @@ namespace KKdMainLib.DB
public void ReadMsgPack(MsgPack msg)
{
FileName = msg.RS ("FileName" );
FileName = msg.RS ("FileName" );
Id = msg.RnU16( "Id");
Name = msg.RS ( "Name" );
NewId = msg.RB("NewId" );
Name = msg.RS ( "Name" );
NewId = msg.RB ("NewId" );
SpriteSetId = msg.RnU16("SpriteSetId");
MsgPack Temp;
+30 -23
View File
@@ -1,4 +1,4 @@
using System;
using System;
using KKdBaseLib;
using KKdMainLib.IO;
using A3DADict = System.Collections.Generic.Dictionary<string, object>;
@@ -8,7 +8,7 @@ namespace KKdMainLib.DB
public class Auth : IDisposable
{
private int i;
private Stream _IO;
private Stream s;
public string[] Category;
public UID[] UIDs;
@@ -17,16 +17,16 @@ namespace KKdMainLib.DB
{
A3DADict dict = new A3DADict();
_IO = File.OpenReader(file + ".bin");
s = File.OpenReader(file + ".bin");
_IO.Format = Format.F;
int signature = _IO.RI32();
s.Format = Format.F;
int signature = s.RI32();
if (signature != 0x44334123) return;
signature = _IO.RI32();
signature = s.RI32();
if (signature != 0x5F5F5F41) return;
_IO.RI64();
s.RI64();
string[] strData = _IO.RS(_IO.L - _IO.P).Replace("\r\n", "\n").Replace("\r", "\n").Split('\n');
string[] strData = s.RS(s.L - s.P).Replace("\r\n", "\n").Replace("\r", "\n").Split('\n');
for (i = 0; i < strData.Length; i++)
dict.GD(strData[i]);
strData = null;
@@ -51,45 +51,52 @@ namespace KKdMainLib.DB
}
}
_IO.C();
s.C();
dict.Clear();
dict = null;
}
public void BINWriter(string file)
{
_IO = File.OpenWriter(file + ".bin", true);
s = File.OpenWriter(file + ".bin", true);
_IO.W("#A3DA__________\n");
_IO.W("#" + DateTime.UtcNow.ToString("ddd MMM dd HH:mm:ss yyyy",
System.Globalization.CultureInfo.InvariantCulture) + "\n");
s.W("#A3DA__________\n");
s.W("# date time was eliminated.\n");
if (Category != null)
{
int[] so = Category.Length.SW();
for (i = 0; i < Category.Length; i++)
_IO.W($"category.{so[i]}.value={ Category[so[i]]}\n");
_IO.W($"category.length={Category.Length}\n");
s.W($"category.{so[i]}.value={ Category[so[i]]}\n");
s.W($"category.length={Category.Length}\n");
}
if (UIDs != null)
{
int[] so = UIDs.Length.SW();
int max = -1;
for (i = 0; i < UIDs.Length; i++)
{
if (UIDs[so[i]].Category != null && UIDs[so[i]].Category != "")
_IO.W($"uid.{so[i]}.category=" + UIDs[so[i]].Category + "\n");
s.W($"uid.{so[i]}.category=" + UIDs[so[i]].Category + "\n");
if (UIDs[so[i]].OrgUid != null)
_IO.W($"uid.{so[i]}.org_uid=" + UIDs[so[i]].OrgUid + "\n");
{
int orgUid = UIDs[so[i]].OrgUid.Value;
s.W($"uid.{so[i]}.org_uid=" + orgUid + "\n");
if (max < orgUid)
max = orgUid;
}
if (UIDs[so[i]].Size != null)
_IO.W($"uid.{so[i]}.size=" + UIDs[so[i]].Size + "\n");
s.W($"uid.{so[i]}.size=" + UIDs[so[i]].Size + "\n");
if (UIDs[so[i]].Value != null && UIDs[so[i]].Value != "")
_IO.W($"uid.{so[i]}.value=" + UIDs[so[i]].Value + "\n");
s.W($"uid.{so[i]}.value=" + UIDs[so[i]].Value + "\n");
}
_IO.W($"uid.length={UIDs.Length}\n");
s.W($"uid.length={UIDs.Length}\n");
if (max != -1)
s.W($"uid.max={max}\n");
}
_IO.C();
s.C();
}
public void MsgPackReader(string file, bool json)
@@ -146,12 +153,12 @@ namespace KKdMainLib.DB
authDB.Add(uid);
}
authDB.Write(true, file, json);
authDB.Write(false, true, file, json);
}
private bool disposed = false;
public void Dispose()
{ if (!disposed) { if (_IO != null) _IO.D(); Category = null; UIDs = null; disposed = true; } }
{ if (!disposed) { if (s != null) s.D(); s = null; Category = null; UIDs = null; disposed = true; } }
public struct UID
{
+64 -67
View File
@@ -1,6 +1,5 @@
//Original: https://github.com/blueskythlikesclouds/MikuMikuLibrary/
//Original: https://github.com/blueskythlikesclouds/MikuMikuLibrary/
using System.Collections.Generic;
using KKdBaseLib;
using KKdMainLib.IO;
@@ -9,27 +8,27 @@ namespace KKdMainLib.DB
public class Spr : System.IDisposable
{
private int i, i0, i1, i2;
private Stream _IO;
private Stream s;
public SpriteSet[] SpriteSets;
public void BINReader(string file)
{
_IO = File.OpenReader(file + ".bin");
s = File.OpenReader(file + ".bin");
int spriteSetsLength = _IO.RI32();
int spriteSetsOffset = _IO.RI32();
int spritesLength = _IO.RI32();
int spritesOffset = _IO.RI32();
int spriteSetsLength = s.RI32();
int spriteSetsOffset = s.RI32();
int spritesLength = s.RI32();
int spritesOffset = s.RI32();
_IO.P = spriteSetsOffset;
s.P = spriteSetsOffset;
SpriteSets = new SpriteSet[spriteSetsLength];
for (i = 0; i < spriteSetsLength; i++)
{
SpriteSets[i].Id = _IO.RI32();
SpriteSets[i].Name = _IO.RSaO();
SpriteSets[i].FileName = _IO.RSaO();
_IO.RI32();
SpriteSets[i].Id = s.RI32();
SpriteSets[i].Name = s.RSaO();
SpriteSets[i].FileName = s.RSaO();
s.RI32();
}
int setIndex;
@@ -38,11 +37,11 @@ namespace KKdMainLib.DB
int[] sprCount = new int[spriteSetsLength];
int[] texCount = new int[spriteSetsLength];
_IO.P = spritesOffset;
s.P = spritesOffset;
for (i = 0; i < spritesLength; i++)
{
_IO.PI64 += 10;
setIndex = _IO.RI16();
s.PI64 += 10;
setIndex = s.RI16();
isTexture = (setIndex & 0x1000) == 0x1000;
setIndex &= 0xFFF;
@@ -59,13 +58,13 @@ namespace KKdMainLib.DB
texCount[i] = 0;
}
_IO.P = spritesOffset;
s.P = spritesOffset;
for (i = 0; i < spritesLength; i++)
{
st.Id = _IO.RI32();
st.Name = _IO.RSaO();
_IO.RI16();
setIndex = _IO.RI16();
st.Id = s.RI32();
st.Name = s.RSaO();
s.RI16();
setIndex = s.RI16();
isTexture = (setIndex & 0x1000) == 0x1000;
setIndex &= 0xFFF;
@@ -73,7 +72,7 @@ namespace KKdMainLib.DB
else { SpriteSets[setIndex]. Sprites[sprCount[setIndex]] = st; sprCount[setIndex]++; }
}
_IO.C();
s.C();
}
public void BINWriter(string file)
@@ -81,13 +80,13 @@ namespace KKdMainLib.DB
if (SpriteSets == null) return;
if (SpriteSets.Length == 0) return;
List<string> setName = new List<string>();
List<string> setFileName = new List<string>();
KKdList<string> setName = KKdList<string>.New;
KKdList<string> setFileName = KKdList<string>.New;
List<int> ids = new List<int>();
List<int> setIds = new List<int>();
KKdList<int> ids = KKdList<int>.New;
KKdList<int> setIds = KKdList<int>.New;
List<int> notAdd = new List<int>();
KKdList<int> notAdd = KKdList<int>.New;
SpriteTexture temp;
SpriteSet set;
@@ -130,8 +129,8 @@ namespace KKdMainLib.DB
else ids.Add ((int)temp.Id);
}
}
setName = null;
setFileName = null;
setName .Dispose();
setFileName.Dispose();
for (i = 0; i < SpriteSets.Length; i++)
{
@@ -151,11 +150,8 @@ namespace KKdMainLib.DB
while (set. Sprites[i0].Id == null)
if (!ids.Contains(i1)) ids.Add((int)(SpriteSets[i]. Sprites[i0].Id = i1)); else i1++;
}
ids = null;
setIds = null;
ids.Dispose();
setIds.Dispose();
for (i = 0, i0 = 0, i2 = 0; i < SpriteSets.Length; i++)
if (!notAdd.Contains(i)) { i0 += SpriteSets[i].Sprites.Length + SpriteSets[i].Textures.Length; i2++; }
@@ -163,68 +159,69 @@ namespace KKdMainLib.DB
i1 = i0 * 12;
i1 = i1.A(0x20) + 0x20;
_IO = File.OpenWriter(file + ".bin", true);
_IO.W(i2);
_IO.W(i1);
_IO.W(i0);
_IO.W(0x20);
_IO.W(0x9066906690669066);
_IO.W(0x9066906690669066);
s = File.OpenWriter(file + ".bin", true);
s.W(i2);
s.W(i1);
s.W(i0);
s.W(0x20);
s.W(0x9066906690669066);
s.W(0x9066906690669066);
_IO.P = (i1 + i2 * 0x10).A(0x20);
s.P = (i1 + i2 * 0x10).A(0x20);
for (i = 0; i < SpriteSets.Length; i++)
{
if (notAdd.Contains(i)) continue;
for (i0 = 0; i0 < SpriteSets[i].Textures.Length; i0++)
{ SpriteSets[i].Textures[i0].NameOffset = _IO.P;
_IO.W(SpriteSets[i].Textures[i0].Name + "\0"); }
{ SpriteSets[i].Textures[i0].NameOffset = s.P;
s.W(SpriteSets[i].Textures[i0].Name + "\0"); }
for (i0 = 0; i0 < SpriteSets[i]. Sprites.Length; i0++)
{ SpriteSets[i]. Sprites[i0].NameOffset = _IO.P;
_IO.W(SpriteSets[i]. Sprites[i0].Name + "\0"); }
{ SpriteSets[i]. Sprites[i0].NameOffset = s.P;
s.W(SpriteSets[i]. Sprites[i0].Name + "\0"); }
}
for (i = 0; i < SpriteSets.Length; i++)
{
if (notAdd.Contains(i)) continue;
SpriteSets[i]. NameOffset = _IO.P; _IO.W(SpriteSets[i]. Name + "\0");
SpriteSets[i].FileNameOffset = _IO.P; _IO.W(SpriteSets[i].FileName + "\0");
SpriteSets[i]. NameOffset = s.P; s.W(SpriteSets[i]. Name + "\0");
SpriteSets[i].FileNameOffset = s.P; s.W(SpriteSets[i].FileName + "\0");
}
s.A(0x08, true);
_IO.A(0x08, true);
_IO.P = 0x20;
s.P = 0x20;
for (i = 0, i2 = 0; i < SpriteSets.Length; i++)
{
if (notAdd.Contains(i)) { i2++; continue; }
for (i0 = 0; i0 < SpriteSets[i].Textures.Length; i0++)
{
_IO.W(SpriteSets[i].Textures[i0].Id );
_IO.W(SpriteSets[i].Textures[i0].NameOffset);
_IO.W((ushort) i0 );
_IO.W((ushort)(0x1000 | (i - i2)));
s.W(SpriteSets[i].Textures[i0].Id );
s.W(SpriteSets[i].Textures[i0].NameOffset);
s.W((ushort) i0 );
s.W((ushort)(0x1000 | (i - i2)));
}
for (i0 = 0; i0 < SpriteSets[i]. Sprites.Length; i0++)
{
_IO.W(SpriteSets[i]. Sprites[i0].Id );
_IO.W(SpriteSets[i]. Sprites[i0].NameOffset);
_IO.W((ushort) i0 );
_IO.W((ushort)(i - i2));
s.W(SpriteSets[i]. Sprites[i0].Id );
s.W(SpriteSets[i]. Sprites[i0].NameOffset);
s.W((ushort) i0 );
s.W((ushort)(i - i2));
}
}
_IO.A(0x20);
s.A(0x20);
for (i = 0, i2 = 0; i < SpriteSets.Length; i++)
{
if (notAdd.Contains(i)) { i2++; continue; }
_IO.W(SpriteSets[i].Id );
_IO.W(SpriteSets[i]. NameOffset);
_IO.W(SpriteSets[i].FileNameOffset);
_IO.W(i - i2);
s.W(SpriteSets[i].Id );
s.W(SpriteSets[i]. NameOffset);
s.W(SpriteSets[i].FileNameOffset);
s.W(i - i2);
}
_IO.C();
notAdd.Dispose();
s.C();
}
public void MsgPackReader(string file, bool json = false)
@@ -251,12 +248,12 @@ 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;
public void Dispose()
{ if (!disposed) { if (_IO != null) _IO.D(); SpriteSets = null; disposed = true; } }
{ if (!disposed) { if (s != null) s.D(); s = null; SpriteSets = null; disposed = true; } }
public struct SpriteTexture
{
+127 -123
View File
@@ -1,4 +1,4 @@
using KKdBaseLib;
using KKdBaseLib;
using KKdBaseLib.F2;
using KKdMainLib.IO;
@@ -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,154 @@ 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();
if (header.SectionSignature == 0x43505845)
header = _IO.ReadHeader(true, true);
if (header.SectionSignature != 0x64) return;
uint signature = s.RU32();
if (signature == 0x43505845) { header = s.ReadHeader(true); signature = s.RU32(); }
if (signature != 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].FaceOffset = s.RIX();
Dex[i].FaceCLOffset = s.RIX();
}
_IO.P = DEXNameOffset;
s.P = DEXNameOffset;
for (i = 0; i < Dex.Length; i++)
Dex[i].NameOffset = (int)_IO.RIX();
Dex[i].NameOffset = s.RIX();
for (i = 0; i < Dex.Length; i++)
{
EXPElement element = new EXPElement();
Dex[i].Main = KKdList<EXPElement>.New;
_IO.P = Dex[i].MainOffset;
EXPData element = new EXPData();
Dex[i].Face = KKdList<EXPData>.New;
s.PI64 = Dex[i].FaceOffset;
while (true)
{
element.Frame = _IO.RF32();
element.Both = _IO.RU16();
element.ID = _IO.RU16();
element.Value = _IO.RF32();
element.Trans = _IO.RF32();
if (element.Frame == 999999 || element.Both == 0xFFFF) break;
Dex[i].Main.Add(element);
element.Frame = s.RF32();
element.Type = s.RU16();
element.ID = s.RU16();
element.Value = s.RF32();
element.Trans = s.RF32();
if (element.Type == 0xFFFF) break;
Dex[i].Face.Add(element);
}
Dex[i].Face.Capacity = Dex[i].Face.Count;
Dex[i].Eyes = KKdList<EXPElement>.New;
_IO.P = Dex[i].EyesOffset;
Dex[i].FaceCL = KKdList<EXPData>.New;
s.PI64 = Dex[i].FaceCLOffset;
while(true)
{
element.Frame = _IO.RF32();
element.Both = _IO.RU16();
element.ID = _IO.RU16();
element.Value = _IO.RF32();
element.Trans = _IO.RF32();
if (element.Frame == 999999 || element.Both == 0xFFFF) break;
Dex[i].Eyes.Add(element);
element.Frame = s.RF32();
element.Type = s.RU16();
element.ID = s.RU16();
element.Value = s.RF32();
element.Trans = s.RF32();
if (element.Type == 0xFFFF) break;
Dex[i].FaceCL.Add(element);
}
Dex[i].FaceCL.Capacity = Dex[i].FaceCL.Count;
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;
for (i1 = 0; i1 < Dex[i0].Main.Count; i1++)
Dex[i0].FaceOffset = s.P;
for (i1 = 0; i1 < Dex[i0].Face.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].Face[i1].Frame);
s.W(Dex[i0].Face[i1].Type );
s.W(Dex[i0].Face[i1].ID );
s.W(Dex[i0].Face[i1].Value);
s.W(Dex[i0].Face[i1].Trans);
}
_IO.W(999999f);
_IO.W(0xFFFF);
_IO.W(0x0L);
_IO.A(0x20);
s.W(999999.0f);
s.W(0xFFFF);
s.W(0x0L);
s.A(0x20);
Dex[i0].EyesOffset = _IO.P;
for (i1 = 0; i1 < Dex[i0].Eyes.Count; i1++)
Dex[i0].FaceCLOffset = s.P;
for (i1 = 0; i1 < Dex[i0].FaceCL.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].FaceCL[i1].Frame);
s.W(Dex[i0].FaceCL[i1].Type );
s.W(Dex[i0].FaceCL[i1].ID );
s.W(Dex[i0].FaceCL[i1].Value);
s.W(Dex[i0].FaceCL[i1].Trans);
}
_IO.W(999999f);
_IO.W(0xFFFF);
_IO.W(0x0L);
_IO.A(0x20);
s.W(999999.0f);
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].FaceOffset);
s.WX(Dex[i].FaceCLOffset);
}
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)
@@ -177,19 +181,19 @@ namespace KKdMainLib
Dex[i0] = new EXP { Name = dex[i0].RS("Name") };
MsgPack temp;
if ((temp = dex[i0]["Main", true]).NotNull)
if ((temp = dex[i0]["Face", true]).NotNull)
{
Dex[i0].Main = KKdList<EXPElement>.New;
Dex[i0].Main.Capacity = temp.Array.Length;
for (i1 = 0; i1 < Dex[i0].Main.Capacity; i1++)
Dex[i0].Main.Add(EXPElement.Read(temp[i1]));
Dex[i0].Face = KKdList<EXPData>.New;
Dex[i0].Face.Capacity = temp.Array.Length;
for (i1 = 0; i1 < Dex[i0].Face.Capacity; i1++)
Dex[i0].Face.Add(EXPData.Read(temp[i1]));
}
if ((temp = dex[i0]["Eyes", true]).NotNull)
if ((temp = dex[i0]["FaceCL", true]).NotNull)
{
Dex[i0].Eyes = KKdList<EXPElement>.New;
Dex[i0].Eyes.Capacity = temp.Array.Length;
for (i1 = 0; i1 < this.Dex[i0].Eyes.Capacity; i1++)
Dex[i0].Eyes.Add(EXPElement.Read(temp[i1]));
Dex[i0].FaceCL = KKdList<EXPData>.New;
Dex[i0].FaceCL.Capacity = temp.Array.Length;
for (i1 = 0; i1 < Dex[i0].FaceCL.Capacity; i1++)
Dex[i0].FaceCL.Add(EXPData.Read(temp[i1]));
}
temp.Dispose();
}
@@ -206,54 +210,54 @@ namespace KKdMainLib
for (i0 = 0; i0 < Dex.Length; i0++)
{
MsgPack exp = MsgPack.New.Add("Name", Dex[i0].Name);
MsgPack main = new MsgPack(Dex[i0].Main.Count, "Main");
for (i1 = 0; i1 < Dex[i0].Main.Count; i1++)
main[i1] = Dex[i0].Main[i1].Write();
MsgPack main = new MsgPack(Dex[i0].Face.Count, "Face");
for (i1 = 0; i1 < Dex[i0].Face.Count; i1++)
main[i1] = Dex[i0].Face[i1].Write();
exp.Add(main);
MsgPack eyes = new MsgPack(Dex[i0].Eyes.Count, "Eyes");
for (i1 = 0; i1 < Dex[i0].Eyes.Count; i1++)
eyes[i1] = Dex[i0].Eyes[i1].Write();
MsgPack eyes = new MsgPack(Dex[i0].FaceCL.Count, "FaceCL");
for (i1 = 0; i1 < Dex[i0].FaceCL.Count; i1++)
eyes[i1] = Dex[i0].FaceCL[i1].Write();
exp.Add(eyes);
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.Dispose(); Dex = null; header = default; disposed = true; } }
{ if (!disposed) { if (s != null) s.D(); s = null; Dex = null; header = default; disposed = true; } }
public struct EXP
{
public int MainOffset;
public int EyesOffset;
public int NameOffset;
public long FaceOffset;
public long FaceCLOffset;
public long NameOffset;
public string Name;
public KKdList<EXPElement> Main;
public KKdList<EXPElement> Eyes;
public KKdList<EXPData> Face;
public KKdList<EXPData> FaceCL;
public override string ToString() => Name;
}
public struct EXPElement
public struct EXPData
{
public float Frame;
public ushort Both;
public ushort Type;
public ushort ID;
public float Value;
public float Trans;
public static EXPElement Read(MsgPack msg) =>
new EXPElement() { Frame = msg.RF32("F"), Both = msg.RU16("B"),
ID = msg.RU16("I"), Value = msg.RF32("V"),
Trans = msg.RF32("T"), };
public static EXPData Read(MsgPack msg) =>
new EXPData() { Frame = msg.RF32("Frame"), Type = msg.RU16("Type" ),
ID = msg.RU16("ID" ), Value = msg.RF32("Value"),
Trans = msg.RF32("Trans"), };
public MsgPack Write() =>
MsgPack.New.Add("F", Frame).Add("B", Both )
.Add("I", ID).Add("V", Value)
.Add("T", Trans);
MsgPack.New.Add("Frame", Frame).Add("Type" , Type )
.Add("ID" , ID ).Add("Value", Value)
.Add("Trans", Trans);
}
}
}
+62 -8
View File
@@ -1,4 +1,4 @@
using System;
using System;
using System.Security.Cryptography;
using KKdBaseLib;
using KKdMainLib.IO;
@@ -8,17 +8,15 @@ 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)
public static void Decrypt(string file)
{
int streamLength, fileLength;
byte[] encrypted, decrypted;
using (Stream _IO = File.OpenReader(file))
{
if (_IO.RI64() != 0x454C494641564944) return;
if (_IO.RU64() != 0x454C494641564944u) return;
streamLength = _IO.RI32();
fileLength = _IO.RI32();
@@ -39,7 +37,7 @@ namespace KKdMainLib
_IO.W(decrypted, fileLength < streamLength ? fileLength : streamLength);
}
public static void Encrypt(this string file)
public static void Encrypt(string file)
{
byte[] data;
using (Stream _IO = File.OpenReader(file))
@@ -62,11 +60,67 @@ namespace KKdMainLib
using (Stream _IO = File.OpenWriter(file, dataAlign.Length))
{
_IO.W(0x454C494641564944);
_IO.W(0x454C494641564944u);
_IO.W(fileLength);
_IO.W(fileLengthOrigin);
_IO.W(encrypted);
}
}
public static byte[] Decrypt(byte[] data)
{
int streamLength, fileLength;
byte[] encrypted, decrypted;
using (Stream _IO = File.OpenReader(data))
{
if (_IO.RU64() != 0x454C494641564944u) return data;
streamLength = _IO.RI32();
fileLength = _IO.RI32();
encrypted = _IO.RBy(streamLength);
decrypted = new byte[streamLength];
}
using (AesManaged crypto = new AesManaged())
{
crypto.Key = Key; crypto.IV = new byte[16];
crypto.Mode = CipherMode.ECB; crypto.Padding = PaddingMode.Zeros;
using CryptoStream cryptoData = new CryptoStream(new MSIO.MemoryStream(encrypted),
crypto.CreateDecryptor(crypto.Key, crypto.IV), CryptoStreamMode.Read);
cryptoData.Read(decrypted, 0, streamLength);
}
data = new byte[fileLength];
Array.Copy(decrypted, data, fileLength < streamLength ? fileLength : streamLength);
return data;
}
public static byte[] Encrypt(byte[] data)
{
int fileLengthOrigin = data.Length;
int fileLength = fileLengthOrigin.A(16);
byte[] dataAlign = new byte[fileLength];
Array.Copy(data, dataAlign, data.Length);
data = null;
byte[] encrypted = new byte[fileLength];
using (AesManaged crypto = new AesManaged())
{
crypto.Key = Key; crypto.IV = new byte[16];
crypto.Mode = CipherMode.ECB; crypto.Padding = PaddingMode.Zeros;
using CryptoStream cryptoData = new CryptoStream(new MSIO.MemoryStream(dataAlign),
crypto.CreateEncryptor(crypto.Key, crypto.IV), CryptoStreamMode.Read);
cryptoData.Read(encrypted, 0, fileLength);
}
using (Stream _IO = File.OpenWriter())
{
_IO.W(0x454C494641564944u);
_IO.W(fileLength);
_IO.W(fileLengthOrigin);
_IO.W(encrypted);
data = _IO.ToArray();
}
return data;
}
}
}
+110 -65
View File
@@ -1,4 +1,4 @@
using System;
using System;
using System.Net;
using KKdBaseLib;
using KKdMainLib.IO;
@@ -7,9 +7,10 @@ namespace KKdMainLib
{
public struct DataBank : IDisposable
{
private Stream _IO;
private int i;
private Stream s;
public bool pvListPDA;
public PvList[] pvList;
public PsrData[] psrData;
@@ -20,6 +21,7 @@ namespace KKdMainLib
public void DBReader(string file)
{
pvListPDA = false;
Success = false;
if (!File.Exists(file)) return;
string text = File.ReadAllText(file);
@@ -28,51 +30,73 @@ namespace KKdMainLib
pvList = null;
psrData = null;
if (file.Contains("psrData") && array.Length % 13 < 2)
if (file.Contains("psrData") && array.Length % 13 == 0)
{
psrData = new PsrData[array.Length / 13];
for (i = 0; i < psrData.Length; i++) psrData[i].SetValue(array, i);
Success = true;
}
else if (file.Contains("psrData")) Success = true;
else if (file.Contains("PvList") && array.Length % 7 < 2)
else if (file.Contains("PvList") && (array.Length % 7 == 0 || array.Length % 6 == 0))
{
pvList = new PvList[array.Length / 7];
for (i = 0; i < pvList.Length; i++) pvList[i].SetValue(array, i);
if (array[2] != "0" && array[2] != "1")
{
pvListPDA = true;
pvList = new PvList[array.Length / 6];
for (i = 0; i < pvList.Length; i++) pvList[i].SetValue(array, i, true);
}
else
{
pvList = new PvList[array.Length / 7];
for (i = 0; i < pvList.Length; i++) pvList[i].SetValue(array, i, false);
}
Success = true;
}
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(pvListPDA) + c));
s.W(UrlEncode(pvList[i].ToString(pvListPDA)));
}
else _IO.W("%2A%2A%2A");
else s.W("%2A%2A%2A");
}
byte[] data = _IO.ToArray(true);
ushort num = DCC.CalculateChecksum(data);
File.WriteAllBytes(file + "_" + num + "_" + num2 + ".dat", data);
return s.ToArray(true);
}
public void DBWriter(string file, uint timestamp)
{
if (!Success) return;
byte[] data = DBWriter(file);
if (data == null) return;
ushort hash = data.HashCRC16_CCITT();
File.WriteAllBytes(file + "_" + hash + "_" + timestamp + ".dat", data);
}
public void MsgPackReader(string file, bool json)
{
pvListPDA = false;
Success = false;
MsgPack msgPack = file.ReadMPAllAtOnce(json);
bool compact = msgPack.RB("Compact");
@@ -100,6 +124,13 @@ namespace KKdMainLib
for (i = 0; i < this.pvList.Length; i++)
this.pvList[i].SetValue(pvList[i], compact);
}
else if ((pvList = msgPack["PvListPDA", true]).NotNull)
{
pvListPDA = true;
this.pvList = new PvList[pvList.Array.Length];
for (i = 0; i < this.pvList.Length; i++)
this.pvList[i].SetValue(pvList[i], compact);
}
Success = true;
pvList.Dispose();
}
@@ -127,22 +158,22 @@ namespace KKdMainLib
if (pvList != null)
{msgPack.Add("Compact", true);
MsgPack PvList = new MsgPack(pvList.Length, "PvList");
MsgPack PvList = new MsgPack(pvList.Length, pvListPDA ? "PvListPDA" : "PvList");
for (i = 0; i < pvList.Length; i++) PvList[i] = pvList[i].WriteMP();
msgPack.Add(PvList);
}
else msgPack.Add(new MsgPack("PvList", null));
else msgPack.Add(new MsgPack(pvListPDA ? "PvListPDA" : "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.Dispose(); psrData = null;
pvList = null; Success = false; disposed = true; } }
{ if (!disposed) { if (s != null) s.D(); s = null; psrData = null;
pvList = null; pvListPDA = false; Success = false; disposed = true; } }
public struct PsrData
{
@@ -166,9 +197,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 +208,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 +246,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
@@ -249,15 +281,27 @@ namespace KKdMainLib
public Date StartShow;
public Date EndShow;
public void SetValue(string[] data, int i = 0)
public void SetValue(string[] data, int i = 0, bool pda = false)
{
PV_ID = int.Parse(data[i * 7]);
Version = int.Parse(data[i * 7 + 1]);
Edition = int.Parse(data[i * 7 + 2]);
AdvDemoStart.SV(data[i * 7 + 3]);
AdvDemoEnd .SV(data[i * 7 + 4]);
StartShow .SV(data[i * 7 + 5]);
EndShow .SV(data[i * 7 + 6]);
if (pda)
{
PV_ID = int.Parse(data[i * 6]);
Version = int.Parse(data[i * 6 + 1]);
AdvDemoStart.SV(data[i * 6 + 2]);
AdvDemoEnd.SV(data[i * 6 + 3]);
StartShow.SV(data[i * 6 + 4]);
EndShow.SV(data[i * 6 + 5]);
}
else
{
PV_ID = int.Parse(data[i * 7]);
Version = int.Parse(data[i * 7 + 1]);
Edition = int.Parse(data[i * 7 + 2]);
AdvDemoStart.SV(data[i * 7 + 3]);
AdvDemoEnd .SV(data[i * 7 + 4]);
StartShow .SV(data[i * 7 + 5]);
EndShow .SV(data[i * 7 + 6]);
}
}
public void SetValue(MsgPack msg, bool Compact)
@@ -290,9 +334,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);
@@ -300,8 +344,9 @@ namespace KKdMainLib
return msgPack;
}
public override string ToString() =>
UrlEncode($"{PV_ID},{Version},{Edition},{AdvDemoStart},{AdvDemoEnd},{StartShow},{EndShow}");
public string ToString(bool pda) => !pda
? UrlEncode($"{PV_ID},{Version},{Edition},{AdvDemoStart},{AdvDemoEnd},{StartShow},{EndShow}")
: UrlEncode($"{PV_ID},{Version},{AdvDemoStart},{AdvDemoEnd},{StartShow},{EndShow}");
}
public struct Date
@@ -375,7 +420,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
+244 -69
View File
@@ -1,4 +1,4 @@
using KKdBaseLib;
using KKdBaseLib;
using KKdBaseLib.F2;
using KKdMainLib.IO;
@@ -6,41 +6,44 @@ namespace KKdMainLib
{
public static class HeaderExtensions
{
public static Header ReadHeader(this Stream stream, bool seek, bool readSectionSignature = true)
public static Header ReadHeader(this Stream stream, bool seek)
{
if (seek)
if (stream.PI64 > 4) stream.PI64 -= 4;
else stream.PI64 = 0;
return stream.ReadHeader(readSectionSignature);
return stream.ReadHeader();
}
public static Header ReadHeader(this Stream stream, bool readSectionSignature = true)
public static Header ReadHeader(this Stream stream)
{
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();
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 +51,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 +63,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);
}
@@ -97,19 +100,21 @@ namespace KKdMainLib
public static Struct RSt(this byte[] data)
{
if (data == null || data.Length < 1) return default;
data = DIVAFILE.Decrypt(data);
Struct @struct;
using (Stream stream = File.OpenReader(data))
@struct = stream.RSt(stream.ReadHeader(false));
return @struct;
}
public static Struct RSt(this Stream stream, Header header)
private 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,46 +122,50 @@ 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(stream.RSt(header));
else if (header.Depth > depth) subStructs.Add(stream.RSt(header));
else { stream.PI64 -= header.Length; break; }
lastSig = sig;
}
subStructs.Capacity = subStructs.Count;
if (subStructs.Capacity > 0) @struct.SubStructs = subStructs.ToArray();
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, 0, shiftX, useDepth); stream.WEOFC(); Data = stream.ToArray(); }
return Data;
}
public static void W(this Stream stream, Struct @struct, bool shiftX = false, bool useDepth = true)
public static void W(this Stream stream, Struct @struct, uint depth = 0,
bool shiftX = false, bool useDepth = true)
{
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);
@struct.Update(shiftX);
@struct.Header.Depth = depth;
stream.W(@struct.Header, @struct.Header.Length == 0x40);
if (@struct.Data != null) stream.W(@struct.Data);
if (@struct.HasPOF ) stream.W(@struct.POF , shiftX, useDepth ? depth + 1 : 0u);
if (@struct.HasENRS) stream.W(@struct.ENRS, useDepth ? depth + 1 : 0u);
if (@struct.HasSubStructs)
{
for (int i = 0; i < @struct.SubStructs.Length; i++)
stream.W(@struct.SubStructs[i], shiftX);
stream.WEOFC(@struct.Depth + 1);
}
stream.W(@struct.SubStructs[i], depth + 1, shiftX, useDepth);
if (@struct.HasPOF || @struct.HasENRS || @struct.HasSubStructs)
stream.WEOFC(depth + 1);
}
}
@@ -186,35 +195,43 @@ 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
@@ -231,12 +248,170 @@ namespace KKdMainLib
}
}
public static class LibDeflate
public static class HashExt
{
public static void Extract()
public static uint HashFNV1a64(this byte[] array) =>
array.HashMurmurHash(array.Length);
// FNV 1a 64-bit Modified
// 0x1403B04D0 in SBZV_7.10
public static ulong HashFNV1a64m(this byte[] array, int length)
{
if (!File.Exists("libdeflate.dll"))
File.WriteAllBytes("libdeflate.dll", Properties.Resources.libdeflate);
int i = 0;
ulong hash = 0xCBF29CE484222325;
while (i < length)
{ hash = 0x100000001B3 * (hash ^ (ulong)array[i]); i++; }
return (hash >> 32) ^ hash; // Actual Modification
}
public static uint HashMurmurHash(this byte[] array, uint salt = 0,
bool alreadyUpper = false, bool bigEndian = false) =>
array.HashMurmurHash(array.Length, salt, alreadyUpper, bigEndian);
// MurmurHash
// 0x814D7A9C in PCSB00554
// 0x8134C304 in PCSB01007
// 0x0069CEA4 in NPEB02013
public static uint HashMurmurHash(this byte[] array, int length, uint salt = 0,
bool alreadyUpper = false, bool bigEndian = false)
{
uint a, b, hash;
int i;
const uint m = 0x7FD652AD;
const int r = 16;
hash = salt + 0xDEADBEEF;
if (alreadyUpper)
{
if (bigEndian)
for (i = 0; length > 3; length -= 4, i += 4)
{
b = (uint)array[i + 3] | ((uint)array[i + 2] << 8)
| ((uint)array[i + 1] << 16) | ((uint)array[i + 0] << 24);
hash += b;
hash *= m;
hash ^= hash >> r;
}
else
for (i = 0; length > 3; length -= 4, i += 4)
{
b = (uint)array[i + 0] | ((uint)array[i + 1] << 8)
| ((uint)array[i + 2] << 16) | ((uint)array[i + 3] << 24);
hash += b;
hash *= m;
hash ^= hash >> r;
}
if (length > 0)
{
if (length > 1)
{
if (length > 2)
hash += (uint)array[i + 2] << 16;
hash += (uint)array[i + 1] << 8;
}
hash += array[i];
hash *= m;
hash ^= hash >> r;
}
}
else
{
if (bigEndian)
for (i = 0; length > 3; length -= 4, i += 4)
{
b = (uint)array[i + 3] | ((uint)array[i + 2] << 8)
| ((uint)array[i + 1] << 16) | ((uint)array[i + 0] << 24);
a = b & 0xFF; if (a > 0x60 && a < 0x7B) a -= 0x20; b = (b & 0xFFFFFF00) | a ;
a = (b >> 8) & 0xFF; if (a > 0x60 && a < 0x7B) a -= 0x20; b = (b & 0xFFFF00FF) | (a << 8);
a = (b >> 16) & 0xFF; if (a > 0x60 && a < 0x7B) a -= 0x20; b = (b & 0xFF00FFFF) | (a << 16);
a = (b >> 24) & 0xFF; if (a > 0x60 && a < 0x7B) a -= 0x20; b = (b & 0x00FFFFFF) | (a << 24);
hash += b;
hash *= m;
hash ^= hash >> r;
}
else
for (i = 0; length > 3; length -= 4, i += 4)
{
b = (uint)array[i + 0] | ((uint)array[i + 1] << 8)
| ((uint)array[i + 2] << 16) | ((uint)array[i + 3] << 24);
a = b & 0xFF; if (a > 0x60 && a < 0x7B) a -= 0x20; b = (b & 0xFFFFFF00) | a ;
a = (b >> 8) & 0xFF; if (a > 0x60 && a < 0x7B) a -= 0x20; b = (b & 0xFFFF00FF) | (a << 8);
a = (b >> 16) & 0xFF; if (a > 0x60 && a < 0x7B) a -= 0x20; b = (b & 0xFF00FFFF) | (a << 16);
a = (b >> 24) & 0xFF; if (a > 0x60 && a < 0x7B) a -= 0x20; b = (b & 0x00FFFFFF) | (a << 24);
hash += b;
hash *= m;
hash ^= hash >> r;
}
if (length > 0)
{
if (length > 1)
{
if (length > 2)
{
b = array[i + 2]; if (b > 0x60 && b < 0x7B) b -= 0x20; hash += b << 16;
}
b = array[i + 1]; if (b > 0x60 && b < 0x7B) b -= 0x20; hash += b << 8;
}
b = array[i]; if (b > 0x60 && b < 0x7B) b -= 0x20; hash += b;
hash *= m;
hash ^= hash >> r;
}
}
hash *= m;
hash ^= hash >> 10;
hash *= m;
hash ^= hash >> 17;
return hash;
}
private static readonly ushort[] CRC16_CCITT_Table = {
0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7,
0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF,
0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6,
0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE,
0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485,
0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D,
0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4,
0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC,
0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823,
0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B,
0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12,
0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A,
0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41,
0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49,
0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70,
0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78,
0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F,
0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067,
0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E,
0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256,
0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D,
0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C,
0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634,
0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB,
0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3,
0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A,
0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92,
0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9,
0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1,
0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8,
0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0,
};
// CRC16-CCITT
// 0x140011A90 in SBZV_7.10
public static ushort HashCRC16_CCITT(this byte[] data, int offset = 0, ushort seed = 0xFFFF)
{
int length = data.Length;
ushort hash = seed;
for (int i = offset; i < length; i++)
hash = (ushort)(CRC16_CCITT_Table[(hash >> 8) ^ data[i]] ^ (hash << 8));
return hash;
}
}
}
+323 -38
View File
@@ -1,4 +1,4 @@
using KKdBaseLib;
using KKdBaseLib;
using KKdBaseLib.F2;
using KKdMainLib.IO;
@@ -7,70 +7,355 @@ namespace KKdMainLib.F2
public struct Bloom : System.IDisposable
{
private int i;
private Stream _IO;
private Header header;
private Stream s;
public bool IsX;
public CountPointer<BLT> BLTs;
public void BLTReader(string file)
{
IsX = false;
BLTs = default;
_IO = File.OpenReader(file + ".blt", true);
header = _IO.ReadHeader();
if (header.Signature != 0x544D4C42 || header.InnerSignature != 0x3) return;
_IO.P -= 0x4;
byte[] bltData = File.ReadAllBytes(file + ".blt");
Struct _BLMT = bltData.RSt(); bltData = null;
if (_BLMT.Header.Signature != 0x544D4C42) return;
BLTs = _IO.RCPE<BLT>();
if (BLTs.C < 1) { _IO.C(); BLTs.C = -1; return; }
s = File.OpenReader(_BLMT.Data);
s.IsBE = _BLMT.Header.UseBigEndian;
if (BLTs.C > 0 && BLTs.O == 0) { _IO.C(); BLTs.C = -1; return; }
/*{
_IO.Format = Header.Format = Format.X;
_IO.Offset = Header.Length;
_IO.Position = BLTs.Offset;
BLTs = _IO.ReadCountPointerX<BLT>();
}*/
BLTs = s.RCPE<BLT>();
if (BLTs.C < 1) { s.C(); BLTs.C = -1; return; }
_IO.P = BLTs.O;
for (i = 0; i < BLTs.C; i++)
if (!(BLTs.C > 0 && BLTs.O == 0))
{
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.PI64 = BLTs.O - _BLMT.Header.Length;
for (i = 0; i < BLTs.C; i++)
{
ref BLT blt = ref BLTs.E[i];
blt.Flags = (Flags)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();
else
{
IsX = true;
BLTs.O = (int)s.RI64E();
s.PI64 = BLTs.O;
for (i = 0; i < BLTs.C; i++)
{
ref BLT blt = ref BLTs.E[i];
blt.Flags = (Flags)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();
blt.Unk1 = s.RF32 ();
blt.Unk2 = s.RI32 ();
blt.Unk3 = s.RF32 ();
}
}
s.C();
}
public void BLTWriter(string file)
{
if (BLTs.E == null || BLTs.C < 1) return;
if (file.EndsWith("_bloom"))
file = file.Substring(0, file.Length - 6);
s = File.OpenWriter();
s.IsBE = false;
s.Format = Format.F2;
ENRS e = default;
POF p = default;
p.Offsets = KKdList<long>.New;
if (!IsX)
{
s.W(BLTs.C);
s.W(0x50);
s.A(0x10);
for (i = 0; i < BLTs.C; i++)
{
ref BLT blt = ref BLTs.E[i];
s.W((int)blt.Flags);
s.W(blt.Color .X);
s.W(blt.Color .Y);
s.W(blt.Color .Z);
s.W(blt.Brightpass.X);
s.W(blt.Brightpass.Y);
s.W(blt.Brightpass.Z);
s.W(blt.Range );
}
e.Array = new ENRS.ENRSEntry[2];
e.Array[0] = new ENRS.ENRSEntry(0x00, 0x01, 0x10, 0x01);
e.Array[0].Sub[0] = new ENRS.ENRSEntry.SubENRSEntry(0x00, 0x02, ENRS.ENRSEntry.Type.DWORD);
e.Array[1] = new ENRS.ENRSEntry(0x10, 0x01, 0x20, BLTs.C);
e.Array[1].Sub[0] = new ENRS.ENRSEntry.SubENRSEntry(0x00, 0x08, ENRS.ENRSEntry.Type.DWORD);
p.Offsets.Add(0x44);
}
else
{
s.W(BLTs.C);
s.A(0x08);
s.W(0x10L);
s.A(0x10);
for (i = 0; i < BLTs.C; i++)
{
ref BLT blt = ref BLTs.E[i];
s.W((int)blt.Flags);
s.W(blt.Color .X);
s.W(blt.Color .Y);
s.W(blt.Color .Z);
s.W(blt.Brightpass.X);
s.W(blt.Brightpass.Y);
s.W(blt.Brightpass.Z);
s.W(blt.Range );
s.W(blt.Unk1 );
s.W(blt.Unk2 );
s.W(blt.Unk3 );
}
e.Array = new ENRS.ENRSEntry[2];
e.Array[0] = new ENRS.ENRSEntry(0x00, 0x02, 0x10, 0x01);
e.Array[0].Sub[0] = new ENRS.ENRSEntry.SubENRSEntry(0x00, 0x01, ENRS.ENRSEntry.Type.DWORD);
e.Array[0].Sub[1] = new ENRS.ENRSEntry.SubENRSEntry(0x04, 0x01, ENRS.ENRSEntry.Type.QWORD);
e.Array[1] = new ENRS.ENRSEntry(0x10, 0x01, 0x2C, BLTs.C);
e.Array[1].Sub[0] = new ENRS.ENRSEntry.SubENRSEntry(0x00, 0x08, ENRS.ENRSEntry.Type.DWORD);
p.Offsets.Add(0x08);
}
s.A(0x10, true);
byte[] data = s.ToArray(true);
Struct _BLMT = default;
_BLMT.Header.Signature = 0x544D4C42;
_BLMT.Header.DataSize = (uint)data.Length;
_BLMT.Header.Length = 0x40;
_BLMT.Header.Depth = 0;
_BLMT.Header.SectionSize = (uint)data.Length;
_BLMT.Header.Version = 0;
_BLMT.Header.InnerSignature = 0x03;
_BLMT.Header.UseBigEndian = false;
_BLMT.Header.UseSectionSize = true;
_BLMT.Header.Format = Format.F2;
_BLMT.Data = data;
_BLMT.ENRS = e;
_BLMT.POF = p;
File.WriteAllBytes(file + ".blt", _BLMT.W(IsX, true));
}
public void MsgPackReader(string file, bool json)
{
IsX = false;
BLTs = default;
MsgPack msgPack = file.ReadMPAllAtOnce(json);
MsgPack bloom;
if ((bloom = msgPack["Bloom", true]).NotNull)
{
BLTs.E = new BLT[bloom.Array.Length];
for (i = 0; i < BLTs.C; i++)
{
ref BLT blt = ref BLTs.E[i];
blt = default;
MsgPack b = bloom[i];
MsgPack temp;
if ((temp = b["Color"]).NotNull)
{
blt.Flags |= Flags.Color;
blt.Color.X = temp.RF32("X");
blt.Color.Y = temp.RF32("Y");
blt.Color.Z = temp.RF32("Z");
}
if ((temp = b["Brightpass"]).NotNull)
{
blt.Flags |= Flags.Brightpass;
blt.Brightpass.X = temp.RF32("X");
blt.Brightpass.Y = temp.RF32("Y");
blt.Brightpass.Z = temp.RF32("Z");
}
if ((temp = b["Range"]).Object != null)
{
blt.Flags |= Flags.Range;
blt.Range = temp.RF32();
}
}
}
else if ((bloom = msgPack["BloomX", true]).NotNull)
{
IsX = true;
s.IsX = true;
BLTs.E = new BLT[bloom.Array.Length];
for (i = 0; i < BLTs.C; i++)
{
ref BLT blt = ref BLTs.E[i];
blt = default;
MsgPack b = bloom[i];
MsgPack temp;
if ((temp = b["Color"]).NotNull)
{
blt.Flags |= Flags.Color;
blt.Color.X = temp.RF32("X");
blt.Color.Y = temp.RF32("Y");
blt.Color.Z = temp.RF32("Z");
}
if ((temp = b["Brightpass"]).NotNull)
{
blt.Flags |= Flags.Brightpass;
blt.Brightpass.X = temp.RF32("X");
blt.Brightpass.Y = temp.RF32("Y");
blt.Brightpass.Z = temp.RF32("Z");
}
if ((temp = b["Range"]).Object != null)
{
blt.Flags |= Flags.Range;
blt.Range = temp.RF32();
}
if ((temp = b["Unk1"]).Object != null)
{
blt.Flags |= Flags.Unk1;
blt.Unk1 = temp.RF32();
}
if ((temp = b["Unk2"]).Object != null)
{
blt.Flags |= Flags.Unk2;
blt.Unk2 = temp.RI32();
}
if ((temp = b["Unk3"]).Object != null)
{
blt.Flags |= Flags.Unk3;
blt.Unk3 = temp.RF32();
}
}
}
bloom.Dispose();
msgPack.Dispose();
}
public void MsgPackWriter(string file, bool json)
{
if (BLTs.E == null || BLTs.C < 1) return;
MsgPack bloom;
if (!IsX)
{
bloom = new MsgPack(BLTs.C, "Bloom");
for (i = 0; i < BLTs.C; i++)
{
ref BLT blt = ref BLTs.E[i];
MsgPack b = MsgPack.New;
if ((blt.Flags & Flags.Color) != 0)
b.Add(new MsgPack("Color")
.Add("X", blt.Color.X)
.Add("Y", blt.Color.Y)
.Add("Z", blt.Color.Z));
if ((blt.Flags & Flags.Brightpass) != 0)
b.Add(new MsgPack("Brightpass")
.Add("X", blt.Brightpass.X)
.Add("Y", blt.Brightpass.Y)
.Add("Z", blt.Brightpass.Z));
if ((blt.Flags & Flags.Range) != 0)
b.Add("Range", blt.Range);
bloom[i] = b;
}
}
else
{
bloom = new MsgPack(BLTs.C, "BloomX");
for (i = 0; i < BLTs.C; i++)
{
ref BLT blt = ref BLTs.E[i];
MsgPack b = MsgPack.New;
if ((blt.Flags & Flags.Color) != 0)
b.Add(new MsgPack("Color")
.Add("X", blt.Color.X)
.Add("Y", blt.Color.Y)
.Add("Z", blt.Color.Z));
if ((blt.Flags & Flags.Brightpass) != 0)
b.Add(new MsgPack("Brightpass")
.Add("X", blt.Brightpass.X)
.Add("Y", blt.Brightpass.Y)
.Add("Z", blt.Brightpass.Z));
if ((blt.Flags & Flags.Range) != 0)
b.Add("Range", blt.Range);
if ((blt.Flags & Flags.Unk1) != 0)
b.Add("Unk1", blt.Unk1);
if ((blt.Flags & Flags.Unk2) != 0)
b.Add("Unk2", blt.Unk2);
if ((blt.Flags & Flags.Unk3) != 0)
b.Add("Unk3", blt.Unk3);
bloom[i] = b;
}
}
bloom.Write(false, true, file + "_bloom", json);
}
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.Dispose(); BLTs = default; header = default; disposed = true; } }
{ if (!disposed) { if (s != null) s.D(); s = null; BLTs = default; IsX = false; disposed = true; } }
public struct BLT
{
public Vector3 Color;
public Vector3 Brightpass;
public Flags Flags;
public Vec3 Color;
public Vec3 Brightpass;
public float Range;
public float Unk1;
public int Unk2;
public float Unk3;
public override string ToString() => Color .ToString(6) + "," +
Brightpass.ToString(6) + "," +
Range .ToS(6);
public override string ToString() =>
((Flags & Flags.Color) != 0
? $"{Color.X.ToS(6)},{Color.Y.ToS(6)},{Color.Z.ToS(6)}," : ",,,") +
((Flags & Flags.Brightpass) != 0
? $"{Brightpass.X.ToS(6)},{Brightpass.Y.ToS(6)},{Brightpass.Z.ToS(6)}," : ",,,") +
((Flags & Flags.Range) != 0
? $"{Range.ToS(6)}" : "");
}
public enum Flags : int
{
Color = 0b000001,
Brightpass = 0b000010,
Range = 0b000100,
Unk1 = 0b001000,
Unk2 = 0b010000,
Unk3 = 0b100000,
}
}
}
+336 -41
View File
@@ -1,4 +1,4 @@
using KKdBaseLib;
using KKdBaseLib;
using KKdBaseLib.F2;
using KKdMainLib.IO;
@@ -7,78 +7,373 @@ namespace KKdMainLib.F2
public struct ColorCorrection : System.IDisposable
{
private int i;
private Stream _IO;
private Header header;
private Stream s;
public bool IsX;
public CountPointer<CCT> CCTs;
public void CCTReader(string file)
{
IsX = false;
CCTs = default;
_IO = File.OpenReader(file + ".cct", true);
header = _IO.ReadHeader();
if (header.Signature != 0x54524343 || header.InnerSignature != 0x3) return;
_IO.P -= 0x4;
byte[] ccData = File.ReadAllBytes(file + ".cct");
Struct _CCRT = ccData.RSt(); ccData = null;
if (_CCRT.Header.Signature != 0x54524343) return;
CCTs = _IO.RCPE<CCT>();
if (CCTs.C < 1) { _IO.C(); CCTs.C = -1; return; }
s = File.OpenReader(_CCRT.Data);
s.IsBE = _CCRT.Header.UseBigEndian;
if (CCTs.C > 0 && CCTs.O == 0) { _IO.C(); CCTs.C = -1; return; }
/*{
_IO.Format = Header.Format = Format.X;
_IO.Offset = Header.Length;
_IO.Position = CCTs.Offset;
CCTs = _IO.ReadCountPointerX<CCT>();
}*/
CCTs = s.RCPE<CCT>();
if (CCTs.C < 1) { s.C(); CCTs.C = -1; return; }
_IO.P = CCTs.O;
for (i = 0; i < CCTs.C; i++)
if (!(CCTs.C > 0 && CCTs.O == 0))
{
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.PI64 = CCTs.O - _CCRT.Header.Length;
for (i = 0; i < CCTs.C; i++)
{
ref CCT cct = ref CCTs.E[i];
cct.Flags = (Flags)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();
}
}
else
{
IsX = true;
s.IsX = true;
CCTs.O = (int)s.RI64E();
s.PI64 = CCTs.O;
for (i = 0; i < CCTs.C; i++)
{
ref CCT cct = ref CCTs.E[i];
cct.Flags = (Flags)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();
}
}
s.C();
}
public void CCTWriter(string file)
{
if (CCTs.E == null || CCTs.C < 1) return;
if (file.EndsWith("_cc"))
file = file.Substring(0, file.Length - 3);
s = File.OpenWriter();
s.IsBE = false;
s.Format = Format.F2;
ENRS e = default;
POF p = default;
p.Offsets = KKdList<long>.New;
if (!IsX)
{
s.W(CCTs.C);
s.W(0x50);
s.A(0x10);
for (i = 0; i < CCTs.C; i++)
{
ref CCT cct = ref CCTs.E[i];
s.W((int)cct.Flags);
s.W(cct.Hue );
s.W(cct.Saturation);
s.W(cct.Lightness );
s.W(cct.Exposure );
s.W(cct.Gamma.X );
s.W(cct.Gamma.Y );
s.W(cct.Gamma.Z );
s.W(cct.Contrast );
}
e.Array = new ENRS.ENRSEntry[2];
e.Array[0] = new ENRS.ENRSEntry(0x00, 0x01, 0x10, 0x01);
e.Array[0].Sub[0] = new ENRS.ENRSEntry.SubENRSEntry(0x00, 0x02, ENRS.ENRSEntry.Type.DWORD);
e.Array[1] = new ENRS.ENRSEntry(0x10, 0x01, 0x24, CCTs.C);
e.Array[1].Sub[0] = new ENRS.ENRSEntry.SubENRSEntry(0x00, 0x08, ENRS.ENRSEntry.Type.DWORD);
p.Offsets.Add(0x44);
}
else
{
s.W(CCTs.C);
s.A(0x08);
s.W(0x10L);
s.A(0x10);
for (i = 0; i < CCTs.C; i++)
{
ref CCT cct = ref CCTs.E[i];
s.W((int)cct.Flags);
s.W(cct.Hue );
s.W(cct.Saturation);
s.W(cct.Lightness );
s.W(cct.Exposure );
s.W(cct.Gamma.X );
s.W(cct.Gamma.Y );
s.W(cct.Gamma.Z );
s.W(cct.Contrast );
}
e.Array = new ENRS.ENRSEntry[2];
e.Array[0] = new ENRS.ENRSEntry(0x00, 0x02, 0x10, 0x01);
e.Array[0].Sub[0] = new ENRS.ENRSEntry.SubENRSEntry(0x00, 0x01, ENRS.ENRSEntry.Type.DWORD);
e.Array[0].Sub[1] = new ENRS.ENRSEntry.SubENRSEntry(0x04, 0x01, ENRS.ENRSEntry.Type.QWORD);
e.Array[1] = new ENRS.ENRSEntry(0x10, 0x01, 0x24, CCTs.C);
e.Array[1].Sub[0] = new ENRS.ENRSEntry.SubENRSEntry(0x00, 0x08, ENRS.ENRSEntry.Type.DWORD);
p.Offsets.Add(0x08);
}
_IO.C();
s.A(0x10, true);
byte[] data = s.ToArray(true);
Struct _CCRT = default;
_CCRT.Header.Signature = 0x54524343;
_CCRT.Header.DataSize = (uint)data.Length;
_CCRT.Header.Length = 0x40;
_CCRT.Header.Depth = 0;
_CCRT.Header.SectionSize = (uint)data.Length;
_CCRT.Header.Version = 0;
_CCRT.Header.InnerSignature = 0x03;
_CCRT.Header.UseBigEndian = false;
_CCRT.Header.UseSectionSize = true;
_CCRT.Header.Format = Format.F2;
_CCRT.Data = data;
_CCRT.ENRS = e;
_CCRT.POF = p;
File.WriteAllBytes(file + ".cct", _CCRT.W(IsX, true));
}
public void MsgPackReader(string file, bool json)
{
IsX = false;
CCTs = default;
MsgPack msgPack = file.ReadMPAllAtOnce(json);
MsgPack cc;
if ((cc = msgPack["ColorCorrection", true]).NotNull)
{
CCTs.E = new CCT[cc.Array.Length];
for (i = 0; i < CCTs.C; i++)
{
ref CCT cct = ref CCTs.E[i];
cct = default;
MsgPack c = cc[i];
MsgPack temp;
if ((temp = c["Hue"]).Object != null)
{
cct.Flags |= Flags.Hue;
cct.Hue = temp.RF32();
}
if ((temp = c["Saturation"]).Object != null)
{
cct.Flags |= Flags.Saturation;
cct.Saturation = temp.RF32();
}
if ((temp = c["Lightness"]).Object != null)
{
cct.Flags |= Flags.Lightness;
cct.Lightness = temp.RF32();
}
if ((temp = c["Exposure"]).Object != null)
{
cct.Flags |= Flags.Exposure;
cct.Exposure = temp.RF32();
}
if ((temp = c["Gamma"]).NotNull)
{
cct.Flags |= Flags.Gamma;
cct.Gamma.X = temp.RF32("X");
cct.Gamma.Y = temp.RF32("Y");
cct.Gamma.Z = temp.RF32("Z");
}
if ((temp = c["Contrast"]).Object != null)
{
cct.Flags |= Flags.Contrast;
cct.Contrast = temp.RF32();
}
}
}
else if ((cc = msgPack["ColorCorrectionX", true]).NotNull)
{
IsX = true;
CCTs.E = new CCT[cc.Array.Length];
for (i = 0; i < CCTs.C; i++)
{
ref CCT cct = ref CCTs.E[i];
cct = default;
MsgPack c = cc[i];
MsgPack temp;
if ((temp = c["Hue"]).Object != null)
{
cct.Flags |= Flags.Hue;
cct.Hue = temp.RF32();
}
if ((temp = c["Saturation"]).Object != null)
{
cct.Flags |= Flags.Saturation;
cct.Saturation = temp.RF32();
}
if ((temp = c["Lightness"]).Object != null)
{
cct.Flags |= Flags.Lightness;
cct.Lightness = temp.RF32();
}
if ((temp = c["Exposure"]).Object != null)
{
cct.Flags |= Flags.Exposure;
cct.Exposure = temp.RF32();
}
if ((temp = c["Gamma"]).NotNull)
{
cct.Flags |= Flags.Gamma;
cct.Gamma.X = temp.RF32("X");
cct.Gamma.Y = temp.RF32("Y");
cct.Gamma.Z = temp.RF32("Z");
}
if ((temp = c["Contrast"]).Object != null)
{
cct.Flags |= Flags.Contrast;
cct.Contrast = temp.RF32();
}
}
}
cc.Dispose();
msgPack.Dispose();
}
public void MsgPackWriter(string file, bool json)
{
if (CCTs.E == null || CCTs.C < 1) return;
MsgPack cc;
if (!IsX)
{
cc = new MsgPack(CCTs.C, "ColorCorrection");
for (i = 0; i < CCTs.C; i++)
{
ref CCT cct = ref CCTs.E[i];
MsgPack c = MsgPack.New;
if ((cct.Flags & Flags.Hue) != 0)
c.Add("Hue", cct.Hue);
if ((cct.Flags & Flags.Saturation) != 0)
c.Add("Saturation", cct.Saturation);
if ((cct.Flags & Flags.Lightness) != 0)
c.Add("Lightness", cct.Lightness);
if ((cct.Flags & Flags.Exposure) != 0)
c.Add("Exposure", cct.Exposure);
if ((cct.Flags & Flags.Gamma) != 0)
c.Add(new MsgPack("Gamma")
.Add("X", cct.Gamma.X)
.Add("Y", cct.Gamma.Y)
.Add("Z", cct.Gamma.Z));
if ((cct.Flags & Flags.Contrast) != 0)
c.Add("Contrast", cct.Contrast);
cc[i] = c;
}
}
else
{
cc = new MsgPack(CCTs.C, "ColorCorrectionX");
for (i = 0; i < CCTs.C; i++)
{
ref CCT cct = ref CCTs.E[i];
MsgPack c = MsgPack.New;
if ((cct.Flags & Flags.Hue) != 0)
c.Add("Hue", cct.Hue);
if ((cct.Flags & Flags.Saturation) != 0)
c.Add("Saturation", cct.Saturation);
if ((cct.Flags & Flags.Lightness) != 0)
c.Add("Lightness", cct.Lightness);
if ((cct.Flags & Flags.Exposure) != 0)
c.Add("Exposure", cct.Exposure);
if ((cct.Flags & Flags.Gamma) != 0)
c.Add(new MsgPack("Gamma")
.Add("X", cct.Gamma.X)
.Add("Y", cct.Gamma.Y)
.Add("Z", cct.Gamma.Z));
if ((cct.Flags & Flags.Contrast) != 0)
c.Add("Contrast", cct.Contrast);
cc[i] = c;
}
}
cc.Write(false, true, file + "_cc", json);
}
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.Dispose(); CCTs = default; header = default; disposed = true; } }
{ if (!disposed) { if (s != null) s.D(); s = null; CCTs = default; IsX = false; disposed = true; } }
public struct CCT
{
public Flags Flags;
public float Hue;
public float Saturation;
public float Lightness;
public float Exposure;
public Vector3 Gamma;
public Vec3 Gamma;
public float Contrast;
public override string ToString() => Hue .ToS(6) + "," +
Saturation.ToS(6) + "," +
Lightness .ToS(6) + "," +
Exposure .ToS(6) + "," +
Gamma .ToString(6) + "," +
Contrast .ToS(6);
public override string ToString() =>
((Flags & Flags.Hue) != 0
? $"{Hue.ToS(6)}," : ",") +
((Flags & Flags.Saturation) != 0
? $"{Saturation.ToS(6)}," : ",") +
((Flags & Flags.Lightness) != 0
? $"{Lightness.ToS(6)}," : ",") +
((Flags & Flags.Exposure) != 0
? $"{Exposure.ToS(6)}," : ",") +
((Flags & Flags.Gamma) != 0
? $"{Gamma.X.ToS(6)},{Gamma.Y.ToS(6)},{Gamma.Z.ToS(6)}," : ",,,") +
((Flags & Flags.Contrast) != 0
? $"{Contrast.ToS(6)}" : "");
}
public enum Flags : int
{
Hue = 0b000001,
Saturation = 0b000010,
Lightness = 0b000100,
Exposure = 0b001000,
Gamma = 0b010000,
Contrast = 0b100000,
}
}
}
+307 -37
View File
@@ -1,4 +1,4 @@
using KKdBaseLib;
using KKdBaseLib;
using KKdBaseLib.F2;
using KKdMainLib.IO;
@@ -7,74 +7,344 @@ namespace KKdMainLib.F2
public struct DOF : System.IDisposable
{
private int i;
private Stream _IO;
private Header header;
private Stream s;
public bool IsX;
public CountPointer<DFT> DFTs;
public void DFTReader(string file)
{
IsX = false;
DFTs = default;
_IO = File.OpenReader(file + ".dft", true);
header = _IO.ReadHeader();
if (header.Signature != 0x54464F44 || header.InnerSignature != 0x3) return;
_IO.P -= 0x4;
byte[] dftData = File.ReadAllBytes(file + ".dft");
Struct _DOFT = dftData.RSt(); dftData = null;
if (_DOFT.Header.Signature != 0x54464F44) return;
DFTs = _IO.RCPE<DFT>();
if (DFTs.C < 1) { _IO.C(); DFTs.C = -1; return; }
s = File.OpenReader(_DOFT.Data);
s.IsBE = _DOFT.Header.UseBigEndian;
if (DFTs.C > 0 && DFTs.O == 0) { _IO.C(); DFTs.C = -1; return; }
/*{
_IO.Format = Header.Format = Format.X;
_IO.Offset = Header.Length;
_IO.Position = DFTs.Offset;
DFTs = _IO.ReadCountPointerX<DFT>();
}*/
DFTs = s.RCPE<DFT>();
if (DFTs.C < 1) { s.C(); DFTs.C = -1; return; }
_IO.P = DFTs.O;
for (i = 0; i < DFTs.C; i++)
if (!(DFTs.C > 0 && DFTs.O == 0))
{
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.PI64 = DFTs.O - _DOFT.Header.Length;
for (i = 0; i < DFTs.C; i++)
{
ref DFT dft = ref DFTs.E[i];
dft.Flags = (Flags)s.RI32E();
dft.Focus = s.RF32E();
dft.FocusRange = s.RF32E();
dft.FuzzingRange = s.RF32E();
dft.Ratio = s.RF32E();
dft.Quality = s.RF32E();
}
}
else
{
IsX = true;
s.IsX = true;
DFTs.O = (int)s.RI64E();
s.PI64 = DFTs.O;
for (i = 0; i < DFTs.C; i++)
{
ref DFT dft = ref DFTs.E[i];
dft.Flags = (Flags)s.RI32E();
dft.Focus = s.RF32E();
dft.FocusRange = s.RF32E();
dft.FuzzingRange = s.RF32E();
dft.Ratio = s.RF32E();
dft.Quality = s.RF32E();
dft.Unk = s.RI32 ();
}
}
s.C();
}
public void DFTWriter(string file)
{
if (DFTs.E == null || DFTs.C < 1) return;
if (file.EndsWith("_dof"))
file = file.Substring(0, file.Length - 4);
s = File.OpenWriter();
s.IsBE = false;
s.Format = Format.F2;
ENRS e = default;
POF p = default;
p.Offsets = KKdList<long>.New;
if (!IsX)
{
s.W(DFTs.C);
s.W(0x50);
s.A(0x10);
for (i = 0; i < DFTs.C; i++)
{
ref DFT dft = ref DFTs.E[i];
s.W((int)dft.Flags);
s.W(dft.Focus );
s.W(dft.FocusRange );
s.W(dft.FuzzingRange);
s.W(dft.Ratio );
s.W(dft.Quality );
}
e.Array = new ENRS.ENRSEntry[2];
e.Array[0] = new ENRS.ENRSEntry(0x00, 0x01, 0x10, 0x01);
e.Array[0].Sub[0] = new ENRS.ENRSEntry.SubENRSEntry(0x00, 0x02, ENRS.ENRSEntry.Type.DWORD);
e.Array[1] = new ENRS.ENRSEntry(0x10, 0x01, 0x18, DFTs.C);
e.Array[1].Sub[0] = new ENRS.ENRSEntry.SubENRSEntry(0x00, 0x06, ENRS.ENRSEntry.Type.DWORD);
p.Offsets.Add(0x44);
}
else
{
s.W(DFTs.C);
s.A(0x08);
s.W(0x10L);
s.A(0x10);
for (i = 0; i < DFTs.C; i++)
{
ref DFT dft = ref DFTs.E[i];
s.W((int)dft.Flags);
s.W(dft.Focus );
s.W(dft.FocusRange );
s.W(dft.FuzzingRange);
s.W(dft.Ratio );
s.W(dft.Quality );
s.W(dft.Unk );
}
e.Array = new ENRS.ENRSEntry[2];
e.Array[0] = new ENRS.ENRSEntry(0x00, 0x02, 0x10, 0x01);
e.Array[0].Sub[0] = new ENRS.ENRSEntry.SubENRSEntry(0x00, 0x01, ENRS.ENRSEntry.Type.DWORD);
e.Array[0].Sub[1] = new ENRS.ENRSEntry.SubENRSEntry(0x04, 0x01, ENRS.ENRSEntry.Type.QWORD);
e.Array[1] = new ENRS.ENRSEntry(0x10, 0x01, 0x1C, DFTs.C);
e.Array[1].Sub[0] = new ENRS.ENRSEntry.SubENRSEntry(0x00, 0x06, ENRS.ENRSEntry.Type.DWORD);
p.Offsets.Add(0x08);
}
_IO.C();
s.A(0x10, true);
byte[] data = s.ToArray(true);
Struct _DOFT = default;
_DOFT.Header.Signature = 0x54464F44;
_DOFT.Header.DataSize = (uint)data.Length;
_DOFT.Header.Length = 0x40;
_DOFT.Header.Depth = 0;
_DOFT.Header.SectionSize = (uint)data.Length;
_DOFT.Header.Version = 0;
_DOFT.Header.InnerSignature = 0x03;
_DOFT.Header.UseBigEndian = false;
_DOFT.Header.UseSectionSize = true;
_DOFT.Header.Format = Format.F2;
_DOFT.Data = data;
_DOFT.ENRS = e;
_DOFT.POF = p;
File.WriteAllBytes(file + ".dft", _DOFT.W(IsX, true));
}
public void MsgPackReader(string file, bool json)
{
IsX = false;
DFTs = default;
MsgPack msgPack = file.ReadMPAllAtOnce(json);
MsgPack dof;
if ((dof = msgPack["DOF", true]).NotNull)
{
DFTs.E = new DFT[dof.Array.Length];
for (i = 0; i < DFTs.C; i++)
{
ref DFT dft = ref DFTs.E[i];
dft = default;
MsgPack d = dof[i];
MsgPack temp;
if ((temp = d["Focus"]).Object != null)
{
dft.Flags |= Flags.Focus;
dft.Focus = temp.RF32();
}
if ((temp = d["FocusRange"]).Object != null)
{
dft.Flags |= Flags.FocusRange;
dft.FocusRange = temp.RF32();
}
if ((temp = d["FuzzingRange"]).Object != null)
{
dft.Flags |= Flags.FuzzingRange;
dft.FuzzingRange = temp.RF32();
}
if ((temp = d["Ratio"]).Object != null)
{
dft.Flags |= Flags.Ratio;
dft.Ratio = temp.RF32();
}
if ((temp = d["Quality"]).Object != null)
{
dft.Flags |= Flags.Quality;
dft.Quality = temp.RF32();
}
}
}
else if ((dof = msgPack["DOFX", true]).NotNull)
{
IsX = true;
DFTs.E = new DFT[dof.Array.Length];
for (i = 0; i < DFTs.C; i++)
{
ref DFT dft = ref DFTs.E[i];
dft = default;
MsgPack d = dof[i];
MsgPack temp;
if ((temp = d["Focus"]).Object != null)
{
dft.Flags |= Flags.Focus;
dft.Focus = temp.RF32();
}
if ((temp = d["FocusRange"]).Object != null)
{
dft.Flags |= Flags.FocusRange;
dft.FocusRange = temp.RF32();
}
if ((temp = d["FuzzingRange"]).Object != null)
{
dft.Flags |= Flags.FuzzingRange;
dft.FuzzingRange = temp.RF32();
}
if ((temp = d["Ratio"]).Object != null)
{
dft.Flags |= Flags.Ratio;
dft.Ratio = temp.RF32();
}
if ((temp = d["Quality"]).Object != null)
{
dft.Flags |= Flags.Quality;
dft.Quality = temp.RF32();
}
if ((temp = d["Unk"]).Object != null)
{
dft.Flags |= Flags.Unk;
dft.Unk = temp.RI32();
}
}
}
dof.Dispose();
msgPack.Dispose();
}
public void MsgPackWriter(string file, bool json)
{
if (DFTs.E == null || DFTs.C < 1) return;
MsgPack dof;
if (!IsX)
{
dof = new MsgPack(DFTs.C, "DOF");
for (i = 0; i < DFTs.C; i++)
{
ref DFT dft = ref DFTs.E[i];
MsgPack d = MsgPack.New;
if ((dft.Flags & Flags.Focus) != 0)
d.Add("Focus", dft.Focus);
if ((dft.Flags & Flags.FocusRange) != 0)
d.Add("FocusRange", dft.FocusRange);
if ((dft.Flags & Flags.FuzzingRange) != 0)
d.Add("FuzzingRange", dft.FuzzingRange);
if ((dft.Flags & Flags.Ratio) != 0)
d.Add("Ratio", dft.Ratio);
if ((dft.Flags & Flags.Quality) != 0)
d.Add("Quality", dft.Quality);
dof[i] = d;
}
}
else
{
dof = new MsgPack(DFTs.C, "DOFX");
for (i = 0; i < DFTs.C; i++)
{
ref DFT dft = ref DFTs.E[i];
MsgPack d = MsgPack.New;
if ((dft.Flags & Flags.Focus) != 0)
d.Add("Focus", dft.Focus);
if ((dft.Flags & Flags.FocusRange) != 0)
d.Add("FocusRange", dft.FocusRange);
if ((dft.Flags & Flags.FuzzingRange) != 0)
d.Add("FuzzingRange", dft.FuzzingRange);
if ((dft.Flags & Flags.Ratio) != 0)
d.Add("Ratio", dft.Ratio);
if ((dft.Flags & Flags.Quality) != 0)
d.Add("Quality", dft.Quality);
if ((dft.Flags & Flags.Unk) != 0)
d.Add("Unk", dft.Unk);
dof[i] = d;
}
}
dof.Write(false, true, file + "_dof", json);
}
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.Dispose(); DFTs = default; header = default; disposed = true; } }
{ if (!disposed) { if (s != null) s.D(); s = null; DFTs = default; IsX = false; disposed = true; } }
public struct DFT
{
public Flags Flags;
public float Focus;
public float FocusRange;
public float FuzzingRange;
public float Ratio;
public float Quality;
public int Unk;
public override string ToString() => Focus .ToS(6) + "," +
FocusRange.ToS(6) + "," +
FuzzingRange.ToS(6) + "," +
Ratio .ToS(6) + "," +
Quality .ToS(6);
public override string ToString() =>
((Flags & Flags.Focus) != 0
? $"{Focus.ToS(6)}," : ",") +
((Flags & Flags.FocusRange) != 0
? $"{FocusRange.ToS(6)}," : ",") +
((Flags & Flags.FuzzingRange) != 0
? $"{FuzzingRange.ToS(6)}," : ",") +
((Flags & Flags.Ratio) != 0
? $"{Ratio.ToS(6)}," : ",") +
((Flags & Flags.Quality) != 0
? $"{Quality.ToS(6)}" : "");
}
public enum Flags : int
{
Focus = 0b000001,
FocusRange = 0b000010,
FuzzingRange = 0b000100,
Ratio = 0b001000,
Quality = 0b010000,
Unk = 0b100000,
}
}
}
+854 -91
View File
@@ -1,4 +1,4 @@
using KKdBaseLib;
using KKdBaseLib;
using KKdBaseLib.F2;
using KKdMainLib.IO;
@@ -7,69 +7,784 @@ namespace KKdMainLib.F2
public struct Light : System.IDisposable
{
private int i, i0;
private Stream _IO;
private Header header;
private Stream s;
public CountPointer<CountPointer<LIT>> LITs;
public bool IsX;
public CountPointer<LightStruct> LITs;
public void LITReader(string file)
{
IsX = false;
LITs = default;
_IO = File.OpenReader(file + ".lit", true);
header = _IO.ReadHeader();
if (header.Signature != 0x4354494C || header.InnerSignature != 0x2 ||
header.SectionSignature != 0x2) return;
byte[] litData = File.ReadAllBytes(file + ".lit");
Struct _LITC = litData.RSt(); litData = null;
if (_LITC.Header.Signature != 0x4354494C) return;
LITs = _IO.RCPE<CountPointer<LIT>>();
if (LITs.C < 1) { _IO.C(); LITs.C = -1; return; }
s = File.OpenReader(_LITC.Data);
s.IsBE = _LITC.Header.UseBigEndian;
_IO.P = LITs.O;
for (i = 0; i < LITs.C; i++)
s.RI32();
LITs = s.RCPE<LightStruct>();
if (LITs.C < 1) { s.C(); LITs.C = -1; return; }
s.PI64 = LITs.O - _LITC.Header.Length;
if (s.RI32() != 0)
{
LITs[i] = _IO.RCPX<LIT>();
if ((LITs[i].C > 0 || LITs[i].O == 0) && !_IO.IsX) { _IO.C(); LITs.C = -1; return; }
/*{
_IO.Format = Header.Format = Format.X;
_IO.Offset = Header.Length;
_IO.Position = LITs.Offset;
LITs[i] = _IO.ReadCountPointerX<LIT>();
}
if (_IO.IsX) IO.ReadInt64();*/
}
s.PI64 = LITs.O - _LITC.Header.Length;
for (i = 0; i < LITs.C; i++)
LITs.E[i] = new LightStruct
{ C0 = s.RI32E(), O0 = s.RI32E() };
for (i = 0; i < LITs.C; i++)
{
_IO.P = LITs[i].O;
for (i0 = 0; i0 < LITs[i].C; i0++)
for (i = 0; i < LITs.C; i++)
{
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(); }
s.PI64 = LITs.E[i].O0 - _LITC.Header.Length;
for (i0 = 0; i0 < LITs.E[i].C0; i0++)
{
ref LIT lit = ref LITs.E[i].E0[i0];
lit.Id = s.RI32E();
lit.Flags = (Flags)s.RI32E();
lit.Type = (Type )s.RI32E();
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();
}
}
}
_IO.C();
else
{
IsX = true;
s.PI64 = LITs.O;
for (i = 0; i < LITs.C; i++)
LITs.E[i] = new LightStruct
{ C0 = s.RI32E(), C1 = s.RI32E(), O0 = (int)s.RI64E(), O1 = (int)s.RI64E() };
for (i = 0; i < LITs.C; i++)
{
s.P = LITs.E[i].O0;
for (i0 = 0; i0 < LITs.E[i].C0; i0++)
{
ref LIT lit = ref LITs.E[i].E0[i0];
lit.Id = s.RI32E();
lit.Flags = (Flags)s.RI32E();
lit.Type = (Type )s.RI32E();
s.RI32();
long off = s.RI64();
lit.HasStr = s.RI64() != 0;
lit.Unk10 = s.RI32();
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.Unk01 = s.RF32();
lit.Unk02 = s.RF32();
lit.Unk03 = s.RF32();
lit.Unk04 = s.RF32();
lit.Unk05.X = s.RF32();
lit.Unk05.Y = s.RF32();
lit.Unk05.Z = s.RF32();
lit.ToneCurve.X = s.RF32E();
lit.ToneCurve.Y = s.RF32E();
lit.ToneCurve.Z = s.RF32E();
lit.Unk = s.RF32();
lit.Unk06 = s.RF32();
lit.Unk07 = s.RF32();
lit.Unk08 = s.RF32();
lit.Str = off > 0 ? s.RaO(off).ToSJIS() : "";
}
s.P = LITs.E[i].O1;
for (i0 = 0; i0 < LITs.E[i].C1; i0++)
{
ref LITX lit = ref LITs.E[i].E1[i0];
lit.C = s.RI32E();
s.RI32E();
lit.O = (int)s.RI64E();
}
for (i0 = 0; i0 < LITs.E[i].C1; i0++)
{
ref LITX lit = ref LITs.E[i].E1[i0];
ref KeyValuePair<int, int>[] data = ref lit.E;
data = new KeyValuePair<int, int>[lit.C];
s.P = lit.O;
for (int i1 = 0; i1 < lit.C; i1++)
data[i1] = new KeyValuePair<int, int>(s.RI32E(), s.RI32E());
}
}
}
s.C();
}
public void LITWriter(string file)
{
if (LITs.E == null || LITs.C < 1) return;
if (file.EndsWith("_light"))
file = file.Substring(0, file.Length - 6);
s = File.OpenWriter();
s.IsBE = false;
s.Format = Format.F2;
ENRS e = default;
POF p = default;
p.Offsets = KKdList<long>.New;
if (!IsX)
{
s.W(0x02);
s.W(LITs.C);
s.W(0x50);
s.A(0x10);
int offset0 = 0x50 + (LITs.C * 0x08).A(0x10);
for (i = 0; i < LITs.C; i++)
{
s.W(LITs.E[i].C0 > 0 ? LITs.E[i].C0 : 0);
s.W(LITs.E[i].C0 > 0 ? offset0 : 0);
offset0 += (0x54 * (LITs.E[i].C0 > 0 ? LITs.E[i].C0 : 0)).A(0x10);
}
s.A(0x10);
for (i = 0; i < LITs.C; i++)
{
for (i0 = 0; i0 < LITs.E[i].C0; i0++)
{
ref LIT lit = ref LITs.E[i].E0[i0];
s.W( lit.Id );
s.W((int)lit.Flags);
s.W((int)lit.Type );
s.W(lit.Ambient .X);
s.W(lit.Ambient .Y);
s.W(lit.Ambient .Z);
s.W(lit.Ambient .W);
s.W(lit.Diffuse .X);
s.W(lit.Diffuse .Y);
s.W(lit.Diffuse .Z);
s.W(lit.Diffuse .W);
s.W(lit.Specular .X);
s.W(lit.Specular .Y);
s.W(lit.Specular .Z);
s.W(lit.Specular .W);
s.W(lit.Position .X);
s.W(lit.Position .Y);
s.W(lit.Position .Z);
s.W(lit.ToneCurve.X);
s.W(lit.ToneCurve.Y);
s.W(lit.ToneCurve.Z);
}
s.A(0x10);
}
int count = 0;
for (i = 0; i < LITs.C; i++)
if (LITs.E[i].C0 > 0)
count += LITs.E[i].C0;
e.Array = new ENRS.ENRSEntry[3];
e.Array[0] = new ENRS.ENRSEntry(0x00, 0x01, 0x10, 0x01);
e.Array[0].Sub[0] = new ENRS.ENRSEntry.SubENRSEntry(0x00, 0x03, ENRS.ENRSEntry.Type.DWORD);
e.Array[1] = new ENRS.ENRSEntry(0x10, 0x01, 0x08, LITs.C);
e.Array[1].Sub[0] = new ENRS.ENRSEntry.SubENRSEntry(0x00, 0x02, ENRS.ENRSEntry.Type.DWORD);
e.Array[2] = new ENRS.ENRSEntry((LITs.C * 0x08).A(0x10), 0x01, 0x54, count);
e.Array[2].Sub[0] = new ENRS.ENRSEntry.SubENRSEntry(0x00, 0x15, ENRS.ENRSEntry.Type.DWORD);
p.Offsets.Add(0x48);
for (i = 0; i < LITs.C; i++)
p.Offsets.Add(0x54 + 0x08 * i);
}
else
{
long offset0 = 0x50 + (LITs.C * 0x18).A(0x10);
long offset1 = offset0;
long offset2 = offset0 + 0x10;
for (i = 0; i < LITs.C; i++)
offset1 += LITs.E[i].C0 * 0x98;
offset1 = offset1.A(0x10);
long offset3 = offset1;
long offset4 = offset1 + 0x08;
for (i = 0; i < LITs.C; i++)
offset3 += LITs.E[i].C1 * 0x10;
offset3 = offset3.A(0x10);
long offset5 = offset3;
long offset6 = offset3;
for (i = 0; i < LITs.C; i++)
for (i0 = 0; i0 < LITs.E[i].C1; i0++)
offset6 += LITs.E[i].E1[i0].C * 0x08;
byte[][][] strdata = new byte[LITs.C][][];
for (i = 0; i < LITs.C; i++)
{
strdata[i] = new byte[LITs.E[i].C0][];
for (i0 = 0; i0 < LITs.E[i].C0; i0++)
{
ref LIT lit = ref LITs.E[i].E0[i0];
strdata[i][i0] = lit.HasStr && lit.Str != null && lit.Str != "" ? lit.Str.ToSJIS() : null;
}
}
s.W(0x02);
s.W(LITs.C);
s.W(0x50L);
s.A(0x10);
s.P = 0x50;
for (i = 0; i < LITs.C; i++)
{
s.W(LITs.E[i].C0 > 0 ? LITs.E[i].C0 : 0);
s.W(LITs.E[i].C1 > 0 ? LITs.E[i].C1 : 0);
s.W(LITs.E[i].C0 > 0 ? offset0 : 0);
s.W(LITs.E[i].C1 > 0 ? offset1 : 0);
offset0 += 0x98 * (LITs.E[i].C0 > 0 ? LITs.E[i].C0 : 0);
offset1 += 0x10 * (LITs.E[i].C1 > 0 ? LITs.E[i].C1 : 0);
}
s.A(0x10);
for (i = 0; i < LITs.C; i++)
for (i0 = 0; i0 < LITs.E[i].C0; i0++)
{
ref LIT lit = ref LITs.E[i].E0[i0];
s.W( lit.Id );
s.W((int)lit.Flags);
s.W((int)lit.Type );
s.W((int)0);
if (lit.HasStr && strdata[i][i0] != null && strdata[i][i0].Length > 0)
{ s.W(offset6); s.W((long)strdata[i][i0].HashMurmurHash(strdata[i][i0].Length));
offset6 += strdata[i][i0].Length + 1; }
else
{ s.W(0x00L); s.W((long)(lit.HasStr ? 0x0CAD3078 : 0)); }
s.W(lit.Unk10 );
s.W(lit.Ambient .X);
s.W(lit.Ambient .Y);
s.W(lit.Ambient .Z);
s.W(lit.Ambient .W);
s.W(lit.Diffuse .X);
s.W(lit.Diffuse .Y);
s.W(lit.Diffuse .Z);
s.W(lit.Diffuse .W);
s.W(lit.Specular .X);
s.W(lit.Specular .Y);
s.W(lit.Specular .Z);
s.W(lit.Specular .W);
s.W(lit.Position .X);
s.W(lit.Position .Y);
s.W(lit.Position .Z);
s.W(lit.Unk01 );
s.W(lit.Unk02 );
s.W(lit.Unk03 );
s.W(lit.Unk04 );
s.W(lit.Unk05.X );
s.W(lit.Unk05.Y );
s.W(lit.Unk05.Z );
s.W(lit.ToneCurve.X);
s.W(lit.ToneCurve.Y);
s.W(lit.ToneCurve.Z);
s.W(lit.Unk );
s.W(lit.Unk06 );
s.W(lit.Unk07 );
s.W(lit.Unk08 );
}
s.A(0x10);
for (i = 0; i < LITs.C; i++)
for (i0 = 0; i0 < LITs.E[i].C1; i0++)
{
ref LITX lit = ref LITs.E[i].E1[i0];
s.W(lit.C);
s.W((int)0);
s.W(offset5);
offset5 += lit.C * 0x08;
}
s.A(0x10);
for (i = 0; i < LITs.C; i++)
for (i0 = 0; i0 < LITs.E[i].C1; i0++)
{
ref LITX lit = ref LITs.E[i].E1[i0];
for (int i1 = 0; i1 < lit.C; i1++)
{
s.W(lit.E[i1].Key);
s.W(lit.E[i1].Value);
}
}
for (i = 0; i < LITs.C; i++)
for (i0 = 0; i0 < LITs.E[i].C0; i0++)
{
ref LIT lit = ref LITs.E[i].E0[i0];
if (lit.HasStr && strdata[i][i0] != null && strdata[i][i0].Length > 0)
{
s.W(strdata[i][i0]);
s.W((byte)0);
}
}
s.A(0x10);
bool sub = false;
for (i = 0; i < LITs.C; i++)
if (LITs.E[i].C1 > 0) { sub = true; break; }
int count = 0;
for (i = 0; i < LITs.C; i++)
if (LITs.E[i].C0 > 0)
count += LITs.E[i].C0;
e.Array = new ENRS.ENRSEntry[sub ? 5 : 3];
e.Array[0] = new ENRS.ENRSEntry(0x00, 0x02, 0x50, 0x01);
e.Array[0].Sub[0] = new ENRS.ENRSEntry.SubENRSEntry(0x00, 0x02, ENRS.ENRSEntry.Type.DWORD);
e.Array[0].Sub[1] = new ENRS.ENRSEntry.SubENRSEntry(0x00, 0x01, ENRS.ENRSEntry.Type.QWORD);
e.Array[1] = new ENRS.ENRSEntry(0x50, 0x02, 0x18, LITs.C);
e.Array[1].Sub[0] = new ENRS.ENRSEntry.SubENRSEntry(0x00, 0x02, ENRS.ENRSEntry.Type.DWORD);
e.Array[1].Sub[1] = new ENRS.ENRSEntry.SubENRSEntry(0x00, 0x02, ENRS.ENRSEntry.Type.QWORD);
e.Array[2] = new ENRS.ENRSEntry((LITs.C * 0x18).A(0x10), 0x03, 0x98, count);
e.Array[2].Sub[0] = new ENRS.ENRSEntry.SubENRSEntry(0x00, 0x03, ENRS.ENRSEntry.Type.DWORD);
e.Array[2].Sub[1] = new ENRS.ENRSEntry.SubENRSEntry(0x18, 0x0F, ENRS.ENRSEntry.Type.DWORD);
e.Array[2].Sub[2] = new ENRS.ENRSEntry.SubENRSEntry(0x20, 0x03, ENRS.ENRSEntry.Type.DWORD);
if (sub)
{
int sub_count = 0;
for (i = 0; i < LITs.C; i++)
if (LITs.E[i].C1 > 0)
sub_count += LITs.E[i].C1;
e.Array[3] = new ENRS.ENRSEntry((count * 0x98).A(0x10), 0x02, 0x10, sub_count);
e.Array[3].Sub[0] = new ENRS.ENRSEntry.SubENRSEntry(0x00, 0x01, ENRS.ENRSEntry.Type.DWORD);
e.Array[3].Sub[1] = new ENRS.ENRSEntry.SubENRSEntry(0x04, 0x01, ENRS.ENRSEntry.Type.QWORD);
e.Array[4] = new ENRS.ENRSEntry(sub_count * 0x10, 0x01, 0x08, LITs.E[0].E1[0].C);
e.Array[4].Sub[0] = new ENRS.ENRSEntry.SubENRSEntry(0x00, 0x02, ENRS.ENRSEntry.Type.DWORD);
}
p.Offsets.Add(0x08);
for (i = 0; i < LITs.C; i++)
{
if (LITs.E[i].C0 > 0)
p.Offsets.Add(0x58 + 0x18 * i);
if (LITs.E[i].C1 > 0)
p.Offsets.Add(0x60 + 0x18 * i);
}
for (i = 0; i < LITs.C; i++)
for (i0 = 0; i0 < LITs.E[i].C0; i0++)
{
ref LIT lit = ref LITs.E[i].E0[i0];
if (lit.HasStr && strdata[i][i0] != null && strdata[i][i0].Length > 0)
p.Offsets.Add(offset2);
offset2 += 0x98;
}
if (sub)
for (i = 0; i < LITs.C; i++)
for (i0 = 0; i0 < LITs.E[i].C1; i0++)
{
p.Offsets.Add(offset4);
offset4 += 0x10;
}
}
s.A(0x10, true);
byte[] data = s.ToArray(true);
Struct _LITC = default;
_LITC.Header.Signature = 0x4354494C;
_LITC.Header.DataSize = (uint)data.Length;
_LITC.Header.Length = 0x40;
_LITC.Header.Depth = 0;
_LITC.Header.SectionSize = (uint)data.Length;
_LITC.Header.Version = 0;
_LITC.Header.InnerSignature = 0x02;
_LITC.Header.UseBigEndian = false;
_LITC.Header.UseSectionSize = true;
_LITC.Header.Format = Format.F2;
_LITC.Data = data;
_LITC.ENRS = e;
_LITC.POF = p;
File.WriteAllBytes(file + ".lit", _LITC.W(IsX, true));
}
public void MsgPackReader(string file, bool json)
{
IsX = false;
LITs = default;
MsgPack msgPack = file.ReadMPAllAtOnce(json);
MsgPack light;
if ((light = msgPack["Light", true]).NotNull)
{
LITs.E = new LightStruct[light.Array.Length];
for (i = 0; i < LITs.C; i++)
{
ref LightStruct lit = ref LITs.E[i];
lit = default;
MsgPack l = light[i];
MsgPack l0;
if ((l0 = l["MainData", true]).IsNull)
continue;
lit.C0 = l0.Array.Length;
for (i0 = 0; i0 < lit.C0; i0++)
{
ref LIT lit0 = ref lit.E0[i0];
MsgPack l1 = l0[i0];
MsgPack temp;
if ((temp = l1["Id"]).Object != null)
lit0.Id = temp.RI32();
if ((temp = l1["Type"]).Object != null)
{
lit0.Flags |= Flags.Type;
lit0.Type = (Type)temp.RI32();
}
if ((temp = l1["Str"]).Object != null)
{
lit0.HasStr = true;
lit0.Str = temp.RS();
}
if ((temp = l1["Ambient"]).Object != null)
{
lit0.Flags |= Flags.Ambient;
lit0.Ambient.X = temp.RF32("R");
lit0.Ambient.Y = temp.RF32("G");
lit0.Ambient.Z = temp.RF32("B");
lit0.Ambient.W = temp.RF32("A");
}
if ((temp = l1["Diffuse"]).Object != null)
{
lit0.Flags |= Flags.Diffuse;
lit0.Diffuse.X = temp.RF32("R");
lit0.Diffuse.Y = temp.RF32("G");
lit0.Diffuse.Z = temp.RF32("B");
lit0.Diffuse.W = temp.RF32("A");
}
if ((temp = l1["Specular"]).Object != null)
{
lit0.Flags |= Flags.Specular;
lit0.Specular.X = temp.RF32("R");
lit0.Specular.Y = temp.RF32("G");
lit0.Specular.Z = temp.RF32("B");
lit0.Specular.W = temp.RF32("A");
}
if ((temp = l1["Position"]).Object != null)
{
lit0.Flags |= Flags.Position;
lit0.Position.X = temp.RF32("X");
lit0.Position.Y = temp.RF32("Y");
lit0.Position.Z = temp.RF32("Z");
}
if ((temp = l1["ToneCurve"]).Object != null)
{
lit0.Flags |= Flags.ToneCurve;
lit0.ToneCurve.X = temp.RF32("Begin" );
lit0.ToneCurve.Y = temp.RF32("End" );
lit0.ToneCurve.Z = temp.RF32("BlendRate");
}
}
}
}
else if ((light = msgPack["LightX", true]).NotNull)
{
IsX = true;
LITs.E = new LightStruct[light.Array.Length];
for (i = 0; i < LITs.C; i++)
{
ref LightStruct lit = ref LITs.E[i];
lit = default;
MsgPack l = light[i];
MsgPack l0;
if ((l0 = l["MainData", true]).IsNull)
continue;
lit.C0 = l0.Array.Length;
for (i0 = 0; i0 < lit.C0; i0++)
{
ref LIT lit0 = ref lit.E0[i0];
lit0 = default;
MsgPack l1;
if ((l1 = l0[i0]).IsNull)
continue;
MsgPack temp;
if ((temp = l1["Id"]).Object != null)
lit0.Id = temp.RI32();
if ((temp = l1["Flags"]).Object != null)
lit0.Flags = (Flags)temp.RI32();
if ((temp = l1["Type"]).Object != null)
lit0.Type = (Type)temp.RI32();
if ((temp = l1["Ambient"]).Object != null)
{
lit0.Ambient.X = temp.RF32("R");
lit0.Ambient.Y = temp.RF32("G");
lit0.Ambient.Z = temp.RF32("B");
lit0.Ambient.W = temp.RF32("A");
}
if ((temp = l1["Diffuse"]).Object != null)
{
lit0.Diffuse.X = temp.RF32("R");
lit0.Diffuse.Y = temp.RF32("G");
lit0.Diffuse.Z = temp.RF32("B");
lit0.Diffuse.W = temp.RF32("A");
}
if ((temp = l1["Specular"]).Object != null)
{
lit0.Specular.X = temp.RF32("R");
lit0.Specular.Y = temp.RF32("G");
lit0.Specular.Z = temp.RF32("B");
lit0.Specular.W = temp.RF32("A");
}
if ((temp = l1["Position"]).Object != null)
{
lit0.Position.X = temp.RF32("X");
lit0.Position.Y = temp.RF32("Y");
lit0.Position.Z = temp.RF32("Z");
}
if ((temp = l1["ToneCurve"]).Object != null)
lit0.ToneCurve.X = temp.RF32("Begin" );
lit0.ToneCurve.Y = temp.RF32("End" );
lit0.ToneCurve.Z = temp.RF32("BlendRate");
if ((temp = l1["Str"]).Object != null)
{
lit0.HasStr = true;
lit0.Str = temp.RS();
}
if ((temp = l1["Unk01"]).Object != null)
lit0.Unk01 = temp.RF32();
if ((temp = l1["Unk02"]).Object != null)
lit0.Unk02 = temp.RF32();
if ((temp = l1["Unk03"]).Object != null)
lit0.Unk03 = temp.RF32();
if ((temp = l1["Unk04"]).Object != null)
lit0.Unk04 = temp.RF32();
if ((temp = l1["Unk05"]).Object != null)
lit0.Unk05.X = temp.RF32("X");
lit0.Unk05.Y = temp.RF32("Y");
lit0.Unk05.Z = temp.RF32("Z");
if ((temp = l1["Unk06"]).Object != null)
lit0.Unk06 = temp.RF32();
if ((temp = l1["Unk07"]).Object != null)
lit0.Unk07 = temp.RF32();
if ((temp = l1["Unk08"]).Object != null)
lit0.Unk08 = temp.RF32();
if ((temp = l1["Unk10"]).Object != null)
lit0.Unk10 = temp.RI32();
if ((temp = l1["Unk"]).Object != null)
lit0.Unk = temp.RF32();
}
if ((l0 = l["SubData", true]).IsNull)
continue;
lit.C1 = l0.Array.Length;
for (i0 = 0; i0 < lit.C1; i0++)
{
ref LITX lit1 = ref lit.E1[i0];
lit1 = default;
MsgPack l1;
if ((l1 = l0[i0]).IsNull && l1.Array != null)
continue;
lit1.C = l1.Array.Length;
lit1.E = new KeyValuePair<int, int>[lit1.C];
for (int i1 = 0; i1 < lit1.C; i1++)
{
lit1.E[i1] = default;
MsgPack l2 = l1[i1];
MsgPack temp;
if ((temp = l2["Key"]).Object != null)
lit1.E[i1].Key = temp.RI32();
if ((temp = l2["Value"]).Object != null)
lit1.E[i1].Value = temp.RI32();
}
}
}
}
light.Dispose();
msgPack.Dispose();
}
public void MsgPackWriter(string file, bool json)
{
if (LITs.E == null || LITs.C < 1) return;
MsgPack light;
if (!IsX)
{
light = new MsgPack(LITs.C, "Light");
for (i = 0; i < LITs.C; i++)
{
ref LightStruct lit = ref LITs.E[i];
MsgPack l = MsgPack.New;
MsgPack l0 = new MsgPack(lit.C0, "MainData");
for (i0 = 0; i0 < lit.C0; i0++)
{
ref LIT lit0 = ref lit.E0[i0];
MsgPack l1 = MsgPack.New;
l1.Add("Id", lit0.Id);
if ((lit0.Flags & Flags.Type) != 0)
l1.Add("Type", (int)lit0.Type);
if ((lit0.Flags & Flags.Ambient) != 0)
l1.Add(new MsgPack("Ambient")
.Add("R", lit0.Ambient.X)
.Add("G", lit0.Ambient.Y)
.Add("B", lit0.Ambient.Z)
.Add("A", lit0.Ambient.W));
if ((lit0.Flags & Flags.Diffuse) != 0)
l1.Add(new MsgPack("Diffuse")
.Add("R", lit0.Diffuse.X)
.Add("G", lit0.Diffuse.Y)
.Add("B", lit0.Diffuse.Z)
.Add("A", lit0.Diffuse.W));
if ((lit0.Flags & Flags.Specular) != 0)
l1.Add(new MsgPack("Specular")
.Add("R", lit0.Specular.X)
.Add("G", lit0.Specular.Y)
.Add("B", lit0.Specular.Z)
.Add("A", lit0.Specular.W));
if ((lit0.Flags & Flags.Position) != 0)
l1.Add(new MsgPack("Position")
.Add("X", lit0.Position.X)
.Add("Y", lit0.Position.Y)
.Add("Z", lit0.Position.Z));
if ((lit0.Flags & Flags.ToneCurve) != 0)
l1.Add(new MsgPack("ToneCurve")
.Add("Begin" , lit0.ToneCurve.X)
.Add("End" , lit0.ToneCurve.Y)
.Add("BlendRate", lit0.ToneCurve.Z));
l0[i0] = l1;
}
l.Add(l0);
light[i] = l;
}
}
else
{
light = new MsgPack(LITs.C, "LightX");
for (i = 0; i < LITs.C; i++)
{
ref LightStruct lit = ref LITs.E[i];
MsgPack l = MsgPack.New;
MsgPack l0 = new MsgPack(lit.C0, "MainData");
for (i0 = 0; i0 < lit.C0; i0++)
{
ref LIT lit0 = ref lit.E0[i0];
MsgPack l1 = MsgPack.New;
l1.Add("Id", lit0.Id);
l1.Add("Flags", (int)lit0.Flags);
l1.Add("Type", (int)lit0.Type);
l1.Add(new MsgPack("Ambient")
.Add("R", lit0.Ambient.X)
.Add("G", lit0.Ambient.Y)
.Add("B", lit0.Ambient.Z)
.Add("A", lit0.Ambient.W));
l1.Add(new MsgPack("Diffuse")
.Add("R", lit0.Diffuse.X)
.Add("G", lit0.Diffuse.Y)
.Add("B", lit0.Diffuse.Z)
.Add("A", lit0.Diffuse.W));
l1.Add(new MsgPack("Specular")
.Add("R", lit0.Specular.X)
.Add("G", lit0.Specular.Y)
.Add("B", lit0.Specular.Z)
.Add("A", lit0.Specular.W));
l1.Add(new MsgPack("Position")
.Add("X", lit0.Position.X)
.Add("Y", lit0.Position.Y)
.Add("Z", lit0.Position.Z));
l1.Add(new MsgPack("ToneCurve")
.Add("Begin" , lit0.ToneCurve.X)
.Add("End" , lit0.ToneCurve.Y)
.Add("BlendRate", lit0.ToneCurve.Z));
if (lit0.HasStr)
l1.Add("Str", lit0.Str ?? "");
l1.Add("Unk01", lit0.Unk01);
l1.Add("Unk02", lit0.Unk02);
l1.Add("Unk03", lit0.Unk03);
l1.Add("Unk04", lit0.Unk04);
l1.Add(new MsgPack("Unk05")
.Add("X", lit0.Unk05.X)
.Add("Y", lit0.Unk05.Y)
.Add("Z", lit0.Unk05.Z));
l1.Add("Unk06", lit0.Unk06);
l1.Add("Unk07", lit0.Unk07);
l1.Add("Unk08", lit0.Unk08);
l1.Add("Unk10", lit0.Unk10);
l1.Add("Unk", lit0.Unk);
l0[i0] = l1;
}
l.Add(l0);
if (lit.C1 > 0)
{
l0 = new MsgPack(lit.C1, "SubData");
for (i0 = 0; i0 < lit.C1; i0++)
{
ref LITX lit1 = ref lit.E1[i0];
MsgPack l1 = new MsgPack(lit1.C);
for (int i1 = 0; i1 < lit1.C; i1++)
l1[i1] = MsgPack.New
.Add("Key" , lit1.E[i1].Key )
.Add("Value", lit1.E[i1].Value);
l0[i0] = l1;
}
l.Add(l0);
}
light[i] = l;
}
}
light.Write(false, true, file + "_light", json);
}
public void TXTWriter(string file)
@@ -77,48 +792,89 @@ 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));
}
public struct LIT
{
public Id Id;
public Flags Flags;
public Type Type;
public Vector4 Ambient;
public Vector4 Diffuse;
public Vector4 Specular;
public Vector3 Position;
public Vector3 ToneCurve;
public override string ToString() => Flags == 0 ? ",,,,,,,,,,,,,,,," : Type + "," +
((Flags & Flags.Ambient ) == 0 ? ",,," : Ambient .ToString(6) + ",") +
((Flags & Flags.Diffuse ) == 0 ? ",,," : Diffuse .ToString(6) + ",") +
((Flags & Flags.Specular ) == 0 ? ",,,," : Specular .ToString(6) + ",") +
((Flags & Flags.Position ) == 0 ? ",,," : Position .ToString(6) + ",") +
((Flags & Flags.ToneCurve) == 0 ? ",,," : ToneCurve.ToString(6));
for (i0 = 0; i0 < LITs.E[i].C0; i0++)
s.W($"{LITs.E[i].E0[i0]},{i}\n");
File.WriteAllBytes($"{file}_light.txt", s.ToArray(true));
}
private bool disposed;
public void Dispose()
{ if (!disposed) { if (_IO != null) _IO.Dispose(); LITs = default; header = default; disposed = true; } }
{ if (!disposed) { if (s != null) s.D(); s = null; LITs = default; IsX = false; disposed = true; } }
public struct LightStruct
{
public int C0 { get => E0 != null ? E0.Length : 0;
set => E0 = value > -1 ? new LIT[value] : null; }
public int O0;
public LIT[] E0;
public int C1 { get => E1 != null ? E1.Length : 0;
set => E1 = value > -1 ? new LITX[value] : default; }
public int O1;
public LITX[] E1;
public LIT this[int index]
{ get => E0 != null && index > -1 && index < E0.LongLength ? E0[index] : default;
set { if (E0 != null && index > -1 && index < E0.LongLength) E0[index] = value; } }
public LITX this[int index, bool x]
{ get => E1 != null && index > -1 && index < E1.LongLength ? E1[index] : default;
set { if (E1 != null && index > -1 && index < E1.LongLength) E1[index] = value; } }
public override string ToString() => C0 < 1 ? "No Entries" :
C0 == 1 ? E0[0].ToString() : "Count: " + C0;
}
public struct LIT
{
public int Id;
public Flags Flags;
public Type Type;
public string Str;
public bool HasStr;
public Vec4 Ambient;
public Vec4 Diffuse;
public Vec4 Specular;
public Vec3 Position;
public float Unk01;
public float Unk02;
public float Unk03;
public float Unk04;
public Vec3 Unk05;
public Vec3 ToneCurve;
public float Unk;
public float Unk06;
public float Unk07;
public float Unk08;
public int Unk10;
public override string ToString() => Flags == 0 ? ",,,,,,,,,,,,,,,," : $"{(Type)Type}," +
((Flags & Flags.Ambient ) != 0
? $"{Ambient .X.ToS(6)},{Ambient .Y.ToS(6)},{Ambient .Z.ToS(6)}," : ",,,") +
((Flags & Flags.Diffuse ) != 0
? $"{Diffuse .X.ToS(6)},{Diffuse .Y.ToS(6)},{Diffuse .Z.ToS(6)}," : ",,,") +
((Flags & Flags.Specular ) != 0
? $"{Specular .X.ToS(6)},{Specular .Y.ToS(6)},{Specular .Z.ToS(6)},{Specular .W.ToS(6)}," : ",,,,") +
((Flags & Flags.Position ) != 0
? $"{Position .X.ToS(6)},{Position .Y.ToS(6)},{Position .Z.ToS(6)}," : ",,,") +
((Flags & Flags.ToneCurve) != 0
? $"{ToneCurve.X.ToS(6)},{ToneCurve.Y.ToS(6)},{ToneCurve.Z.ToS(6)}" : ",,");
}
public enum Id : int
{
CHARA = 0,
STAGE = 1,
SUN = 2,
REFLECT = 3,
SHADOW = 4,
CHARA_COLOR = 5,
CHARA_F = 6,
PROJECTION = 7,
CHARA = 0x00,
STAGE = 0x01,
SUN = 0x02,
REFLECT = 0x03,
SHADOW = 0x04,
CHARA_COLOR = 0x05,
CHARA_F = 0x06,
PROJECTION = 0x07,
}
public enum Type : int
@@ -131,12 +887,19 @@ namespace KKdMainLib.F2
public enum Flags : int
{
Type = 0b0000000001,
Ambient = 0b0000000010,
Diffuse = 0b0000000100,
Specular = 0b0000001000,
Position = 0b0000010000,
ToneCurve = 0b1000000000,
Type = 0b00000000000000001,
Ambient = 0b00000000000000010,
Diffuse = 0b00000000000000100,
Specular = 0b00000000000001000,
Position = 0b00000000000010000,
ToneCurve = 0b00000001000000000,
}
}
public struct LITX
{
public int C;
public int O;
public KeyValuePair<int, int>[] E;
}
}
+230 -148
View File
@@ -1,4 +1,4 @@
//Original: https://github.com/blueskythlikesclouds/MikuMikuLibrary/
//Original: https://github.com/blueskythlikesclouds/MikuMikuLibrary/
using System.IO.Compression;
using System.Security.Cryptography;
@@ -14,30 +14,28 @@ 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; FT = false; }
public KKdList<FARCFile> Files = KKdList<FARCFile>.New;
public Type FARCType;
public Flags FARCFlags;
public Farc Signature = Farc.FArC;
public Format Format = Format.DT;
public bool FT = false;
public string FilePath, DirectoryPath;
public bool HasFiles => Files.IsNull ? false : Files.Count > 0;
public bool HasFiles => !Files.IsNull || 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 };
private AesManaged GetAes(bool isFT, byte[] iv) =>
new AesManaged () { KeySize = 128, Key = isFT ? keyFT : key,
BlockSize = 128, Mode = isFT ? CipherMode.CBC : CipherMode.ECB,
Padding = PaddingMode.Zeros, IV = iv ?? new byte[16] };
private AesManaged GetAes(byte[] iv = null) =>
new AesManaged () { KeySize = 128, Key = iv != null ? keyFT : key,
BlockSize = 128, Mode = iv != null ? CipherMode.CBC : CipherMode.ECB,
Padding = iv != null ? PaddingMode.PKCS7 : PaddingMode.Zeros, IV = iv ?? new byte[16] };
public void Unpack(bool saveToDisk = true)
{ if (HeaderReader()) { FileReader(); if (saveToDisk) SaveToDisk(); } }
{ if (HeaderReader()) FileReader(saveToDisk); }
public bool HeaderReader()
{
@@ -45,87 +43,137 @@ namespace KKdMainLib
if (!File.Exists(FilePath)) return false;
Stream reader = File.OpenReader(FilePath);
DirectoryPath = Path.GetFullPath(FilePath).Replace(Path.GetExtension(FilePath), "");
DirectoryPath = Path.RemoveExtension(Path.GetFullPath(FilePath));
Signature = (Farc)reader.RI32E(true);
if (Signature != Farc.FArc && Signature != Farc.FArC && Signature != Farc.FARC)
{ reader.Dispose(); return false; }
FT = false;
int headerLength = reader.RI32E(true);
if (Signature == Farc.FARC)
{
FARCType = (Type)reader.RI32E(true);
FARCFlags = (Flags)reader.RI32E(true);
reader.RI32();
int farcMode = reader.RI32E(true);
int alignment = reader.RI32E(true);
Format = (FARCType & Type.ECB) != 0 && (farcMode & (farcMode - 1)) != 0 ? Format.FT : Format.DT;
FT = (FARCFlags & Flags.AES) != 0 && (alignment & (alignment - 1)) != 0;
if (Format == Format.FT && (FARCType & Type.ECB) != 0)
if (FT)
{
reader.Dispose();
byte[] header = new byte[headerLength - 0x08];
MSIO.FileStream stream = new MSIO.FileStream(FilePath, MSIO.FileMode.Open,
MSIO.FileAccess.ReadWrite, MSIO.FileShare.ReadWrite) { Position = 0x10 };
using (AesManaged aes = GetAes(true, null))
using (CryptoStream cryptoStream = new CryptoStream(stream,
aes.CreateDecryptor(), CryptoStreamMode.Read))
cryptoStream.Read(header, 0x00, headerLength - 0x08);
header = SkipData(header, 0x10);
reader = File.OpenReader(header);
farcMode = reader.RI32E(true);
headerLength -= 0x08;
reader.S(-0x04, SeekOrigin.Current);
}
else
headerLength -= 0x0C;
}
if (Signature == Farc.FARC)
if (reader.RI32E(true) == 1)
Files.Capacity = 0;
if (FT)
{
headerLength -= 0x10;
byte[] iv = reader.RBy(0x10);
byte[] header = reader.RBy(headerLength);
reader.Dispose();
using (MSIO.MemoryStream ms = new MSIO.MemoryStream())
{
using (AesManaged aes = GetAes(iv))
using (CryptoStream cryptoStream = new CryptoStream(ms,
aes.CreateDecryptor(), CryptoStreamMode.Write))
cryptoStream.Write(header, 0x00, headerLength);
header = ms.ToArray();
headerLength = header.Length;
}
reader = File.OpenReader(header);
int alignment = reader.RI32E(true);
}
else
{
byte[] header = reader.RBy(headerLength);
reader.Dispose();
reader = File.OpenReader(header);
}
bool hasPerFileFlags = false;
if (Signature == Farc.FARC) {
if (reader.RI32E(true) == 1) {
Files.Capacity = reader.RI32E(true);
reader.RI32();
hasPerFileFlags = true;
}
}
reader.RI32E(true);
if (Files.Capacity == 0)
{
int Count = 0;
long Position = reader.PI64;
int Size = 0;
if (hasPerFileFlags)
Size = sizeof(int) * 4;
else if (Signature != Farc.FArc)
Size = sizeof(int) * 3;
else
Size = sizeof(int) * 2;
while (reader.PI64 < headerLength)
{
reader.NT();
reader.RI32();
if (Signature != Farc.FArc) reader.RI32();
reader.RI32();
if (Signature == Farc.FARC && Format == Format.FT) reader.RI32();
reader.RBy(Size);
Count++;
}
reader.PI64 = Position;
Files.Capacity = Count;
}
for (int i = 0; i < Files.Capacity; i++)
{
FARCFile file = default;
file.Name = reader.NTUTF8();
file.Offset = reader.RI32E(true);
if (Signature != Farc.FArc) file.SizeComp = reader.RI32E(true);
file.SizeUnc = reader.RI32E(true);
if (Signature == Farc.FARC && Format == Format.FT)
file.Type = (Type)reader.RI32E(true);
Files.Add(file);
}
if (hasPerFileFlags)
for (int i = 0; i < Files.Capacity; i++)
{
FARCFile file = default;
file.Name = reader.NTUTF8();
file.Offset = reader.RI32E(true);
file.SizeComp = reader.RI32E(true);
file.Size = reader.RI32E(true);
Flags Flags = (Flags)reader.RI32E(true);
file.Compressed = file.Size != 0 || (FARCFlags & Flags.GZip) != 0;
file.Encrypted = ((FARCFlags | Flags) & Flags.AES) != 0;
Files.Add(file);
}
else if (Signature != Farc.FArc)
for (int i = 0; i < Files.Capacity; i++)
{
FARCFile file = default;
file.Name = reader.NTUTF8();
file.Offset = reader.RI32E(true);
file.SizeComp = reader.RI32E(true);
file.Size = reader.RI32E(true);
file.Compressed = file.Size != 0;
file.Encrypted = (FARCFlags & Flags.AES) != 0;
Files.Add(file);
}
else
for (int i = 0; i < Files.Capacity; i++)
{
FARCFile file = default;
file.Name = reader.NTUTF8();
file.Offset = reader.RI32E(true);
file.Size = reader.RI32E(true);
file.SizeComp = 0;
file.Compressed = false;
file.Encrypted = false;
Files.Add(file);
}
reader.Dispose();
return true;
}
private void FileReader()
{ for (int i = 0; i < Files.Count; i++) FileReader(i); }
public byte[] FileReader(string file)
{
if (!HasFiles) return null;
for (int i = 0; i < Files.Count; i++)
if (Files[i].Name.ToLower() == file.ToLower()) return FileReader(i);
return null;
}
public bool Exists(string file)
{
if (!HasFiles) return false;
@@ -134,79 +182,116 @@ namespace KKdMainLib
return false;
}
private void FileReader(bool saveToDisk)
{
if (saveToDisk)
MSIO.Directory.CreateDirectory(DirectoryPath);
Stream reader = File.OpenReader(FilePath);
for (int i = 0; i < Files.Count; i++)
FileReader(i, saveToDisk, ref reader);
reader.Dispose();
}
public byte[] FileReader(string file)
{
if (!HasFiles) return null;
for (int i = 0; i < Files.Count; i++)
if (Files[i].Name.ToLower() == file.ToLower())
return FileReader(i);
return null;
}
public byte[] FileReader(int i)
{
Stream reader = File.OpenReader(FilePath);
byte[] data = FileReader(i, false, ref reader);
reader.Dispose();
return data;
}
public byte[] FileReader(int i, bool saveToDisk, ref Stream reader)
{
if (!HasFiles) return null;
if (i >= Files.Count) return null;
FARCFile file = Files[i];
if (Signature != Farc.FARC)
file.Data = null;
reader.S(file.Offset, SeekOrigin.Begin);
if (Signature == Farc.FArc)
{
if (Signature == Farc.FArC)
using (MSIO.MemoryStream memorystream = new MSIO.MemoryStream(
File.ReadAllBytes(FilePath, file.SizeComp, file.Offset)))
using (GZipStream gZipStream = new GZipStream(memorystream, CompressionMode.Decompress))
file.DataComp = null;
file.Data = reader.RBy(file.Size);
}
else if (Signature == Farc.FArC)
{
file.DataComp = reader.RBy(file.SizeComp);
file.Data = file.DataComp.InflateGZip(file.Size);
}
else if (file.Encrypted || file.Compressed)
{
int tempSize = file.Encrypted ? file.SizeComp.A(0x10) : file.SizeComp;
byte[] temp;
if (file.Encrypted)
if (FT)
{
file.Data = new byte[file.SizeUnc];
gZipStream.Read(file.Data, 0, file.SizeUnc);
file.SizeComp -= 0x10;
tempSize -= 0x10;
byte[] iv = reader.RBy(0x10);
using (MSIO.MemoryStream ms = new MSIO.MemoryStream())
{
using (AesManaged aes = GetAes(iv))
using (CryptoStream cryptoStream = new CryptoStream(ms,
aes.CreateDecryptor(), CryptoStreamMode.Write))
cryptoStream.Write(reader.RBy(tempSize), 0x00, tempSize);
temp = ms.ToArray();
file.SizeComp = temp.Length;
}
}
else file.Data = File.ReadAllBytes(FilePath, file.SizeUnc, file.Offset);
Files[i] = file;
return file.Data;
}
else
{
using (MSIO.MemoryStream ms = new MSIO.MemoryStream())
{
using (AesManaged aes = GetAes())
using (CryptoStream cryptoStream = new CryptoStream(ms,
aes.CreateDecryptor(), CryptoStreamMode.Write))
cryptoStream.Write(reader.RBy(tempSize), 0x00, tempSize);
temp = ms.ToArray();
}
}
else
temp = reader.RBy(tempSize);
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);
using (Stream stream = File.OpenReader(FilePath))
{
stream.S(file.Offset, 0);
file.Data = stream.RBy(FileSize);
}
if ((FARCType & Type.ECB) != 0)
{
if (Format == Format.FT && (file.Type & Type.ECB) != 0)
if (!file.Compressed)
{
using (AesManaged aes = GetAes(true, null))
using (CryptoStream cryptoStream = new CryptoStream(new MSIO.MemoryStream(file.Data),
aes.CreateDecryptor(), CryptoStreamMode.Read))
cryptoStream.Read(file.Data, 0, FileSize);
file.Data = SkipData(file.Data, 0x10);
file.DataComp = null;
file.Data = temp;
}
else
using (AesManaged aes = GetAes(false, null))
using (CryptoStream cryptoStream = new CryptoStream(new MSIO.MemoryStream(file.Data),
aes.CreateDecryptor(), CryptoStreamMode.Read))
cryptoStream.Read(file.Data, 0, FileSize);
{
file.DataComp = temp;
file.Data = file.DataComp.InflateGZip(file.Size);
}
}
else
{
file.DataComp = null;
file.Data = reader.RBy(file.Size);
}
if (saveToDisk)
{
File.WriteAllBytes(Path.Combine(DirectoryPath, file.Name), file.Data);
file.DataComp = null;
file.Data = null;
}
if (((Format == Format.FT && (file.Type & Type.GZip) != 0) ||
(FARCType & Type.GZip) != 0) && file.SizeUnc > 0)
file.Data = file.Data.InflateGZip(file.SizeUnc);
Files[i] = file;
return file.Data;
}
private void SaveToDisk()
{
if (DirectoryPath == null || Files.IsNull ) return;
if (DirectoryPath == "" || Files.Count < 1) return;
MSIO.Directory.CreateDirectory(DirectoryPath);
for (int i = 0; i < Files.Count; i++)
{
FARCFile file = Files[i];
if (file.Data != null)
File.WriteAllBytes(Path.Combine(DirectoryPath, file.Name), file.Data);
}
}
private byte[] SkipData(byte[] data, int skip)
{
byte[] skipData = new byte[data.Length - skip];
System.Array.Copy(data, skip, skipData, 0, data.Length - skip);
return skipData;
return Files[i].Data;
}
public void Pack(Farc signature = Farc.FArC)
@@ -223,12 +308,12 @@ 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++)
{
string ext = Path.GetExtension(Files[i].Name).ToLower();
if (ext == ".a3da" || ext == ".diva" || ext == ".vag")
if (ext == ".a3da" || ext == ".diva" || ext == ".farc" || ext == ".vag")
{ Signature = Farc.FArc; break; }
}
@@ -237,11 +322,11 @@ namespace KKdMainLib
using (Stream headerWriter = File.OpenWriter())
{
if (Signature == Farc.FArc) headerWriter.WE(0x20, true);
else if (Signature == Farc.FArC) headerWriter.WE(0x10, true);
if (Signature == Farc.FArc) headerWriter.WE(0x01, true);
else if (Signature == Farc.FArC) headerWriter.WE(0x01, true);
else if (Signature == Farc.FARC)
{
headerWriter.WE((int)FARCType, true);
headerWriter.WE((int)FARCFlags, true);
headerWriter.W (0x00);
headerWriter.WE(0x40, true);
headerWriter.W (0x00);
@@ -272,7 +357,7 @@ namespace KKdMainLib
writer.W (file.Name + "\0");
writer.WE(file.Offset, true);
if (Signature != Farc.FArc) writer.WE(file.SizeComp, true);
writer.WE(file.SizeUnc, true);
writer.WE(file.Size, true);
}
writer.Dispose();
}
@@ -281,25 +366,20 @@ namespace KKdMainLib
{
FARCFile file = Files[i];
file.Offset = writer.P;
file.SizeUnc = file.Data.Length;
file.Type = Type.None;
file.Size = file.Data.Length;
byte[] data = file.Data;
if (Signature == Farc.FArC || (Signature == Farc.FARC && (FARCType & Type.GZip) != 0))
{
file.Type |= Type.GZip;
if (Signature == Farc.FArC || (Signature == Farc.FARC && (FARCFlags & Flags.GZip) != 0))
data = file.Data.DeflateGZip(CompressionLevel);
file.SizeComp = data.Length;
}
file.SizeComp = data.Length;
if (Signature == Farc.FARC && (FARCType & Type.ECB) != 0)
if (Signature == Farc.FARC && (FARCFlags & Flags.AES) != 0)
{
int alignLength = data.Length.A(0x40);
byte[] tempData = new byte[alignLength];
System.Array.Copy(data, tempData, data.Length);
for (int i1 = file.Data.Length; i1 < alignLength; i1++) tempData[i1] = 0x78;
data = Encrypt(tempData, false);
file.SizeComp = data.Length;
data = Encrypt(tempData);
}
writer.W(data);
@@ -312,26 +392,28 @@ namespace KKdMainLib
Files[i] = file;
}
private byte[] Encrypt(byte[] data, bool isFT)
private byte[] Encrypt(byte[] data)
{
MSIO.MemoryStream stream = new MSIO.MemoryStream();
using (AesManaged aes = GetAes(isFT, null))
using (CryptoStream cryptoStream = new CryptoStream(stream,
aes.CreateEncryptor(), CryptoStreamMode.Write))
cryptoStream.Write(data, 0, data.Length);
return stream.ToArray();
MSIO.MemoryStream ms = new MSIO.MemoryStream();
using (AesManaged aes = GetAes())
using (CryptoStream cryptoStream = new CryptoStream(ms,
aes.CreateDecryptor(), CryptoStreamMode.Write))
cryptoStream.Write(data, 0x00, data.Length);
return ms.ToArray();
}
public void Dispose() => NewFARC();
public struct FARCFile
{
public int Offset;
public int SizeComp;
public int SizeUnc;
public Type Type;
public byte[] Data;
public string Name;
public int Offset;
public int Size;
public int SizeComp;
public byte[] Data;
public byte[] DataComp;
public bool Compressed;
public bool Encrypted;
public override string ToString() => Name;
}
@@ -343,11 +425,11 @@ namespace KKdMainLib
FARC = 0x46415243,
}
public enum Type : int
public enum Flags : int
{
None = 0b000,
GZip = 0b010,
ECB = 0b100,
AES = 0b100,
}
}
}
+180 -161
View File
@@ -1,161 +1,180 @@
using System.Runtime.InteropServices;
namespace KKdMainLib.IO
{
public static unsafe class DeflateInflate
{
private const string libDeflateString = "libdeflate.dll";
public static byte[] Deflate(this byte[] data, long compressionLevel)
{
void* c = libdeflate_alloc_compressor((int)compressionLevel);
int maxOutBytes = libdeflate_deflate_compress_bound(c, data.Length);
byte[] outData = new byte[maxOutBytes];
int actualOut = 0;
fixed (byte* inPtr = data)
fixed (byte* outPtr = outData)
actualOut = libdeflate_deflate_compress(c, inPtr, data.Length, outPtr, maxOutBytes);
libdeflate_free_compressor(c);
System.Array.Resize(ref outData, (int)actualOut);
return outData;
}
public static byte[] Inflate(this byte[] data, long length)
{
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_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");
else if (actualOut < length)
System.Array.Resize(ref outData, (int)actualOut);
return outData;
}
public static byte[] DeflateGZip(this byte[] data, long compressionLevel)
{
void* c = libdeflate_alloc_compressor((int)compressionLevel);
int maxOutBytes = libdeflate_deflate_compress_bound(c, data.Length);
byte[] outData = new byte[maxOutBytes];
int actualOut = 0;
fixed (byte* inPtr = data)
fixed (byte* outPtr = outData)
actualOut = libdeflate_gzip_compress(c, inPtr, data.Length, outPtr, maxOutBytes);
libdeflate_free_compressor(c);
System.Array.Resize(ref outData, (int)actualOut);
return outData;
}
public static byte[] InflateGZip(this byte[] data, long length)
{
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_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");
else if (actualOut < length)
System.Array.Resize(ref outData, (int)actualOut);
return outData;
}
public static byte[] DeflateZLib(this byte[] data, long compressionLevel)
{
void* c = libdeflate_alloc_compressor((int)compressionLevel);
int maxOutBytes = libdeflate_deflate_compress_bound(c, data.Length);
byte[] outData = new byte[maxOutBytes];
int actualOut = 0;
fixed (byte* inPtr = data)
fixed (byte* outPtr = outData)
actualOut = libdeflate_zlib_compress(c, inPtr, data.Length, outPtr, maxOutBytes);
libdeflate_free_compressor(c);
System.Array.Resize(ref outData, (int)actualOut);
return outData;
}
public static byte[] InflateZLib(this byte[] data, long length)
{
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_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");
else if (actualOut < length)
System.Array.Resize(ref outData, (int)actualOut);
return outData;
}
[DllImport(libDeflateString)]
private static extern void* libdeflate_alloc_compressor(int compressionLevel);
[DllImport(libDeflateString)]
private static extern void* libdeflate_alloc_decompressor();
[DllImport(libDeflateString)]
private static extern int libdeflate_deflate_compress_bound(void* c, int length);
[DllImport(libDeflateString)]
private static extern int libdeflate_deflate_compress(void* c, byte* inData, int inBytes,
byte* outData, int maxOutBytes);
[DllImport(libDeflateString)]
private static extern void libdeflate_deflate_decompress(void* d, byte* inData, int inBytes,
byte* outData, int outBytesAvail, byte* 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);
[DllImport(libDeflateString)]
private static extern int libdeflate_gzip_compress_bound(void* c, int length);
[DllImport(libDeflateString)]
private static extern int libdeflate_gzip_compress(void* c, byte* inData, int inBytes,
byte* outData, int maxOutBytes);
[DllImport(libDeflateString)]
private static extern void libdeflate_gzip_decompress(void* d, byte* inData, int inBytes,
byte* outData, int outBytesAvail, byte* 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);
[DllImport(libDeflateString)]
private static extern int libdeflate_zlib_compress_bound(void* c, int length);
[DllImport(libDeflateString)]
private static extern int libdeflate_zlib_compress(void* c, byte* inData, int inBytes,
byte* outData, int maxOutBytes);
[DllImport(libDeflateString)]
private static extern void libdeflate_zlib_decompress(void* d, byte* inData, int inBytes,
byte* outData, int outBytesAvail, byte* actualOutBytes);
[DllImport(libDeflateString)]
private static extern void libdeflate_free_compressor(void* c);
[DllImport(libDeflateString)]
private static extern void libdeflate_free_decompressor(void* d);
}
}
using System.Runtime.InteropServices;
namespace KKdMainLib.IO
{
public static unsafe class DeflateInflate
{
public static bool HasFile = false;
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];
int actualOut = 0;
fixed (byte* inPtr = data)
fixed (byte* outPtr = outData)
actualOut = libdeflate_deflate_compress(c, inPtr, data.Length, outPtr, maxOutBytes);
libdeflate_free_compressor(c);
System.Array.Resize(ref outData, (int)actualOut);
return outData;
}
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, &actualOut);
libdeflate_free_decompressor(d);
if (actualOut == 0 || actualOut > length)
return data.Inflate(length * 2);
else if (actualOut < length)
System.Array.Resize(ref outData, (int)actualOut);
return outData;
}
public static byte[] DeflateGZip(this byte[] data, long compressionLevel)
{
CheckLib();
void* c = libdeflate_alloc_compressor((int)compressionLevel);
int maxOutBytes = libdeflate_gzip_compress_bound(c, data.Length);
byte[] outData = new byte[maxOutBytes];
int actualOut = 0;
fixed (byte* inPtr = data)
fixed (byte* outPtr = outData)
actualOut = libdeflate_gzip_compress(c, inPtr, data.Length, outPtr, maxOutBytes);
libdeflate_free_compressor(c);
System.Array.Resize(ref outData, (int)actualOut);
return outData;
}
public static byte[] InflateGZip(this byte[] data, long length)
{
CheckLib();
byte[] outData = new byte[length];
int result;
int actualOut = 0;
void* d = libdeflate_alloc_decompressor();
fixed (byte* inPtr = data)
fixed (byte* outPtr = outData)
result = libdeflate_gzip_decompress(d, inPtr, data.Length, outPtr, (int)length, &actualOut);
libdeflate_free_decompressor(d);
if (actualOut == 0 || actualOut > length)
return data.InflateGZip(length * 2 + 1);
else if (actualOut < length)
System.Array.Resize(ref outData, (int)actualOut);
return outData;
}
public static byte[] DeflateZLib(this byte[] data, long compressionLevel)
{
CheckLib();
void* c = libdeflate_alloc_compressor((int)compressionLevel);
int maxOutBytes = libdeflate_zlib_compress_bound(c, data.Length);
byte[] outData = new byte[maxOutBytes];
int actualOut = 0;
fixed (byte* inPtr = data)
fixed (byte* outPtr = outData)
actualOut = libdeflate_zlib_compress(c, inPtr, data.Length, outPtr, maxOutBytes);
libdeflate_free_compressor(c);
System.Array.Resize(ref outData, (int)actualOut);
return outData;
}
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, &actualOut);
libdeflate_free_decompressor(d);
if (actualOut == 0 || actualOut > length)
return data.InflateZLib(length * 2);
else if (actualOut < length)
System.Array.Resize(ref outData, (int)actualOut);
return outData;
}
[DllImport(libDeflateString)]
private static extern void* libdeflate_alloc_compressor(int compressionLevel);
[DllImport(libDeflateString)]
private static extern void* libdeflate_alloc_decompressor();
[DllImport(libDeflateString)]
private static extern int libdeflate_deflate_compress_bound(void* c, int length);
[DllImport(libDeflateString)]
private static extern int libdeflate_deflate_compress(void* c, byte* inData, int inBytes,
byte* outData, int maxOutBytes);
[DllImport(libDeflateString)]
private static extern int libdeflate_deflate_decompress(void* d, byte* inData, int inBytes,
byte* outData, int outBytesAvail, int* actualOutBytes);
[DllImport(libDeflateString)]
private static extern int libdeflate_deflate_decompress_ex(void* d, byte* inData, int inBytes,
byte* outData, int outBytesAvail, int* actualInBytes, int* actualOutBytes);
[DllImport(libDeflateString)]
private static extern int libdeflate_gzip_compress_bound(void* c, int length);
[DllImport(libDeflateString)]
private static extern int libdeflate_gzip_compress(void* c, byte* inData, int inBytes,
byte* outData, int maxOutBytes);
[DllImport(libDeflateString)]
private static extern int libdeflate_gzip_decompress(void* d, byte* inData, int inBytes,
byte* outData, int outBytesAvail, int* actualOutBytes);
[DllImport(libDeflateString)]
private static extern int libdeflate_gzip_decompress_ex(void* d, byte* inData, int inBytes,
byte* outData, int outBytesAvail, int* actualInBytes, int* actualOutBytes);
[DllImport(libDeflateString)]
private static extern int libdeflate_zlib_compress_bound(void* c, int length);
[DllImport(libDeflateString)]
private static extern int libdeflate_zlib_compress(void* c, byte* inData, int inBytes,
byte* outData, int maxOutBytes);
[DllImport(libDeflateString)]
private static extern int libdeflate_zlib_decompress(void* d, byte* inData, int inBytes,
byte* outData, int outBytesAvail, int* actualOutBytes);
[DllImport(libDeflateString)]
private static extern void libdeflate_free_compressor(void* c);
[DllImport(libDeflateString)]
private static extern void libdeflate_free_decompressor(void* d);
}
}
+94 -7
View File
@@ -1,15 +1,102 @@
using MSIO = System.IO;
using MSIO = System.IO;
using MSIOD = System.IO.Directory;
namespace KKdMainLib.IO
{
public static class Directory
{
public static bool Exists(string path) => MSIO.Directory.Exists(path);
public static void Delete(string path) => MSIO.Directory.Delete(path);
public static string GetCurrentDirectory() => MSIO.Directory.GetCurrentDirectory();
public static string[] GetFiles(string path) => MSIO.Directory.GetFiles(path);
public static string[] GetDirectories(string path) => MSIO.Directory.GetDirectories(path);
public static MSIO.DirectoryInfo CreateDirectory(string path) => MSIO.Directory.CreateDirectory(path);
public static MSIO.DirectoryInfo CreateDirectory(string path) =>
MSIOD.CreateDirectory(path);
public static void Delete(string path, bool recursive) =>
MSIOD.Delete(path, recursive);
public static void Delete(string path) =>
MSIOD.Delete(path);
public static bool Exists(string path) =>
MSIOD.Exists(path);
public static System.DateTime GetCreationTime(string path) =>
MSIOD.GetCreationTime(path);
public static System.DateTime GetCreationTimeUtc(string path) =>
MSIOD.GetCreationTimeUtc(path);
public static string GetCurrentDirectory() =>
MSIOD.GetCurrentDirectory();
public static string[] GetDirectories(string path, string searchPattern, MSIO.SearchOption searchOption) =>
MSIOD.GetDirectories(path, searchPattern, searchOption);
public static string[] GetDirectories(string path, string searchPattern) =>
MSIOD.GetDirectories(path, searchPattern);
public static string[] GetDirectories(string path) =>
MSIOD.GetDirectories(path);
public static string GetDirectoryRoot(string path) =>
MSIOD.GetDirectoryRoot(path);
public static string[] GetFiles(string path, string searchPattern, MSIO.SearchOption searchOption) =>
MSIOD.GetFiles(path, searchPattern, searchOption);
public static string[] GetFiles(string path) =>
MSIOD.GetFiles(path);
public static string[] GetFiles(string path, string searchPattern) =>
MSIOD.GetFiles(path, searchPattern);
public static string[] GetFileSystemEntries(string path) =>
MSIOD.GetFileSystemEntries(path);
public static string[] GetFileSystemEntries(string path, string searchPattern) =>
MSIOD.GetFileSystemEntries(path, searchPattern);
public static string[] GetFileSystemEntries(string path, string searchPattern, MSIO.SearchOption searchOption) =>
MSIOD.GetFileSystemEntries(path, searchPattern, searchOption);
public static System.DateTime GetLastAccessTime(string path) =>
MSIOD.GetLastAccessTime(path);
public static System.DateTime GetLastAccessTimeUtc(string path) =>
MSIOD.GetLastAccessTimeUtc(path);
public static System.DateTime GetLastWriteTime(string path) =>
MSIOD.GetLastWriteTime(path);
public static System.DateTime GetLastWriteTimeUtc(string path) =>
MSIOD.GetLastWriteTimeUtc(path);
public static string[] GetLogicalDrives() =>
MSIOD.GetLogicalDrives();
public static MSIO.DirectoryInfo GetParent(string path) =>
MSIOD.GetParent(path);
public static void Move(string sourceDirName, string destDirName) =>
MSIOD.Move(sourceDirName, destDirName);
public static void SetCreationTime(string path, System.DateTime creationTime) =>
MSIOD.SetCreationTime(path, creationTime);
public static void SetCreationTimeUtc(string path, System.DateTime creationTimeUtc) =>
MSIOD.SetCreationTimeUtc(path, creationTimeUtc);
public static void SetCurrentDirectory(string path) =>
MSIOD.SetCurrentDirectory(path);
public static void SetLastAccessTime(string path, System.DateTime lastAccessTime) =>
MSIOD.SetLastAccessTime(path, lastAccessTime);
public static void SetLastAccessTimeUtc(string path, System.DateTime lastAccessTimeUtc) =>
MSIOD.SetLastAccessTimeUtc(path, lastAccessTimeUtc);
public static void SetLastWriteTime(string path, System.DateTime lastWriteTime) =>
MSIOD.SetLastWriteTime(path, lastWriteTime);
public static void SetLastWriteTimeUtc(string path, System.DateTime lastWriteTimeUtc) =>
MSIOD.SetLastWriteTimeUtc(path, lastWriteTimeUtc);
}
}
+56 -33
View File
@@ -1,4 +1,4 @@
using KKdBaseLib;
using KKdBaseLib;
using KKdBaseLib.F2;
namespace KKdMainLib.IO
@@ -18,6 +18,7 @@ namespace KKdMainLib.IO
if (a == end) break;
else s.Add(a);
}
s.Capacity = s.Count;
return s.ToArray();
}
@@ -64,46 +65,68 @@ 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.RI64E( ) : stream.RI32E( );
public static long RIX(this Stream stream, bool isBE) =>
stream.IsX ? stream.RI64E(isBE) : stream.RI32E(isBE);
public static void WX(this Stream stream, long val, ref POF POF)
{ if (stream.IsX) stream.W ( val);
else stream.WE((int)val); POF.Offsets.Add(stream.P); }
public static void WX(this Stream stream, long val, ref POF POF, bool IsBE)
{ if (stream.IsX) stream.W ( val );
else stream.WE((int)val, IsBE); POF.Offsets.Add(stream.P); }
public static void WX(this Stream stream, long val, ref POF pof)
{ if (stream.IsX) stream.WE( val);
else stream.WE((int)val); pof.Offsets.Add(stream.P); }
public static void WX(this Stream stream, long val, ref POF pof, bool isBE)
{ if (stream.IsX) stream.WE( val, isBE);
else stream.WE((int)val, isBE); pof.Offsets.Add(stream.P); }
public static void WX(this Stream stream, long val)
{ if (stream.IsX) stream.W ( val);
{ if (stream.IsX) stream.WE( val);
else stream.WE((int)val); }
public static void WX(this Stream stream, long val, bool IsBE)
{ if (stream.IsX) stream.W ( val );
else stream.WE((int)val, IsBE); }
public static void WX(this Stream stream, long val, bool isBE)
{ if (stream.IsX) stream.WE( val, isBE);
else stream.WE((int)val, isBE); }
public static byte[] RaO(this Stream stream, long Offset = -1, long Length = -1)
public static byte[] RaO(this Stream stream, long offset = -1, long length = -1)
{
byte[] arr = null;
long Position = stream.PI64;
if (Offset == -1) { Position += stream.IsX ? 8 : 4; Offset = stream.RIX(); }
stream.PI64 = Offset;
if (Length == -1) arr = stream.NT();
else arr = stream.RBy(Length);
if (offset == -1) { Position += stream.IsX ? 8 : 4; offset = stream.RIX(); }
stream.PI64 = offset;
if (length == -1) arr = stream.NT();
else arr = stream.RBy(length);
stream.PI64 = Position;
return arr;
}
public static string RSaO(this Stream stream, long Offset = -1, long Length = -1)
public static string RSaO(this Stream stream)
{
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);
stream.PI64 = Position;
long offset = stream.RIX();
if (offset < 1)
return "";
long position = stream.PI64;
stream.PI64 = offset;
string s = stream.NTUTF8();
stream.PI64 = position;
return s;
}
public static string RSaO(this Stream stream, long offset)
{
long position = stream.PI64;
stream.PI64 = offset;
string s = stream.NTUTF8();
stream.PI64 = position;
return s;
}
public static string RSaO(this Stream stream, long offset, long length)
{
if (length < 1)
return "";
long position = stream.PI64;
stream.PI64 = offset;
string s = stream.RSUTF8(length);
stream.PI64 = position;
return s;
}
@@ -114,11 +137,11 @@ namespace KKdMainLib.IO
public static void WPSSJIS(this Stream stream, ref Pointer<string> val)
{ val.O = stream.P; stream.WPSSJIS(val.V); }
public static string RPSSJIS(this Stream stream, long Offset = -1, long Length = -1) =>
Text.ShiftJIS.GetString(stream.RaO(Offset, Length));
public static string RPSSJIS(this Stream stream, long offset = -1, long length = -1) =>
Text.ShiftJIS.GetString(stream.RaO(offset, length));
public static void WPSSJIS(this Stream stream, string String) =>
stream.W(Text.ShiftJIS.GetBytes(String));
public static void WPSSJIS(this Stream stream, string val) =>
stream.W(val.ToSJIS());
public static Pointer<string> RPS(this Stream stream)
{ Pointer<string> val = stream.RP<string>();
@@ -133,7 +156,7 @@ namespace KKdMainLib.IO
public static void W<T>(this Stream stream, Pointer<T> val) =>
stream.W(val.O);
public static CountPointer<T> ReadCountPointer<T>(this Stream stream) =>
public static CountPointer<T> RCP<T>(this Stream stream) =>
new CountPointer<T> { C = stream.RI32(), O = stream.RI32() };
public static void W<T>(this Stream stream, CountPointer<T> val)
+82 -23
View File
@@ -1,30 +1,41 @@
using System;
using MSIO = System.IO;
using MSIOF = System.IO.File;
namespace KKdMainLib.IO
{
public static class File
{
public static Stream OpenReader(byte[] Data) => new Stream(new MSIO.MemoryStream(Data));
public static Stream OpenWriter(byte[] Data) => new Stream(new MSIO.MemoryStream(Data));
public static Stream OpenWriter( ) => new Stream(new MSIO.MemoryStream( ));
public static Stream OpenReadWriter(byte[] data) => new Stream(new MSIO.MemoryStream(data));
public static Stream OpenReader (byte[] data) => new Stream(new MSIO.MemoryStream(data), canWrite: false);
public static Stream OpenWriter (byte[] data) => new Stream(new MSIO.MemoryStream(data), canRead : false);
public static Stream OpenWriter ( ) => new Stream(new MSIO.MemoryStream( ), canRead : false);
public static Stream OpenReader(string file, bool ReadAllAtOnce)
{ Stream _IO = OpenReader(file); if (ReadAllAtOnce) { byte[] data =
public static Stream OpenReadWriter(string file)
{ bool exist = Exists(file);
Stream _IO = new Stream(new MSIO.FileStream(file, MSIO.FileMode.OpenOrCreate,
MSIO.FileAccess.ReadWrite, MSIO.FileShare.ReadWrite)) { File = file };
System.DateTime t = System.DateTime.UtcNow;
if (exist) MSIOF.SetCreationTimeUtc(file, t);
MSIOF. SetLastWriteTimeUtc(file, t);
MSIOF.SetLastAccessTimeUtc(file, t); return _IO; }
public static Stream OpenReader(string file, bool readAllAtOnce)
{ Stream _IO = OpenReader(file); if (readAllAtOnce) { byte[] data =
_IO.ToArray(); _IO.Dispose(); return OpenReader(data); } return _IO; }
public static Stream OpenReader(string file)
{ Stream _IO = new Stream(new MSIO.FileStream(file, MSIO.FileMode.Open, MSIO.FileAccess.ReadWrite,
MSIO.FileShare.ReadWrite)) { File = file }; return _IO; }
public static Stream OpenWriter(string file, bool SetLength0)
{ Stream _IO = OpenWriter(file); if (SetLength0) _IO.SL(0); return _IO; }
public static Stream OpenWriter(string file, int SetLength)
{ Stream _IO = OpenWriter(file); _IO.SL(SetLength); return _IO; }
{ Stream _IO = new Stream(new MSIO.FileStream(file, MSIO.FileMode.Open, MSIO.FileAccess.Read,
MSIO.FileShare.ReadWrite), canWrite: false) { File = file }; return _IO; }
public static Stream OpenWriter(string file, bool setLength0)
{ Stream _IO = OpenWriter(file); if (setLength0) _IO.SL(0); return _IO; }
public static Stream OpenWriter(string file, int setLength)
{ Stream _IO = OpenWriter(file); _IO.SL(setLength); return _IO; }
public static Stream OpenWriter(string file)
{ Stream _IO = new Stream(new MSIO.FileStream(file,
MSIO.FileMode.OpenOrCreate, MSIO.FileAccess.ReadWrite, MSIO.FileShare.ReadWrite)) { File = file };
MSIO.File. SetCreationTimeUtc(file, DateTime.UtcNow);
MSIO.File. SetLastWriteTimeUtc(file, DateTime.UtcNow);
MSIO.File.SetLastAccessTimeUtc(file, DateTime.UtcNow); return _IO; }
{ bool exist = Exists(file);
Stream _IO = new Stream(new MSIO.FileStream(file, MSIO.FileMode.OpenOrCreate,
MSIO.FileAccess.ReadWrite, MSIO.FileShare.ReadWrite), canRead: false) { File = file };
System.DateTime t = System.DateTime.UtcNow;
if (!exist) MSIOF.SetCreationTimeUtc(file, t);
MSIOF. SetLastWriteTimeUtc(file, t);
MSIOF.SetLastAccessTimeUtc(file, t); return _IO; }
public static byte[] ReadAllBytes(string file, int length, int offset)
{ byte[] Data; using (Stream _IO = OpenReader(file)) Data = _IO.RBy(length, offset); return Data; }
@@ -48,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] + "\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; } }
@@ -59,10 +70,58 @@ 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] + "\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) => MSIO.File.Exists(file);
public static void Delete(string file) => MSIO.File.Delete(file);
public static bool Exists(string file) =>
MSIOF.Exists(file);
public static void Delete(string file) =>
MSIOF.Delete(file);
public static MSIO.FileAttributes GetAttributes(string path) =>
MSIOF.GetAttributes(path);
public static System.DateTime GetCreationTime(string path) =>
MSIOF.GetCreationTime(path);
public static System.DateTime GetCreationTimeUtc(string path) =>
MSIOF.GetCreationTimeUtc(path);
public static System.DateTime GetLastAccessTime(string path) =>
MSIOF.GetLastAccessTime(path);
public static System.DateTime GetLastAccessTimeUtc(string path) =>
MSIOF.GetLastAccessTimeUtc(path);
public static System.DateTime GetLastWriteTime(string path) =>
MSIOF.GetLastWriteTime(path);
public static System.DateTime GetLastWriteTimeUtc(string path) =>
MSIOF.GetLastWriteTimeUtc(path);
public static void Move(string sourceFileName, string destFileName) =>
MSIOF.Move(sourceFileName, destFileName);
public static void SetAttributes(string path, MSIO.FileAttributes fileAttributes) =>
MSIOF.SetAttributes(path, fileAttributes);
public static void SetCreationTime(string path, System.DateTime creationTime) =>
MSIOF.SetCreationTime(path, creationTime);
public static void SetCreationTimeUtc(string path, System.DateTime creationTimeUtc) =>
MSIOF.SetCreationTimeUtc(path, creationTimeUtc);
public static void SetLastAccessTime(string path, System.DateTime lastAccessTime) =>
MSIOF.SetLastAccessTime(path, lastAccessTime);
public static void SetLastAccessTimeUtc(string path, System.DateTime lastAccessTimeUtc) =>
MSIOF.SetLastAccessTimeUtc(path, lastAccessTimeUtc);
public static void SetLastWriteTime(string path, System.DateTime lastWriteTime) =>
MSIOF.SetLastWriteTime(path, lastWriteTime);
public static void SetLastWriteTimeUtc(string path, System.DateTime lastWriteTimeUtc) =>
MSIOF.SetLastWriteTimeUtc(path, lastWriteTimeUtc);
}
}
+499 -151
View File
@@ -1,12 +1,26 @@
//Original or reader part: https://github.com/MarcosLopezC/LightJson/
using KKdBaseLib;
using System;
using System.IO;
using BaseExtensions = KKdBaseLib.Extensions;
namespace KKdMainLib.IO
{
public struct JSON : System.IDisposable
{
struct ReadBuffer
{
public char[] data;
public int first;
public int length;
public ReadBuffer(int size)
{
data = new char[size];
first = 0;
length = 0;
}
};
public JSON(Stream _IO) => this._IO = _IO;
private Stream _IO;
@@ -15,178 +29,512 @@ namespace KKdMainLib.IO
public byte[] ToArray(bool Close = false) => _IO.ToArray(Close);
public MsgPack Read() => ReadValue();
private MsgPack ReadValue(string Key = null)
public MsgPack Read()
{
char c = _IO.SW().PCUTF8();
object obj = null;
if (char.IsDigit(c))
obj = RF();
else
obj = c switch
{
'"' => RS (),
'{' => RO (),
'[' => RA (),
'-' => RF (),
't' => RBo(),
'f' => RBo(),
'n' => RN (),
_ => null ,
};
return new MsgPack(Key, obj);
ReadBuffer buf = new ReadBuffer(0x400);
buf.first = 0;
buf.length = 0;
buf.data[0] = '\0';
buf.data[buf.data.Length - 1] = '\0';
int c = ReadChar(ref buf);
return new MsgPack(null, ReadInner(ref buf, ref c));
}
private string RS()
int ReadChar(ref ReadBuffer buf)
{
if (!Extensions.As(_IO, '"')) return null;
char c;
string s = "";
while (true)
if (buf.length == 0)
{
c = _IO.RCUTF8();
buf.first = 1;
buf.data[0] = buf.data[buf.data.Length - 1];
byte[] temp = _IO.RBy(buf.data.Length - 1);
buf.length = temp.Length;
Array.Copy(temp, 0, buf.data, 1, temp.Length);
}
if (buf.length < 1)
return -1;
int c = buf.data[buf.first];
buf.first++;
buf.length--;
return c;
}
void Seek(ref ReadBuffer buf, long offset)
{
if (buf.first < offset || offset >= buf.length - 1L) {
long pos = _IO.PI64 - buf.length - offset;
long off = pos % buf.data.Length;
pos -= off;
if (pos > 1)
{
_IO.S(pos, SeekOrigin.Begin);
buf.first = (int)off;
byte[] temp = _IO.RBy(buf.data.Length);
buf.length = temp.Length;
Array.Copy(temp, 0, buf.data, 0, temp.Length);
}
else
{
_IO.S(pos, SeekOrigin.Begin);
buf.first = (int)(off + 1);
buf.data[0] = '\0';
byte[] temp = _IO.RBy(buf.data.Length - 1);
buf.length = temp.Length;
Array.Copy(temp, 0, buf.data, 1, temp.Length);
}
buf.length -= (int)off;
}
else
{
buf.first -= (int)offset;
buf.length += (int)offset;
}
}
void SeekOne(ref ReadBuffer buf)
{
buf.first--;
buf.length++;
}
object ReadInner(ref ReadBuffer buf, ref int c)
{
if (c == -1)
return null;
if (c == ' ' || c == '\n' || c == '\r' || c == '\t')
c = ReadChar(ref buf);
switch (c)
{
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
case '-':
return ReadFloat(ref buf, ref c);
case '"':
return ReadString(ref buf, ref c);
case '{':
return ReadMap(ref buf, ref c);
case '[':
return ReadArray(ref buf, ref c);
case 't':
return ReadBool(ref buf, ref c);
case 'f':
return ReadBool(ref buf, ref c);
case 'n':
return ReadNull(ref buf, ref c);
}
return null;
}
void ReadDigit(ref ReadBuffer buf, ref int c, byte[] dig_buf, ref int dig_buf_pos, int dig_buf_end) {
int b = dig_buf_pos;
while (c >= '0' && c <= '9' && b < dig_buf_end) {
dig_buf[b++] = (byte)c;
if ((c = ReadChar(ref buf)) == -1)
break;
}
dig_buf_pos = b;
}
object ReadFloat(ref ReadBuffer buf, ref int c)
{
byte[] dig_buf = new byte[0x100];
int buf_pos = 0;
int buf_end = dig_buf.Length;
bool negate = false;
bool zero = false;
bool fraction = false;
if (c == '-')
{
dig_buf[buf_pos++] = (byte)c;
if ((c = ReadChar(ref buf)) == -1)
return null;
negate = true;
}
if (c == '0')
{
dig_buf[buf_pos++] = (byte)c;
if ((c = ReadChar(ref buf)) == -1)
return null;
zero = true;
}
else
ReadDigit(ref buf, ref c, dig_buf, ref buf_pos, buf_end);
if (c == '.')
{
dig_buf[buf_pos++] = (byte)c;
if ((c = ReadChar(ref buf)) == -1)
return null;
ReadDigit(ref buf, ref c, dig_buf, ref buf_pos, buf_end);
fraction = true;
}
if (zero && !fraction)
{
object obj;
if (negate)
obj = -0.0f;
else
obj = 0;
SeekOne(ref buf);
return obj;
}
else if (c != 'e' && c != 'E' && !fraction)
{
string temp = dig_buf.ToUTF8();
int null_term = temp.IndexOf('\0');
if (null_term >= 0)
temp = temp.Substring(0, null_term);
if (!long.TryParse(temp, out long val))
return null;
object obj;
unchecked
{
if (val >= 0x00 && val < 0xFF)
obj = (byte)val;
else if (val >= (sbyte)0x80 && val <= (sbyte)0x7F)
obj = (sbyte)val;
else if (val >= 0x0000 && val < 0xFFFF)
obj = (ushort)val;
else if (val >= (short)0x8000 && val <= (short)0x7FFF)
obj = (short)val;
else if (val >= 0x00000000 && val <= 0xFFFFFFFF)
obj = (uint)val;
else if (val >= (int)0x80000000 && val <= (int)0x7FFFFFFF)
obj = (int)val;
else
obj = val;
}
SeekOne(ref buf);
return obj;
}
else if (c == 'e' || c == 'E')
{
dig_buf[buf_pos++] = (byte)c;
if ((c = ReadChar(ref buf)) == -1)
return null;
if (c == '+' || c == '-')
{
dig_buf[buf_pos++] = (byte)c;
if ((c = ReadChar(ref buf)) == -1)
return null;
}
ReadDigit(ref buf, ref c, dig_buf, ref buf_pos, buf_end);
}
string ftemp = dig_buf.ToUTF8();
int fnull_term = ftemp.IndexOf('\0');
if (fnull_term >= 0)
ftemp = ftemp.Substring(0, fnull_term);
if (!ftemp.ToF64(out double fval))
return null;
object fobj;
if (fval == (float)fval)
fobj = (float)fval;
else
fobj = fval;
SeekOne(ref buf);
return fobj;
}
byte ReadStringHex(int c)
{
if (c >= '0' && c <= '9')
return (byte)(c - '0');
else if (c >= 'A' && c <= 'F')
return (byte)(c - 'A' + 0xA);
else if (c >= 'a' && c <= 'f')
return (byte)(c - 'a' + 0xA);
else
return 0;
}
string ReadStringInner(ref ReadBuffer buf, ref int c)
{
if (c != '"')
return null;
long pos = _IO.PI64 - buf.length;
ulong len = 0;
while (c != -1)
{
c = ReadChar(ref buf);
if (c == '\\')
{
if ((c = ReadChar(ref buf)) == -1)
break;
switch (c)
{
case '"':
case '\\':
case '/':
case 'b':
case 'f':
case 'n':
case 'r':
case 't':
len++;
break;
case 'u':
{
uint uc = 0;
if ((c = ReadChar(ref buf)) == -1)
break;
uc |= (uint)ReadStringHex(c) << 24;
if ((c = ReadChar(ref buf)) == -1)
break;
uc |= (uint)ReadStringHex(c) << 16;
if ((c = ReadChar(ref buf)) == -1)
break;
uc |= (uint)ReadStringHex(c) << 8;
if ((c = ReadChar(ref buf)) == -1)
break;
uc |= (uint)ReadStringHex(c);
if (uc <= 0x7F)
len++;
else if (c <= 0x7FF)
len += 2;
else
len += 3;
}
break;
}
}
else if (c == '"')
break;
else
len++;
}
if (c == -1)
return null;
long pos_end = _IO.PI64 - buf.length;
Seek(ref buf, pos_end - pos);
byte[] temp = new byte[len + 1];
for (ulong i = 0; i < len;)
{
c = ReadChar(ref buf);
if (c == '\\')
{
c = _IO.RCUTF8();
c = ReadChar(ref buf);
switch (char.ToLower(c))
switch (c)
{
case '"' :
case '"':
temp[i++] = (byte)'"';
break;
case '\\':
case '/' : s += c; break;
case 'b' : s += '\b'; break;
case 'f' : s += '\f'; break;
case 'n' : s += '\n'; break;
case 'r' : s += '\r'; break;
case 't' : s += '\t'; break;
case 'u' : s += RUL(); break;
default: return null;
temp[i++] = (byte)'\\';
break;
case '/':
temp[i++] = (byte)'/';
break;
case 'b':
temp[i++] = (byte)'\b';
break;
case 'f':
temp[i++] = (byte)'\f';
break;
case 'n':
temp[i++] = (byte)'\n';
break;
case 'r':
temp[i++] = (byte)'\r';
break;
case 't':
temp[i++] = (byte)'\t';
break;
case 'u':
{
uint uc = 0;
uc |= (uint)ReadStringHex(ReadChar(ref buf)) << 24;
uc |= (uint)ReadStringHex(ReadChar(ref buf)) << 16;
uc |= (uint)ReadStringHex(ReadChar(ref buf)) << 8;
uc |= (uint)ReadStringHex(ReadChar(ref buf));
if (uc <= 0x7F)
temp[i] = (byte)uc;
else if (uc <= 0x7FF)
{
temp[i++] = (byte)(0xC0 | ((uc >> 6) & 0x1F));
temp[i] = (byte)(0x80 | (uc & 0x3F));
}
else
{
temp[i++] = (byte)(0xE0 | ((uc >> 12) & 0xF));
temp[i++] = (byte)(0x80 | ((uc >> 6) & 0x3F));
temp[i++] = (byte)(0x80 | (uc & 0x3F));
}
}
break;
}
}
else if (c == '"') break;
else if (char.IsControl(c))
else if (c == '"')
break;
else
temp[i++] = (byte)c;
}
if ((c = ReadChar(ref buf)) == -1)
return null;
string str = temp.ToUTF8();
int null_term = str.IndexOf('\0');
if (null_term >= 0)
str = str.Substring(0, null_term);
return str;
}
object ReadString(ref ReadBuffer buf, ref int c)
{
return ReadStringInner(ref buf, ref c);
}
void ReadSkipWhitespace(ref ReadBuffer buf, ref int c)
{
while ((c = ReadChar(ref buf)) != -1)
{
if (c == ' ' || c == '\n' || c == '\r' || c == '\t')
continue;
break;
}
}
object ReadMap(ref ReadBuffer buf, ref int c)
{
KKdList<MsgPack> map = KKdList<MsgPack>.New;
if (c != '}')
{
while (true)
{
ReadSkipWhitespace(ref buf, ref c);
if (c == '}')
break;
string key = ReadStringInner(ref buf, ref c);
if (key == null)
return null;
ReadSkipWhitespace(ref buf, ref c);
if (c != ':')
return null;
ReadSkipWhitespace(ref buf, ref c);
map.Add(new MsgPack(key, ReadInner(ref buf, ref c)));
ReadSkipWhitespace(ref buf, ref c);
if (c == '}')
break;
else if (c != ',')
return null;
}
}
map.Capacity = map.Count;
return map;
}
object ReadArray(ref ReadBuffer buf, ref int c)
{
KKdList<MsgPack> array = KKdList<MsgPack>.New;
if (c != ']')
{
while (true)
{
ReadSkipWhitespace(ref buf, ref c);
if (c == ']')
break;
array.Add(new MsgPack(null, ReadInner(ref buf, ref c)));
ReadSkipWhitespace(ref buf, ref c);
if (c == ']')
break;
else if (c != ',')
return null;
}
}
array.Capacity = array.Count;
return array.ToArray();
}
object ReadBool(ref ReadBuffer buf, ref int c)
{
if (c != 't')
{
if ((c = ReadChar(ref buf)) == -1 || c != 'a')
return null;
else s += c;
if ((c = ReadChar(ref buf)) == -1 || c != 'l')
return null;
if ((c = ReadChar(ref buf)) == -1 || c != 's')
return null;
if ((c = ReadChar(ref buf)) == -1 || c != 'e')
return null;
return false;
}
return s;
}
private char RUL() =>
(char)((((((RHD() << 4) | RHD()) << 4) | RHD()) << 4) | RHD());
private int RHD() => byte.Parse(_IO.RCUTF8().ToString(),
System.Globalization.NumberStyles.HexNumber);
private KKdList<MsgPack> RO()
{
KKdList<MsgPack> obj = KKdList<MsgPack>.New;
if (!Extensions.As(_IO, '{')) return KKdList<MsgPack>.Null;
if (_IO.SW().PCUTF8() == '}')
{ _IO.RCUTF8(); return KKdList<MsgPack>.Null; }
string key;
char c;
while (true)
else
{
_IO.SW();
key = RS();
if (!Extensions.As(_IO.SW(), ':'))
return KKdList<MsgPack>.Null;
obj.Add(ReadValue(key));
c = _IO.SW().PCUTF8();
if (c == '}') { _IO.RCUTF8(); break; }
else if (c == ',') { _IO.RCUTF8(); continue; }
else return KKdList<MsgPack>.Null;
if ((c = ReadChar(ref buf)) == -1 || c != 'r')
return null;
if ((c = ReadChar(ref buf)) == -1 || c != 'u')
return null;
if ((c = ReadChar(ref buf)) == -1 || c != 'e')
return null;
return true;
}
return obj;
}
private MsgPack[] RA()
object ReadNull(ref ReadBuffer buf, ref int c)
{
KKdList<MsgPack> obj = KKdList<MsgPack>.New;
if (!Extensions.As(_IO, '[')) return null;
if (_IO.SW().PCUTF8() == ']')
{ _IO.RCUTF8(); return obj.ToArray(); }
if ((c = ReadChar(ref buf)) == -1 || c != 'u')
return null;
if ((c = ReadChar(ref buf)) == -1 || c != 'l')
return null;
if ((c = ReadChar(ref buf)) == -1 || c != 'l')
return null;
char c;
while (true)
{
obj.Add(ReadValue(null));
c = _IO.SW().PCUTF8();
if (c == ']') { _IO.RCUTF8(); break; }
else if (c == ',') { _IO.RCUTF8(); continue; }
else return null;
}
return obj.ToArray();
return null;
}
private object RF()
{
string s = " ";
_IO.SW();
if (_IO.PCUTF8() == '-') s += _IO.RCUTF8();
if (_IO.PCUTF8() == '0') s += _IO.RCUTF8();
else s += RD ();
char c = _IO.PCUTF8();
if (c == '.') s += _IO.RCUTF8() + RD();
else if (c != 'e' && c != 'E')
{
long val = long.Parse(s);
if (val >= 0x00000000 && val < 0x000000100) return ( byte)val;
else if (val >= -0x00000080 && val < 0x000000080) return ( sbyte)val;
else if (val >= -0x00008000 && val < 0x000008000) return ( short)val;
else if (val >= 0x00000000 && val < 0x000010000) return (ushort)val;
else if (val >= -0x80000000 && val < 0x000800000) return ( int)val;
else if (val >= 0x00000000 && val < 0x100000000) return ( uint)val;
else return val;
}
public JSON W(MsgPack msgPack, bool ignoreNull, string end = "\n", string tabChar = " ") =>
W(msgPack, ignoreNull, end, tabChar, "", true);
c = _IO.PCUTF8();
if (c == 'e' || c == 'E')
{
s += _IO.RCUTF8();
c = _IO.PCUTF8();
if (c == '+' || c == '-') s += _IO.RCUTF8();
s += RD();
}
double d = s.ToF64();
return (float)d == d ? (float)d : d;
}
public JSON W(MsgPack msgPack, bool ignoreNull, bool style = false) =>
W(msgPack, ignoreNull, "\n", " ", "", style);
private bool RBo()
{
char c = _IO.PCUTF8();
if (c == 't' && _IO.As( "true")) return true;
else if (c == 'f' && _IO.As("false")) return false;
return false;
}
private object RN() { _IO.As("null"); return null; }
private string RD()
{ 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 style = false) =>
W(msgPack, "\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 +544,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 +565,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));
+8 -8
View File
@@ -1,4 +1,4 @@
using KKdBaseLib;
using KKdBaseLib;
namespace KKdMainLib.IO
{
@@ -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;
+61 -15
View File
@@ -1,26 +1,72 @@
using MSIO = System.IO;
using MSIOP = System.IO.Path;
namespace KKdMainLib.IO
{
public static class Path
{
public static string GetFileName(string path) =>
MSIO.Path.GetFileName(path);
public static string GetFileNameWithoutExtension(string path) =>
MSIO.Path.GetFileNameWithoutExtension(path);
public static string GetExtension(string path) =>
MSIO.Path.GetExtension(path);
public static string GetFullPath(string path) =>
MSIO.Path.GetFullPath(path);
public static string Combine(string path1, string path2) =>
MSIO.Path.Combine(path1, path2);
public static char DirectorySeparatorChar => MSIOP.DirectorySeparatorChar;
public static char AltDirectorySeparatorChar => MSIOP.AltDirectorySeparatorChar;
public static char VolumeSeparatorChar => MSIOP.VolumeSeparatorChar;
public static char PathSeparator => MSIOP.PathSeparator;
public static string ChangeExtension(string path, string extension) =>
MSIOP.ChangeExtension(path, extension);
public static string Combine(string path1, string path2, string path3) =>
MSIO.Path.Combine(path1, path2, path3);
MSIOP.Combine(path1, path2, path3);
public static string Combine(string path1, string path2) =>
MSIOP.Combine(path1, path2);
public static string Combine(string path1, string path2, string path3, string path4) =>
MSIO.Path.Combine(path1, path2, path3, path4);
MSIOP.Combine(path1, path2, path3, path4);
public static string Combine(params string[] paths) =>
MSIO.Path.Combine(paths);
MSIOP.Combine(paths);
public static string GetDirectoryName(string path) =>
MSIO.Path.GetDirectoryName(path);
MSIOP.GetDirectoryName(path);
public static string GetExtension(string path) =>
MSIOP.GetExtension(path);
public static string GetFileName(string path) =>
MSIOP.GetFileName(path);
public static string GetFileNameWithoutExtension(string path) =>
MSIOP.GetFileNameWithoutExtension(path);
public static string GetFullPath(string path) =>
MSIOP.GetFullPath(path);
public static char[] GetInvalidFileNameChars() =>
MSIOP.GetInvalidFileNameChars();
public static char[] GetInvalidPathChars() =>
MSIOP.GetInvalidPathChars();
public static string GetPathRoot(string path) =>
MSIOP.GetPathRoot(path);
public static string GetRandomFileName() =>
MSIOP.GetRandomFileName();
public static string GetTempFileName() =>
MSIOP.GetTempFileName();
public static string GetTempPath() =>
MSIOP.GetTempPath();
public static bool HasExtension(string path) =>
MSIOP.HasExtension(path);
public static bool IsPathRooted(string path) =>
MSIOP.IsPathRooted(path);
public static string RemoveExtension(string path) =>
path.Substring(0, path.Length - GetExtension(path).Length);
public static string ReplaceExtension(string path, string ext) =>
path.Substring(0, path.Length - GetExtension(path).Length) + ext;
}
}
+234 -162
View File
@@ -1,7 +1,7 @@
using System;
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
{
@@ -11,15 +11,16 @@ namespace KKdMainLib.IO
private byte[] b;
private MSIO.Stream s;
private readonly bool canRead;
private readonly bool canWrite;
private bool getENRS;
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;
@@ -42,14 +43,14 @@ namespace KKdMainLib.IO
public uint PU32 { get => (uint)s.Position - OU32; set => s.Position = value + OU32; }
public long PI64 { get => s.Position - OI64; set => s.Position = value + OI64; }
public bool CanRead => s.CanRead;
public bool CanRead => canRead ;
public bool CanSeek => s.CanSeek;
public bool CanTimeout => s.CanTimeout;
public bool CanWrite => s.CanWrite;
public bool CanWrite => s.CanWrite && canWrite;
public string File = null;
public Stream(MSIO.Stream output = null, bool isBE = false)
public Stream(MSIO.Stream output = null, bool isBE = false, bool canRead = true, bool canWrite = true)
{
if (output == null) output = MSIO.Stream.Null;
OI64 = 0;
@@ -59,6 +60,8 @@ namespace KKdMainLib.IO
Format = Format.NULL;
b = new byte[0x100];
IsBE = isBE;
this.canRead = s.CanRead && canRead;
this.canWrite = s.CanWrite && canWrite;
}
public void C() => D(true);
@@ -92,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)
@@ -108,56 +111,59 @@ namespace KKdMainLib.IO
if (setLength1) s.SetLength(P + O);
}
public bool RBo () => s.ReadByte() != 0;
public sbyte RI8 () => (sbyte)s.ReadByte();
public byte RU8 () => ( byte)s.ReadByte();
public short RI16() { s.Read(b, 0, 2); return b.TI16(); }
public ushort RU16() { s.Read(b, 0, 2); return b.TU16(); }
public int RI32() { s.Read(b, 0, 4); return b.TI32(); }
public uint RU32() { s.Read(b, 0, 4); return b.TU32(); }
public long RI64() { s.Read(b, 0, 8); return b.TI64(); }
public ulong RU64() { s.Read(b, 0, 8); return b.TU64(); }
public float RF32() { s.Read(b, 0, 4); return b.TF32(); }
public double RF64() { s.Read(b, 0, 8); return b.TF64(); }
private void cR() { if (!canRead ) throw new Exception("Stream cannot be read!"); }
private void cW() { if (!canWrite) throw new Exception("Stream cannot be read!"); }
public short RI16E() { s.Read(b, 0, 2); b.E(2, IsBE); return b.TI16(); }
public ushort RU16E() { s.Read(b, 0, 2); b.E(2, IsBE); return b.TU16(); }
public int RI32E() { s.Read(b, 0, 4); b.E(4, IsBE); return b.TI32(); }
public uint RU32E() { s.Read(b, 0, 4); b.E(4, IsBE); return b.TU32(); }
public long RI64E() { s.Read(b, 0, 8); b.E(8, IsBE); return b.TI64(); }
public ulong RU64E() { s.Read(b, 0, 8); b.E(8, IsBE); return b.TU64(); }
public float RF32E() { s.Read(b, 0, 4); b.E(4, IsBE); return b.TF32(); }
public double RF64E() { s.Read(b, 0, 8); b.E(8, IsBE); return b.TF64(); }
public bool RBo () { cR(); return s.ReadByte() != 0; }
public sbyte RI8 () { cR(); return (sbyte)s.ReadByte(); }
public byte RU8 () { cR(); return ( byte)s.ReadByte(); }
public short RI16() { cR(); s.Read(b, 0, 2); return b.TI16(); }
public ushort RU16() { cR(); s.Read(b, 0, 2); return b.TU16(); }
public int RI32() { cR(); s.Read(b, 0, 4); return b.TI32(); }
public uint RU32() { cR(); s.Read(b, 0, 4); return b.TU32(); }
public long RI64() { cR(); s.Read(b, 0, 8); return b.TI64(); }
public ulong RU64() { cR(); s.Read(b, 0, 8); return b.TU64(); }
public float RF32() { cR(); s.Read(b, 0, 4); return b.TF32(); }
public double RF64() { cR(); s.Read(b, 0, 8); return b.TF64(); }
public short RI16E(bool isBE) { s.Read(b, 0, 2); b.E(2, isBE); return b.TI16(); }
public ushort RU16E(bool isBE) { s.Read(b, 0, 2); b.E(2, isBE); return b.TU16(); }
public int RI32E(bool isBE) { s.Read(b, 0, 4); b.E(4, isBE); return b.TI32(); }
public uint RU32E(bool isBE) { s.Read(b, 0, 4); b.E(4, isBE); return b.TU32(); }
public long RI64E(bool isBE) { s.Read(b, 0, 8); b.E(8, isBE); return b.TI64(); }
public ulong RU64E(bool isBE) { s.Read(b, 0, 8); b.E(8, isBE); return b.TU64(); }
public float RF32E(bool isBE) { s.Read(b, 0, 4); b.E(4, isBE); return b.TF32(); }
public double RF64E(bool isBE) { s.Read(b, 0, 8); b.E(8, isBE); return b.TF64(); }
public short RI16E() { cR(); s.Read(b, 0, 2); b.E(2, IsBE); return b.TI16(); }
public ushort RU16E() { cR(); s.Read(b, 0, 2); b.E(2, IsBE); return b.TU16(); }
public int RI32E() { cR(); s.Read(b, 0, 4); b.E(4, IsBE); return b.TI32(); }
public uint RU32E() { cR(); s.Read(b, 0, 4); b.E(4, IsBE); return b.TU32(); }
public long RI64E() { cR(); s.Read(b, 0, 8); b.E(8, IsBE); return b.TI64(); }
public ulong RU64E() { cR(); s.Read(b, 0, 8); b.E(8, IsBE); return b.TU64(); }
public float RF32E() { cR(); s.Read(b, 0, 4); b.E(4, IsBE); return b.TF32(); }
public double RF64E() { cR(); s.Read(b, 0, 8); b.E(8, IsBE); return b.TF64(); }
public void W(byte[] Val ) =>
s.Write(Val ?? new byte[0], 0, Val.Length);
public void W(byte[] Val, int Length) =>
s.Write(Val ?? new byte[0], 0, Length);
public void W(byte[] Val, int Offset, int Length) =>
s.Write(Val ?? new byte[0], Offset, Length);
public void W(char[] val, bool UTF8 = true) =>
W(UTF8 ? val.ToUTF8() : val.ToASCII());
public short RI16E(bool isBE) { cR(); s.Read(b, 0, 2); b.E(2, isBE); return b.TI16(); }
public ushort RU16E(bool isBE) { cR(); s.Read(b, 0, 2); b.E(2, isBE); return b.TU16(); }
public int RI32E(bool isBE) { cR(); s.Read(b, 0, 4); b.E(4, isBE); return b.TI32(); }
public uint RU32E(bool isBE) { cR(); s.Read(b, 0, 4); b.E(4, isBE); return b.TU32(); }
public long RI64E(bool isBE) { cR(); s.Read(b, 0, 8); b.E(8, isBE); return b.TI64(); }
public ulong RU64E(bool isBE) { cR(); s.Read(b, 0, 8); b.E(8, isBE); return b.TU64(); }
public float RF32E(bool isBE) { cR(); s.Read(b, 0, 4); b.E(4, isBE); return b.TF32(); }
public double RF64E(bool isBE) { cR(); s.Read(b, 0, 8); b.E(8, isBE); return b.TF64(); }
public void W( bool val) => s.WriteByte((byte)(val ? 1 : 0));
public void W( sbyte val) => s.WriteByte((byte) val);
public void W( byte val) => s.WriteByte( val);
public void W( short val) { b.GBy(val); s.Write(b, 0, 2); }
public void W(ushort val) { b.GBy(val); s.Write(b, 0, 2); }
public void W( int val) { b.GBy(val); s.Write(b, 0, 4); }
public void W( uint val) { b.GBy(val); s.Write(b, 0, 4); }
public void W( long val) { b.GBy(val); s.Write(b, 0, 8); }
public void W( ulong val) { b.GBy(val); s.Write(b, 0, 8); }
public void W( float val) { b.GBy(val); s.Write(b, 0, 4); }
public void W(double val) { b.GBy(val); s.Write(b, 0, 8); }
public void W(byte[] val )
{ cW(); s.Write(val ?? new byte[0], 0, val.Length); }
public void W(byte[] val, int Length)
{ cW(); s.Write(val ?? new byte[0], 0, Length); }
public void W(byte[] val, int offset, int length)
{ cW(); s.Write(val ?? new byte[0], offset, length); }
public void W(char[] val, bool utf8 = true) =>
W(utf8 ? val.ToUTF8() : val.ToASCII());
public void W( bool val) { cW(); s.WriteByte((byte)(val ? 1 : 0)); }
public void W( sbyte val) { cW(); s.WriteByte((byte) val); }
public void W( byte val) { cW(); s.WriteByte( val); }
public void W( short val) { cW(); b.GBy(val); s.Write(b, 0, 2); }
public void W(ushort val) { cW(); b.GBy(val); s.Write(b, 0, 2); }
public void W( int val) { cW(); b.GBy(val); s.Write(b, 0, 4); }
public void W( uint val) { cW(); b.GBy(val); s.Write(b, 0, 4); }
public void W( long val) { cW(); b.GBy(val); s.Write(b, 0, 8); }
public void W( ulong val) { cW(); b.GBy(val); s.Write(b, 0, 8); }
public void W( float val) { cW(); b.GBy(val); s.Write(b, 0, 4); }
public void W(double val) { cW(); b.GBy(val); s.Write(b, 0, 8); }
public void W( sbyte? val) => W(val ?? default);
public void W( byte? val) => W(val ?? default);
@@ -170,107 +176,171 @@ namespace KKdMainLib.IO
public void W( float? val) => W(val ?? default);
public void W(double? val) => W(val ?? default);
public void W( char val, bool UTF8 = true) =>
W(UTF8 ? val.ToString().ToUTF8() : val.ToString().ToASCII());
public void W(string val, bool UTF8 = true) =>
W(UTF8 ? val .ToUTF8() : val .ToASCII());
public void W( char val, bool utf8 = true) =>
W(utf8 ? val.ToString().ToUTF8() : val.ToString().ToASCII());
public void W(string val, bool utf8 = true) =>
W(utf8 ? val .ToUTF8() : val .ToASCII());
public void WE( short val) { b.GBy(val); b.E(2, IsBE); s.Write(b, 0, 2); }
public void WE(ushort val) { b.GBy(val); b.E(2, IsBE); s.Write(b, 0, 2); }
public void WE( int val) { b.GBy(val); b.E(4, IsBE); s.Write(b, 0, 4); }
public void WE( uint val) { b.GBy(val); b.E(4, IsBE); s.Write(b, 0, 4); }
public void WE( long val) { b.GBy(val); b.E(8, IsBE); s.Write(b, 0, 8); }
public void WE( ulong val) { b.GBy(val); b.E(8, IsBE); s.Write(b, 0, 8); }
public void WE( float val) { b.GBy(val); b.E(4, IsBE); s.Write(b, 0, 4); }
public void WE(double val) { b.GBy(val); b.E(8, IsBE); s.Write(b, 0, 8); }
public void WE( short val) { cW(); b.GBy(val); b.E(2, IsBE); s.Write(b, 0, 2); }
public void WE(ushort val) { cW(); b.GBy(val); b.E(2, IsBE); s.Write(b, 0, 2); }
public void WE( int val) { cW(); b.GBy(val); b.E(4, IsBE); s.Write(b, 0, 4); }
public void WE( uint val) { cW(); b.GBy(val); b.E(4, IsBE); s.Write(b, 0, 4); }
public void WE( long val) { cW(); b.GBy(val); b.E(8, IsBE); s.Write(b, 0, 8); }
public void WE( ulong val) { cW(); b.GBy(val); b.E(8, IsBE); s.Write(b, 0, 8); }
public void WE( float val) { cW(); b.GBy(val); b.E(4, IsBE); s.Write(b, 0, 4); }
public void WE(double val) { cW(); b.GBy(val); b.E(8, IsBE); s.Write(b, 0, 8); }
public void WE( short val, bool isBE) { b.GBy(val); b.E(2, isBE); s.Write(b, 0, 2); }
public void WE(ushort val, bool isBE) { b.GBy(val); b.E(2, isBE); s.Write(b, 0, 2); }
public void WE( int val, bool isBE) { b.GBy(val); b.E(4, isBE); s.Write(b, 0, 4); }
public void WE( uint val, bool isBE) { b.GBy(val); b.E(4, isBE); s.Write(b, 0, 4); }
public void WE( long val, bool isBE) { b.GBy(val); b.E(8, isBE); s.Write(b, 0, 8); }
public void WE( ulong val, bool isBE) { b.GBy(val); b.E(8, isBE); s.Write(b, 0, 8); }
public void WE( float val, bool isBE) { b.GBy(val); b.E(4, isBE); s.Write(b, 0, 4); }
public void WE(double val, bool isBE) { b.GBy(val); b.E(8, isBE); s.Write(b, 0, 8); }
public void WE( short val, bool isBE) { cW(); b.GBy(val); b.E(2, isBE); s.Write(b, 0, 2); }
public void WE(ushort val, bool isBE) { cW(); b.GBy(val); b.E(2, isBE); s.Write(b, 0, 2); }
public void WE( int val, bool isBE) { cW(); b.GBy(val); b.E(4, isBE); s.Write(b, 0, 4); }
public void WE( uint val, bool isBE) { cW(); b.GBy(val); b.E(4, isBE); s.Write(b, 0, 4); }
public void WE( long val, bool isBE) { cW(); b.GBy(val); b.E(8, isBE); s.Write(b, 0, 8); }
public void WE( ulong val, bool isBE) { cW(); b.GBy(val); b.E(8, isBE); s.Write(b, 0, 8); }
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)
{ if (getENRS) ENRSDict.Add(P, c); s.Read(b, 0, 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); 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 Half RF16 ( ) { ushort a = RU16 ( ); return (Half)a; }
public Half RF16E ( ) { ushort a = RU16E ( ); return (Half)a; }
public Half RF16E (bool isBE) { ushort a = RU16E (isBE); return (Half)a; }
public Half RF16ENRS ( ) { ushort a = RU16E ( ); return (Half)a; }
public Half RF16ENRSE( ) { ushort a = RU16ENRSE( ); return (Half)a; }
public Half RF16ENRSE(bool isBE) { ushort a = RU16ENRSE(isBE); return (Half)a; }
public int RI24 ( ) { cR(); s.Read(b, 0, 3); return b.TI24(); }
public uint RU24 ( ) { cR(); s.Read(b, 0, 3); return b.TU24(); }
public int RI24E( ) { cR(); s.Read(b, 0, 3); b.E(3, IsBE); return b.TI24(); }
public uint RU24E( ) { cR(); s.Read(b, 0, 3); b.E(3, IsBE); return b.TU24(); }
public int RI24E(bool isBE) { cR(); s.Read(b, 0, 3); b.E(3, isBE); return b.TI24(); }
public uint RU24E(bool isBE) { cR(); s.Read(b, 0, 3); b.E(3, isBE); return b.TU24(); }
public void W (Half val ) => W ((ushort)val );
public void WE (Half val ) => WE ((ushort)val );
public void WE (Half val, bool isBE) => WE ((ushort)val, isBE);
public void WENRS (Half val ) => WENRS ((ushort)val );
public void WENRSE(Half val ) => WENRSE((ushort)val );
public void WENRSE(Half val, bool isBE) => WENRSE((ushort)val, isBE);
public Half RF16 ( ) { cR(); s.Read(b, 0, 2); return b.TF16(); }
public Half RF16E( ) { cR(); s.Read(b, 0, 2); b.E(2, IsBE); return b.TF16(); }
public Half RF16E(bool isBE) { cR(); s.Read(b, 0, 2); b.E(2, isBE); return b.TF16(); }
public char RC(bool utf8 = true) => utf8 ? RCUTF8() : (char)s.ReadByte();
public void W (Half val ) { cW(); b.GBy(val); s.Write(b, 0, 2); }
public void WE (Half val ) { cW(); b.GBy(val); b.E(2, IsBE); s.Write(b, 0, 2); }
public void WE (Half val, bool isBE) { cW(); b.GBy(val); b.E(2, isBE); s.Write(b, 0, 2); }
public Vec2 RV2 ( ) { cR(); s.Read(b, 0, 8); return b.TV2(); }
public Vec3 RV3 ( ) { cR(); s.Read(b, 0, 12); return b.TV3(); }
public Vec4 RV4 ( ) { cR(); s.Read(b, 0, 16); return b.TV4(); }
public Vec2 RV2E ( ) { cR(); s.Read(b, 0, 8); b.E( 8, IsBE); return b.TV2(); }
public Vec3 RV3E ( ) { cR(); s.Read(b, 0, 12); b.E(12, IsBE); return b.TV3(); }
public Vec4 RV4E ( ) { cR(); s.Read(b, 0, 16); b.E(16, IsBE); return b.TV4(); }
public Vec2 RV2E (bool isBE) { cR(); s.Read(b, 0, 8); b.E( 8, isBE); return b.TV2(); }
public Vec3 RV3E (bool isBE) { cR(); s.Read(b, 0, 12); b.E(12, isBE); return b.TV3(); }
public Vec4 RV4E (bool isBE) { cR(); s.Read(b, 0, 16); b.E(16, isBE); return b.TV4(); }
public void W (Vec2 val ) { cW(); b.GBy(val); s.Write(b, 0, 8); }
public void W (Vec3 val ) { cW(); b.GBy(val); s.Write(b, 0, 12); }
public void W (Vec4 val ) { cW(); b.GBy(val); s.Write(b, 0, 16); }
public void WE(Vec2 val ) { cW(); b.GBy(val); b.E( 8, IsBE); s.Write(b, 0, 8); }
public void WE(Vec3 val ) { cW(); b.GBy(val); b.E(12, IsBE); s.Write(b, 0, 12); }
public void WE(Vec4 val ) { cW(); b.GBy(val); b.E(16, IsBE); s.Write(b, 0, 16); }
public void WE(Vec2 val, bool isBE) { cW(); b.GBy(val); b.E( 8, isBE); s.Write(b, 0, 8); }
public void WE(Vec3 val, bool isBE) { cW(); b.GBy(val); b.E(12, isBE); s.Write(b, 0, 12); }
public void WE(Vec4 val, bool isBE) { cW(); b.GBy(val); b.E(16, isBE); s.Write(b, 0, 16); }
public Quat RQ ( ) { cR(); s.Read(b, 0, 16); return b.TQ(); }
public Quat RQE ( ) { cR(); s.Read(b, 0, 16); b.E(16, IsBE); return b.TQ(); }
public Quat RQE (bool isBE) { cR(); s.Read(b, 0, 16); b.E(16, isBE); return b.TQ(); }
public void W (Quat val ) { cW(); b.GBy(val); s.Write(b, 0, 16); }
public void WE(Quat val ) { cW(); b.GBy(val); b.E(16, IsBE); s.Write(b, 0, 16); }
public void WE(Quat val, bool isBE) { cW(); b.GBy(val); b.E(16, isBE); s.Write(b, 0, 16); }
public T[] RA<T>(long length, long offset = -1) where T : unmanaged
{
cR();
int sizeOfT = sizeof(T);
if (offset > -1) s.Position = offset;
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);
array[i] = *(T*)ptr;
}
if (IsBE) array = array.ReverseEndian();
return array;
}
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;
byte[] buf = new byte[sizeOfT];
fixed (byte* ptr = buf)
for (i = 0; i < length; i++)
{
*(T*)ptr = array[i];
s.Write(buf, 0, sizeOfT);
}
}
public char RC(bool utf8 = true)
{ cR(); return utf8 ? RCUTF8() : (char)s.ReadByte();}
public char RCUTF8()
{
cR();
byte t;
int T;
int val = 0;
@@ -290,25 +360,24 @@ namespace KKdMainLib.IO
return (char)val;
}
public string RS(long Length, bool UTF8 = true) =>
UTF8 ? RSUTF8(Length) : RSASCII(Length);
public string RS(long Length, bool utf8 = true)
{ cR(); return utf8 ? RSUTF8(Length) : RSASCII(Length);}
public string RSUTF8 (long length) => RBy(length).ToUTF8 ();
public string RSASCII(long length) => RBy(length).ToASCII();
public string RSUTF8 (long length) { cR(); return RBy(length).ToUTF8 (); }
public string RSASCII(long length) { cR(); return RBy(length).ToASCII(); }
public string RS(long? length, bool utf8 = true)
{ cR(); return utf8? RSUTF8(length) : RSASCII(length); }
public string RS(long? length, bool utf8 = true) =>
utf8 ? RSUTF8(length) : RSASCII(length);
public string RSUTF8 (long? length) => RBy(length).ToUTF8 ();
public string RSASCII(long? length) => RBy(length).ToASCII();
public string RSUTF8 (long? length) { cR(); return RBy(length).ToUTF8 (); }
public string RSASCII(long? length) { cR(); return RBy(length).ToASCII(); }
public byte[] RBy(long length, long offset = -1)
{ byte[] Buf = new byte[length]; if (offset > -1) s.Position = offset;
s.Read(Buf, 0, (int)length); return Buf; }
{ cR(); byte[] buf = new byte[length]; if (offset > -1) s.Position = offset;
s.Read(buf, 0, (int)length); return buf; }
public int RBy(long length, byte[] buf, long offset = -1)
{ if (offset > -1) s.Position = offset; return s.Read(buf, 0, (int)length); }
{ cR(); if (offset > -1) s.Position = offset; return s.Read(buf, 0, (int)length); }
public byte[] RBy(long? length, long offset = -1)
{ if (length == null) return new byte[0]; else return RBy((long)length, offset); }
@@ -319,6 +388,7 @@ namespace KKdMainLib.IO
public byte RBi(byte bits)
{
cR();
bitRead += bits;
tempBitRead = 8 - bitRead;
if (tempBitRead < 0)
@@ -334,6 +404,7 @@ namespace KKdMainLib.IO
public void W(int val, byte bits)
{
cW();
val &= (1 << bits) - 1;
bitWrite += bits;
tempBitWrite = 8 - bitWrite;
@@ -349,19 +420,20 @@ namespace KKdMainLib.IO
}
public void CR() //CheckRead
{ if (bitRead > 0) valRead = 0; bitRead = 8; }
{ if (bitRead > 0) valRead = 0; bitRead = 8; }
public void CW() //CheckWrite
{ if (bitWrite > 0) { s.WriteByte((byte)valWrite); valWrite = 0; bitWrite = 0; } }
{ if (bitWrite > 0) { cW(); s.WriteByte((byte)valWrite); valWrite = 0; bitWrite = 0; } }
public byte[] ToArray(bool close)
{ byte[] Data = ToArray(); if (close) Dispose(); return Data; }
{ byte[] data = ToArray(); if (close) Dispose(); return data; }
public byte[] ToArray()
{
long Position = s.Position;
byte[] Data = RBy(s.Length, 0);
s.Position = Position;
return Data;
long position = s.Position; s.Position = 0;
byte[] data = new byte[s.Length];
s.Read(data, 0, data.Length);
s.Position = position;
return data;
}
}
+21 -8
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>
<Description>A simple library for working with Project Diva AC/DT/F/AFT/F2/X/FT/M39 files</Description>
<FileVersion>0.4.9.1</FileVersion>
<Copyright>korenkonder (C) 2018-2023</Copyright>
<Description>A simple library for working with Project Diva AC/DT/F/AFT/F2/X/XHD/FT/VRFL/M39 files</Description>
<FileVersion>0.4.10.16</FileVersion>
<PackageId>KKdMainLib</PackageId>
<Product>KKdMainLib</Product>
<TargetFramework>netstandard2.0</TargetFramework>
<TargetFramework>net461</TargetFramework>
<Title>KKdMainLib</Title>
<Version>0.4.9.1</Version>
<Version>0.4.10.16</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, IDE0018, IDE0032, IDE0044, IDE0045, IDE0046, IDE0051, IDE0055, IDE0059, IDE0063, 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, IDE0018, IDE0032, IDE0044, IDE0045, IDE0046, IDE0051, IDE0055, IDE0059, IDE0063, 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>
-184
View File
@@ -1,184 +0,0 @@
using System;
using System.Linq;
using System.Globalization;
using System.Collections.Generic;
using KKdBaseLib;
using A3DADict = System.Collections.Generic.Dictionary<string, object>;
namespace KKdMainLib
{
public static unsafe class Main
{
public const string TimeFormatHHmmssfff = "{0:d2}:{1:d2}:{2:d2}.{3:d3}";
public static void WT(this TimeSpan time, bool writeLine = false)
{
if (writeLine) Console.WriteLine(TimeFormatHHmmssfff,
time.Hours, time.Minutes, time.Seconds, time.Milliseconds);
else Console.Write (TimeFormatHHmmssfff,
time.Hours, time.Minutes, time.Seconds, time.Milliseconds);
}
public static void WT(this TimeSpan time, string text, bool writeLine = true)
{
if (writeLine) Console.WriteLine(TimeFormatHHmmssfff + " - " + text,
time.Hours, time.Minutes, time.Seconds, time.Milliseconds);
else Console.Write (TimeFormatHHmmssfff + " - " + text,
time.Hours, time.Minutes, time.Seconds, time.Milliseconds);
}
public static string NT(this string source, ref int i, byte end)
{
string s = "";
while (true)
{
if (source[i] == end) break;
else s += source[i];
i++;
}
return s;
}
public static bool SW(this A3DADict dict, string args, char split = '.') =>
dict.SW(args.Split(split));
public static bool SW(this A3DADict dict, string[] args)
{
if (dict == null || args.Length < 1) return false;
args[0] = args[0].ToLower();
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 dict.ContainsKey(args[0]) ? SW((A3DADict)dict[args[0]], newArgs) : false;
}
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 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 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 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 string value, char split, string args)
{ if (dict.FV(out string val , args.Split(split)))
{ value = val; return true; } return false; }
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)
{ if (dict.FV(out string val , args.Split('.' )))
return int.TryParse(val, out value); value = 0; return false; }
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; }
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; }
public static bool FV(this A3DADict dict, out int? value, string args)
{ if (dict.FV(out string val , args.Split('.' )))
{ bool Val = int.TryParse(val, out int _value);
value = _value; return Val; } value = null; return false; }
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 = null; return false; }
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(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)
{
value = null;
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]]).FV(out value, newArgs);
}
else if (args.Length == 1)
{
if (dict[args[0]].GetType() == dict.GetType())
return ((A3DADict)dict[args[0]]).FV(out value, args);
else if (dict[args[0]].GetType() != typeof(string)) return false;
}
value = (string)dict[args[0]];
return true;
}
public static void GD(this A3DADict dict, string args, char split = '.')
{
string[] dataArray = args.Split('=');
if (dataArray.Length == 2)
dict.GD(dataArray[0].Split(split), dataArray[1]);
dataArray = null;
}
public static void GD(this A3DADict dict, string args, string value, char split = '.') =>
dict.GD(args.Split(split), value);
public static void GD(this A3DADict dict, string[] args, string value)
{
if (dict == null) dict = new A3DADict();
else if (args.Length < 1) return;
args[0] = args[0].ToLower();
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];
if (!dict.ContainsKey(args[0])) dict.Add(args[0], null);
if (dict[args[0]] != null)
{
if (dict[args[0]].GetType() == typeof(string))
dict[args[0]] = new A3DADict { { "", dict[args[0]] } };
}
else dict[args[0]] = new A3DADict();
A3DADict bufDict = (A3DADict)dict[args[0]];
bufDict.GD(newArgs, value);
dict[args[0]] = bufDict;
}
else if (!dict.ContainsKey(args[0])) dict.Add(args[0], value);
}
public static TKey GK<TKey, TVal>(this Dictionary<TKey, TVal> dict, TVal val) =>
dict.First((System.Collections.Generic.KeyValuePair<TKey, TVal> x) => x.Value.Equals(val)).Key;
public static string TTC(this string s) =>
CultureInfo.CurrentCulture.TextInfo.ToTitleCase(s);
public static int[] SW(this int length)
{
int i = 0;
List<string> A = new List<string>();
for (i = 0; i < length; i++) A.Add(i.ToString());
A.Sort();
int[] B = new int[length];
for (i = 0; i < length; i++) B[i] = int.Parse(A[i]);
return B;
}
}
}
+135 -111
View File
@@ -1,4 +1,4 @@
//Original: https://github.com/blueskythlikesclouds/MikuMikuLibrary/
//Original: https://github.com/blueskythlikesclouds/MikuMikuLibrary/
using KKdBaseLib;
using KKdMainLib.IO;
@@ -9,28 +9,30 @@ namespace KKdMainLib
{
private int i, i0, i1;
public MotHeader[] MOT;
private Stream _IO;
private Stream s;
[System.ThreadStatic] public bool Modern;
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 +40,158 @@ 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.P < s.L && s.RU16() != 0) i0++;
mot.BoneInfo.V = new BoneInfo[i0];
_IO.P = mot.BoneInfo.O;
mot.BoneInfo.V = new int[i0];
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] = 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(); }
else if (key.Type == KeySetType.Linear)
key.Keys[0].V = s.RF32(); }
else if (key.Type == KeySetType.Linear && !Modern)
{
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)
else if (key.Type == KeySetType.Tangent && !Modern)
{
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(); }
}
else if (key.Type != KeySetType.None)
{
key.Keys = new KFT2[s.RU16()];
ushort type = s.RU16();
if (key.Type == KeySetType.Tangent)
for (i1 = 0; i1 < key.Keys.Length; i1++)
key.Keys[i1].T = s.RF32();
if (type == 1)
{
for (i1 = 0; i1 < key.Keys.Length; i1++)
key.Keys[i1].V = s.RF16();
s.A(0x4);
}
else
for (i1 = 0; i1 < key.Keys.Length; i1++)
key.Keys[i1].V = s.RF32();
for (i1 = 0; i1 < key.Keys.Length; i1++)
key.Keys[i1].F = s.RU16();
s.A(0x4);
}
}
}
_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);
else if (key.Type == KeySetType.Linear)
s.W(key.Keys[0].V);
else if ((key.Type == KeySetType.Linear
|| key.Type == KeySetType.Tangent) && !Modern)
{
_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);
for (i1 = 0; i1 < key.Keys.Length; i1++)
_IO.W(key.Keys[i1].V);
s.W((ushort)key.Keys[i1].F);
if (s.P % 4 != 0) s.W((ushort)0x00);
if (key.Type == KeySetType.Tangent)
for (i1 = 0; i1 < key.Keys.Length; i1++)
{ s.W(key.Keys[i1].V); s.W(key.Keys[i1].T); }
else
for (i1 = 0; i1 < key.Keys.Length; i1++)
s.W(key.Keys[i1].V);
}
else if (key.Type == KeySetType.Interpolated)
else if (key.Type != KeySetType.None)
{
_IO.W((ushort)key.Keys.Length);
s.W((ushort)key.Keys.Length);
s.W((ushort)0);
if (key.Type == KeySetType.Tangent)
for (i1 = 0; i1 < key.Keys.Length; i1++)
s.W(key.Keys[i1].T);
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(key.Keys[i1].V);
for (i1 = 0; i1 < key.Keys.Length; i1++)
{ _IO.W(key.Keys[i1].V); _IO.W(key.Keys[i1].T); }
s.W((ushort)key.Keys[i1].F);
s.A(0x4);
}
}
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]);
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 +216,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)
@@ -210,14 +242,9 @@ namespace KKdMainLib
else if (keySet.Type == KeySetType.Static)
{
keySet.Keys = new KFT2[1];
if (temp1.Array == null) continue;
else if (temp1.Array.Length == 0) continue;
else if (temp1.Array[0].Array == null) continue;
else if (temp1.Array[0].Array.Length == 0) continue;
else if (temp1.Array[0].Array.Length == 1)
keySet.Keys[0] = new KFT2(temp1.Array[0][0].RF32());
else if (temp1.Array[0].Array.Length > 1)
keySet.Keys[0] = new KFT2(temp1.Array[0][0].RF32(), temp1.Array[0][1].RF32());
if (temp1.Array == null) continue;
else if (temp1.Array.Length == 0) continue;
else keySet.Keys[0] = new KFT2(0.0f, temp1.Array[0].RF32());
}
else if (keySet.Type == KeySetType.Linear)
{
@@ -233,7 +260,7 @@ namespace KKdMainLib
keySet.Keys[i1] = new KFT2(array[0].RF32(), array[1].RF32());
}
}
else if (keySet.Type == KeySetType.Interpolated)
else if (keySet.Type == KeySetType.Tangent)
{
keySet.Keys = new KFT2[temp1.Array.Length];
for (i1 = 0; i1 < temp1.Array.Length; i1++)
@@ -254,9 +281,9 @@ namespace KKdMainLib
if ((temp = msgPack["BoneInfo", true]).NotNull)
{
mot.BoneInfo.V = new BoneInfo[temp.Array.Length];
mot.BoneInfo.V = new int[temp.Array.Length];
for (i = 0; i < mot.BoneInfo.V.Length; i++)
mot.BoneInfo.V[i].Id = temp[i].RI32();
mot.BoneInfo.V[i] = temp[i].RI32();
}
temp.Dispose();
}
@@ -273,41 +300,43 @@ namespace KKdMainLib
keySets[i0] = new MsgPack(2);
keySets[i0].Array[0] = (byte)keySet.Type;
keySets[i0].Array[1] = new MsgPack(keySet.Keys.Length);
if (keySet.Type == KeySetType.Static)
{
IKF kf = keySet.Keys[0].Check();
if (kf is KFT0 KFT0) keySets[i0].Array[1][0] =
new MsgPack(null, new MsgPack[] { KFT0.F });
else if (kf is KFT1 KFT1) keySets[i0].Array[1][0] =
new MsgPack(null, new MsgPack[] { KFT1.F, KFT1.V });
MsgPack k = default;
if (kf is KFT0 KFT0) k = new MsgPack(null, new MsgPack[] { 0.0f });
else if (kf is KFT1 KFT1) k = new MsgPack(null, new MsgPack[] { KFT1.V });
keySets[i0].Array[1] = k;
}
else if (keySet.Type == KeySetType.Linear)
{
MsgPack k = new MsgPack(keySet.Keys.Length);
for (i1 = 0; i1 < keySet.Keys.Length; i1++)
{
IKF kf = keySet.Keys[i1].Check();
if (kf is KFT0 KFT0) keySets[i0].Array[1][i1] =
new MsgPack(null, new MsgPack[] { KFT0.F });
else if (kf is KFT1 KFT1) keySets[i0].Array[1][i1] =
new MsgPack(null, new MsgPack[] { KFT1.F, KFT1.V });
if (kf is KFT0 KFT0) k[i1] = new MsgPack(null, new MsgPack[] { KFT0.F });
else if (kf is KFT1 KFT1) k[i1] = new MsgPack(null, new MsgPack[] { KFT1.F, KFT1.V });
}
keySets[i0].Array[1] = k;
}
else
{
MsgPack k = new MsgPack(keySet.Keys.Length);
for (i1 = 0; i1 < keySet.Keys.Length; i1++)
{
IKF kf = keySet.Keys[i1].Check();
if (kf is KFT0 KFT0) keySets[i0].Array[1][i1] =
new MsgPack(null, new MsgPack[] { KFT0.F });
else if (kf is KFT1 KFT1) keySets[i0].Array[1][i1] =
new MsgPack(null, new MsgPack[] { KFT1.F, KFT1.V });
else if (kf is KFT2 KFT2) keySets[i0].Array[1][i1] =
new MsgPack(null, new MsgPack[] { KFT2.F, KFT2.V, KFT2.T });
if (kf is KFT0 KFT0) k[i1] = new MsgPack(null, new MsgPack[] { KFT0.F });
else if (kf is KFT1 KFT1) k[i1] = new MsgPack(null, new MsgPack[] { KFT1.F, KFT1.V });
else if (kf is KFT2 KFT2) k[i1] = new MsgPack(null, new MsgPack[] { KFT2.F, KFT2.V, KFT2.T });
}
keySets[i0].Array[1] = k;
}
}
mot.Add(keySets);
MsgPack boneInfo = new MsgPack(Mot.BoneInfo.V.Length, "BoneInfo");
for (i0 = 0; i0 < Mot.BoneInfo.V.Length; i0++)
boneInfo[i0] = Mot.BoneInfo.V[i0].Id;
boneInfo[i0] = Mot.BoneInfo.V[i0];
mot.Add(boneInfo);
return mot;
@@ -315,7 +344,7 @@ namespace KKdMainLib
public void Dispose()
{
_IO = null;
s = null;
MOT = null;
}
@@ -323,8 +352,8 @@ namespace KKdMainLib
{
public int KeySetOffset;
public int KeySetTypesOffset;
public Pointer< KeySet []> KeySet ;
public Pointer<BoneInfo[]> BoneInfo;
public Pointer<KeySet[]> KeySet ;
public Pointer< int[]> BoneInfo;
public int HighBits;
public int FrameCount;
@@ -335,22 +364,17 @@ namespace KKdMainLib
public KFT2[] Keys;
public KeySetType Type;
public override string ToString() => $"Type: {Type}" + (Type == KeySetType.Static ?
$"; Value: {Keys[0].V}" : Type > KeySetType.Static ? $"; Keys: {Keys.Length}" : "");
public override string ToString() =>
$"Type: {Type}" + (Type == KeySetType.Static ? $"; Value: {Keys[0].V}"
: Type > KeySetType.Static ? $"; Keys: {Keys.Length}; First Key: {Keys[0]}" : "");
}
public enum KeySetType : byte
{
None = 0b00,
Static = 0b01,
Linear = 0b10,
Interpolated = 0b11,
}
public struct BoneInfo
{
public string Name;
public int Id;
None = 0b00,
Static = 0b01,
Linear = 0b10,
Tangent = 0b11,
}
}
}
+854 -506
View File
File diff suppressed because it is too large Load Diff
+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>
+83 -73
View File
@@ -1,4 +1,4 @@
using KKdBaseLib;
using KKdBaseLib;
using KKdBaseLib.F2;
using KKdMainLib.IO;
@@ -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();
if (header.Signature == 0x41525453)
s.Format = Format.F;
uint signature = s.RU32();
if (signature == 0x41525453)
{
header = _IO.ReadHeader(true, false);
header = s.ReadHeader(true);
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 ((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 = 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,22 +174,24 @@ 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++)
{
strings[i] = MsgPack.New.Add("ID", Strings[i].ID);
MsgPack @string = MsgPack.New.Add("ID", Strings[i].ID);
if (Strings[i].Str.V != null)
if (Strings[i].Str.V != "")
strings[i] = strings[i].Add("Str", Strings[i].Str.V);
@string.Add("Str", Strings[i].Str.V);
strings[i] = @string;
}
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.Dispose(); Strings = default;
{ if (!disposed) { if (s != null) s.D(); s = null; Strings = default;
pof = default; header = default; disposed = true; } }
public struct String
+105 -115
View File
@@ -1,5 +1,6 @@
using KKdBaseLib;
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');
@@ -83,7 +73,7 @@ namespace KKdMainLib
dict.FV(out csld. SortIndex, name + "sort_index");
dict.FV(out csld. SubSEName , name + "sub_se_name" );
dict.FV(out csld.SuccessSEName , name + "success_se_name" );
csld.Start = GetStartTableDate(dict, name);
csld.End = GetEndTableDate(dict, name);
}
@@ -130,7 +120,7 @@ namespace KKdMainLib
dict.FV(out czitm.SellType , name + "sell_type" );
dict.FV(out czitm.ShopPrice, name + "shop_price");
dict.FV(out czitm.SortIndex, name + "sort_index");
czitm.ShopStart = GetStartTableDate(dict, name + "shop_");
czitm.ShopEnd = GetEndTableDate(dict, name + "shop_");
}
@@ -151,7 +141,7 @@ namespace KKdMainLib
dict.FV(out mdl.NG , name + "ng" );
dict.FV(out mdl.ShopPrice, name + "shop_price");
dict.FV(out mdl.SortIndex, name + "sort_index");
mdl.ShopStart = GetStartTableDate(dict, name + "shop_");
mdl.ShopEnd = GetEndTableDate(dict, name + "shop_");
}
@@ -181,19 +171,19 @@ 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" );
pv.AdvStart = GetStartTableDate(dict, name + "adv_demo_");
pv.AdvEnd = GetEndTableDate(dict, name + "adv_demo_");
pv.Easy = GetDifficulty(dict, name + "easy" + c);
pv.Encore = GetDifficulty(dict, name + "encore" + c);
pv.Extreme = GetDifficulty(dict, name + "extreme" + c);
@@ -230,7 +220,7 @@ namespace KKdMainLib
dict.FV(out sld. Name , name + "name" );
dict.FV(out sld. SEName , name + "se_name" );
dict.FV(out sld.SortIndex, name + "sort_index");
sld.Start = GetStartTableDate(dict, name);
sld.End = GetEndTableDate(dict, 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,107 +425,107 @@ 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();
for (int i = 0; i < length; i++)
{
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)
{ for (int i = 0; i < count; i++) _IO.W("#---------------------------------------------\n"); }
static void WriteStartTableDate(Stream _IO, string name, TableDate date)
{
_IO.W(name + "st_day" + "=" + date.Day + "\n");
_IO.W(name + "st_month" + "=" + date.Month + "\n");
_IO.W(name + "st_year" + "=" + date.Year + "\n");
}
static void WriteEndTableDate(Stream _IO, string name, TableDate date)
{
_IO.W(name + "ed_day" + "=" + date.Day + "\n");
@@ -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;
@@ -582,7 +572,7 @@ namespace KKdMainLib
ref ChainSlideSE csld = ref ChainSlideSETable[i0];
csld.End .SV(csldMP.RnI32("End" ), true);
csld.Start.SV(csldMP.RnI32("Start"), false);
csldMP.R("FailureSEName" , out csld.FailureSEName );
csldMP.R( "FirstSEName" , out csld. FirstSEName );
csldMP.R( "ID" , out csld. ID );
@@ -601,7 +591,7 @@ namespace KKdMainLib
ref CollectionCard clcrd = ref CollectionCardTable[i0];
clcrd.End .SV(clcrdMP.RnI32("End" ), true);
clcrd.Start.SV(clcrdMP.RnI32("Start"), false);
clcrdMP.R("Chara" , out clcrd.Chara );
clcrdMP.R("DispNum" , out clcrd.DispNum );
clcrdMP.R("DivaProParam", out clcrd.DivaProParam);
@@ -646,7 +636,7 @@ namespace KKdMainLib
ref Module mdl = ref ModuleTable[i0];
mdl.ShopEnd .SV(mdlMP.RnI32("ShopEnd" ), true);
mdl.ShopStart.SV(mdlMP.RnI32("ShopStart"), false);
mdlMP.R("Attribute", out mdl.Attribute);
mdlMP.R("Costume" , out mdl.Costume );
mdlMP.R("Chara" , out mdl.Chara );
@@ -679,16 +669,16 @@ 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);
pvMP.R("ID" , out pv.ID );
pvMP.R("Ignore", out pv.Ignore);
pvMP.R("Name" , out pv.Name );
@@ -704,7 +694,7 @@ namespace KKdMainLib
{
MsgPack t;
if ((t = mp[name, true]).IsNull) return null;
PV.Difficulty[] arr = new PV.Difficulty[t.Array.Length];
for (int i = 0; i < arr.Length; i++)
{
@@ -712,7 +702,7 @@ namespace KKdMainLib
ref PV.Difficulty diff = ref arr[i];
diff.End .SV(pvMP.RnI32("End" ), true);
diff.Start.SV(pvMP.RnI32("Start"), false);
pvMP.R("Edition", out diff.Edition);
pvMP.R("Version", out diff.Version);
}
@@ -728,7 +718,7 @@ namespace KKdMainLib
ref SlideSE sld = ref SlideSETable[i0];
sld.End .SV(sldMP.RnI32("End" ), true);
sld.Start.SV(sldMP.RnI32("Start"), false);
sldMP.R( "ID" , out sld. ID );
sldMP.R( "Name" , out sld. Name );
sldMP.R( "SEName" , out sld. SEName );
@@ -744,7 +734,7 @@ namespace KKdMainLib
ref SliderTouchSE sldt = ref SliderTouchSETable[i0];
sldt.End .SV(TEMP.RnI32("End" ), true);
sldt.Start.SV(TEMP.RnI32("Start"), false);
TEMP.R( "ID" , out sldt. ID );
TEMP.R( "Name" , out sldt. Name );
TEMP.R( "SEName" , out sldt. SEName );
@@ -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;
}
}
}
Binary file not shown.
+7 -6
View File
@@ -1,4 +1,4 @@
using KKdBaseLib;
using KKdBaseLib;
using KKdMainLib.IO;
namespace KKdSoundLib
@@ -24,9 +24,10 @@ namespace KKdSoundLib
Data.SampleRate = reader.RI32();
Data.SamplesCount = reader.RI32();
reader.RI64();
Data.Channels = reader.RU16();
Data.Channels = reader.RU8();
reader.RU8();
reader.RU16();
Data.Name = reader.RS(0x20);
reader.RBy(0x20);
byte value = 0;
byte[] data = new byte[Data.SamplesCount * Data.Channels * 4];
@@ -39,6 +40,7 @@ namespace KKdSoundLib
fixed (sbyte* stepindexPtr = stepindex)
fixed (byte* ptr = data)
{
reader.S(0, SeekOrigin.Begin);
float* dataPtr = (float*)ptr;
for (i = 0; i < Data.SamplesCount; i++)
for (c = 0; c < Data.Channels; c++, dataPtr++)
@@ -76,7 +78,7 @@ namespace KKdSoundLib
if (!Header.IsSupported) { reader.C(); return; }
Stream writer = File.OpenWriter(file + ".diva", true);
Data.Channels = Header.Channels;
Data.Channels = (byte)Header.Channels;
Data.SampleRate = Header.SampleRate;
Data.SamplesCount = Header.Size / Header.Channels / Header.Bytes;
writer.PI64 = 0x40;
@@ -198,8 +200,7 @@ namespace KKdSoundLib
public int Size;
public int SampleRate;
public int SamplesCount;
public string Name;
public ushort Channels;
public byte Channels;
public byte[] Data;
}
}
+1 -1
View File
@@ -1,4 +1,4 @@
using KKdBaseLib;
using KKdBaseLib;
using KKdMainLib.IO;
namespace KKdSoundLib
+8 -8
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>
<Description>A simple library for working with Project Diva F/AFT/F2/X/FT audio files</Description>
<FileVersion>0.1.2.0</FileVersion>
<Copyright>korenkonder (C) 2019-2022</Copyright>
<Description>A simple library for working with Project Diva F/AFT/F2/X/XHD/FT/VRFL/M39 audio files</Description>
<FileVersion>0.1.2.1</FileVersion>
<PackageId>KKdSoundLib</PackageId>
<Product>KKdSoundLib</Product>
<TargetFramework>netstandard2.0</TargetFramework>
<TargetFramework>net461</TargetFramework>
<Title>KKdSoundLib</Title>
<Version>0.1.2.0</Version>
<Version>0.1.2.1</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, IDE0018, IDE0032, IDE0044, IDE0045, IDE0046, IDE0051, IDE0055, IDE0059, IDE0063, 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, IDE0018, IDE0032, IDE0044, IDE0045, IDE0046, IDE0051, IDE0055, IDE0059, IDE0063, 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("")]
+15 -15
View File
@@ -1,4 +1,4 @@
using KKdBaseLib;
using KKdBaseLib;
using KKdMainLib.IO;
namespace KKdSoundLib
@@ -122,7 +122,7 @@ namespace KKdSoundLib
writer.W((ushort)(HEVAG ? VAGData.Channels : 0x1));
writer.W(name, 0x10);
writer.P = 0x30;
int[] samp = new int[HEVAG ? ch * (PrNRCount > 29 ? 8 : 4) : 4];
fixed (int* sampPtr = samp)
fixed (int* HEVAG1 = VAG.HEVAG1)
@@ -170,7 +170,7 @@ namespace KKdSoundLib
}
if (h)
{
{
Calc4BitsHEVAG(HEVAG1, HEVAG2, HEVAG3, HEVAG4, v1 + c, v2 + c,
v3 + c, v4 + c, tV1 + c, tV2 + c, tV3 + c, tV4 + c);
@@ -207,7 +207,7 @@ namespace KKdSoundLib
}
if (h)
{
{
Calc4BitsVAG(HEVAG1, HEVAG2, v1 + c, v2 + c, tV1 + c, tV2 + c);
s = ((PrNR & 0xF) << 4) | (ShF & 0xF);
@@ -241,9 +241,9 @@ namespace KKdSoundLib
dataBuf[i] /= ch;
if (dataBuf[i] != 0) h = true;
}
if (h)
{
{
Calc4BitsVAG(HEVAG1, HEVAG2, v1, v2, tV1, tV2);
s = ((PrNR & 0xF) << 4) | (ShF & 0xF);
@@ -287,7 +287,7 @@ namespace KKdSoundLib
}
writer.C();
}
private fixed int dataBuf[(int)BS];
private fixed int fourBit[(int)BS];
private fixed int tempBuf[(int)BS];
@@ -301,7 +301,7 @@ namespace KKdSoundLib
for (j = 0; j < PrNRCount; j++)
{
PrNR = j;
Calc4Bits_VAG(HEVAG1, HEVAG2, v1, v2, tV1, tV2);
s1 = *v1; s2 = *v2;
@@ -320,7 +320,7 @@ namespace KKdSoundLib
if (err < min) { PrNRf = j; min = err; }
}
PrNR = PrNRf;
Calc4Bits_VAG(HEVAG1, HEVAG2, v1, v2, tV1, tV2);
* v1 = s1; * v2 = s2;
*tV1 = tS1; *tV2 = tS2;
@@ -344,12 +344,12 @@ namespace KKdSoundLib
e = (e + g) ^ g;
if (e > max) max = e;
}
for (ShF = 12, ShM = 0x400000; ShF > 0; ShF--, ShM >>= 1)
if ((ShM & (max + (ShM >> 4))) == ShM) break;
ShFf = 8 + ShF;
ShF = 12 - ShF;
tS1 = *tV1; tS2 = *tV2;
for (i = 0; i < BS; i++)
{
@@ -376,7 +376,7 @@ namespace KKdSoundLib
for (j = 0; j < PrNRCount; j++)
{
PrNR = j;
Calc4Bits_HEVAG(HEVAG1, HEVAG2, HEVAG3, HEVAG4, v1, v2, v3, v4, tV1, tV2, tV3, tV4);
s1 = *v1; s2 = *v2; s3 = *v3; s4 = *v4;
@@ -395,7 +395,7 @@ namespace KKdSoundLib
if (err < min) { PrNRf = j; min = err; }
}
PrNR = PrNRf;
Calc4Bits_HEVAG(HEVAG1, HEVAG2, HEVAG3, HEVAG4, v1, v2, v3, v4, tV1, tV2, tV3, tV4);
* v1 = s1; * v2 = s2; * v3 = s3; * v4 = s4;
*tV1 = tS1; *tV2 = tS2; *tV3 = tS3; *tV4 = tS4;
@@ -427,7 +427,7 @@ namespace KKdSoundLib
if ((ShM & (max + (ShM >> 4))) == ShM) break;
ShFf = 8 + ShF;
ShF = 12 - ShF;
tS1 = *tV1; tS2 = *tV2; tS3 = *tV3; tS4 = *tV4;
for (i = 0; i < BS; i++)
{
@@ -741,7 +741,7 @@ namespace KKdSoundLib
public byte[] Flags;
public int[] Data;
}
private static readonly int[] ShiftFactor =
{ 0, 1, 2, 3, 4, 5, 6, 7, -8, -7, -6, -5, -4, -3, -2, -1 };
+1 -1
View File
@@ -1,4 +1,4 @@
namespace KKdSoundLib
namespace KKdSoundLib
{
public static class WAV
{
+82 -183
View File
@@ -1,184 +1,83 @@
<?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, IDE0018, IDE0032, IDE0044, IDE0045, IDE0046, IDE0051, IDE0055, IDE0059, IDE0063, 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, IDE0018, IDE0032, IDE0044, IDE0045, IDE0046, IDE0051, IDE0055, IDE0059, IDE0063, IDE0066, IDE0069, IDE1006</NoWarn>
</PropertyGroup>
<ItemGroup>
<Compile Include="classes\A3D.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>
+185 -131
View File
@@ -1,4 +1,4 @@
using System;
using System;
using System.Windows.Forms;
using KKdMainLib;
using KKdMainLib.IO;
@@ -18,6 +18,9 @@ namespace PD_Tool
{
SetProcessDPIAware();
Console. InputEncoding = System.Text.Encoding.Unicode;
Console.OutputEncoding = System.Text.Encoding.Unicode;
Console.Title = "PD_Tool";
if (args.Length == 0) { while (choose != "Q") MainMenu(); Exit(); }
@@ -26,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))
@@ -43,22 +47,21 @@ namespace PD_Tool
private static void MainMenu()
{
Console. InputEncoding = System.Text.Encoding.Unicode;
Console.OutputEncoding = System.Text.Encoding.Unicode;
Console.Title = "PD_Tool";
Version ver = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;
Console.Title = $"PD_Tool v{ver}";
Console.Clear();
ConsoleDesign(true);
ConsoleDesign(" Choose action:");
ConsoleDesign(false);
ConsoleDesign("1. Extract FARC Archive");
ConsoleDesign("2. Create FARC Archive");
ConsoleDesign("2. Create FARC Archive");
ConsoleDesign("3. Decrypt from DIVAFILE");
ConsoleDesign("4. Encrypt to 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("8. X/XHD/VRFL Converting Tools");
ConsoleDesign("9. FT/M39 Converting Tools");
ConsoleDesign(json ? "A. MsgPack to JSON" : "A. JSON to MsgPack");
ConsoleDesign(false);
@@ -71,42 +74,58 @@ namespace PD_Tool
choose = Console.ReadLine().ToUpper();
bool isNumber = int.TryParse(choose, out int result);
if (isNumber) Functions();
if (choose == "M") json = false;
else if (choose == "J") json = true ;
if (choose == null || choose == "") return;
if (choose[0] == 'M') json = false;
else if (choose[0] == 'J') json = true ;
else if (choose[0] >= 'A' && choose[0] <= 'A') Functions();
}
private static void Functions()
{
Console.Clear();
if (choose == "1" || choose == "2") FARC.Processor(choose == "1");
else if (choose == "3" || choose == "4")
if (choose == null || choose == "") return;
if (choose[0] == '1' || choose[0] == '2') FARC.Processor(choose == "1");
else if (choose[0] == '3')
{
Choose(1, "", out string[] FileNames);
foreach (string FileName in FileNames) DIVAFILE.Decrypt(FileName);
}
else if (choose == "5") DataBase.Processor(json);
else if (choose == "6")
else if (choose[0] == '4')
{
Console.Clear();
Console.Title = "AC/DT/F/AFT Converting Tools";
ConsoleDesign(true);
ConsoleDesign(" Choose converter:");
ConsoleDesign(false);
ConsoleDesign("1. A3DA" );
ConsoleDesign("2. AET" );
ConsoleDesign("3. DataBank");
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();
Choose(1, "", out string[] FileNames);
foreach (string FileName in FileNames) DIVAFILE.Encrypt(FileName);
}
else if (choose[0] == '5')
DataBase.Processor(json, choose.Length > 1 ? choose[1] : '\0');
else if (choose[0] == '6')
{
string localChoose = "";
if (choose.Length == 1)
{
Console.Clear();
Console.Title = "AC/DT/F/AFT Converting Tools";
ConsoleDesign(true);
ConsoleDesign(" Choose converter:");
ConsoleDesign(false);
ConsoleDesign("1. A3DA" );
ConsoleDesign("2. AET" );
ConsoleDesign("3. DataBank");
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") AET.Processor(json);
else if (localChoose == "3") DB .Processor(json);
@@ -114,96 +133,117 @@ 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 == "7")
else if (choose[0] == '7')
{
Console.Clear();
Console.Title = "F/F2/FT Converting Tools";
ConsoleDesign(true);
ConsoleDesign(" Choose converter:");
ConsoleDesign(false);
ConsoleDesign("1. A3DA" );
ConsoleDesign("2. Bloom" );
ConsoleDesign("3. Color Correction");
ConsoleDesign("4. DEX" );
ConsoleDesign("5. DOF" );
ConsoleDesign("6. Light" );
ConsoleDesign("7. STR" );
ConsoleDesign("8. VAG" );
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 = "F/F2/FT Converting Tools";
ConsoleDesign(true);
ConsoleDesign(" Choose converter:");
ConsoleDesign(false);
ConsoleDesign("1. A3DA" );
ConsoleDesign("2. Bloom" );
ConsoleDesign("3. Color Correction");
ConsoleDesign("4. DEX" );
ConsoleDesign("5. DOF" );
ConsoleDesign("6. Light" );
ConsoleDesign("7. STR" );
ConsoleDesign("8. VAG" );
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") BLT.Processor();
else if (localChoose == "3") CCT.Processor();
else if (localChoose == "2") BLT.Processor(json);
else if (localChoose == "3") CCT.Processor(json);
else if (localChoose == "4") DEX.Processor(json);
else if (localChoose == "5") DFT.Processor();
else if (localChoose == "6") LIT.Processor();
else if (localChoose == "5") DFT.Processor(json);
else if (localChoose == "6") LIT.Processor(json);
else if (localChoose == "7") STR.Processor(json);
else if (localChoose == "8") VAG.Processor();
else choose = localChoose;
}
else if (choose == "8")
else if (choose[0] == '8')
{
Console.Clear();
Console.Title = "X Converting Tools";
ConsoleDesign(true);
ConsoleDesign(" Choose converter:");
ConsoleDesign(false);
ConsoleDesign("1. A3DA" );
ConsoleDesign("2. DEX" );
ConsoleDesign("3. VAG" );
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 = "X/XHD/VRFL Converting Tools";
ConsoleDesign(true);
ConsoleDesign(" Choose converter:");
ConsoleDesign(false);
ConsoleDesign("1. A3DA");
ConsoleDesign("2. Bloom" );
ConsoleDesign("3. Color Correction");
ConsoleDesign("4. DEX" );
ConsoleDesign("5. DOF" );
ConsoleDesign("6. Light" );
ConsoleDesign("7. VAG" );
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") DEX.Processor(json);
else if (localChoose == "3") VAG.Processor();
else choose = localChoose;
}
else if (choose == "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();
if (localChoose == "1") A3D.Processor(json);
else if (localChoose == "2") ADP.Processor(json);
else if (localChoose == "3") AET.Processor(json);
else if (localChoose == "2") BLT.Processor(json);
else if (localChoose == "3") CCT.Processor(json);
else if (localChoose == "4") DEX.Processor(json);
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 == "5") DFT.Processor(json);
else if (localChoose == "6") LIT.Processor(json);
else if (localChoose == "7") VAG.Processor();
else choose = localChoose;
}
else if (choose == "A")
else if (choose[0] == '9')
{
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. AET" );
ConsoleDesign("3. DEX" );
ConsoleDesign("4. DIVA" );
ConsoleDesign("5. MotHead" );
ConsoleDesign("6. MOT" );
ConsoleDesign("7. STR" );
ConsoleDesign("8. 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") AET.Processor(json);
else if (localChoose == "3") DEX.Processor(json);
else if (localChoose == "4") DIV.Processor();
else if (localChoose == "5") MHD.Processor(json);
else if (localChoose == "6") MOT.Processor(json);
else if (localChoose == "7") STR.Processor(json);
else if (localChoose == "8") TBL.Processor(json);
else choose = localChoose;
}
else if (choose[0] == 'A')
{
Console.Title = json ? "MsgPack to JSON" : "JSON to MsgPack";
Choose(1, json ? "mp" : "json", out string[] fileNames);
@@ -211,30 +251,30 @@ namespace PD_Tool
if (json)
{
Console.Title = "MsgPack to JSON: " + Path.GetFileNameWithoutExtension(file);
file.Replace(Path.GetExtension(file), "").ToJSON ();
Path.RemoveExtension(file).ToJSON ();
}
else
{
Console.Title = "JSON to MsgPack: " + Path.GetFileNameWithoutExtension(file);
file.Replace(Path.GetExtension(file), "").ToMsgPack();
Path.RemoveExtension(file).ToMsgPack();
}
}
}
public static void Exit() => Environment.Exit(0);
public static void ConsoleDesign(string text, params string[] args)
{
text = string.Format(text, args);
string Text = " ";
string Text = "X X";
Text = Text.Remove(3) + text + Text.Remove(0, text.Length + 3);
Console.WriteLine(Text);
}
public static void ConsoleDesign(bool Fill)
{
if (Fill) Console.WriteLine("████████████████████████████████████████████████████");
else Console.WriteLine(" ");
if (Fill) Console.WriteLine("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
else Console.WriteLine("X X");
}
private static string GetArgs(string name, bool And, params string[] ext)
@@ -259,50 +299,64 @@ namespace PD_Tool
public static string Choose(int code, string filetype, out string[] FileNames)
{
string mp = GetArgs("MessagePack", true, "mp" );
string json = GetArgs("JSON" , true, "json");
string bin = GetArgs("BIN" , true, "bin" );
string wav = GetArgs("WAV" , true, "wav" );
FileNames = new string[0];
if (code == 1)
{
string Filter = GetArgs("All;", false, "*");
string mp = GetArgs("MessagePack", true, "mp" );
string json = GetArgs("JSON" , true, "json");
string bin = GetArgs("BIN" , true, "bin" );
string wav = GetArgs("WAV" , true, "wav" );
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 == "bin" ) Filter = GetArgs("BIN" , "bin", "json", "mp") +
bin + json + mp;
else if (filetype == "blt" ) Filter = GetArgs("BLT" , "blt");
else if (filetype == "blt" ) Filter = GetArgs("BLT" , "blt", "json", "mp") +
GetArgs("BLT", true, "blt") + json + mp;
else if (filetype == "bon" ) Filter = GetArgs("BON" , "bon", "bin", "json", "mp") +
GetArgs("BON", true, "bon") + bin + json + mp;
else if (filetype == "cct" ) Filter = GetArgs("CCT" , "cct");
else if (filetype == "cct" ) Filter = GetArgs("CCT" , "cct", "json", "mp") +
GetArgs("CCT", true, "cct") + json + mp;
else if (filetype == "databank") Filter = GetArgs("DAT", "dat", "json", "mp") +
GetArgs("DAT", true, "dat") + json + mp;
else if (filetype == "dex" ) Filter = GetArgs("DEX" , "dex", "bin", "json", "mp") +
GetArgs("DEX", true, "dex") + bin + json + mp;
else if (filetype == "dft" ) Filter = GetArgs("DFT" , "dft");
else if (filetype == "dft" ) Filter = GetArgs("DFT" , "dft", "json", "mp") +
GetArgs("DFT", true, "dft") + json + mp;
else if (filetype == "diva") Filter = GetArgs("DIVA", "diva", "wav") +
GetArgs("DIVA", true, "diva") + wav;
else if (filetype == "dsc" ) Filter = GetArgs("DSC" , "dsc", "json", "mp") +
GetArgs("DSC", true, "dsc") + json + mp;
else if (filetype == "dve" ) Filter = GetArgs("Particle", "dve", "farc", "json", "mp") +
GetArgs("Particle", true, "dve") + GetArgs("Particle", true, "farc") + json + mp;
else if (filetype == "farc") Filter = GetArgs("FARC", "farc");
else if (filetype == "json") Filter = GetArgs("JSON", "json");
else if (filetype == "igb" ) Filter = GetArgs("IGB", "igb");
else if (filetype == "mgftxt") Filter = GetArgs("MGF2AFT txt", "txt");
else if (filetype == "mhd" ) Filter = GetArgs("MotHead", "mhd", "bin", "json", "mp") +
GetArgs("MotHead", true, "mhd") + bin + json + mp;
else if (filetype == "mp" ) Filter = GetArgs("MessagePack", "mp");
else if (filetype == "lit") Filter = GetArgs("LIT" , "lit");
else if (filetype == "lit") Filter = GetArgs("LIT" , "lit", "json", "mp") +
GetArgs("LIT", true, "lit") + json + mp;
else if (filetype == "pvdb") Filter = GetArgs("PV DB / PV Field", "txt", "json", "mp") +
GetArgs("PV DB / PV Field", true, "txt") + json + mp;
else if (filetype == "str" ) Filter = GetArgs("STR" , "str", "bin", "json", "mp") +
GetArgs("STR", true, "str") + bin + json + mp;
else if (filetype == "tbl" ) Filter = GetArgs("Table" , "bin", "farc", "json", "mp") +
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:" };
using OpenFileDialog ofd = new OpenFileDialog { Filter = Filter,
Multiselect = true, Title = "Choose file(s) to open:" };
if (ofd.ShowDialog() == DialogResult.OK) FileNames = ofd.FileNames;
}
else if (code == 2)
{
string Return = "";
using (OpenFileDialog ofd = new OpenFileDialog { //InitialDirectory = Application.StartupPath,
ValidateNames = false, CheckFileExists = false, Filter = " | ", CheckPathExists = true,
using (OpenFileDialog ofd = new OpenFileDialog { ValidateNames = false,
CheckFileExists = false, Filter = " | ", CheckPathExists = true,
Title = "Choose any file in folder:", FileName = "Folder Selection." })
if (ofd.ShowDialog() == DialogResult.OK) Return = Path.GetDirectoryName(ofd.FileName);
return Return;
+5 -5
View File
@@ -1,15 +1,15 @@
using System.Reflection;
using System.Reflection;
using System.Runtime.InteropServices;
[assembly: AssemblyTitle("PD_Tool")]
[assembly: AssemblyDescription("A simple tool for working with Project Diva AC/DT/F/AFT/F2/X/FT/M39 files")]
[assembly: AssemblyDescription("A simple tool for working with Project Diva AC/DT/F/AFT/F2/X/XHD/FT/VRFL/M39 files")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("PD_Tool")]
[assembly: AssemblyCopyright("korenkonder © 2017-2020")]
[assembly: AssemblyCopyright("korenkonder (C) 2017-2023")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
[assembly: ComVisible(false)]
[assembly: Guid("7B5D5A3A-A6F8-4813-C97D-ACFC98F7397E")]
[assembly: AssemblyVersion("0.4.9.1")]
[assembly: AssemblyFileVersion("0.4.9.1")]
[assembly: AssemblyVersion("0.4.10.16")]
[assembly: AssemblyFileVersion("0.4.10.16")]
+73 -54
View File
@@ -1,4 +1,4 @@
using System;
using System;
using KKdBaseLib;
using KKdMainLib.IO;
using KKdA3DA = KKdMainLib.A3DA;
@@ -20,78 +20,93 @@ 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(" Tip: A3DC Opt - A3DC Optimization");
Program.ConsoleDesign(" WARNING! CHECK RESULTS AFTER CONVERTING ");
Program.ConsoleDesign(false);
Program.ConsoleDesign("1. A3DA [DT/AC/F]");
Program.ConsoleDesign("2. A3DC [DT/AC/F]");
Program.ConsoleDesign("3. A3DA [AFT/FT/M39]");
Program.ConsoleDesign("4. A3DC [AFT/FT/M39]");
Program.ConsoleDesign("5. A3DC [F2]");
Program.ConsoleDesign("6. A3DC [MGF]");
Program.ConsoleDesign("7. A3DC [X]");
Program.ConsoleDesign("8. A3DC [XHD/VRFL]");
if (!mp) Program.ConsoleDesign($"9. {(json ? "JSON" : "MsgPack")}");
Program.ConsoleDesign(false);
Program.ConsoleDesign("X[Y] - X: option; Y: rounding in text (def. 9)");
Program.ConsoleDesign(false);
Program.ConsoleDesign(true);
Console.WriteLine();
choose = Console.ReadLine().ToUpper();
if (choose == null || choose.Length < 1)
return;
else if (choose[0] == '1') format = Format.DT ;
else if (choose[0] == '2') format = Format.F ;
else if (choose[0] == '3') format = Format.AFT;
else if (choose[0] == '4') format = Format.AFT;
else if (choose[0] == '5') format = Format.F2 ;
else if (choose[0] == '6') format = Format.MGF;
else if (choose[0] == '7') format = Format.X ;
else if (choose[0] == '8') format = Format.XHD;
else if (choose[0] == '9') format = Format.NULL;
else return;
if (int.TryParse(choose.Substring(1), out int rounding))
KKdA3DA.Rounding = rounding;
else
KKdA3DA.Rounding = 9;
int state;
string filepath, ext;
KKdA3DA a3da;
KKdFARC farc;
foreach (string file in fileNames)
{
ext = Path.GetExtension(file);
filepath = file.Replace(ext, "");
ext = ext.ToLower();
filepath = Path.RemoveExtension(file);
ext = Path.GetExtension(file).ToLower();
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))
using (a3da = new KKdA3DA())
{
state = a3da.A3DAReader(filepath);
if (state == 1) a3da.MsgPackWriter(filepath, json);
if (state == 1)
if (choose[0] == '9') a3da.MsgPackWriter(filepath, json);
else
{
a3da.Head.Format = format;
File.WriteAllBytes(filepath + ".a3da", choose[0] == '1' || choose[0] == '3'
? a3da.A3DAWriter() : a3da.A3DCWriter());
}
}
else if (ext == ".mp" || ext == ".json")
using (a3da = new KKdA3DA(true))
using (a3da = new KKdA3DA())
{
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[0] == '1' || choose[0] == '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,11 +115,11 @@ 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++)
using (a3da = new KKdA3DA(true))
using (a3da = new KKdA3DA())
{
data = farc.FileReader(A3DAlist[i]);
int state = a3da.A3DAReader(data);
@@ -112,7 +127,8 @@ 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[0] == '1' || choose[0] == '3'
? a3da.A3DAWriter() : a3da.A3DCWriter();
farc.Files[i] = file;
}
}
@@ -121,12 +137,12 @@ 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++)
{
KKdA3DA a3da;
using (a3da = new KKdA3DA(true))
using (a3da = new KKdA3DA())
{
data = farc.FileReader(list[i]);
int state = a3da.A3DAReader(data);
@@ -139,13 +155,14 @@ 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.RemoveExtension(list[i]);
string ext = Path.GetExtension(list[i]).ToLower();
KKdA3DA a3da;
for (int i1 = 1; i1 < Div; i1++)
using (a3da = new KKdA3DA(true))
for (int i1 = 1; i1 < div; i1++)
using (a3da = new KKdA3DA())
{
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);
@@ -153,13 +170,15 @@ namespace PD_Tool
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[0] == '1'|| choose[0] == '3'
? a3daArray[i].A3DAWriter() : a3daArray[i].A3DCWriter();
farc.Files.Add(file);
}
farc.Save();
-39
View File
@@ -1,39 +0,0 @@
using System;
using KKdMainLib;
using KKdMainLib.IO;
namespace PD_Tool
{
public class ADP
{
public static void Processor(bool json)
{
Console.Title = "Add Param Converter";
Program.Choose(1, "adp", out string[] fileNames);
if (fileNames.Length < 1) return;
string filepath, ext;
AddParam adp;
foreach (string file in fileNames)
{
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);
}
else if (ext == ".mp" || ext == ".json")
{
adp.MsgPackReader(filepath, ext == ".json");
adp.MotHeadWriter(filepath);
}
adp.Dispose();
}
}
}
}
+3 -4
View File
@@ -1,4 +1,4 @@
using System;
using System;
using KKdMainLib;
using KKdMainLib.IO;
@@ -17,9 +17,8 @@ namespace PD_Tool
foreach (string file in fileNames)
using (aet = new Aet())
{
ext = Path.GetExtension(file);
filepath = file.Replace(ext, "");
ext = ext.ToLower();
filepath = Path.RemoveExtension(file);
ext = Path.GetExtension(file).ToLower();
Console.Title = "AET Converter: " + Path.GetFileNameWithoutExtension(file);
if (ext == ".bin")
+37 -8
View File
@@ -1,29 +1,58 @@
using System;
using KKdMainLib.IO;
using System;
using KKdMainLib.F2;
using KKdMainLib.IO;
namespace PD_Tool
{
public class BLT
{
public static void Processor()
public static void Processor(bool json)
{
Console.Title = "Bloom Converter";
Program.Choose(1, "blt", out string[] fileNames);
if (fileNames.Length < 1) return;
bool bloom = false;
foreach (string file in fileNames)
if (file.EndsWith(".blt")) { bloom = true; break; }
string choose = "";
if (bloom)
{
Console.Clear();
Program.ConsoleDesign(true);
Program.ConsoleDesign(" Choose type of format to export:");
Program.ConsoleDesign(false);
Program.ConsoleDesign("1. JSON");
Program.ConsoleDesign("2. TXT");
Program.ConsoleDesign(false);
Program.ConsoleDesign(true);
Console.WriteLine();
choose = Console.ReadLine().ToUpper();
}
string filepath, ext;
Bloom blt;
foreach (string file in fileNames)
using (blt = new Bloom())
{
ext = Path.GetExtension(file);
filepath = file.Replace(ext, "");
ext = ext.ToLower();
filepath = Path.RemoveExtension(file);
ext = Path.GetExtension(file).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);
if (choose == "2" && !blt.IsX)
blt.TXTWriter(filepath);
else
blt.MsgPackWriter(filepath, json);
}
else if (ext == ".json" || ext == ".mp")
{
blt.MsgPackReader(filepath, json);
blt.BLTWriter(filepath);
}
}
}
}
+37 -8
View File
@@ -1,29 +1,58 @@
using System;
using KKdMainLib.IO;
using System;
using KKdMainLib.F2;
using KKdMainLib.IO;
namespace PD_Tool
{
public class CCT
{
public static void Processor()
public static void Processor(bool json)
{
Console.Title = "Color Correction Converter";
Program.Choose(1, "cct", out string[] fileNames);
if (fileNames.Length < 1) return;
bool cc = false;
foreach (string file in fileNames)
if (file.EndsWith(".cct")) { cc = true; break; }
string choose = "";
if (cc)
{
Console.Clear();
Program.ConsoleDesign(true);
Program.ConsoleDesign(" Choose type of format to export:");
Program.ConsoleDesign(false);
Program.ConsoleDesign("1. JSON");
Program.ConsoleDesign("2. TXT");
Program.ConsoleDesign(false);
Program.ConsoleDesign(true);
Console.WriteLine();
choose = Console.ReadLine().ToUpper();
}
string filepath, ext;
ColorCorrection cct;
foreach (string file in fileNames)
using (cct = new ColorCorrection())
{
ext = Path.GetExtension(file);
filepath = file.Replace(ext, "");
ext = ext.ToLower();
filepath = Path.RemoveExtension(file);
ext = Path.GetExtension(file).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);
if (choose == "2" && !cct.IsX)
cct.TXTWriter(filepath);
else
cct.MsgPackWriter(filepath, json);
}
else if (ext == ".json" || ext == ".mp")
{
cct.MsgPackReader(filepath, json);
cct.CCTWriter(filepath);
}
}
}
}
+5 -6
View File
@@ -1,4 +1,4 @@
using System;
using System;
using KKdMainLib.IO;
namespace PD_Tool
@@ -16,15 +16,14 @@ namespace PD_Tool
if (file.EndsWith(".mp" )) { mp = false; break; }
else if (file.EndsWith(".json")) { mp = false; break; }
uint num2 = (uint)DateTime.Now.Subtract(new DateTime(1970, 1, 1)).TotalSeconds;
uint timestamp = (uint)((DateTime.Now.Ticks - 621355968000000000) / 10000000);
string[] file_split;
string filepath, ext;
KKdMainLib.DataBank db;
foreach (string file in fileNames)
{
ext = Path.GetExtension(file);
filepath = file.Replace(ext, "");
ext = ext.ToLower();
filepath = Path.RemoveExtension(file);
ext = Path.GetExtension(file).ToLower();
string filename = Path.GetFileNameWithoutExtension(file);
file_split = filename.Split('_');
@@ -49,7 +48,7 @@ namespace PD_Tool
{
Console.Title = "DataBank Converter: " + filename;
db.MsgPackReader(filepath, json);
db. DBWriter(filepath, num2);
db. DBWriter(filepath, timestamp);
}
}
}
+15 -16
View File
@@ -1,4 +1,4 @@
using System;
using System;
using KKdBaseLib;
using KKdMainLib.IO;
using KKdDEX = KKdMainLib.DEX;
@@ -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,26 @@ 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();
filepath = Path.RemoveExtension(file);
ext = Path.GetExtension(file).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);
}
}
}
+37 -8
View File
@@ -1,29 +1,58 @@
using System;
using KKdMainLib.IO;
using System;
using KKdMainLib.F2;
using KKdMainLib.IO;
namespace PD_Tool
{
public class DFT
{
public static void Processor()
public static void Processor(bool json)
{
Console.Title = "DOF Converter";
Program.Choose(1, "dft", out string[] fileNames);
if (fileNames.Length < 1) return;
bool cc = false;
foreach (string file in fileNames)
if (file.EndsWith(".dft")) { cc = true; break; }
string choose = "";
if (cc)
{
Console.Clear();
Program.ConsoleDesign(true);
Program.ConsoleDesign(" Choose type of format to export:");
Program.ConsoleDesign(false);
Program.ConsoleDesign("1. JSON");
Program.ConsoleDesign("2. TXT");
Program.ConsoleDesign(false);
Program.ConsoleDesign(true);
Console.WriteLine();
choose = Console.ReadLine().ToUpper();
}
string filepath, ext;
DOF dft;
foreach (string file in fileNames)
using (dft = new DOF())
{
ext = Path.GetExtension(file);
filepath = file.Replace(ext, "");
ext = ext.ToLower();
filepath = Path.RemoveExtension(file);
ext = Path.GetExtension(file).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);
if (choose == "2" && !dft.IsX)
dft.TXTWriter(filepath);
else
dft.MsgPackWriter(filepath, json);
}
else if (ext == ".json" || ext == ".mp")
{
dft.MsgPackReader(filepath, json);
dft.DFTWriter(filepath);
}
}
}
}
+4 -5
View File
@@ -1,5 +1,5 @@
using System;
using System.IO;
using System;
using KKdMainLib.IO;
using KKdSoundLib;
namespace PD_Tool
@@ -17,9 +17,8 @@ namespace PD_Tool
foreach (string file in fileNames)
{
diva = new DIVA();
ext = Path.GetExtension(file);
filepath = file.Replace(ext, "");
ext = ext.ToLower();
filepath = Path.RemoveExtension(file);
ext = Path.GetExtension(file).ToLower();
Console.Title = "DIVA Converter: " + Path.GetFileNameWithoutExtension(file);
if (ext == ".diva") diva.DIVAReader(filepath);
+3 -3
View File
@@ -1,4 +1,4 @@
using KKdMainLib;
using KKdMainLib;
using KKdMainLib.IO;
namespace PD_Tool
@@ -13,7 +13,7 @@ namespace PD_Tool
if (head != 0x454C494641564944) return;
System.Console.Title = "DIVAFILE Decrypt: " + Path.GetFileName(file);
file.Decrypt();
KKdMainLib.DIVAFILE.Decrypt(file);
}
public static void Encrypt(string file)
@@ -24,7 +24,7 @@ namespace PD_Tool
if (head == 0x454C494641564944) return;
System.Console.Title = "DIVAFILE Encrypt: " + Path.GetFileName(file);
file.Encrypt();
KKdMainLib.DIVAFILE.Encrypt(file);
}
}
}
+29 -27
View File
@@ -1,32 +1,34 @@
using System;
using System.IO;
using Aet = KKdMainLib.DB.Aet;
using Auth = KKdMainLib.DB.Auth;
using Spr = KKdMainLib.DB.Spr;
using System;
using KKdMainLib.DB;
using KKdMainLib.IO;
namespace PD_Tool
{
public class DataBase
{
public static void Processor(bool json)
public static void Processor(bool json, char choose)
{
Console.Title = "DB Converter";
Console.Clear();
Program.ConsoleDesign(true);
Program.ConsoleDesign(" Choose type of DataBase file:");
Program.ConsoleDesign(false);
Program.ConsoleDesign("1. Auth DB Converter");
Program.ConsoleDesign("2. AET DB Converter");
Program.ConsoleDesign("3. SPR DB Converter");
Program.ConsoleDesign(false);
Program.ConsoleDesign("R. Return to Main Menu");
Program.ConsoleDesign(false);
Program.ConsoleDesign(true);
Console.WriteLine();
string format = Console.ReadLine().ToUpper();
if (format == "1") AuthDBProcessor(json);
if (format == "2") AETDBProcessor(json);
if (format == "3") SPRDBProcessor(json);
if (choose == '\0')
{
Console.Title = "DB Converter";
Console.Clear();
Program.ConsoleDesign(true);
Program.ConsoleDesign(" Choose type of DataBase file:");
Program.ConsoleDesign(false);
Program.ConsoleDesign("1. Auth DB Converter");
Program.ConsoleDesign("2. AET DB Converter");
Program.ConsoleDesign("3. SPR DB Converter");
Program.ConsoleDesign(false);
Program.ConsoleDesign("R. Return to Main Menu");
Program.ConsoleDesign(false);
Program.ConsoleDesign(true);
Console.WriteLine();
string format = Console.ReadLine().ToUpper();
if (format.Length > 0) choose = format[0];
}
if (choose == '1') AuthDBProcessor(json);
if (choose == '2') AETDBProcessor(json);
if (choose == '3') SPRDBProcessor(json);
}
public static void AuthDBProcessor(bool JSON)
@@ -41,8 +43,8 @@ namespace PD_Tool
using (auth = new Auth())
{
Console.Title = "Auth DB Converter: " + Path.GetFileNameWithoutExtension(file);
ext = Path.GetExtension(file).ToLower();
filepath = file.Replace(Path.GetExtension(file), "");
filepath = Path.RemoveExtension(file);
ext = Path.GetExtension(file).ToLower();
if (ext == ".bin")
{
@@ -69,8 +71,8 @@ namespace PD_Tool
using (aet = new Aet())
{
Console.Title = "AET DB Converter: " + Path.GetFileNameWithoutExtension(file);
filepath = Path.RemoveExtension(file);
ext = Path.GetExtension(file).ToLower();
filepath = file.Replace(Path.GetExtension(file), "");
if (ext == ".bin")
{
@@ -97,8 +99,8 @@ namespace PD_Tool
using (spr = new Spr())
{
Console.Title = "SPR DB Converter: " + Path.GetFileNameWithoutExtension(file);
filepath = Path.RemoveExtension(file);
ext = Path.GetExtension(file).ToLower();
filepath = file.Replace(Path.GetExtension(file), "");
if (ext == ".bin")
{
+4 -4
View File
@@ -1,5 +1,5 @@
using System;
using System.IO;
using System;
using KKdMainLib.IO;
using KKdFARC = KKdMainLib.FARC;
namespace PD_Tool
@@ -63,8 +63,8 @@ namespace PD_Tool
Program.ConsoleDesign(true);
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 == "2" || choose == "4") farc.FARCFlags |= KKdFARC.Flags.GZip;
if (choose == "3" || choose == "4") farc.FARCFlags |= KKdFARC.Flags.AES ;
}
else if (choose == "R") return;
else farc.Signature = KKdFARC.Farc.FArC;
+36 -7
View File
@@ -1,4 +1,4 @@
using System;
using System;
using KKdMainLib.IO;
using KKdMainLib.F2;
@@ -6,24 +6,53 @@ namespace PD_Tool
{
public class LIT
{
public static void Processor()
public static void Processor(bool json)
{
Console.Title = "Light Converter";
Program.Choose(1, "lit", out string[] fileNames);
if (fileNames.Length < 1) return;
bool bloom = false;
foreach (string file in fileNames)
if (file.EndsWith(".lit")) { bloom = true; break; }
string choose = "";
if (bloom)
{
Console.Clear();
Program.ConsoleDesign(true);
Program.ConsoleDesign(" Choose type of format to export:");
Program.ConsoleDesign(false);
Program.ConsoleDesign("1. JSON");
Program.ConsoleDesign("2. TXT");
Program.ConsoleDesign(false);
Program.ConsoleDesign(true);
Console.WriteLine();
choose = Console.ReadLine().ToUpper();
}
string filepath, ext;
Light lit;
foreach (string file in fileNames)
using (lit = new Light())
{
ext = Path.GetExtension(file);
filepath = file.Replace(ext, "");
ext = ext.ToLower();
filepath = Path.RemoveExtension(file);
ext = Path.GetExtension(file).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);
if (choose == "2" && !lit.IsX)
lit.TXTWriter(filepath);
else
lit.MsgPackWriter(filepath, json);
}
else if (ext == ".json" || ext == ".mp")
{
lit.MsgPackReader(filepath, json);
lit.LITWriter(filepath);
}
}
}
}
+17 -19
View File
@@ -1,4 +1,4 @@
using System;
using System;
using KKdMainLib;
using KKdMainLib.IO;
@@ -9,31 +9,29 @@ namespace PD_Tool
public static void Processor(bool json)
{
Console.Title = "MotHead Converter";
Program.Choose(1, "bin", out string[] fileNames);
Program.Choose(1, "mhd", out string[] fileNames);
if (fileNames.Length < 1) return;
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())
{
filepath = Path.RemoveExtension(file);
ext = Path.GetExtension(file).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" || ext == ".mhd")
{
mhd.MotHeadReader(filepath, ext);
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();
}
}
}
}
+73 -1
View File
@@ -1,4 +1,4 @@
using System;
using System;
using KKdMainLib;
using KKdMainLib.IO;
@@ -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);
}
+4 -5
View File
@@ -1,4 +1,4 @@
using System;
using System;
using KKdMainLib.IO;
using KKdSTR = KKdMainLib.STR;
@@ -16,14 +16,13 @@ namespace PD_Tool
foreach (string file in fileNames)
using (str = new KKdSTR())
{
ext = Path.GetExtension(file);
filepath = file.Replace(ext, "");
ext = ext.ToLower();
filepath = Path.RemoveExtension(file);
ext = Path.GetExtension(file).ToLower();
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")
+4 -5
View File
@@ -1,7 +1,7 @@
using System;
using System.IO;
using System;
using KKdBaseLib;
using KKdMainLib;
using KKdMainLib.IO;
using KKdFARC = KKdMainLib.FARC;
namespace PD_Tool
@@ -19,9 +19,8 @@ namespace PD_Tool
foreach (string file in fileNames)
using (tbl = new Tables())
{
ext = Path.GetExtension(file);
filepath = file.Replace(ext, "");
ext = ext.ToLower();
filepath = Path.RemoveExtension(file);
ext = Path.GetExtension(file).ToLower();
Console.Title = "Table Converter: " + Path.GetFileNameWithoutExtension(file);
if (ext == ".bin")
+4 -5
View File
@@ -1,5 +1,5 @@
using System;
using System.IO;
using System;
using KKdMainLib.IO;
using KKdVAG = KKdSoundLib.VAG;
namespace PD_Tool
@@ -42,9 +42,8 @@ namespace PD_Tool
foreach (string file in fileNames)
using (VAG = new KKdVAG())
{
ext = Path.GetExtension(file);
filepath = file.Replace(ext, "");
ext = ext.ToLower();
filepath = Path.RemoveExtension(file);
ext = Path.GetExtension(file).ToLower();
Console.Title = "VAG Converter: " + Path.GetFileNameWithoutExtension(file);
if (ext == ".vag") { VAG.VAGReader(filepath); VAG.WAVWriter(filepath ); }
+20 -5
View File
@@ -1,9 +1,8 @@
# 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.
+ `.NET Framework 4.6.1`: Required to run/build PD_Tool C# project.
+ `.NET Framework 4.6.1`: Required to build KKdBaseLib, KKdMainLib and KKdSoundLib C# projects and to run/build PD_Tool C# project.
# Tools:
- `FARC Extract/Create`
@@ -12,15 +11,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`
- `STR Converter`
- `F/F2/X/FT Converting Tools`
- `Table Converter`
- `F/F2/FT Converting Tools`
- `A3DA Converter`
- `Bloom Converter`
- `Color Correction Converter`
@@ -29,3 +30,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`
- `STR Converter`
- `Table Converter`