Release v0.4.11.0

`A3DA`: Added support for Raw Data Binary
`Aet`: Complete overhaul of AET writer
`FARC`: Fixed compressed files not having correct size and encrypted files not being encrypted
Updated libdeflate to 1.20
This commit is contained in:
korenkonder
2024-05-11 13:00:07 +03:00
parent b66b3b01d0
commit 8b46fbbe03
12 changed files with 1877 additions and 1717 deletions
+18 -1
View File
@@ -16,12 +16,29 @@ namespace KKdBaseLib.Auth2D
public uint BackColor;
public uint Width;
public uint Height;
public Pointer<Vec2<CountPointer<KFT2>>> Camera;
public Pointer<Camera> Camera;
public CountPointer<Composition> Composition;
public CountPointer<Video > Video;
public CountPointer<Audio > Audio;
}
public struct Camera
{
public CountPointer<KFT2> EyeX;
public CountPointer<KFT2> EyeY;
public CountPointer<KFT2> EyeZ;
public CountPointer<KFT2> PositionX;
public CountPointer<KFT2> PositionY;
public CountPointer<KFT2> PositionZ;
public CountPointer<KFT2> DirectionX;
public CountPointer<KFT2> DirectionY;
public CountPointer<KFT2> DirectionZ;
public CountPointer<KFT2> RotationX;
public CountPointer<KFT2> RotationY;
public CountPointer<KFT2> RotationZ;
public CountPointer<KFT2> Zoom ;
}
public struct Composition
{
public int P;
+6
View File
@@ -142,6 +142,9 @@ namespace KKdBaseLib.Auth3D
public float? Max;
public float Value;
public bool RawData;
public bool RawDataBinary;
public int? RawDataValueListSize;
public int? RawDataValueListOffset;
public KFT3[] Keys;
public Key(A3DAKey k)
@@ -150,6 +153,9 @@ namespace KKdBaseLib.Auth3D
Value = 0;
BinOffset = null;
RawData = default;
RawDataBinary = default;
RawDataValueListSize = null;
RawDataValueListOffset = null;
Keys = null;
EPTypePost = k.EPTypePost;
+3 -3
View File
@@ -4,14 +4,14 @@
<Authors>korenkonder</Authors>
<Company></Company>
<Configuration></Configuration>
<Copyright>korenkonder (C) 2019-2022</Copyright>
<Copyright>korenkonder (C) 2019-2024</Copyright>
<Description>A base library</Description>
<FileVersion>0.4.10.12</FileVersion>
<FileVersion>0.4.11.0</FileVersion>
<PackageId>KKdBaseLib</PackageId>
<Product>KKdBaseLib</Product>
<TargetFramework>net461</TargetFramework>
<Title>KKdBaseLib</Title>
<Version>0.4.10.12</Version>
<Version>0.4.11.0</Version>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
+88 -38
View File
@@ -5,7 +5,6 @@ using KKdBaseLib.Auth3D;
using KKdMainLib.IO;
using Object = KKdBaseLib.Auth3D.Object;
using A3DADict = System.Collections.Generic.Dictionary<string, object>;
using UsedDict = System.Collections.Generic.Dictionary< int, KKdBaseLib.KeyValuePair<int, float>>;
namespace KKdMainLib
{
@@ -1075,7 +1074,7 @@ namespace KKdMainLib
private Key RK(string str)
{
Key key = new Key();
if ( dict.FV(out key.BinOffset, str + BO )) return key;
if ( dict.FV(out key.BinOffset, str + BO )) return key;
if (!dict.FV(out int type , str + ".type")) return default;
key.Type = (KeyType)type;
@@ -1095,11 +1094,24 @@ namespace KKdMainLib
if (keyType != 0)
{
dict.FV(out string valueType, str + ".raw_data.value_type");
dict.FV(out int valueListSize, str + ".raw_data.value_list_size");
if (dict.FV(out int valueListOffset, str + ".raw_data.value_list_offset"))
{
if (keyType != 3)
return default;
key.RawData = true;
key.RawDataBinary = true;
key.RawDataValueListSize = valueListSize;
key.RawDataValueListOffset = valueListOffset;
return key;
}
string[] VL = null;
dict.FV(out string value_type, str + ".raw_data.value_type");
if (dict.FV(out value, str + ".raw_data.value_list"))
VL = value.Split(',');
dict.FV(out int valueListSize, str + ".raw_data.value_list_size");
value = "";
int ds = keyType + 1;
@@ -1180,7 +1192,7 @@ namespace KKdMainLib
private void W(ref Key key, string str, bool a3dc)
{
if (a3dc) { W(str + BO, key.BinOffset); return; }
if (a3dc && !(key.RawData && key.RawDataBinary)) { W(str + BO, key.BinOffset); return; }
int i = 0;
if (key.Type < KeyType.Linear || key.Keys == null || (key.Keys != null && key.Keys.Length == 0))
@@ -1216,30 +1228,37 @@ namespace KKdMainLib
else if (key.Keys != null)
{
int length = key.Keys.Length;
int keyType = 0;
IKF kf;
W(str + ".max", (float)(key.Max ?? Data.PlayControl.Size));
for (i = 0; i < length && keyType < 3; i++)
int keyType = 0;
if (key.RawDataBinary)
{
kf = key.Keys[i].Check();
if (kf is KFT0 && keyType < 0) keyType = 0;
else if (kf is KFT1 && keyType < 1) keyType = 1;
else if (kf is KFT2 && keyType < 2) keyType = 2;
else if (kf is KFT3 && keyType < 3) keyType = 3;
W(str + ".raw_data.value_list_offset", key.RawDataValueListOffset);
keyType = 3;
}
int valueListSize = length * keyType + length;
s.W(str + ".raw_data.value_list=");
if (keyType == 0) for (i = 0; i < length; i++)
s.W(key.Keys[i].ToT0().ToString(false) + (i + 1 < length ? "," : ""));
else if (keyType == 1) for (i = 0; i < length; i++)
s.W(key.Keys[i].ToT1().ToString(false) + (i + 1 < length ? "," : ""));
else if (keyType == 2) for (i = 0; i < length; i++)
s.W(key.Keys[i].ToT2().ToString(false) + (i + 1 < length ? "," : ""));
else if (keyType == 3) for (i = 0; i < length; i++)
s.W(key.Keys[i] .ToString(false) + (i + 1 < length ? "," : ""));
s.P--;
s.W('\n');
W(str + ".raw_data.value_list_size", valueListSize);
else
{
for (i = 0; i < length && keyType < 3; i++)
{
IKF kf = key.Keys[i].Check();
if (kf is KFT0 && keyType < 0) keyType = 0;
else if (kf is KFT1 && keyType < 1) keyType = 1;
else if (kf is KFT2 && keyType < 2) keyType = 2;
else if (kf is KFT3 && keyType < 3) keyType = 3;
}
s.W(str + ".raw_data.value_list=");
if (keyType == 0) for (i = 0; i < length; i++)
s.W(key.Keys[i].ToT0().ToString(false) + (i + 1 < length ? "," : ""));
else if (keyType == 1) for (i = 0; i < length; i++)
s.W(key.Keys[i].ToT1().ToString(false) + (i + 1 < length ? "," : ""));
else if (keyType == 2) for (i = 0; i < length; i++)
s.W(key.Keys[i].ToT2().ToString(false) + (i + 1 < length ? "," : ""));
else if (keyType == 3) for (i = 0; i < length; i++)
s.W(key.Keys[i] .ToString(false) + (i + 1 < length ? "," : ""));
s.P--;
s.W('\n');
}
W(str + ".raw_data.value_list_size", length * keyType + length);
W(str + ".raw_data.value_type" , "float" );
W(str + ".raw_data_key_type" , keyType );
W(str + ".type", (int)key.Type);
@@ -1673,14 +1692,15 @@ namespace KKdMainLib
private void RMT(ref ModelTransform mt)
{
if (mt.BinOffset == null) return;
if (mt.BinOffset.HasValue)
{
s.P = (int)mt.BinOffset;
s.P = (int)mt.BinOffset;
ReadOffset(out mt.Scale);
ReadOffset(out mt.Rot );
ReadOffset(out mt.Trans);
mt.Visibility = new Key { BinOffset = s.RI32() };
ReadOffset(out mt.Scale);
ReadOffset(out mt.Rot);
ReadOffset(out mt.Trans);
mt.Visibility = new Key { BinOffset = s.RI32() };
}
RV3(ref mt.Scale );
RV3(ref mt.Rot , true);
@@ -1705,15 +1725,32 @@ namespace KKdMainLib
private void RK(ref Key key, bool f16 = false)
{
int length;
if (key.RawData)
{
if (!key.RawDataBinary)
return;
s.P = (int)key.RawDataValueListOffset;
key.RawDataValueListOffset = 0;
length = (int)key.RawDataValueListSize / 4;
key.Keys = new KFT3[length];
for (int i = 0; i < key.Keys.Length; i++)
{ ref KFT3 kf = ref key.Keys[i]; Vec4 v = s.RV4(); kf.F = v.X; kf.V = v.Y;
kf.T1 = v.Z; kf.T2 = v.W; }
return;
}
if (key.BinOffset == null || key.BinOffset < 0) return;
s.P = (int)key.BinOffset;
int Type = s.RI32();
int Type = s.RI32();
key.Value = s.RF32();
key.Type = (KeyType)(Type & 0xFF);
if (key.Type < KeyType.Linear) return;
key.Max = s.RF32();
int length = s.RI32();
key.Max = s.RF32();
length = s.RI32();
key.EPTypePost = (EPType)((Type >> 12) & 0xF);
key.EPTypePre = (EPType)((Type >> 8) & 0xF);
key.Keys = new KFT3[length];
@@ -1774,6 +1811,17 @@ namespace KKdMainLib
private void W(ref Key key, bool f16 = false)
{
if (key.RawData) {
if (!key.RawDataBinary)
return;
key.RawDataValueListOffset = s.P;
key.RawDataValueListSize = key.Keys.Length * 4;
for (i = 0; i < key.Keys.Length; i++)
{ ref KFT3 kf = ref key.Keys[i]; s.W(new Vec4(kf.F, kf.V, kf.T1, kf.T2)); }
return;
}
key.BinOffset = s.P;
if (key.Type > KeyType.Static && key.Keys != null)
{
@@ -2906,7 +2954,8 @@ namespace KKdMainLib
if (key.Type == 0) { key.Value = 0; return key; }
else if (key.Type < KeyType.Linear) return key;
key.RawData = msgPack.RB("RawData");
key.RawData = msgPack.RB("RawData");
key.RawDataBinary = msgPack.RB("RawDataBinary");
MsgPack trans;
if ((trans = msgPack["Keys", true]).IsNull && (trans = msgPack["Trans", true]).IsNull) return key;
@@ -2982,7 +3031,8 @@ namespace KKdMainLib
if (key.EPTypePre != EPType.None)
keys.Add("EPTypePre", key.EPTypePre.ToString());
if (key.RawData) keys.Add("RawData", true);
if (key.RawData ) keys.Add("RawData" , true);
if (key.RawDataBinary) keys.Add("RawDataBinary", true);
int length = key.Keys.Length;
MsgPack Keys = new MsgPack(length, "Keys");
+575 -488
View File
File diff suppressed because it is too large Load Diff
+2 -2
View File
@@ -140,7 +140,7 @@ namespace KKdMainLib
if (file.Size != 0)
{
file.Compressed = (FARCFlags & Flags.GZip) != 0;
file.Compressed = true;
}
else
{
@@ -172,7 +172,7 @@ namespace KKdMainLib
file.Compressed = false;
}
file.Encrypted = false;
file.Encrypted = (FARCFlags & Flags.AES) != 0;
Files.Add(file);
}
else
+342 -342
View File
@@ -1,342 +1,342 @@
using KKdBaseLib;
namespace KKdMainLib.IO
{
public struct MP : System.IDisposable
{
public MP(Stream _IO) => this._IO = _IO;
private Stream _IO;
public void Close() => _IO.C();
public byte[] ToArray(bool Close = false) => _IO.ToArray(Close);
public MsgPack Read(bool array = false)
{
MsgPack msgPack = MsgPack.New;
byte unk = _IO.RU8();
if (!array) { msgPack.Name = RS((Types)unk); unk = _IO.RU8(); }
Types type = (Types)unk;
if (type >= Types.FixMap && type <= Types.FixMapMax)
{
msgPack.Object = KKdList<MsgPack>.New;
for (int i = 0; i < unk - (byte)Types.FixMap; i++) msgPack.Add( Read(false));
}
else if (type >= Types.FixArr && type <= Types.FixArrMax)
{
msgPack.Object = new MsgPack[unk - (byte)Types.FixArr];
for (int i = 0; i < unk - (byte)Types.FixArr; i++) msgPack[i] = Read( true);
}
else if (type >= Types.FixStr && type <= Types.FixStrMax) msgPack.Object = RS(type);
else if (type >= Types.PosInt && type <= Types.PosIntMax) msgPack.Object = unk;
else if (type >= Types.NegInt && type <= Types.NegIntMax) msgPack.Object = (sbyte)unk;
else
while (true)
{
if (RN (ref msgPack, ref type)) break;
if (RBy(ref msgPack, ref type)) break;
if (RM (ref msgPack, ref type)) break;
if (RE (ref msgPack, ref type)) break;
if (RS (ref msgPack, ref type)) break;
if (RBo(ref msgPack, ref type)) break;
if (RA (ref msgPack, ref type)) break;
if (RI (ref msgPack, ref type)) break;
if (RU (ref msgPack, ref type)) break;
if (RF (ref msgPack, ref type)) break;
break;
}
return msgPack;
}
private bool RI(ref MsgPack msgPack, ref Types type)
{
if (type == Types.Int8 ) msgPack.Object = _IO.RI8();
else if (type == Types.Int16) msgPack.Object = _IO.RI16E(true);
else if (type == Types.Int32) msgPack.Object = _IO.RI32E(true);
else if (type == Types.Int64) msgPack.Object = _IO.RI64E(true);
else return false;
return true;
}
private bool RU(ref MsgPack msgPack, ref Types type)
{
if (type == Types.UInt8 ) msgPack.Object = _IO.RU8();
else if (type == Types.UInt16) msgPack.Object = _IO.RU16E(true);
else if (type == Types.UInt32) msgPack.Object = _IO.RU32E(true);
else if (type == Types.UInt64) msgPack.Object = _IO.RU64E(true);
else return false;
return true;
}
private bool RF(ref MsgPack msgPack, ref Types type)
{
if (type == Types.Float32) msgPack.Object = _IO.RF32E(true);
else if (type == Types.Float64) msgPack.Object = _IO.RF64E(true);
else return false;
return true;
}
private bool RBo(ref MsgPack msgPack, ref Types type)
{
if (type == Types.False) msgPack.Object = false;
else if (type == Types.True ) msgPack.Object = true ;
else return false;
return true;
}
private bool RBy(ref MsgPack msgPack, ref Types type)
{
int Length = 0;
if (type == Types.Bin8 ) Length = _IO.RU8();
else if (type == Types.Bin16) Length = _IO.RI16E(true);
else if (type == Types.Bin32) Length = _IO.RI32E(true);
else return false;
msgPack.Object = _IO.RBy(Length);
return true;
}
private bool RS(ref MsgPack msgPack, ref Types type)
{
string val = RS(type);
if (val != null) msgPack.Object = val;
else return false;
return true;
}
private string RS(Types val)
{
if (val >= Types.FixStr && val <= Types.FixStrMax)
return _IO.RS(val - Types.FixStr);
else if (val >= Types. Str8 && val <= Types. Str32 )
{
System.Enum.TryParse(val.ToString(), out Types type);
int Length = 0;
if (type == Types.Str8 ) Length = _IO.RU8();
else if (type == Types.Str16) Length = _IO.RI16E(true);
else Length = _IO.RI32E(true);
return _IO.RS(Length);
}
return null;
}
private bool RN(ref MsgPack msgPack, ref Types type)
{
if (type == Types.Nil) msgPack.Object = null;
else return false;
return true;
}
private bool RA(ref MsgPack msgPack, ref Types type)
{
int Length = 0;
if (type == Types.Arr16) Length = _IO.RI16E(true);
else if (type == Types.Arr32) Length = _IO.RI32E(true);
else return false;
msgPack.Object = new MsgPack[Length];
for (int i = 0; i < Length; i++) msgPack[i] = Read(true);
return true;
}
private bool RM(ref MsgPack msgPack, ref Types type)
{
int Length = 0;
if (type == Types.Map16) Length = _IO.RI16E(true);
else if (type == Types.Map32) Length = _IO.RI32E(true);
else return false;
msgPack.Object = KKdList<MsgPack>.New;
for (int i = 0; i < Length; i++) msgPack.Add(Read());
return true;
}
private bool RE(ref MsgPack MsgPack, ref Types type)
{
int Length = 0;
if (type == Types.FixExt1 ) Length = 1 ;
else if (type == Types.FixExt2 ) Length = 2 ;
else if (type == Types.FixExt4 ) Length = 4 ;
else if (type == Types.FixExt8 ) Length = 8 ;
else if (type == Types.FixExt16) Length = 16;
else if (type == Types. Ext8 ) Length = _IO.RU8();
else if (type == Types. Ext16) Length = _IO.RI16E(true);
else if (type == Types. Ext32) Length = _IO.RI32E(true);
else return false;
MsgPack.Object = new MsgPack.Ext { Type = _IO.RI8(), Data = _IO.RBy(Length) };
return true;
}
public MP W(MsgPack msgPack, bool ignoreNull, bool IsArray = false)
{
if (msgPack.Name != null && !IsArray) W(msgPack.Name);
Write(msgPack.Object, ignoreNull);
return this;
}
private void Write(object obj, bool ignoreNull)
{
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], ignoreNull); break;
case MsgPack[] val: WA(val.Length);
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;
case byte val: W(val); break;
case short val: W(val); break;
case ushort val: W(val); break;
case int val: W(val); break;
case uint val: W(val); break;
case long val: W(val); break;
case ulong val: W(val); break;
case float val: W(val); break;
case double val: W(val); break;
case string val: W(val); break;
case MsgPack.Ext val: W(val); break;
}
}
private void W( sbyte val) { if (val < -0x20) _IO.W((byte)0xD0); _IO.W(val); }
private void W( byte val) { if (val >= 0x80) _IO.W((byte)0xCC); _IO.W(val); }
private void W( short val) { if (( sbyte)val == val) W(( sbyte)val);
else if (( byte)val == val) W(( byte)val);
else { _IO.W((byte)0xD1); _IO.WE(val, true); } }
private void W(ushort val) { if (( byte)val == val) W(( byte)val);
else { _IO.W((byte)0xCD); _IO.WE(val, true); } }
private void W( int val) { if (( short)val == val) W(( short)val);
else if ((ushort)val == val) W((ushort)val);
else { _IO.W((byte)0xD2); _IO.WE(val, true); } }
private void W( uint val) { if ((ushort)val == val) W((ushort)val);
else { _IO.W((byte)0xCE); _IO.WE(val, true); } }
private void W( long val) { if (( int)val == val) W(( int)val);
else if (( uint)val == val) W(( uint)val);
else { _IO.W((byte)0xD3); _IO.WE(val, true); } }
private void W( ulong val) { if (( uint)val == val) W(( uint)val);
else { _IO.W((byte)0xCF); _IO.WE(val, true); } }
private void W( float val) { if (( long)val == val) W(( long)val);
else { _IO.W((byte)0xCA); _IO.WE(val, true); } }
private void W(double val) { if (( long)val == val) W(( long)val);
else if (( float)val == val) W(( float)val);
else { _IO.W((byte)0xCB); _IO.WE(val, true); } }
private void W( bool val) =>
_IO.W((byte)(val ? 0xC3 : 0xC2));
private void W(byte[] val)
{
if (val == null) { WN(); return; }
if (val.Length < 0x100) { _IO.W((byte)0xC4); _IO.W (( byte)val.Length ); }
else if (val.Length < 0x10000) { _IO.W((byte)0xC5); _IO.WE((ushort)val.Length, true); }
else { _IO.W((byte)0xC6); _IO.WE( val.Length, true); }
_IO.W(val);
}
private void W(string val)
{
if (val == null) { WN(); return; }
byte[] array = Text.ToUTF8(val);
if (array.Length < 0x20) _IO.W((byte)(0xA0 | (array.Length & 0x1F)));
else if (array.Length < 0x100) { _IO.W((byte)0xD9); _IO.W (( byte)array.Length); }
else if (array.Length < 0x10000) { _IO.W((byte)0xDA); _IO.WE((ushort)array.Length, true); }
else { _IO.W((byte)0xDB); _IO.WE( array.Length, true); }
_IO.W(array);
}
private void WN() => _IO.W((byte)0xC0);
private void WA(int val)
{
if (val == 0) { WN(); return; }
else if (val < 0x10) _IO.W((byte)(0x90 | (val & 0x0F)));
else if (val < 0x10000) { _IO.W((byte)0xDC); _IO.WE((ushort)val, true); }
else { _IO.W((byte)0xDD); _IO.WE( val, true); }
}
private void WM(int val)
{
if (val == 0) { WN(); return; }
else if (val < 0x10) _IO.W((byte)(0x80 | (val & 0x0F)));
else if (val < 0x10000) { _IO.W((byte)0xDE); _IO.WE((ushort)val, true); }
else { _IO.W((byte)0xDF); _IO.WE( val, true); }
}
private void W(MsgPack.Ext val) => WE(val);
private void WE(MsgPack.Ext val)
{
if (val.Data == null) { WN(); return; }
if (val.Data.Length < 1 ) { WN(); return; }
else if (val.Data.Length == 1 ) _IO.W((byte)0xD4);
else if (val.Data.Length == 2 ) _IO.W((byte)0xD5);
else if (val.Data.Length == 4 ) _IO.W((byte)0xD6);
else if (val.Data.Length == 8 ) _IO.W((byte)0xD7);
else if (val.Data.Length == 16) _IO.W((byte)0xD8);
else
{
if (val.Data.Length < 0x100)
{ _IO.W((byte)0xC7); _IO.W (( byte)val.Data.Length); }
else if (val.Data.Length < 0x10000)
{ _IO.W((byte)0xC8); _IO.WE((ushort)val.Data.Length, true); }
else
{ _IO.W((byte)0xC9); _IO.WE( val.Data.Length, true); }
}
_IO.W(val.Type);
_IO.W(val.Data);
}
public void Dispose() => _IO.C();
}
public enum Types : byte
{
PosInt = 0b00000000,
FixMap = 0b10000000,
FixArr = 0b10010000,
FixStr = 0b10100000,
Nil = 0b11000000,
NeverUsed = 0b11000001,
False = 0b11000010,
True = 0b11000011,
Bin8 = 0b11000100,
Bin16 = 0b11000101,
Bin32 = 0b11000110,
Ext8 = 0b11000111,
Ext16 = 0b11001000,
Ext32 = 0b11001001,
Float32 = 0b11001010,
Float64 = 0b11001011,
UInt8 = 0b11001100,
UInt16 = 0b11001101,
UInt32 = 0b11001110,
UInt64 = 0b11001111,
Int8 = 0b11010000,
Int16 = 0b11010001,
Int32 = 0b11010010,
Int64 = 0b11010011,
FixExt1 = 0b11010100,
FixExt2 = 0b11010101,
FixExt4 = 0b11010110,
FixExt8 = 0b11010111,
FixExt16 = 0b11011000,
Str8 = 0b11011001,
Str16 = 0b11011010,
Str32 = 0b11011011,
Arr16 = 0b11011100,
Arr32 = 0b11011101,
Map16 = 0b11011110,
Map32 = 0b11011111,
NegInt = 0b11100000,
PosIntMax = 0b01111111,
FixMapMax = 0b10001111,
FixArrMax = 0b10011111,
FixStrMax = 0b10111111,
NegIntMax = 0b11111111,
}
}
using KKdBaseLib;
namespace KKdMainLib.IO
{
public struct MP : System.IDisposable
{
public MP(Stream _IO) => this._IO = _IO;
private Stream _IO;
public void Close() => _IO.C();
public byte[] ToArray(bool Close = false) => _IO.ToArray(Close);
public MsgPack Read(bool array = false)
{
MsgPack msgPack = MsgPack.New;
byte unk = _IO.RU8();
if (!array) { msgPack.Name = RS((Types)unk); unk = _IO.RU8(); }
Types type = (Types)unk;
if (type >= Types.FixMap && type <= Types.FixMapMax)
{
msgPack.Object = KKdList<MsgPack>.New;
for (int i = 0; i < unk - (byte)Types.FixMap; i++) msgPack.Add( Read(false));
}
else if (type >= Types.FixArr && type <= Types.FixArrMax)
{
msgPack.Object = new MsgPack[unk - (byte)Types.FixArr];
for (int i = 0; i < unk - (byte)Types.FixArr; i++) msgPack[i] = Read( true);
}
else if (type >= Types.FixStr && type <= Types.FixStrMax) msgPack.Object = RS(type);
else if (type >= Types.PosInt && type <= Types.PosIntMax) msgPack.Object = unk;
else if (type >= Types.NegInt && type <= Types.NegIntMax) msgPack.Object = (sbyte)unk;
else
while (true)
{
if (RN (ref msgPack, ref type)) break;
if (RBy(ref msgPack, ref type)) break;
if (RM (ref msgPack, ref type)) break;
if (RE (ref msgPack, ref type)) break;
if (RS (ref msgPack, ref type)) break;
if (RBo(ref msgPack, ref type)) break;
if (RA (ref msgPack, ref type)) break;
if (RI (ref msgPack, ref type)) break;
if (RU (ref msgPack, ref type)) break;
if (RF (ref msgPack, ref type)) break;
break;
}
return msgPack;
}
private bool RI(ref MsgPack msgPack, ref Types type)
{
if (type == Types.Int8 ) msgPack.Object = _IO.RI8();
else if (type == Types.Int16) msgPack.Object = _IO.RI16E(true);
else if (type == Types.Int32) msgPack.Object = _IO.RI32E(true);
else if (type == Types.Int64) msgPack.Object = _IO.RI64E(true);
else return false;
return true;
}
private bool RU(ref MsgPack msgPack, ref Types type)
{
if (type == Types.UInt8 ) msgPack.Object = _IO.RU8();
else if (type == Types.UInt16) msgPack.Object = _IO.RU16E(true);
else if (type == Types.UInt32) msgPack.Object = _IO.RU32E(true);
else if (type == Types.UInt64) msgPack.Object = _IO.RU64E(true);
else return false;
return true;
}
private bool RF(ref MsgPack msgPack, ref Types type)
{
if (type == Types.Float32) msgPack.Object = _IO.RF32E(true);
else if (type == Types.Float64) msgPack.Object = _IO.RF64E(true);
else return false;
return true;
}
private bool RBo(ref MsgPack msgPack, ref Types type)
{
if (type == Types.False) msgPack.Object = false;
else if (type == Types.True ) msgPack.Object = true ;
else return false;
return true;
}
private bool RBy(ref MsgPack msgPack, ref Types type)
{
int Length = 0;
if (type == Types.Bin8 ) Length = _IO.RU8();
else if (type == Types.Bin16) Length = _IO.RI16E(true);
else if (type == Types.Bin32) Length = _IO.RI32E(true);
else return false;
msgPack.Object = _IO.RBy(Length);
return true;
}
private bool RS(ref MsgPack msgPack, ref Types type)
{
string val = RS(type);
if (val != null) msgPack.Object = val;
else return false;
return true;
}
private string RS(Types val)
{
if (val >= Types.FixStr && val <= Types.FixStrMax)
return _IO.RS(val - Types.FixStr);
else if (val >= Types. Str8 && val <= Types. Str32 )
{
System.Enum.TryParse(val.ToString(), out Types type);
int Length = 0;
if (type == Types.Str8 ) Length = _IO.RU8();
else if (type == Types.Str16) Length = _IO.RI16E(true);
else Length = _IO.RI32E(true);
return _IO.RS(Length);
}
return null;
}
private bool RN(ref MsgPack msgPack, ref Types type)
{
if (type == Types.Nil) msgPack.Object = null;
else return false;
return true;
}
private bool RA(ref MsgPack msgPack, ref Types type)
{
int Length = 0;
if (type == Types.Arr16) Length = _IO.RI16E(true);
else if (type == Types.Arr32) Length = _IO.RI32E(true);
else return false;
msgPack.Object = new MsgPack[Length];
for (int i = 0; i < Length; i++) msgPack[i] = Read(true);
return true;
}
private bool RM(ref MsgPack msgPack, ref Types type)
{
int Length = 0;
if (type == Types.Map16) Length = _IO.RI16E(true);
else if (type == Types.Map32) Length = _IO.RI32E(true);
else return false;
msgPack.Object = KKdList<MsgPack>.New;
for (int i = 0; i < Length; i++) msgPack.Add(Read());
return true;
}
private bool RE(ref MsgPack MsgPack, ref Types type)
{
int Length = 0;
if (type == Types.FixExt1 ) Length = 1 ;
else if (type == Types.FixExt2 ) Length = 2 ;
else if (type == Types.FixExt4 ) Length = 4 ;
else if (type == Types.FixExt8 ) Length = 8 ;
else if (type == Types.FixExt16) Length = 16;
else if (type == Types. Ext8 ) Length = _IO.RU8();
else if (type == Types. Ext16) Length = _IO.RI16E(true);
else if (type == Types. Ext32) Length = _IO.RI32E(true);
else return false;
MsgPack.Object = new MsgPack.Ext { Type = _IO.RI8(), Data = _IO.RBy(Length) };
return true;
}
public MP W(MsgPack msgPack, bool ignoreNull, bool IsArray = false)
{
if (msgPack.Name != null && !IsArray) W(msgPack.Name);
Write(msgPack.Object, ignoreNull);
return this;
}
private void Write(object obj, bool ignoreNull)
{
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], ignoreNull); break;
case MsgPack[] val: WA(val.Length);
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;
case byte val: W(val); break;
case short val: W(val); break;
case ushort val: W(val); break;
case int val: W(val); break;
case uint val: W(val); break;
case long val: W(val); break;
case ulong val: W(val); break;
case float val: W(val); break;
case double val: W(val); break;
case string val: W(val); break;
case MsgPack.Ext val: W(val); break;
}
}
private void W( sbyte val) { if (val < -0x20) _IO.W((byte)0xD0); _IO.W(val); }
private void W( byte val) { if (val >= 0x80) _IO.W((byte)0xCC); _IO.W(val); }
private void W( short val) { if (( sbyte)val == val) W(( sbyte)val);
else if (( byte)val == val) W(( byte)val);
else { _IO.W((byte)0xD1); _IO.WE(val, true); } }
private void W(ushort val) { if (( byte)val == val) W(( byte)val);
else { _IO.W((byte)0xCD); _IO.WE(val, true); } }
private void W( int val) { if (( short)val == val) W(( short)val);
else if ((ushort)val == val) W((ushort)val);
else { _IO.W((byte)0xD2); _IO.WE(val, true); } }
private void W( uint val) { if ((ushort)val == val) W((ushort)val);
else { _IO.W((byte)0xCE); _IO.WE(val, true); } }
private void W( long val) { if (( int)val == val) W(( int)val);
else if (( uint)val == val) W(( uint)val);
else { _IO.W((byte)0xD3); _IO.WE(val, true); } }
private void W( ulong val) { if (( uint)val == val) W(( uint)val);
else { _IO.W((byte)0xCF); _IO.WE(val, true); } }
private void W( float val) { if (( long)val == val) W(( long)val);
else { _IO.W((byte)0xCA); _IO.WE(val, true); } }
private void W(double val) { if (( long)val == val) W(( long)val);
else if (( float)val == val) W(( float)val);
else { _IO.W((byte)0xCB); _IO.WE(val, true); } }
private void W( bool val) =>
_IO.W((byte)(val ? 0xC3 : 0xC2));
private void W(byte[] val)
{
if (val == null) { WN(); return; }
if (val.Length < 0x100) { _IO.W((byte)0xC4); _IO.W (( byte)val.Length ); }
else if (val.Length < 0x10000) { _IO.W((byte)0xC5); _IO.WE((ushort)val.Length, true); }
else { _IO.W((byte)0xC6); _IO.WE( val.Length, true); }
_IO.W(val);
}
private void W(string val)
{
if (val == null) { WN(); return; }
byte[] array = Text.ToUTF8(val);
if (array.Length < 0x20) _IO.W((byte)(0xA0 | (array.Length & 0x1F)));
else if (array.Length < 0x100) { _IO.W((byte)0xD9); _IO.W (( byte)array.Length); }
else if (array.Length < 0x10000) { _IO.W((byte)0xDA); _IO.WE((ushort)array.Length, true); }
else { _IO.W((byte)0xDB); _IO.WE( array.Length, true); }
_IO.W(array);
}
private void WN() => _IO.W((byte)0xC0);
private void WA(int val)
{
if (val == 0) { WN(); return; }
else if (val < 0x10) _IO.W((byte)(0x90 | (val & 0x0F)));
else if (val < 0x10000) { _IO.W((byte)0xDC); _IO.WE((ushort)val, true); }
else { _IO.W((byte)0xDD); _IO.WE( val, true); }
}
private void WM(int val)
{
if (val == 0) { WN(); return; }
else if (val < 0x10) _IO.W((byte)(0x80 | (val & 0x0F)));
else if (val < 0x10000) { _IO.W((byte)0xDE); _IO.WE((ushort)val, true); }
else { _IO.W((byte)0xDF); _IO.WE( val, true); }
}
private void W(MsgPack.Ext val) => WE(val);
private void WE(MsgPack.Ext val)
{
if (val.Data == null) { WN(); return; }
if (val.Data.Length < 1 ) { WN(); return; }
else if (val.Data.Length == 1 ) _IO.W((byte)0xD4);
else if (val.Data.Length == 2 ) _IO.W((byte)0xD5);
else if (val.Data.Length == 4 ) _IO.W((byte)0xD6);
else if (val.Data.Length == 8 ) _IO.W((byte)0xD7);
else if (val.Data.Length == 16) _IO.W((byte)0xD8);
else
{
if (val.Data.Length < 0x100)
{ _IO.W((byte)0xC7); _IO.W (( byte)val.Data.Length); }
else if (val.Data.Length < 0x10000)
{ _IO.W((byte)0xC8); _IO.WE((ushort)val.Data.Length, true); }
else
{ _IO.W((byte)0xC9); _IO.WE( val.Data.Length, true); }
}
_IO.W(val.Type);
_IO.W(val.Data);
}
public void Dispose() => _IO.C();
}
public enum Types : byte
{
PosInt = 0b00000000,
FixMap = 0b10000000,
FixArr = 0b10010000,
FixStr = 0b10100000,
Nil = 0b11000000,
NeverUsed = 0b11000001,
False = 0b11000010,
True = 0b11000011,
Bin8 = 0b11000100,
Bin16 = 0b11000101,
Bin32 = 0b11000110,
Ext8 = 0b11000111,
Ext16 = 0b11001000,
Ext32 = 0b11001001,
Float32 = 0b11001010,
Float64 = 0b11001011,
UInt8 = 0b11001100,
UInt16 = 0b11001101,
UInt32 = 0b11001110,
UInt64 = 0b11001111,
Int8 = 0b11010000,
Int16 = 0b11010001,
Int32 = 0b11010010,
Int64 = 0b11010011,
FixExt1 = 0b11010100,
FixExt2 = 0b11010101,
FixExt4 = 0b11010110,
FixExt8 = 0b11010111,
FixExt16 = 0b11011000,
Str8 = 0b11011001,
Str16 = 0b11011010,
Str32 = 0b11011011,
Arr16 = 0b11011100,
Arr32 = 0b11011101,
Map16 = 0b11011110,
Map32 = 0b11011111,
NegInt = 0b11100000,
PosIntMax = 0b01111111,
FixMapMax = 0b10001111,
FixArrMax = 0b10011111,
FixStrMax = 0b10111111,
NegIntMax = 0b11111111,
}
}
+3 -3
View File
@@ -4,14 +4,14 @@
<Authors>korenkonder</Authors>
<Company></Company>
<Configuration></Configuration>
<Copyright>korenkonder (C) 2018-2023</Copyright>
<Copyright>korenkonder (C) 2018-2024</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.19</FileVersion>
<FileVersion>0.4.11.0</FileVersion>
<PackageId>KKdMainLib</PackageId>
<Product>KKdMainLib</Product>
<TargetFramework>net461</TargetFramework>
<Title>KKdMainLib</Title>
<Version>0.4.10.19</Version>
<Version>0.4.11.0</Version>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
+9 -9
View File
@@ -200,15 +200,15 @@ RETURN:
{
ref HeaderData.Sub.Data data = ref Header.Data[i].Array[i0];
int Size = GetSize(data.Type);
if (data.Array == null || data.Array.Length < 1 || Size < 1) continue;
switch ((int)data.Type)
{
case 0x3E:
case 0x49:
case 0x4B:
s.A(0x20, true);
break;
if (data.Array == null || data.Array.Length < 1 || Size < 1) continue;
switch ((int)data.Type)
{
case 0x3E:
case 0x49:
case 0x4B:
s.A(0x20, true);
break;
}
if (data.Array.Length >= 4 && s.P % 0x4 != 0)
Binary file not shown.
+828 -828
View File
File diff suppressed because it is too large Load Diff
+3 -3
View File
@@ -6,10 +6,10 @@ using System.Runtime.InteropServices;
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("PD_Tool")]
[assembly: AssemblyCopyright("korenkonder (C) 2017-2023")]
[assembly: AssemblyCopyright("korenkonder (C) 2017-2024")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
[assembly: ComVisible(false)]
[assembly: Guid("7B5D5A3A-A6F8-4813-C97D-ACFC98F7397E")]
[assembly: AssemblyVersion("0.4.10.19")]
[assembly: AssemblyFileVersion("0.4.10.19")]
[assembly: AssemblyVersion("0.4.11.0")]
[assembly: AssemblyFileVersion("0.4.11.0")]