From b26cdc8b5cb6f257998d447f31daa89163b89899 Mon Sep 17 00:00:00 2001 From: Kuji Kitamura Date: Wed, 7 Aug 2019 21:24:59 +0300 Subject: [PATCH] Release v0.4.7.1 A3DA --- .gitignore | 2 + KKdBaseLib/Extensions.cs | 16 +- KKdBaseLib/Format.cs | 18 ++ KKdBaseLib/IKeyFrame.cs | 10 +- KKdBaseLib/KKdBaseLib.csproj | 4 +- KKdBaseLib/KKdList.cs | 32 +-- .../MessagePack => KKdBaseLib}/MsgPack.cs | 5 +- KKdBaseLib/Properties/AssemblyInfo.cs | 4 +- KKdBaseLib/Vector3.cs | 3 +- KKdBaseLib/Vector4.cs | 3 +- KKdBaseLib/bin/KKdBaseLib.dll | Bin 32768 -> 46080 bytes .../KKdBaseLib.csproj.CoreCompileInputs.cache | 1 - .../KKdBaseLib.csproj.FileListAbsolute.txt | 3 - KKdBaseLib/obj/Release/KKdBaseLib.dll | Bin 32768 -> 0 bytes KKdMainLib/A3DA.cs | 110 +++++----- KKdMainLib/Aet.cs | 1 - KKdMainLib/DB/Aet.cs | 1 - KKdMainLib/DB/Auth.cs | 4 +- KKdMainLib/DB/Spr.cs | 5 +- KKdMainLib/DEX.cs | 14 +- KKdMainLib/DataBank.cs | 1 - KKdMainLib/Extensions.cs | 199 ++++++++---------- KKdMainLib/F2nd/ENRS.cs | 104 +++++++++ KKdMainLib/F2nd/Header.cs | 8 +- KKdMainLib/F2nd/POF.cs | 83 +++++++- KKdMainLib/F2nd/Struct.cs | 46 ++-- KKdMainLib/IO/Directory.cs | 3 +- .../IO/{IOExtensions.cs => Extensions.cs} | 55 ++++- .../{MessagePack/JSONIO.cs => IO/JSON.cs} | 49 ++--- KKdMainLib/{MessagePack/IO.cs => IO/MP.cs} | 75 +++---- KKdMainLib/IO/Stream.cs | 50 ++--- KKdMainLib/KKdMainLib.csproj | 9 +- KKdMainLib/Main.cs | 39 ++-- KKdMainLib/MessagePack/MPExt.cs | 70 ------ KKdMainLib/Properties/AssemblyInfo.cs | 4 +- KKdMainLib/STR.cs | 61 +++--- PD_Tool/Program.cs | 4 +- PD_Tool/Properties/AssemblyInfo.cs | 4 +- PD_Tool/classes/DIVAFILE.cs | 15 +- PD_Tool/classes/Tools/A3D.cs | 34 ++- PD_Tool/classes/Tools/DEX.cs | 15 +- 41 files changed, 625 insertions(+), 539 deletions(-) create mode 100644 KKdBaseLib/Format.cs rename {KKdMainLib/MessagePack => KKdBaseLib}/MsgPack.cs (99%) delete mode 100644 KKdBaseLib/obj/Release/KKdBaseLib.csproj.CoreCompileInputs.cache delete mode 100644 KKdBaseLib/obj/Release/KKdBaseLib.csproj.FileListAbsolute.txt delete mode 100644 KKdBaseLib/obj/Release/KKdBaseLib.dll create mode 100644 KKdMainLib/F2nd/ENRS.cs rename KKdMainLib/IO/{IOExtensions.cs => Extensions.cs} (56%) rename KKdMainLib/{MessagePack/JSONIO.cs => IO/JSON.cs} (83%) rename KKdMainLib/{MessagePack/IO.cs => IO/MP.cs} (85%) delete mode 100644 KKdMainLib/MessagePack/MPExt.cs diff --git a/.gitignore b/.gitignore index 15a263f..3464999 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,7 @@ .vs build +KKdBaseLib/bin +KKdBaseLib/obj KKdMainLib/bin KKdMainLib/obj KKdMathLib/bin diff --git a/KKdBaseLib/Extensions.cs b/KKdBaseLib/Extensions.cs index 0c6b00e..535f1a4 100644 --- a/KKdBaseLib/Extensions.cs +++ b/KKdBaseLib/Extensions.cs @@ -99,7 +99,6 @@ namespace KKdBaseLib { if (IsBE) { for (byte i = 0; i < Len; i++) { bufPtr[i] = (byte)LE; LE >>= 8; } LE = 0; for (byte i = 0; i < Len; i++) { LE |= bufPtr[i]; if (i < Len - 1) LE <<= 8; } } return LE; } - public static sbyte CITSB(this int c) { if (c > 0x0000007F) c = 0x0000007F; else if (c < -0x00000080) c = -0x00000080; return ( sbyte)c; } @@ -162,6 +161,16 @@ namespace KKdBaseLib { c = c.Round(); if (c > 0xFFFFFFFF) c = 0xFFFFFFFF; else if (c < 0x00000000) c = 0x00000000; return ( uint)c; } + public static int ToInt32(this float f) => *( int*)&f; + public static uint ToUInt32(this float f) => *( uint*)&f; + public static long ToInt64(this double f) => *( long*)&f; + public static ulong ToUInt64(this double f) => *(ulong*)&f; + + public static float ToSingle(this int i) => *( float*)&i; + public static float ToSingle(this uint i) => *( float*)&i; + public static double ToSingle(this long i) => *(double*)&i; + public static double ToSingle(this ulong i) => *(double*)&i; + public static sbyte* GetPtr(this sbyte[] array) { fixed ( sbyte* tempPtr = array) return tempPtr; } public static byte* GetPtr(this byte[] array) { fixed ( byte* tempPtr = array) return tempPtr; } public static short* GetPtr(this short[] array) { fixed ( short* tempPtr = array) return tempPtr; } @@ -179,8 +188,9 @@ namespace KKdBaseLib public static string ToString(this object d) { if (d == null) return "Null"; - else if (d is float F32) return ToString(F32); - else if (d is double F64) return ToString(F64); + else if (d is bool Boolean) return Boolean ? "true" : "false"; + else if (d is float F32 ) return ToString(F32); + else if (d is double F64 ) return ToString(F64); return d.ToString(); } diff --git a/KKdBaseLib/Format.cs b/KKdBaseLib/Format.cs new file mode 100644 index 0000000..01706d0 --- /dev/null +++ b/KKdBaseLib/Format.cs @@ -0,0 +1,18 @@ +namespace KKdBaseLib +{ + public enum Format : byte + { + NULL = 0, + DT = 1, + PDA = 2, + DT2 = 3, + DTe = 4, + F = 5, + FT = 6, + F2LE = 7, + F2BE = 8, + MGF = 9, + X = 10, + XHD = 11, + } +} diff --git a/KKdBaseLib/IKeyFrame.cs b/KKdBaseLib/IKeyFrame.cs index dc75763..1896754 100644 --- a/KKdBaseLib/IKeyFrame.cs +++ b/KKdBaseLib/IKeyFrame.cs @@ -2,6 +2,8 @@ { public interface IKeyFrame { + TKey Frame { get; set; } + IKeyFrame Check(); IKeyFrame ToKeyFrameT0(); IKeyFrame ToKeyFrameT1(); @@ -13,7 +15,7 @@ public struct KeyFrameT0 : IKeyFrame { - public TKey Frame; + public TKey Frame { get; set; } public IKeyFrame ToKeyFrameT0() => new KeyFrameT0 { Frame = Frame }; @@ -34,7 +36,7 @@ public struct KeyFrameT1 : IKeyFrame { - public TKey Frame; + public TKey Frame { get; set; } public TVal Value; public IKeyFrame ToKeyFrameT0() => @@ -57,7 +59,7 @@ public struct KeyFrameT2 : IKeyFrame { - public TKey Frame; + public TKey Frame { get; set; } public TVal Value; public TVal Interpolation; @@ -94,7 +96,7 @@ public struct KeyFrameT3 : IKeyFrame { - public TKey Frame; + public TKey Frame { get; set; } public TVal Value; public TVal Interpolation1; public TVal Interpolation2; diff --git a/KKdBaseLib/KKdBaseLib.csproj b/KKdBaseLib/KKdBaseLib.csproj index 410cb91..e244ba1 100644 --- a/KKdBaseLib/KKdBaseLib.csproj +++ b/KKdBaseLib/KKdBaseLib.csproj @@ -1,4 +1,4 @@ - + @@ -41,9 +41,11 @@ + + diff --git a/KKdBaseLib/KKdList.cs b/KKdBaseLib/KKdList.cs index 37ffe6e..1c189c0 100644 --- a/KKdBaseLib/KKdList.cs +++ b/KKdBaseLib/KKdList.cs @@ -1,4 +1,5 @@ using System.Collections; +using System.Collections.Generic; namespace KKdBaseLib { @@ -17,20 +18,12 @@ namespace KKdBaseLib public bool NotNull => array != null; public int Capacity { get => array != null ? array.Length : -1; - set - { - if (array != null) System.Array.Resize(ref array, value); - else array = new T[value]; - } - } + set { if (array != null) System.Array.Resize(ref array, value); else array = new T[value]; + if (Count >= value) Count = value; } } public KKdList(T[] Array) - { - index = 0; - Count = Array.Length; - array = Array; - } + { index = 0; Count = Array.Length; array = Array; } public T Current => index < Count ? array[index] : default; @@ -66,15 +59,17 @@ namespace KKdBaseLib for (int i = index + 1; i < Count; i++) array[i - 1] = array[i]; + Count--; } public void RemoveRange(int IndexStart, int IndexEnd) { - if (IndexEnd - IndexStart < 1) return; if (IsNull) return; + if (IndexEnd - IndexStart < 1) return; for (int i = IndexStart; i < Count; i++) array[i] = array[i + IndexEnd - IndexStart]; + Count -= IndexEnd - IndexStart; } public T[] ToArray() => array; @@ -98,5 +93,18 @@ namespace KKdBaseLib else if (array[i] .Equals(val) ) return i; return -1; } + + public void Sort() + { List List = (List)this; List.Sort(); array = List.ToArray(); Count = List.Count; } + + public static explicit operator KKdList( List List) => + new KKdList { array = List.ToArray(), Count = List.Count }; + + public static explicit operator List(KKdList List) + { + List list = new List(); + for (int i = 0; i < List.Count; i++) list.Add(List[i]); + return list; + } } } diff --git a/KKdMainLib/MessagePack/MsgPack.cs b/KKdBaseLib/MsgPack.cs similarity index 99% rename from KKdMainLib/MessagePack/MsgPack.cs rename to KKdBaseLib/MsgPack.cs index 70bf4e0..c3a50a3 100644 --- a/KKdMainLib/MessagePack/MsgPack.cs +++ b/KKdBaseLib/MsgPack.cs @@ -1,7 +1,6 @@ using System; -using KKdBaseLib; -namespace KKdMainLib.MessagePack +namespace KKdBaseLib { public struct MsgPack : IDisposable, IEquatable { @@ -107,7 +106,7 @@ namespace KKdMainLib.MessagePack public MsgPack Add(string Val, ulong val) => Add(new MsgPack(Val, val)); public MsgPack Add(string Val, float val) => Add(new MsgPack(Val, val)); public MsgPack Add(string Val, double val) => Add(new MsgPack(Val, val)); - + public bool ReadBoolean(string Name) => ReadNBoolean(Name).GetValueOrDefault(); public sbyte ReadInt8(string Name) => ReadNInt8(Name).GetValueOrDefault(); public byte ReadUInt8(string Name) => ReadNUInt8(Name).GetValueOrDefault(); diff --git a/KKdBaseLib/Properties/AssemblyInfo.cs b/KKdBaseLib/Properties/AssemblyInfo.cs index 8f23168..170a8c3 100644 --- a/KKdBaseLib/Properties/AssemblyInfo.cs +++ b/KKdBaseLib/Properties/AssemblyInfo.cs @@ -11,5 +11,5 @@ using System.Runtime.InteropServices; [assembly: AssemblyCulture("")] [assembly: ComVisible(false)] [assembly: Guid("437F63F1-8C23-429E-AB14-38B85C9EDB16")] -[assembly: AssemblyVersion("0.0.1.0")] -[assembly: AssemblyFileVersion("0.0.1.0")] +[assembly: AssemblyVersion("0.0.1.1")] +[assembly: AssemblyFileVersion("0.0.1.1")] diff --git a/KKdBaseLib/Vector3.cs b/KKdBaseLib/Vector3.cs index 8e0ebd2..90cb26f 100644 --- a/KKdBaseLib/Vector3.cs +++ b/KKdBaseLib/Vector3.cs @@ -10,8 +10,7 @@ { this.X = X; this.Y = Y; this.Z = Z; } public double Length => (X * X + Y * Y + Z * Z).Sqrt(); - public Vector3 Normalized => this = new Vector3() - { X = X * (1 / Length), Y = Y * (1 / Length), Z = Z * (1 / Length) }; + 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; } diff --git a/KKdBaseLib/Vector4.cs b/KKdBaseLib/Vector4.cs index e276265..a76716d 100644 --- a/KKdBaseLib/Vector4.cs +++ b/KKdBaseLib/Vector4.cs @@ -11,8 +11,7 @@ { this.X = X; this.Y = Y; this.Z = Z; this.W = W; } public double Length => (X * X + Y * Y + Z * Z + W * W).Sqrt(); - public Vector4 Normalized => this = new Vector4() - { X = X * (1 / Length), Y = Y * (1 / Length), Z = Z * (1 / Length), W = W * (1 / Length) }; + 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; } diff --git a/KKdBaseLib/bin/KKdBaseLib.dll b/KKdBaseLib/bin/KKdBaseLib.dll index 9adfdc16a677e6fe52d433c81c5eb3b6a3b4fd5b..cc7a89e00243db8880c98df7c61a5567ee22fa07 100644 GIT binary patch literal 46080 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

WS?L9^b6RXO9(`11ad)dV%ff+; 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

  • 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
  • zWT1bbZ=`Pk^|fsPUyg&mZArGOAhma5WP4}>O@ex8GYd7UU=kFkQx8)X zsG@T6G^!j`E=EC{8?Gu)sx|q+aFh*;OibuP!lEdROr&fV5*`*tqVl^$keCQ+J2W9I zDhiBqDU^xAg1w_i!XR~4LHDQxYKNMk8Gxe_;cG~V@R~LWzNC>t!j%O|l8FR*s*5sT z6{AikIr$k{od%d;stgjEnMuN-3zfMUs)V71N}Vc`)*Y+W&zcSLJAjsp6Hn*(#Esq132I*dSHLko>}&7_D|lVO}DRI1&|+TbQHLaeO5DR8T-c zqBdMxh#K)QAk{f4>QgsmZYGElwF%%QFm$YwK1xlY3WpxaRSm}=pkH}fNE3C%aY`L9 z5jp9q%uH2gXaRh&E4{D)oYCgwsWmEHS5+=lUtpZowNP!O*gJQaN~g|JqgU9lS`*=_ z^up|Hl-J6@Y#(*Lx{fR~KVOxTt|?Ab7Z|G=#5!fBDo3dsQfnnqse`dcTQ^*5oDoq} zpvujMu~w_AHxmi1>7&xs%}h{b6zbFk#c?WKjyk_?p1xq1HaAP1T?j$=tle-`euhq+ zS2r_Um8C4y6!d_0sdTlza6zSp;#C@D5#{o0^YvB6>0lyd6nvTyrp+tXsj~+eWku!3 ztCX2Nb2Y`EQ_sm$<{D-2g9ZJ7y3^GfXnSq3gf7L<^K`h7R9H$1RU}q5JYJQr(hb7_ zn-9~08}>c3NH?V>i=-E3;h>Jl&Cq7TkRy>AtyUMN0=obbit`IpIo^Do-hA*e2L>qp z0wI>=Iar}dSV1-kJzWkIxIrXQnLCKUNFD@(F@F&0p)43gr)G>QHyhY^WoDe3XwwIC z6Ne;%I98QS`@il= zt&dt)_{JozKb(qwoQ7uLI71T&h3N%4B?t9^R%K~mALA8ZVN+8+wh#v)w{}G3W@%~T z!wPjeSeGe|fjx^v6y-r2l{yl|X~Gc1B}+%L=%QnQ+JZqK?4mA!X#o=-_B-g!80~OK zY3K9d#wx>A8ERNV6I6Lhm^@lA%`axi(@{g0HbmaI{Q{*4463*Ss)0#pdcHm;;c8`e zt~MWbRD(!Axae-D%}aohs?Jb-lC59O4EfyJ1Y;4lEKrBlRF$n$0T+=ABNI~a4`)L@ z^karjo3G6(@TRLPUTh9L}rd>Es!&8dMgtU(4Z^u6a@yUZB!!n7K` z)6hgd3C#e)x2l^;lLspn2?Gc6Nf+quA*zCWlCB04r&A46YYRb_?jxZE=s^4otcNk}woV57-`K@$WG6!#fdqEDUQB ziPH{;1)+$jaTA83Fx2U8O^;g8D_p9?gBMAJ0}?j42dv2IJWVk-0hD=4XnZl}gdSj6 zuwyX;_^4c!9`R1-yAlqvvRJse)8O}`1>Sfd7PtWiU-=NUBE%w$XdyS36p#*Z(k8aC zfE6TyN_0dGcY*NbX-N{7Ytj+&l8yKjBfc-klh!%Yik{A$5jH`xdC-*)T`h?~K^UQe zVWc7;R<_8RBVj3yklI>1u{Okp0X-+7gq29)DTA>t8*f!MSx6W&Gaynkcos1;FyoW+PG5zZ1!r4i0jOl1+yGEC(W&T>pmBAiVy zHH~mK#nddq8ERpiMN%+rY6d=;3nbvGt;kCk;)~Et(AgCT&iaTVjK9I zARuq9mvao2x#?vbLuHm*kYy$G;53(+-qHn*0rwpN@$ zTPw~8G{AMQ_ftc#^kB7~|!z7v3Ou6Q>{Fsd;~;-ou9^zY*sP(4|y z|I6V*e7=KkesG_%rQS^0xO&sicqR4L&&k@=)o`ToROk=;o(lf_(FuRQ0seU^!eBip z)Tuh}D_4@F=Kk%$F#Ax=)1JA{Ew0-H#LICw=!#7HDaq)22)gjkCRi5Q6l zi3}=bEQHQNOhnG`%LC28S366K8OUu`qQu#l#FJ zGHWhHx6GZSK)5*!4BX{#NQimxiys^kArk447?D_yB#0z>gv~OS>X8hQOpoM<*(nZdy95-DKx17H~`%mM|m9tuknBbAC2gv*6F z4?2(u)#J3nMH5yiI;|w23QIbXDFigNAtnkT&%rzfDXdH|SIxk%Rg9FdRx$VwN@D_d zO_-R`)Qn;(01U_~Mn(jffQDSpS;c@aUv8xGtwVxVA)(ge%qXS; zY8^7rIwYWh)+uKdht}gb>v7QUT+Co2mBJ4zbi-}IjW~(iFlNA+fe4ljAaSrhK#<|n z7=Q5~k+tiqQ|85Lb0dl}RPZxCf;CHRsdi#R= z<_!#)_-w9G7RSOZRRb)gFyttxHe8ko=~D`A6(J)xt$0b89&y;pmhdxk4E$vBnUG+U zY~Tm;c0k?^qdXA7ecTs55Ldh*tp zIJ@|DbN|`xn#U}?9atQ~3QcE@8)qr4dSdxU8L?_w{Ee^&QIh$hOxu@n7yG6Dy4EeN z;AMjXQABdusLEX)%Ude`9C3X_)8M2R4PL+AxNux|XQ$V1uibh6_Qbw@|7=|Q_k*)qCa=dx zs#c`6EVA1z9VnVuX_aTXm@FI9y0Trhq~bw`En|EvMK?p`zp|n81PtTF>f)6JEKt6DvAbkNF__95T585g+zuhKXEo88wT_byXws zI__+A&0>3b%PRl0c9$gPW13Z)wwHL9#Vwi~SZ;4hGD2JzXiQWy$_G>jKC!-JVLo<6 zb*DV*5{c8RxVy~eO3AaT@Hk1s&_v;|+0O3K)=k2h z@*k@#<4h0T?BXR^R5_qJn9IIZJ?HEpu|wN=78AyvPHULN_8B{}GIo=TlO($`@QIDI z@bUtiqEM%9!Uqcb2IZ40%=yGama zGElg2OjxzFy?C$qhQO}z{w_(6oqFUu1s+mlWgoJByTH=*zLqSr4|{*@NcPi@xnD27 z8@=vk+k=m0{jAPSd=`7q?BIYY6I(Uju(My_(yl`{#s_zK+U?+q1~d8uMLtbBc&mYn zBJlSg1hzB!28BKio$|gx&pA#rLg#%~^yBRpn(n=VdOr;~vL|iRte$;?!k)$)+|uA= zpP;UROH-frzcb=)tC!DhTgR15x*2BMI&pV5oy1|)o4h;kX2k7IYSlSjm*O#PR* zYjH!juNPlvvBK76#havq(XPuB#nKgC)wUpddBTec{+L4*_TVcE1G`0Sykr2A-2nwzd1kUVyocZ z&)WN#<<2eXaIM8#)13pJ4XHLilD&V)tW=YB&6kOWM+G-(+~RHLsspae1j8krtdGqt znREN*zy^PpTcoEy3bOdyY~Jc^+C8_$3pU=i?-qNj^xIk5xMvqzy^ZKTdh;x8;0eeVF>!qkp)o-LVm_MaaUb-R}3CjNQjyK|3c1&Ing zUe1q-{byT$-7c5DZf_UO{m}hj->PP=7L_Z;E|v9(j(vW#;SqK4K##Y@k&lbMEm|cj z4YOHFN+(Qy?fa}j(e}uUiJMa^&#ruRF)H@n^XMZFibr?MT2=61gr?62^Mj8QKX@Ne zk9vM`R>J#!4fge0Q##}J*1fy>K27x)z3g^Gb!zj~PhT`Ta?fW(*GHwhC39XiPP{U* z+cUo>n{E#;U;kuU#SPQOUoZY@Uyo8s@McE$*u$kUx(*+2%{u#ZNAyQoQJ28$ zvuA0Uj?Eu49evmOt-N;!Dl7?F+5Y^4!iFH9h?7W<0B77m-N!@TH3nR%hHW=N|SZ(f=9Y8Gkp~m9HZO3J^e4+ zqCP&UO^b_sYTSeR?Hc{w_3^C58+zLmnJsO0XXKuCH67laZT)*^N%PeY-%B6_x;ULn z`{sea*GzPEvG_Pidw2eZlZ~eAYZch3=6d{xoRuG}4nj*V-tT$l>4D0Qvs#vQjt+ME z5TP6Vc)$_$Kf0J_4WBGMbA9N_J+EC;rNMDmYT6xn(07f6t5)2yd23-y+s>|m>m|Xn z7GGGg+O{TXP0i$4HHk-Rdg~g_UKSO5>z^C0%VfdxOWfaBK)c>Ax}8&Pa^zuEsr%d3 zt}cQT-D01g?+ZhAnBCGw1t}Xxo1HZ2@O$eU-D3ZFz5e#O(i>5uZQHkeyT1DItiC=Y zvR=J@?Alt~x!XYUG5V>?+;^Q@y*26nG5g4x&I^W}Ueh_?$b5DH1g^=fvu^^T_F9kY zKDwn(^yoI5x&=EYxvqX~(I_Z&*T-Q+p{LaUJepb3#HRGcwR3MSPs-nQ?$wK$1FOH; zVRP|f%ZAIM-fP=E$!W-RaM{tM=;er!RHH%nR{nt$lGV#n$8C(rq9>yu`uFQ>ej zyW{5Xlip2A+5UXqL7R22^WUg~^WWU7uGzl+>8<$wM@kDXCavpHvgPbo)h8!yTi@=^ zmMKj{KWyLg$DuTq0z#tgF9YL9vOD{%&HT6ofakD7{7hx zk1q#QeKhSjYx76ZjvX)N@3?;Z-N8;Bm!CMf%>g$)7HH!lqRYVI-#@;YAA77* z=~Rz)ZQp)-sps?I-Xk{+y7}Psf(QK{{MEew{QH^%$27YJtoBG;xAEDJGkYIwaqM;e z@nfpBhkJJqNY>ol^|yJ6)l;4=X`J9Ot-n|FOz*j#+5hyW$H}DensQ-*=vis*)@q6muPh+ z+~HVQxVUp%cngcCmk$*GYE^YItjmT?K~~Qq+$@!oq+tcK zS-y6*yF=n!ZJ_t|QTOJ`uZ>#Cz8^iN) zWq5Y=-1O-7Z`Xz1NYxCTz0dB&#i?G6p9w;1!Zsg_9_@2~;uJ5d+Y`rrJe(fg{B5Jq z(k+*)BR=*yb>psYo4oJ#TlaWBqfgS4RefxV4p;o6D&P0Zqz^xr>}#FpxuA37W2KeP zBg!oXG&n4deb(OdiPg#Z;^4N|HWy722Nz!26u!35Pck+C@ad%|zw7kEZ(*CGchizP zn4D$z$*Pa%l#DuCILcyD;f(i94_&=5a#6{~-pAd(xlojwcKq_&lj_3KhX35E>~v)0 zjRC*U&NwtByJGsuL*`wN1nn+8JhAwPoqu$_oV+{u#LVp_^DjMnb>p{y=>?lJojV1_ zA8s6UYF5&QuXar6=A1C4M|OGkE#C>VOg*AcKZ@NQ+tX)Ln`zpgYA*H*yu07cRQ^NX z{e_Fu8jN!2;2kw*^2g4xHF^90Z1J1sG54@jO4;Y&+)3$Tl=iY zI5P41{@jEeHgkQQzbWvX5^sO(<)+)sO%oTbSya<<$e0_`f{!iv_1=(^&G&6tyX)JZ zm+#s8)3=XDY<&H$ZSRfASK18G9M~{%;L&F@7Cis{^-HbwcKgE4^LD(N+#PZI)V zJ?F9m&$Kx=qoR%NWO+u!c)zt3y{GwmPBu*)xmy{PwW?BJGksixL+-0bbU)pu{J348 zHIMf+@!k38+-vWfUMF5;_zW)3*%Cf`YWVEwADpthta{`QZW|xJpzW&Pw~*iC2A@83 ze?|0LyQAm2ww&a(df=~(`g=Dld6;$Jo8Mw`%C{Zz%h|l7_?M=KQ!iXOcWzU~?0M~* zT$ylr>)wTzE}gzSys%xto4W%R1nVX|+W)4F|9tby`J<0+Ubc7VyL%@acMj4Hy?RQJ zZIb)u!nD^_dC@J#hkIB&NY^atFKE?%z~lzg@?0!(8(Z&DZ*_YW{?q!RWikFfNsSiA zob9LH*ooQE++~mVlF{QY{(L;?>MGa62|c3!Ov`<6`o;CXk33094v1cTf7mU0 zBt7iVC|4nEoN$q`T>NGu+-yU)C}wtfbX~rA`O(7A4(p8MAJU z@8W}Jo(J~Wu`7Anb?4A*zXkH?kGyWTEnINFN#hk8ryNNC@t1M=1Jg4Wu5ov{W4+cV z#`A~p4D&snNe43ite)|YX4LtRa}HDIPGn>(kuo2OOuzSd%S(Ue^0vcN%X zj#;BJi+OGVnQwncvzf4M>BS`(rxKT6*!FVckcX)kbJy><7yh%}Yp-pi zKF3>^KJB-CSJ7+x9#cz$_k91;``EMPC;jLDlUVv>@Af7qpIklIy&V(nJFC?%J7=vK z9^bU+@y@1u+S(m0IoC1lL7yYjUUeMPOglKNZ}y~N4}Z41va{&azIWG`Yz=JkwruL;)wZPWF!HPW*SGd>5jbytlymj!s{7p@_7%HaxIU)%!S3pr zG5ZEAzCLs6z1QDpwF9qhOy8locD?ZG#pJNzIl;c~#?Dx`+UZKb@H>-^|2$&%x)x7t zHl_Y4v|c>3q+Q-Mo&vOxznEtZM$%oh=u3HCULvZ9`SbF6X)G z>U9qWTn;*R#75~R>f_gcTzWI>*Oe8%xhIy9T_&F?Wj;^o6h*RNO1>A32~w!ijN1lbOMd#-Zy#a*w* zJWt$zXUJRc#gTH{BLL zr^{>Ih4jGL4r51dNm;Sy?BWA8&#&J~Zypu^cXMG-def;~44<{S#>##9-S<#G1U#}_uZS%u#O;3AO#Xi;kQD*rq+3#~pA&hek ziOkDR`)TZg+3#0e+0yBN)7jEn1D|hZXIejRdd9C!mj>~})BEWD+;(*3_j4zY&wbhR zj^}x^gEs>XG_Pn-F3c+En%O*26n=H}yB*(5+&Mq>-ssoPhl4JjZSkz_*WyifeY1uQ zvyBYs6LUG|i22*r4}SgT!Q?4Fty>eGr0OOvYB{LV;ScGU_AA^*9qoU$^TWpP-%h=> z=;w6{e=h8vn9^>r-H501Qw_Jc&+6d)kHsU+?>&yM-7|Il{Ut}Hwhd_aX28jk8;dsX+IM-zn`QR7ZAbTxEf_f4`^VtZ=1&?M4W9qU{$CRT?*D=3 zKuB5LCey#lMBt+N6FKU2gP)`dLSo=8l>QSV2mrPZNg$~}BjE3!B# UsedValues; private Dictionary Dict; - private bool IsX => Data.Format == Main.Format.X || Data.Format == Main.Format.XHD; + private bool IsX => Data.Format == Format.X || Data.Format == Format.XHD; public Stream IO; public A3DAData Data; @@ -48,7 +48,7 @@ namespace KKdMainLib.A3DA Data = new A3DAData(); Header Header = new Header(); - Data.Format = IO.Format = Main.Format.F; + Data.Format = IO.Format = Format.F; Header.SectionSignature = IO.ReadInt32(); if (Header.SectionSignature == 0x41443341) { Header = IO.ReadHeader(true, true); Data.Format = Header.Format; } @@ -60,7 +60,7 @@ namespace KKdMainLib.A3DA if (Header.SectionSignature == 0x5F5F5F41) { IO.Position = 0x10; - Header.Format = IO.Format = Main.Format.DT; + Header.Format = IO.Format = Format.DT; } else if (Header.SectionSignature == 0x5F5F5F43) { @@ -82,7 +82,7 @@ namespace KKdMainLib.A3DA } else { IO.Close(); return 0; } - if (Header.Format == Main.Format.DT) + if (Header.Format == Format.DT) Data.StringLength = IO.Length - 0x10; string[] STRData = IO.ReadString(Data.StringLength).Replace("\r", "").Split('\n'); @@ -110,6 +110,7 @@ namespace KKdMainLib.A3DA nameView = ""; dataArray = null; Dict = null; + IO = null; return 1; } @@ -168,14 +169,14 @@ namespace KKdMainLib.A3DA if (Dict.FindValue(out value, "dof.name")) { Data.DOF = new DOF { Name = value }; - Data.Format = Main.Format.FT; + Data.Format = Format.FT; Data.DOF.MT = Dict.ReadMT("dof" + d); } if (Dict.FindValue(out value, "ambient.length")) { Data.Ambient = new Ambient[int.Parse(value)]; - Data.Format = Main.Format.MGF; + Data.Format = Format.MGF; for (i0 = 0; i0 < Data.Ambient.Length; i0++) { name = "ambient" + d + i0 + d; @@ -343,7 +344,7 @@ namespace KKdMainLib.A3DA if (Dict.FindValue(out value, "material_list.length")) { Data.MaterialList = new MaterialList[int.Parse(value)]; - Data.Format = Main.Format.X; + Data.Format = Format.X; for (i0 = 0; i0 < Data.MaterialList.Length; i0++) { name = "material_list" + d + i0 + d; @@ -488,7 +489,7 @@ namespace KKdMainLib.A3DA IO.Write("_.file_name=", Data._.FileName); IO.Write("_.property.version=", Data._.PropertyVersion); - if (Data.Ambient != null && Data.Format == Main.Format.MGF) + if (Data.Ambient != null && Data.Format == Format.MGF) { SO0 = Data.Ambient.Length.SortWriter(); SOi0 = 0; @@ -569,7 +570,7 @@ namespace KKdMainLib.A3DA IO.Write("curve.length=", Data.Curve.Length); } - if (Data.DOF != null && Data.Format == Main.Format.FT) + if (Data.DOF != null && Data.Format == Format.FT) { IO.Write("dof.name=", Data.DOF.Name); IO.Write(Data.DOF.MT, "dof" + d, A3DC, IsX); @@ -1014,7 +1015,7 @@ namespace KKdMainLib.A3DA public byte[] A3DCWriter() { if (A3DCOpt) UsedValues = new Dictionary(); - if (Data.Format < Main.Format.F2LE) Data._.CompressF16 = null; + if (Data.Format < Format.F2LE) Data._.CompressF16 = null; IO = File.OpenWriter(); for (byte i = 0; i < 2; i++) @@ -1025,9 +1026,9 @@ namespace KKdMainLib.A3DA if (Data.CameraRoot != null) for (i0 = 0; i0 < Data.CameraRoot.Length; i0++) { - IO.WriteOffset(ref Data.CameraRoot[i0].Interest, ReturnToOffset); IO.WriteOffset(ref Data.CameraRoot[i0]. MT, ReturnToOffset); IO.WriteOffset(ref Data.CameraRoot[i0].VP. MT, ReturnToOffset); + IO.WriteOffset(ref Data.CameraRoot[i0].Interest, ReturnToOffset); } if (Data.DOF != null) @@ -1085,12 +1086,12 @@ namespace KKdMainLib.A3DA if (Data.CameraRoot != null) for (i0 = 0; i0 < Data.CameraRoot.Length; i0++) { - Write(ref Data.CameraRoot[i0].Interest); Write(ref Data.CameraRoot[i0]. MT); Write(ref Data.CameraRoot[i0].VP. MT); - Write(ref Data.CameraRoot[i0].VP.FOV ); - Write(ref Data.CameraRoot[i0].VP.FocalLength); Write(ref Data.CameraRoot[i0].VP.Roll ); + Write(ref Data.CameraRoot[i0].VP.FocalLength); + Write(ref Data.CameraRoot[i0].VP.FOV ); + Write(ref Data.CameraRoot[i0].Interest); } if (Data.Chara != null) @@ -1101,16 +1102,14 @@ namespace KKdMainLib.A3DA for (i0 = 0; i0 < Data.Curve.Length; i0++) Write(ref Data.Curve[i0].CV); - if (Data.DOF != null && Data.Format == Main.Format.FT) + if (Data.DOF != null && Data.Format == Format.FT) Write(ref Data.DOF.MT); - if (Data.Fog != null) - for (i0 = 0; i0 < Data.Fog.Length; i0++) + if (Data.Light != null) + for (i0 = 0; i0 < Data.Light.Length; i0++) { - Write(ref Data.Fog[i0].Density); - Write(ref Data.Fog[i0].Diffuse); - Write(ref Data.Fog[i0].End ); - Write(ref Data.Fog[i0].Start ); + Write(ref Data.Light[i0].Position ); + Write(ref Data.Light[i0].SpotDirection); } if (Data.Light != null) @@ -1120,8 +1119,15 @@ namespace KKdMainLib.A3DA Write(ref Data.Light[i0].Diffuse ); Write(ref Data.Light[i0].Incandescence); Write(ref Data.Light[i0].Specular ); - Write(ref Data.Light[i0].Position ); - Write(ref Data.Light[i0].SpotDirection); + } + + if (Data.Fog != null) + for (i0 = 0; i0 < Data.Fog.Length; i0++) + { + Write(ref Data.Fog[i0].Density); + Write(ref Data.Fog[i0].Diffuse); + Write(ref Data.Fog[i0].Start ); + Write(ref Data.Fog[i0].End ); } if (Data.MObjectHRC != null) @@ -1178,8 +1184,8 @@ namespace KKdMainLib.A3DA Write(ref Data.PostProcess.Diffuse ); Write(ref Data.PostProcess.Specular ); Write(ref Data.PostProcess.LensFlare); - Write(ref Data.PostProcess.LensGhost); Write(ref Data.PostProcess.LensShaft); + Write(ref Data.PostProcess.LensGhost); } IO.Align(0x10, true); @@ -1188,7 +1194,7 @@ namespace KKdMainLib.A3DA byte[] A3DAData = A3DAWriter(true); IO = File.OpenWriter(); - IO.Offset = Data.Format > Main.Format.FT ? 0x40 : 0; + IO.Offset = Data.Format > Format.FT ? 0x40 : 0; IO.Position = 0x40; Data.StringOffset = IO.Position; @@ -1218,13 +1224,13 @@ namespace KKdMainLib.A3DA IO.WriteEndian(Data.BinaryLength, true); IO.WriteEndian(0x20, true); - if (Data.Format > Main.Format.FT) + if (Data.Format > Format.FT) { IO.Position = A3DCEnd; IO.WriteEOFC(0); IO.Offset = 0; IO.Position = 0; - Header Header = new Header { Signature = 0x41443341, Format = Main.Format.F2LE, + Header Header = new Header { Signature = 0x41443341, Format = Format.F2LE, DataSize = A3DCEnd, SectionSize = A3DCEnd, InnerSignature = 0x01131010 }; IO.Write(Header, true); } @@ -1254,7 +1260,7 @@ namespace KKdMainLib.A3DA Key.BinOffset = IO.Position; int Type = Key.Type.Value; if (Key.EPTypePost.HasValue) Type |= (Key.EPTypePost.Value & 0xF) << 12; - if (Key.EPTypePre .HasValue) Type |= (Key.EPTypePre .Value & 0xF) << 12; + if (Key.EPTypePre .HasValue) Type |= (Key.EPTypePre .Value & 0xF) << 8; IO.Write(Type); IO.Write(0x00); IO.Write((float)Key.Max); @@ -2162,7 +2168,7 @@ namespace KKdMainLib.A3DA else if (Key.RawData.KeyType == 3) for (i = 0; i < Key.Trans.Length; i++) IO.Write(Key.Trans[i].ToKeyFrameT3().ToString(false) + ((i + 1 < Key.Trans.Length) ? "," : "")); - IO.Position = IO.Position - 1; + IO.Position--; IO.Write('\n'); IO.Write(Temp + "raw_data.value_list_size=", Key.RawData.ValueListSize); IO.Write(Temp + "raw_data.value_type=" , Key.RawData.ValueType ); @@ -2220,7 +2226,7 @@ namespace KKdMainLib.A3DA if (Key.EPTypePost == 0) Key.EPTypePost = null; if (Key.EPTypePre == 0) Key.EPTypePre = null; } - Key.Type = Key.Type & 0xFF; + Key.Type &= 0xFF; Key.Trans = new IKeyFrame[(int)Key.Length]; KeyFrameT3 Temp; for (int i = 0; i < Key.Length; i++) @@ -2386,38 +2392,21 @@ namespace KKdMainLib.A3DA if (Key.RawData.KeyType != null) Keys.Add("RawData", true); MsgPack Trans = new MsgPack(Key.Trans.Length, "Trans"); - MsgPack K; for (int i = 0; i < Key.Trans.Length; i++) if (Key.Trans[i] is KeyFrameT0 KeyFrameT0) - { - K = new MsgPack(1); - K[0] = (MsgPack)KeyFrameT0.Frame; - Trans[i] = K; - } + Trans[i] = new MsgPack(null, new MsgPack[] + { (MsgPack)KeyFrameT0.Frame }); else if (Key.Trans[i] is KeyFrameT1 KeyFrameT1) - { - K = new MsgPack(2); - K[0] = (MsgPack)KeyFrameT1.Frame; - K[1] = (MsgPack)KeyFrameT1.Value; - Trans[i] = K; - } + Trans[i] = new MsgPack(null, new MsgPack[] + { (MsgPack)KeyFrameT1.Frame, (MsgPack)KeyFrameT1.Value }); else if (Key.Trans[i] is KeyFrameT2 KeyFrameT2) - { - K = new MsgPack(3); - K[0] = (MsgPack)KeyFrameT2.Frame; - K[1] = (MsgPack)KeyFrameT2.Value; - K[2] = (MsgPack)KeyFrameT2.Interpolation; - Trans[i] = K; - } + Trans[i] = new MsgPack(null, new MsgPack[] + { (MsgPack)KeyFrameT2.Frame, (MsgPack)KeyFrameT2.Value, + (MsgPack)KeyFrameT2.Interpolation }); else if (Key.Trans[i] is KeyFrameT3 KeyFrameT3) - { - K = new MsgPack(4); - K[0] = (MsgPack)KeyFrameT3.Frame; - K[1] = (MsgPack)KeyFrameT3.Value; - K[2] = (MsgPack)KeyFrameT3.Interpolation1; - K[3] = (MsgPack)KeyFrameT3.Interpolation2; - Trans[i] = K; - } + Trans[i] = new MsgPack(null, new MsgPack[] + { (MsgPack)KeyFrameT3.Frame, (MsgPack)KeyFrameT3.Value, + (MsgPack)KeyFrameT3.Interpolation1, (MsgPack)KeyFrameT3.Interpolation2 }); Keys.Add(Trans); } else if (Key.Value != 0) Keys.Add("Value", Key.Value); @@ -2457,6 +2446,8 @@ namespace KKdMainLib.A3DA public int StringLength; public int StringOffset; + public Format Format; + public string[] Motion; public string[] ObjectList; public string[] ObjectHRCList; @@ -2472,7 +2463,6 @@ namespace KKdMainLib.A3DA public ObjectHRC[] ObjectHRC; public CameraRoot[] CameraRoot; public MObjectHRC[] MObjectHRC; - public Main.Format Format; public PlayControl PlayControl; public PostProcess PostProcess; public MaterialList[] MaterialList; diff --git a/KKdMainLib/Aet.cs b/KKdMainLib/Aet.cs index 4f24b43..ad29ae2 100644 --- a/KKdMainLib/Aet.cs +++ b/KKdMainLib/Aet.cs @@ -3,7 +3,6 @@ using KKdBaseLib; using KKdMainLib.IO; using KKdMainLib.F2nd; -using KKdMainLib.MessagePack; namespace KKdMainLib.Aet { diff --git a/KKdMainLib/DB/Aet.cs b/KKdMainLib/DB/Aet.cs index df55da7..7b78d99 100644 --- a/KKdMainLib/DB/Aet.cs +++ b/KKdMainLib/DB/Aet.cs @@ -3,7 +3,6 @@ using System.Collections.Generic; using KKdBaseLib; using KKdMainLib.IO; -using KKdMainLib.MessagePack; namespace KKdMainLib.DB { diff --git a/KKdMainLib/DB/Auth.cs b/KKdMainLib/DB/Auth.cs index 70e2ae6..28000e1 100644 --- a/KKdMainLib/DB/Auth.cs +++ b/KKdMainLib/DB/Auth.cs @@ -1,8 +1,8 @@ using System; using System.Collections.Generic; +using KKdBaseLib; using KKdMainLib.IO; using KKdMainLib.A3DA; -using KKdMainLib.MessagePack; namespace KKdMainLib.DB { @@ -20,7 +20,7 @@ namespace KKdMainLib.DB IO = File.OpenReader(file + ".bin"); - IO.Format = Main.Format.F; + IO.Format = Format.F; Signature = IO.ReadInt32(); if (Signature != 0x44334123) return; Signature = IO.ReadInt32(); diff --git a/KKdMainLib/DB/Spr.cs b/KKdMainLib/DB/Spr.cs index e7c7ba7..6fdd90b 100644 --- a/KKdMainLib/DB/Spr.cs +++ b/KKdMainLib/DB/Spr.cs @@ -3,7 +3,6 @@ using System.Collections.Generic; using KKdBaseLib; using KKdMainLib.IO; -using KKdMainLib.MessagePack; namespace KKdMainLib.DB { @@ -85,8 +84,8 @@ namespace KKdMainLib.DB List SetName = new List(); List SetFileName = new List(); - List Ids = new List(); - List SetIds = new List(); + List Ids = new List(); + List SetIds = new List(); List NotAdd = new List(); SpriteTexture temp; diff --git a/KKdMainLib/DEX.cs b/KKdMainLib/DEX.cs index 243f513..e569e64 100644 --- a/KKdMainLib/DEX.cs +++ b/KKdMainLib/DEX.cs @@ -1,7 +1,7 @@ using System.Collections.Generic; +using KKdBaseLib; using KKdMainLib.IO; using KKdMainLib.F2nd; -using KKdMainLib.MessagePack; namespace KKdMainLib { @@ -21,7 +21,7 @@ namespace KKdMainLib Header = new Header(); IO = File.OpenReader(filepath + ext); - Header.Format = Main.Format.F; + Header.Format = Format.F; Header.SectionSignature = IO.ReadInt32(); if (Header.SectionSignature == 0x43505845) Header = IO.ReadHeader(true); @@ -31,7 +31,7 @@ namespace KKdMainLib Offset = IO.Position - 0x4; Dex = new EXP[IO.ReadInt32()]; int DEXOffset = IO.ReadInt32(); - if (IO.ReadInt32() == 0x00) Header.Format = Main.Format.X; + if (IO.ReadInt32() == 0x00) Header.Format = Format.X; int DEXNameOffset = IO.ReadInt32(); if (Header.IsX) IO.ReadInt32(); @@ -92,13 +92,13 @@ namespace KKdMainLib return 1; } - public void DEXWriter(string filepath, Main.Format Format) + public void DEXWriter(string filepath, Format Format) { Header = new Header(); - IO = File.OpenWriter(filepath + (Format > Main.Format.F ? ".dex" : ".bin"), true); + IO = File.OpenWriter(filepath + (Format > Format.F ? ".dex" : ".bin"), true); Header.Format = IO.Format = Format; - IO.Offset = Format > Main.Format.F ? 0x20 : 0; + IO.Offset = Format > Format.F ? 0x20 : 0; IO.Write(0x64); IO.Write(Dex.Length); @@ -157,7 +157,7 @@ namespace KKdMainLib IO.Position = Position0 - (Header.IsX ? 8 : 4); IO.Write(Position1); - if (Format > Main.Format.F) + if (Format > Format.F) { Offset = IO.Length; IO.Offset = 0; diff --git a/KKdMainLib/DataBank.cs b/KKdMainLib/DataBank.cs index 8ec1251..a3efbb6 100644 --- a/KKdMainLib/DataBank.cs +++ b/KKdMainLib/DataBank.cs @@ -2,7 +2,6 @@ using System.Net; using KKdBaseLib; using KKdMainLib.IO; -using KKdMainLib.MessagePack; namespace KKdMainLib { diff --git a/KKdMainLib/Extensions.cs b/KKdMainLib/Extensions.cs index 158be1d..0d136dd 100644 --- a/KKdMainLib/Extensions.cs +++ b/KKdMainLib/Extensions.cs @@ -1,5 +1,4 @@ -using System.Collections.Generic; -using KKdBaseLib; +using KKdBaseLib; using KKdMainLib.IO; using KKdMainLib.F2nd; @@ -10,22 +9,20 @@ namespace KKdMainLib public static Header ReadHeader(this Stream stream, bool Seek, bool ReadSectionSignature = true) { if (Seek) - if (stream.Position > 4) stream.LongPosition -= 4; - else stream.LongPosition = 0; + if (stream.LongPosition > 4) stream.LongPosition -= 4; + else stream.LongPosition = 0; return stream.ReadHeader(ReadSectionSignature); } public static Header ReadHeader(this Stream stream, bool ReadSectionSignature = true) { - Header Header = new Header - { Format = Main.Format.F2LE, Signature = stream.ReadInt32(), - DataSize = stream.ReadInt32(), - Length = stream.ReadInt32() }; + Header Header = new Header { Format = Format.F2LE, Signature = stream.ReadInt32(), + DataSize = stream.ReadInt32(), Length = stream.ReadInt32() }; if (stream.ReadUInt32() == 0x18000000) - { Header.Format = Main.Format.F2BE; } + { Header.Format = Format.F2BE; } Header.ID = stream.ReadInt32(); Header.SectionSize = stream.ReadInt32(); - Header.Count = stream.ReadInt32(); + Header.SubID = stream.ReadInt32(); stream.ReadInt32(); if (Header.Length == 0x40) { @@ -44,15 +41,15 @@ namespace KKdMainLib { stream.Write(Header.Signature); stream.Write(Header.DataSize); - stream.Write((Header.Format < Main.Format.X && Extended) ? 0x40 : 0x20); - stream.Write(Header.Format == Main.Format.F2BE ? 0x18000000 : 0x10000000); + stream.Write((Header.Format < Format.X && Extended) ? 0x40 : 0x20); + stream.Write(Header.Format == Format.F2BE ? 0x18000000 : 0x10000000); stream.Write(Header.ID); stream.Write(Header.SectionSize); + stream.Write(Header.SubID); stream.Write(0x00); - stream.Write(0x00); - if (Header.Format < Main.Format.X && Extended) + if (Header.Format < Format.X && Extended) { - stream.Write(Header.Format < Main.Format.MGF ? (int)((Header.SectionSignature ^ + stream.Write(Header.Format < Format.MGF ? (int)((Header.SectionSignature ^ (Header.DataSize * (long)Header.Signature)) - Header.ID + Header.SectionSize) : 0); stream.Write(0x00); stream.Write(0x00L); @@ -68,114 +65,92 @@ namespace KKdMainLib public static class POFExtensions { - public static POF AddPOF(this Header Header) => - new POF { Offsets = new List(), Offset = Header.DataSize + Header.Length }; - - public static void GetOffset(this Stream stream, ref POF POF) - { if (stream.Format > Main.Format.F) POF.Offsets.Add(stream.Position + (stream.IsX ? stream.Offset : 0x00)); } - - public static void ReadPOF(this Stream stream, ref POF POF) + public static void Write(this Stream stream, ref KKdList Offsets, int ID, bool ShiftX) { - if (stream.ReadString(3) == "POF") - { - POF.Type = byte.Parse(stream.ReadString(1)); - int IsX = POF.Type + 2; - stream.Seek(-4, SeekOrigin.Current); - POF.Header = stream.ReadHeader(); - stream.Seek(POF.Offset + POF.Header.Length, 0); - POF.Length = stream.ReadInt32(); - while (POF.Length + POF.Offset + POF.Header.Length > stream.Position) - { - int a = stream.ReadByte(); - if (a >> 6 == 0) break; - else if (a >> 6 == 1) a = a & 0x3F; - else if (a >> 6 == 2) - { - a = a & 0x3F; - a = (a << 8) | stream.ReadByte(); - } - else if (a >> 6 == 3) - { - a = a & 0x3F; - a = (a << 8) | stream.ReadByte(); - a = (a << 8) | stream.ReadByte(); - a = (a << 8) | stream.ReadByte(); - } - a <<= IsX; - POF.LastOffset += a; - } - } - } - - public static void Write(this Stream stream, ref POF POF, int ID) - { - POF.Offsets.Sort(); - long CurrentPOFOffset = 0; - long POFOffset = 0; - byte BitShift = (byte)(2 + POF.Type); - int Max1 = (0x00FF >> BitShift) << BitShift; - int Max2 = (0xFFFF >> BitShift) << BitShift; - POF.Length = 5 + ID; - for (int i = 0; i < POF.Offsets.Count; i++) - { - POFOffset = POF.Offsets[i] - CurrentPOFOffset; - CurrentPOFOffset = POF.Offsets[i]; - if (POFOffset <= Max1) POF.Length += 1; - else if (POFOffset <= Max2) POF.Length += 2; - else POF.Length += 4; - POF.Offsets[i] = POFOffset; - } - - long POFLengthAling = POF.Length.Align(16); - POF.Header = new Header { DataSize = (int)POFLengthAling, ID = ID, Format = Main.Format.F2LE, - Length = 0x20, SectionSize = (int)POFLengthAling, Signature = 0x30464F50 }; - POF.Header.Signature += POF.Type << 24; - stream.Write(POF.Header); - - stream.Write(POF.Length); - for (int i = 0; i < POF.Offsets.Count; i++) - { - POFOffset = POF.Offsets[i]; - if (POFOffset <= Max1) stream.Write (( byte)((1 << 6) | (POFOffset >> BitShift))); - else if (POFOffset <= Max2) stream.WriteEndian((ushort)((2 << 14) | (POFOffset >> BitShift)), true); - else stream.WriteEndian(( uint)((3 << 30) | (POFOffset >> BitShift)), true); - } - stream.Write(0x00); - stream.Align(16, true); + byte[] data = POF.Write(Offsets, ShiftX); + Header Header = new Header { ID = ID, Format = Format.F2LE, + Length = 0x20, Signature = ShiftX ? 0x31464F50 : 0x30464F50 }; + Header.DataSize = Header.SectionSize = data.Length; + stream.Write(Header); + stream.Write(data); stream.WriteEOFC(ID); } } - - public static class PointerExt + + public static class MPExt { - public static Pointer ReadPointer(this Stream IO) => - new Pointer { Offset = IO.ReadInt32() }; + public static MsgPack ReadMP(this byte[] array, bool JSON = false) + { + MsgPack MsgPack; + if (JSON) + { JSON IO = new JSON(File.OpenReader(array)); + MsgPack = IO.Read(); IO.Close(); } + else + { MP IO = new MP(File.OpenReader(array)); + MsgPack = IO.Read(); IO.Close(); } + return MsgPack; + } - public static Pointer ReadPointerString(this Stream IO) - { Pointer val = IO.ReadPointer(); - val.Value = IO.ReadStringAtOffset(val.Offset); return val; } + public static MsgPack ReadMPAllAtOnce(this string file, bool JSON = false) + { + MsgPack MsgPack; + if (JSON) + { JSON IO = new JSON(File.OpenReader(file + ".json", true)); + MsgPack = IO.Read(); IO.Close(); } + else + { MP IO = new MP(File.OpenReader(file + ".mp" , true)); + MsgPack = IO.Read(); IO.Close(); } + return MsgPack; + } - public static CountPointer ReadCountPointer(this Stream IO) => - new CountPointer { Count = IO.ReadInt32(), Offset = IO.ReadInt32() }; + public static MsgPack ReadMP(this string file, bool JSON = false) + { + MsgPack MsgPack; + if (JSON) + { JSON IO = new JSON(File.OpenReader(file + ".json")); + MsgPack = IO.Read(); IO.Close(); } + else + { MP IO = new MP(File.OpenReader(file + ".mp" )); + MsgPack = IO.Read(); IO.Close(); } + 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 Pointer ReadPointerEndian(this Stream IO) => - new Pointer { Offset = IO.ReadInt32Endian() }; + public static MsgPack Write(this MsgPack mp, string file, bool JSON = false) + { + if (JSON) + { JSON IO = new JSON(File.OpenWriter(file + ".json", true)); + IO.Write(mp, "\n", " ").Close(); } + else + { MP IO = new MP(File.OpenWriter(file + ".mp" , true)); + IO.Write(mp ).Close(); } + return mp; + } - public static Pointer ReadPointerStringEndian(this Stream IO) - { Pointer val = IO.ReadPointerEndian(); - val.Value = IO.ReadStringAtOffset(val.Offset); return val; } + 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 CountPointer ReadCountPointerEndian(this Stream IO) => - new CountPointer { Count = IO.ReadInt32Endian(), Offset = IO.ReadInt32Endian() }; + public static MsgPack WriteAfterAll(this MsgPack mp, string file, bool JSON = false) + { + byte[] data = null; + if (JSON) + { JSON IO = new JSON(File.OpenWriter()); + IO.Write(mp, true); data = IO.ToArray(true); } + else + { MP IO = new MP(File.OpenWriter()); + IO.Write(mp ); data = IO.ToArray(true); } + File.WriteAllBytes(file + (JSON ? ".json" : ".mp"), data); + return mp; + } - public static Pointer ReadPointerX(this Stream IO) => - new Pointer { Offset = (int)IO.ReadIntX() }; + public static void ToJSON (this string file) => + file.ReadMP( ).Write(file, true).Dispose(); - public static Pointer ReadPointerStringX(this Stream IO) - { Pointer val = IO.ReadPointerX(); - val.Value = IO.ReadStringAtOffset(val.Offset); return val; } - - public static CountPointer ReadCountPointerX(this Stream IO) => - new CountPointer { Count = (int)IO.ReadIntX(), Offset = (int)IO.ReadIntX() }; + public static void ToMsgPack(this string file) => + file.ReadMP(true).Write(file ).Dispose(); } } diff --git a/KKdMainLib/F2nd/ENRS.cs b/KKdMainLib/F2nd/ENRS.cs new file mode 100644 index 0000000..98bd175 --- /dev/null +++ b/KKdMainLib/F2nd/ENRS.cs @@ -0,0 +1,104 @@ +using KKdBaseLib; + +namespace KKdMainLib.F2nd +{ + public struct ENRS + { + public int Offset; + public int Count; + public int Size; + public int Repeat; + public SubENRS[] Sub; + + public struct SubENRS + { + public int Skip; + public int Reverse; + public Type Type; + + public override string ToString() => "Skip: " + Skip + "; Reverse: " + Reverse + "; Type: " + Type; + } + + public static unsafe ENRS[] Read(byte[] data) + { + byte* ptr = data.GetPtr(); + int i, i0; + int ENRSCount = ((int*)ptr)[1]; + ENRS[] ENRSArr = new ENRS[ENRSCount]; + ptr = ptr + 0x10; + + ENRS ENR = new ENRS(); + for (i = 0; i < ENRSCount; i++) + { + ENR.Offset = ReadENRSValue(ref ptr) + ENR.Offset; + ENR.Count = ReadENRSValue(ref ptr); + ENR.Size = ReadENRSValue(ref ptr); + ENR.Repeat = ReadENRSValue(ref ptr); + + if (ENR.Repeat > 0) + { + ENR.Sub = new SubENRS[ENR.Count]; + for (i0 = 0; i0 < ENR.Count; i0++) + { + ENR.Sub[i0].Skip = ReadENRSValue(ref ptr, out ENR.Sub[i0].Type); + ENR.Sub[i0].Reverse = ReadENRSValue(ref ptr); + + if (ENR.Sub[i0].Type == Type.Invalid) return null; + + if (i0 > 0) ENR.Sub[i0].Skip += ENR.Sub[i0 - 1].Skip + ENR.Sub[i0 - 1].Reverse * + ((ENR.Sub[i0].Type == Type.WORD) ? 2 : (ENR.Sub[i0].Type == Type.DWORD) ? 4 : 8); + } + } + else ENR.Sub = null; + ENRSArr[i] = ENR; + } + return ENRSArr; + } + + private static unsafe int ReadENRSValue(ref byte* ptr, out Type Rev) + { + int V = *ptr & 0xF; + Rev = (Type)(*ptr & 0x30); + Value Val = (Value)(*ptr & 0xC0); + ptr++; + if (Val == Value.Int32 ) + { V = (V << 24) | (ptr[0] << 16) | (ptr[1] << 8) | ptr[2]; ptr += 3; } + else if (Val == Value.Int16 ) + { V = (V << 8) | ptr[0]; ptr += 1; } + else if (Val == Value.Invalid) V = 0; + return V; + } + + private static unsafe int ReadENRSValue(ref byte* ptr) + { + int V = *ptr & 0x3F; + Value Val = (Value)(*ptr & 0xC0); + ptr++; + if (Val == Value.Int32 ) + { V = (V << 24) | (ptr[0] << 16) | (ptr[1] << 8) | ptr[2]; ptr += 3; } + else if (Val == Value.Int16 ) + { V = (V << 8) | ptr[0]; ptr += 1; } + else if (Val == Value.Invalid) V = 0; + return V; + } + + public enum Type : byte + { + WORD = 0b00000000, + DWORD = 0b00010000, + QWORD = 0b00100000, + Invalid = 0b00110000, + } + + public enum Value : byte + { + Int8 = 0b00000000, + Int16 = 0b01000000, + Int32 = 0b10000000, + Invalid = 0b11000000, + } + + public override string ToString() => + "Offset: " + Offset + "; Count: " + Count + "; " + "Size: " + Size + "; Repeat: " + Repeat; + } +} diff --git a/KKdMainLib/F2nd/Header.cs b/KKdMainLib/F2nd/Header.cs index 63e2af0..84bbe80 100644 --- a/KKdMainLib/F2nd/Header.cs +++ b/KKdMainLib/F2nd/Header.cs @@ -7,15 +7,15 @@ namespace KKdMainLib.F2nd public int Signature; public int DataSize; public int Length; - public Main.Format Format; + public Format Format; public int ID; public int SectionSize; - public int Count; + public int SubID; public int InnerSignature; public int SectionSignature; - public bool IsBE => Format == Main.Format.F2BE; - public bool IsX => Format == Main.Format.X || Format == Main.Format.XHD; + public bool IsBE => Format == Format.F2BE; + public bool IsX => Format == Format.X || Format == Format.XHD; public override string ToString() => Signature.ToString(false); } diff --git a/KKdMainLib/F2nd/POF.cs b/KKdMainLib/F2nd/POF.cs index 4c7527c..5a22cca 100644 --- a/KKdMainLib/F2nd/POF.cs +++ b/KKdMainLib/F2nd/POF.cs @@ -1,14 +1,83 @@ -using System.Collections.Generic; +using KKdBaseLib; namespace KKdMainLib.F2nd { public struct POF { - public byte Type; - public int Length; - public int Offset; - public int LastOffset; - public List Offsets; - public Header Header; + public static unsafe KKdList Read(byte[] data, bool ShiftX) + { + Value Val = 0; + KKdList Offsets = KKdList.New; + byte* ptr = data.GetPtr(); + int i = 0, Offset = 0, V = 0; + byte BitShift = (byte)(ShiftX ? 3 : 2); + + int Length = *(int*)ptr - 4; ptr += 4; + while (Length > i) + { + V = *ptr & 0x3F; + Val = (Value)(*ptr & 0xC0); + ptr++; i++; + if (Val == Value.Int32 ) + { V = (V << 24) | (ptr[0] << 16) | (ptr[1] << 8) | ptr[2]; ptr += 3; i += 3; } + else if (Val == Value.Int16 ) + { V = (V << 8) | ptr[0]; ptr += 1; i += 3; } + else if (Val == Value.Invalid) break; + Offset += V; + Offsets.Add(Offset << BitShift); + } + return Offsets; + } + + public static unsafe byte[] Write(KKdList Offsets, bool ShiftX) + { + Offsets.Sort(); + int Length = 5; + long Offset = 0; + byte BitShift = (byte)(ShiftX ? 3 : 2); + int Max1 = 0x00FF >> BitShift; + int Max2 = 0xFFFF >> BitShift; + for (int i = 0; i < Offsets.Count; i++) + { + Offset = Offsets[i]; + if (i > 0) { Offset -= Offsets[i - 1]; if (Offset == 0) continue; } + + Offset >>= BitShift; + if (Offset <= Max1) Length += 1; + else if (Offset <= Max2) Length += 2; + else Length += 4; + } + + byte[] data = new byte[Length.Align(0x10)]; + byte* ptr = data.GetPtr(); + + Value Val = 0; + *(int*)ptr = Length; ptr += 4; + for (int i = 0; i < Offsets.Count; i++) + { + Offset = Offsets[i]; + if (i > 0) { Offset -= Offsets[i - 1]; if (Offset == 0) continue; } + + Offset >>= BitShift; + Val = Offset > Max2 ? Value.Int32 : Offset > Max1 ? Value.Int16 : Value.Int8; + if (Offset <= Max1) *ptr = (byte)((byte)Val | Offset ); + else if (Offset <= Max2) { *ptr = (byte)((byte)Val | (Offset >> 8)); ptr++; + *ptr = (byte) Offset ; } + else { *ptr = (byte)((byte)Val | (Offset >> 24)); ptr++; + *ptr = (byte) (Offset >> 16) ; ptr++; + *ptr = (byte) (Offset >> 8) ; ptr++; + *ptr = (byte) Offset ; } + ptr++; + } + return data; + } + + public enum Value : byte + { + Invalid = 0b00000000, + Int8 = 0b01000000, + Int16 = 0b10000000, + Int32 = 0b11000000, + } } } diff --git a/KKdMainLib/F2nd/Struct.cs b/KKdMainLib/F2nd/Struct.cs index 631fa0d..402d14a 100644 --- a/KKdMainLib/F2nd/Struct.cs +++ b/KKdMainLib/F2nd/Struct.cs @@ -8,15 +8,15 @@ namespace KKdMainLib.F2nd public Header Header; public byte[] Data; public Struct[] SubStructs; - public bool HasEOFC; - public Mini POF; - public Mini ENRS; + public bool EOFC; + public ENRS[] ENRS; + public KKdList POF; public long DataOffset; - public override string ToString() => Header.ToString() + (SubStructs != null ? "; SubStructs: " + - SubStructs.Length : "") + (POF != null ? "; Has " + POF.Header.ToString() : "") + - (ENRS != null ? "; Has ENRS" : "") + (HasEOFC ? "; Has EOFC" : ""); + public override string ToString() => Header.ToString() + (SubStructs != null ? + "; SubStructs: " + SubStructs.Length : "")+ (ENRS != null ? "; Has ENRS" : "") + + (POF.NotNull ? "; Has POF" : "") + (EOFC ? "; Has EOFC" : ""); public static Struct ReadStruct(byte[] Data) { @@ -40,48 +40,30 @@ namespace KKdMainLib.F2nd Header = stream.ReadHeader(false); Position += Header.Length + Header.DataSize; if (Header.ID == ID && Header.Signature == 0x43464F45) - { Struct.HasEOFC = true; break; } - else if (Header.ID == 0 && Header.Signature == 0x53524E45) + { Struct.EOFC = true; break; } + else if (Header.ID == 0 && (Header.Signature == 0x30464F50 || + Header.Signature == 0x31464F50 || Header.Signature == 0x53524E45)) SubStructs.Add(new Struct { Header = Header, DataOffset = stream.Position, Data = stream.ReadBytes(Header.SectionSize) }); else if (Header.ID <= ID) { stream.LongPosition -= Header.Length; break; } else SubStructs.Add(ReadStruct(ref stream, Header)); - //(Header.Signature == 0x30464F50 || Header.Signature == - // 0x31464F50 || Header.Signature == 0x53524E45) } for (int i = 0; i < SubStructs.Capacity; i++) { string Sig = SubStructs[i].Header.ToString(); - if (Sig == "ENRS" || Sig == "POF0" || Sig == "POF1") + if (Sig == "ENRS" || Sig == "EOFC" || Sig == "POF0" || Sig == "POF1") { - if (Sig == "ENRS") Struct.ENRS = (Mini)SubStructs[i]; - else Struct.POF = (Mini)SubStructs[i]; + if (Sig == "EOFC") Struct.EOFC = true; + else if (Sig == "ENRS") Struct.ENRS = F2nd.ENRS.Read(SubStructs[i].Data); + else Struct.POF = F2nd.POF .Read(SubStructs[i].Data, Sig == "POF1"); SubStructs.RemoveAt(i); SubStructs.Capacity--; i--; } } - if (SubStructs.Capacity > 0) - { - Struct.SubStructs = SubStructs.ToArray(); - } + if (SubStructs.Capacity > 0) Struct.SubStructs = SubStructs.ToArray(); return Struct; } - - public class Mini - { - public Header Header; - public byte[] Data; - public bool HasEOFC; - - public static explicit operator Mini(Struct Struct) => - new Mini() { Header = Struct.Header, Data = Struct.Data, HasEOFC = Struct.HasEOFC }; - - public static explicit operator Struct( Mini Struct) => - new Struct() { Header = Struct.Header, Data = Struct.Data, HasEOFC = Struct.HasEOFC }; - - public override string ToString() => Header.ToString() + (HasEOFC ? "; Has EOFC" : ""); - } } } diff --git a/KKdMainLib/IO/Directory.cs b/KKdMainLib/IO/Directory.cs index cabfc67..3c13395 100644 --- a/KKdMainLib/IO/Directory.cs +++ b/KKdMainLib/IO/Directory.cs @@ -1,5 +1,4 @@ -using System; -using MSIO = System.IO; +using MSIO = System.IO; namespace KKdMainLib.IO { diff --git a/KKdMainLib/IO/IOExtensions.cs b/KKdMainLib/IO/Extensions.cs similarity index 56% rename from KKdMainLib/IO/IOExtensions.cs rename to KKdMainLib/IO/Extensions.cs index c3ba13e..af3e5ef 100644 --- a/KKdMainLib/IO/IOExtensions.cs +++ b/KKdMainLib/IO/Extensions.cs @@ -2,7 +2,7 @@ namespace KKdMainLib.IO { - public static class IOExtensions + public static class Extensions { public static string NullTerminatedASCII(this Stream stream, byte End = 0) => stream.NullTerminated(End).ToASCII(); @@ -43,6 +43,13 @@ namespace KKdMainLib.IO public static long ReadIntX(this Stream stream, bool IsBE) => stream.IsX ? stream.ReadInt64() : stream.ReadUInt32Endian(IsBE); + public static void WriteX(this Stream stream, long val, ref KKdList POF) + { if (stream.IsX) stream.Write ( val); + else stream.WriteEndian((int)val); POF.Add(stream.Position); } + public static void WriteX(this Stream stream, long val, ref KKdList POF, bool IsBE) + { if (stream.IsX) stream.Write ( val ); + else stream.WriteEndian((int)val, IsBE); POF.Add(stream.Position); } + public static void WriteX(this Stream stream, long val) { if (stream.IsX) stream.Write ( val); else stream.WriteEndian((int)val); } @@ -50,26 +57,26 @@ namespace KKdMainLib.IO { if (stream.IsX) stream.Write ( val ); else stream.WriteEndian((int)val, IsBE); } - public static byte[] ReadAtOffset(this Stream stream, long Offset = 0, long Length = 0) + public static byte[] ReadAtOffset(this Stream stream, long Offset = -1, long Length = -1) { byte[] arr = null; long Position = stream.LongPosition; - if (Offset == 0) { Position += stream.IsX ? 8 : 4; Offset = stream.ReadIntX(); } + if (Offset == -1) { Position += stream.IsX ? 8 : 4; Offset = stream.ReadIntX(); } stream.LongPosition = Offset; - if (Length == 0) arr = stream.NullTerminated(); - else arr = stream.ReadBytes(Length); + if (Length == -1) arr = stream.NullTerminated(); + else arr = stream.ReadBytes(Length); stream.LongPosition = Position; return arr; } - public static string ReadStringAtOffset(this Stream stream, long Offset = 0, long Length = 0) + public static string ReadStringAtOffset(this Stream stream, long Offset = -1, long Length = -1) { string s = null; long Position = stream.LongPosition; - if (Offset == 0) { Position += stream.IsX ? 8 : 4; Offset = stream.ReadIntX(); } + if (Offset == -1) { Position += stream.IsX ? 8 : 4; Offset = stream.ReadIntX(); } stream.LongPosition = Offset; - if (Length == 0) s = stream.NullTerminatedUTF8(); - else s = stream.ReadStringUTF8(Length); + if (Length == -1) s = stream.NullTerminatedUTF8(); + else s = stream.ReadStringUTF8(Length); stream.LongPosition = Position; return s; } @@ -83,5 +90,35 @@ namespace KKdMainLib.IO public static void WriteShiftJIS(this Stream IO, string String) => IO.Write(Text.ShiftJIS.GetBytes(String)); + + public static Pointer ReadPointer(this Stream IO) => + new Pointer { Offset = IO.ReadInt32() }; + + public static Pointer ReadPointerString(this Stream IO) + { Pointer val = IO.ReadPointer(); + val.Value = IO.ReadStringAtOffset(val.Offset); return val; } + + public static CountPointer ReadCountPointer(this Stream IO) => + new CountPointer { Count = IO.ReadInt32(), Offset = IO.ReadInt32() }; + + public static Pointer ReadPointerEndian(this Stream IO) => + new Pointer { Offset = IO.ReadInt32Endian() }; + + public static Pointer ReadPointerStringEndian(this Stream IO) + { Pointer val = IO.ReadPointerEndian(); + val.Value = IO.ReadStringAtOffset(val.Offset); return val; } + + public static CountPointer ReadCountPointerEndian(this Stream IO) => + new CountPointer { Count = IO.ReadInt32Endian(), Offset = IO.ReadInt32Endian() }; + + public static Pointer ReadPointerX(this Stream IO) => + new Pointer { Offset = (int)IO.ReadIntX() }; + + public static Pointer ReadPointerStringX(this Stream IO) + { Pointer val = IO.ReadPointerX(); + val.Value = IO.ReadStringAtOffset(val.Offset); return val; } + + public static CountPointer ReadCountPointerX(this Stream IO) => + new CountPointer { Count = (int)IO.ReadIntX(), Offset = (int)IO.ReadIntX() }; } } diff --git a/KKdMainLib/MessagePack/JSONIO.cs b/KKdMainLib/IO/JSON.cs similarity index 83% rename from KKdMainLib/MessagePack/JSONIO.cs rename to KKdMainLib/IO/JSON.cs index ef6eb1e..9208928 100644 --- a/KKdMainLib/MessagePack/JSONIO.cs +++ b/KKdMainLib/IO/JSON.cs @@ -1,16 +1,15 @@ //Original or reader part: https://github.com/MarcosLopezC/LightJson/ using KKdBaseLib; -using KKdMainLib.IO; +using BaseExtensions = KKdBaseLib.Extensions; -namespace KKdMainLib.MessagePack +namespace KKdMainLib.IO { - public class JSONIO + public struct JSON { - public Stream _IO; + public JSON(Stream IO) => _IO = IO; - public JSONIO( ) => _IO = File.OpenWriter(); - public JSONIO(Stream IO) => _IO = IO; + private Stream _IO; public void Close() => _IO.Close(); @@ -66,7 +65,8 @@ namespace KKdMainLib.MessagePack } } else if (c == '"') break; - else if (char.IsControl(c)) return null; + else if (char.IsControl(c)) + return null; else s += c; } @@ -83,7 +83,8 @@ namespace KKdMainLib.MessagePack { KKdList Obj = KKdList.New; if (!_IO.Assert('{')) return KKdList.Null; - if (_IO.SkipWhitespace().PeekCharUTF8() == '}') { _IO.ReadCharUTF8(); return KKdList.Null; } + if (_IO.SkipWhitespace().PeekCharUTF8() == '}') + { _IO.ReadCharUTF8(); return KKdList.Null; } string key; char c; @@ -110,7 +111,8 @@ namespace KKdMainLib.MessagePack { KKdList Obj = KKdList.New; if (!_IO.Assert('[')) return null; - if (_IO.SkipWhitespace().PeekCharUTF8() == ']') { _IO.ReadCharUTF8(); return null; } + if (_IO.SkipWhitespace().PeekCharUTF8() == ']') + { _IO.ReadCharUTF8(); return null; } char c; while (true) @@ -171,13 +173,13 @@ namespace KKdMainLib.MessagePack { string s = ""; while (char.IsDigit(_IO.SkipWhitespace(). PeekCharUTF8())) s += _IO.ReadCharUTF8(); return s; } - public JSONIO Write(MsgPack MsgPack, string End = "\n", string TabChar = " ") + public JSON Write(MsgPack MsgPack, string End = "\n", string TabChar = " ") { Write(MsgPack, End, TabChar, "", true); return this; } - public JSONIO Write(MsgPack MsgPack, bool Style = false) + public JSON Write(MsgPack MsgPack, bool Style = false) { Write(MsgPack, "\n", " ", "", Style); return this; } - private JSONIO Write(MsgPack MsgPack, string End, string TabChar, string Tab, bool Style, bool IsArray = false) + private JSON Write(MsgPack MsgPack, string End, string TabChar, string Tab, bool Style, bool IsArray = false) { string OldTab = Tab; Tab += TabChar; @@ -239,21 +241,20 @@ namespace KKdMainLib.MessagePack switch (obj) { case MsgPack val: Write(val, End, TabChar, Tab, Style); break; - case bool val: Write(val); break; case string val: Write(val); break; - case sbyte val: _IO.Write(Extensions.ToString(val)); break; - case byte val: _IO.Write(Extensions.ToString(val)); break; - case short val: _IO.Write(Extensions.ToString(val)); break; - case ushort val: _IO.Write(Extensions.ToString(val)); break; - case int val: _IO.Write(Extensions.ToString(val)); break; - case uint val: _IO.Write(Extensions.ToString(val)); break; - case long val: _IO.Write(Extensions.ToString(val)); break; - case ulong val: _IO.Write(Extensions.ToString(val)); break; - case float val: _IO.Write(Extensions.ToString(val)); break; - case double val: _IO.Write(Extensions.ToString(val)); break; + case bool Boolean: + case sbyte Int8 : + case byte UInt8 : + case short Int16: + case ushort UInt16: + case int Int32: + case uint UInt32: + case long Int64: + case ulong UInt64: + case float Float32: + case double Float64: _IO.Write(BaseExtensions.ToString(obj)); break; } } - private void Write( bool val) => _IO.Write(val ? "true" : "false"); private void Write(string val) => _IO.Write("\"" + val .Replace("\\", "\\\\").Replace("/" , "\\/").Replace("\"", "\\\"") .Replace("\0", "\\0" ).Replace("\b", "\\b").Replace("\f", "\\f" ) diff --git a/KKdMainLib/MessagePack/IO.cs b/KKdMainLib/IO/MP.cs similarity index 85% rename from KKdMainLib/MessagePack/IO.cs rename to KKdMainLib/IO/MP.cs index 67421d5..05ca9fe 100644 --- a/KKdMainLib/MessagePack/IO.cs +++ b/KKdMainLib/IO/MP.cs @@ -1,15 +1,13 @@ using System; using KKdBaseLib; -using KKdMainLib.IO; -namespace KKdMainLib.MessagePack +namespace KKdMainLib.IO { - public class IO + public struct MP { - public Stream _IO; + public MP(Stream IO) => _IO = IO; - public IO( ) => _IO = File.OpenWriter(); - public IO(Stream IO) => _IO = IO; + private Stream _IO; public void Close() => _IO.Close(); @@ -18,51 +16,38 @@ namespace KKdMainLib.MessagePack public MsgPack Read(bool Array = false) { MsgPack MsgPack = MsgPack.New; + if (!Array) MsgPack.Name = ReadString((Types)_IO.ReadByte()); byte Unk = _IO.ReadByte(); Types Type = (Types)Unk; - if (!Array) - { - MsgPack.Name = ReadString(Type); - if (MsgPack.Name != null) { Unk = _IO.ReadByte(); Type = (Types)Unk; } - } - bool FixArr = Type >= Types.FixArr && Type <= Types.FixArrMax; - bool FixMap = Type >= Types.FixMap && Type <= Types.FixMapMax; - bool FixStr = Type >= Types.FixStr && Type <= Types.FixStrMax; - bool PosInt = Type >= Types.PosInt && Type <= Types.PosIntMax; - bool NegInt = Type >= Types.NegInt && Type <= Types.NegIntMax; - if (FixArr || FixMap || FixStr || PosInt || NegInt) + if (Type >= Types.FixMap && Type <= Types.FixMapMax) { - if (FixMap) - { - MsgPack.Object = KKdList.New; - for (int i = 0; i < Unk - (byte)Types.FixMap; i++) MsgPack.Add( Read(false)); - } - else if (FixArr) - { - MsgPack.Object = new MsgPack[Unk - (byte)Types.FixArr]; - for (int i = 0; i < Unk - (byte)Types.FixArr; i++) MsgPack[i] = Read( true); - } - else if (FixStr) MsgPack.Object = ReadString( Type); - else if (PosInt) MsgPack.Object = Unk; - else if (NegInt) MsgPack.Object = (sbyte)Unk; - return MsgPack; + MsgPack.Object = KKdList.New; + for (int i = 0; i < Unk - (byte)Types.FixMap; i++) MsgPack.Add( Read(false)); } - - while (true) + else if (Type >= Types.FixArr && Type <= Types.FixArrMax) { - if (ReadNil (ref MsgPack, ref Type)) break; - if (ReadArr (ref MsgPack, ref Type)) break; - if (ReadMap (ref MsgPack, ref Type)) break; - if (ReadExt (ref MsgPack, ref Type)) break; - if (ReadString (ref MsgPack, ref Type)) break; - if (ReadBoolean(ref MsgPack, ref Type)) break; - if (ReadBytes (ref MsgPack, ref Type)) break; - if (ReadInt (ref MsgPack, ref Type)) break; - if (ReadUInt (ref MsgPack, ref Type)) break; - if (ReadFloat (ref MsgPack, ref Type)) break; - break; + 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 = ReadString( 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 (ReadNil (ref MsgPack, ref Type)) break; + if (ReadArr (ref MsgPack, ref Type)) break; + if (ReadMap (ref MsgPack, ref Type)) break; + if (ReadExt (ref MsgPack, ref Type)) break; + if (ReadString (ref MsgPack, ref Type)) break; + if (ReadBoolean(ref MsgPack, ref Type)) break; + if (ReadBytes (ref MsgPack, ref Type)) break; + if (ReadInt (ref MsgPack, ref Type)) break; + if (ReadUInt (ref MsgPack, ref Type)) break; + if (ReadFloat (ref MsgPack, ref Type)) break; + break; + } return MsgPack; } @@ -182,7 +167,7 @@ namespace KKdMainLib.MessagePack return true; } - public IO Write(MsgPack MsgPack, bool IsArray = false) + public MP Write(MsgPack MsgPack, bool IsArray = false) { if (MsgPack.Name != null && !IsArray) Write(MsgPack.Name); Write(MsgPack.Object); diff --git a/KKdMainLib/IO/Stream.cs b/KKdMainLib/IO/Stream.cs index b174097..8097d46 100644 --- a/KKdMainLib/IO/Stream.cs +++ b/KKdMainLib/IO/Stream.cs @@ -7,18 +7,16 @@ namespace KKdMainLib.IO public unsafe class Stream : IDisposable { private MSIO.Stream stream; - private int I, i, i0, TempBitRead, TempBitWrite; - private ushort ValRead; - private byte BitRead, BitWrite, ValWrite; + private int I, i, i0, BitRead, BitWrite, TempBitRead, TempBitWrite, ValRead, ValWrite; private byte[] buf; - private Main.Format _format = Main.Format.NULL; + private Format _format = Format.NULL; - public Main.Format Format + public Format Format { get => _format; set { _format = value; - IsBE = _format == Main.Format.F2BE; - IsX = _format == Main.Format.X || _format == Main.Format.XHD; } } + IsBE = _format == Format.F2BE; + IsX = _format == Format.X || _format == Format.XHD; } } public bool IsBE = false; public bool IsX = false; @@ -27,9 +25,12 @@ namespace KKdMainLib.IO public uint UIntOffset { get => (uint)LongOffset; set => LongOffset = value; } public long LongOffset; - public int Length { get => ( int)stream.Length - Offset; set => stream.SetLength(value + Offset); } - public uint UIntLength { get => (uint)stream.Length - UIntOffset; set => stream.SetLength(value + UIntOffset); } - public long LongLength { get => stream.Length - LongOffset; set => stream.SetLength(value + LongOffset); } + public int Length { get => ( int)stream.Length - Offset; + set => stream.SetLength(value + Offset); } + public uint UIntLength { get => (uint)stream.Length - UIntOffset; + set => stream.SetLength(value + UIntOffset); } + public long LongLength { get => stream.Length - LongOffset; + set => stream.SetLength(value + LongOffset); } public int Position { get => ( int)stream.Position - Offset; set => stream.Position = value + Offset; } @@ -52,7 +53,7 @@ namespace KKdMainLib.IO BitRead = 8; ValRead = ValRead = BitWrite = 0; stream = output; - Format = Main.Format.NULL; + Format = Format.NULL; buf = new byte[128]; IsBE = isBE; } @@ -322,18 +323,18 @@ namespace KKdMainLib.IO public string ReadStringUTF8 (long? Length) => ReadBytes(Length).ToUTF8 (); public string ReadStringASCII(long? Length) => ReadBytes(Length).ToASCII(); - public byte[] ReadBytes(long Length, int Offset = 0) - { byte[] Buf = new byte[Length]; if (Offset > 0) stream.Position = Offset; + public byte[] ReadBytes(long Length, int Offset = -1) + { byte[] Buf = new byte[Length]; if (Offset > -1) stream.Position = Offset; stream.Read(Buf, 0, (int)Length); return Buf; } - public void ReadBytes(long Length, byte[] Buf, long Offset = 0) - { if (Offset > 0) stream.Position = Offset; stream.Read(Buf, 0, (int)Length); } + public void ReadBytes(long Length, byte[] Buf, long Offset = -1) + { if (Offset > -1) stream.Position = Offset; stream.Read(Buf, 0, (int)Length); } - public byte[] ReadBytes(long? Length, int Offset = 0) + public byte[] ReadBytes(long? Length, int Offset = -1) { if (Length == null) return new byte[0]; else return ReadBytes((long)Length, Offset); } - public void ReadBytes(long Length, byte Bits, byte[] Buf, long Offset = 0) - { if (Offset > 0) stream.Seek(Offset, 0); + public void ReadBytes(long Length, byte Bits, byte[] Buf, long Offset = -1) + { if (Offset > -1) stream.Seek(Offset, 0); if (Bits > 0 && Bits < 8) for (i0 = 0; i0 < Length; i0++) Buf[i0] = ReadBits(Bits); } public byte ReadBits(byte Bits) @@ -351,8 +352,9 @@ namespace KKdMainLib.IO public byte ReadHalfByte() => ReadBits(4); - public void Write(byte val, byte Bits) + public void Write(int val, byte Bits) { + val &= (1 << Bits) - 1; BitWrite += Bits; TempBitWrite = 8 - BitWrite; if (TempBitWrite < 0) @@ -362,11 +364,12 @@ namespace KKdMainLib.IO stream.WriteByte((byte)(ValWrite | (val >> BitWrite))); ValWrite = 0; } - ValWrite |= (byte)(val << TempBitWrite); + ValWrite |= val << TempBitWrite; + ValWrite &= 0xFF; } - public void CheckRead () { if (BitRead > 0) ValRead = 0; BitRead = 8; } - public void CheckWrited() { if (BitWrite > 0) { Write(ValWrite); ValWrite = BitWrite = 0; } } + public void CheckRead () { if (BitRead > 0) ValRead = 0; BitRead = 8; } + public void CheckWrited() { if (BitWrite > 0) { Write(ValWrite); ValWrite = 0; BitWrite = 0; } } public byte[] ToArray(bool Close) { byte[] Data = ToArray(); if (Close) this.Close(); return Data; } @@ -374,8 +377,7 @@ namespace KKdMainLib.IO public byte[] ToArray() { long Position = stream.Position; - stream.Position = 0; - byte[] Data = ReadBytes(stream.Length); + byte[] Data = ReadBytes(stream.Length, 0); stream.Position = Position; return Data; } diff --git a/KKdMainLib/KKdMainLib.csproj b/KKdMainLib/KKdMainLib.csproj index 2d80aea..6222a4d 100644 --- a/KKdMainLib/KKdMainLib.csproj +++ b/KKdMainLib/KKdMainLib.csproj @@ -42,18 +42,17 @@ + + - + + - - - - diff --git a/KKdMainLib/Main.cs b/KKdMainLib/Main.cs index f7c4d51..894cfaa 100644 --- a/KKdMainLib/Main.cs +++ b/KKdMainLib/Main.cs @@ -111,14 +111,18 @@ namespace KKdMainLib if (ofd.ShowDialog() == DialogResult.OK) FileNames = ofd.FileNames; + ofd.Dispose(); } else if (code == 2) { OpenFileDialog ofd = new OpenFileDialog { InitialDirectory = Application.StartupPath, ValidateNames = false, CheckFileExists = false, Filter = " | ", CheckPathExists = true, Title = "Choose any file in folder:", FileName = "Folder Selection." }; + string Return = ""; if (ofd.ShowDialog() == DialogResult.OK) - return Path.GetDirectoryName(ofd.FileName); + Return = Path.GetDirectoryName(ofd.FileName); + ofd.Dispose(); + return Return; } return ""; } @@ -141,6 +145,7 @@ namespace KKdMainLib InitialDirectory = sfd.InitialDirectory.ToString(); FileNames = sfd.FileNames; } + sfd.Dispose(); } public static string NullTerminated(this string Source, ref int i, byte End) @@ -164,8 +169,10 @@ namespace KKdMainLib public static bool StartsWith(this Dictionary Dict, string[] args) { Dictionary bufDict = new Dictionary(); - if (Dict == null) - Dict = new Dictionary(); + if (Dict == null) return false; + else if (args.Length < 1) return false; + + args[0] = args[0].ToLower(); if (args.Length > 1) { string[] NewArgs = new string[args.Length - 1]; @@ -231,10 +238,11 @@ namespace KKdMainLib out string value, string[] args) { value = ""; - if (Dict == null) return false; + if (Dict == null) return false; else if (args.Length < 1) return false; - if (!Dict.ContainsKey(args[0])) 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]; @@ -260,7 +268,10 @@ namespace KKdMainLib string[] args, string value) { Dictionary bufDict = new Dictionary(); - if (Dict == null) Dict = new Dictionary(); + if (Dict == null) Dict = new Dictionary(); + else if (args.Length < 1) return; + + args[0] = args[0].ToLower(); if (args.Length > 1) { string[] NewArgs = new string[args.Length - 1]; @@ -295,21 +306,5 @@ namespace KKdMainLib for (i = 0; i < Length; i++) B[i] = int.Parse(A[i]); return B; } - - public enum Format : byte - { - NULL = 0, - DT = 1, - PDA = 2, - DT2 = 3, - DTe = 4, - F = 5, - FT = 6, - F2LE = 7, - F2BE = 8, - MGF = 9, - X = 10, - XHD = 11, - } } } diff --git a/KKdMainLib/MessagePack/MPExt.cs b/KKdMainLib/MessagePack/MPExt.cs deleted file mode 100644 index 03b3ebb..0000000 --- a/KKdMainLib/MessagePack/MPExt.cs +++ /dev/null @@ -1,70 +0,0 @@ -using KKdMainLib.IO; -using MPIO = KKdMainLib.MessagePack.IO; - -namespace KKdMainLib.MessagePack -{ - public static class MPExt - { - public static MsgPack ReadMPAllAtOnce(this string file, bool JSON = false) - { - MsgPack MsgPack; - if (JSON) - { JSONIO IO = new JSONIO(File.OpenReader(file + ".json", true)); - MsgPack = IO.Read(); IO.Close(); IO = null; } - else - { MPIO IO = new MPIO(File.OpenReader(file + ".mp" , true)); - MsgPack = IO.Read(); IO.Close(); IO = null; } - return MsgPack; - } - - public static MsgPack ReadMP(this string file, bool JSON = false) - { - MsgPack MsgPack; - if (JSON) - { JSONIO IO = new JSONIO(File.OpenReader(file + ".json")); - MsgPack = IO.Read(); IO.Close(); IO = null; } - else - { MPIO IO = new MPIO(File.OpenReader(file + ".mp" )); - MsgPack = IO.Read(); IO.Close(); IO = null; } - 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 MsgPack Write(this MsgPack mp, string file, bool JSON = false) - { - if (JSON) - { JSONIO IO = new JSONIO(File.OpenWriter(file + ".json", true)); - IO.Write(mp, "\n", " ").Close(); IO = null; } - else - { MPIO IO = new MPIO(File.OpenWriter(file + ".mp" , true)); - IO.Write(mp ).Close(); IO = null; } - 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 MsgPack WriteAfterAll(this MsgPack mp, string file, bool JSON = false) - { - byte[] data = null; - if (JSON) - { JSONIO IO = new JSONIO(File.OpenWriter()); - IO.Write(mp, true); data = IO.ToArray(true); } - else - { MPIO IO = new MPIO(File.OpenWriter()); - IO.Write(mp ); data = IO.ToArray(true); } - File.WriteAllBytes(file + (JSON ? ".json" : ".mp"), data); - return mp; - } - - public static void ToJSON (this string file) => - file.ReadMP( ).Write(file, true).Dispose(); - - public static void ToMsgPack(this string file) => - file.ReadMP(true).Write(file ).Dispose(); - } -} diff --git a/KKdMainLib/Properties/AssemblyInfo.cs b/KKdMainLib/Properties/AssemblyInfo.cs index 71d3833..5b03fc6 100644 --- a/KKdMainLib/Properties/AssemblyInfo.cs +++ b/KKdMainLib/Properties/AssemblyInfo.cs @@ -11,5 +11,5 @@ using System.Runtime.InteropServices; [assembly: AssemblyCulture("")] [assembly: ComVisible(false)] [assembly: Guid("2BA7EFC6-91D1-8BBC-C487-06C7F36CC789")] -[assembly: AssemblyVersion("0.4.7.0")] -[assembly: AssemblyFileVersion("0.4.7.0")] +[assembly: AssemblyVersion("0.4.7.1")] +[assembly: AssemblyFileVersion("0.4.7.1")] diff --git a/KKdMainLib/STR.cs b/KKdMainLib/STR.cs index 62b5f86..c22ae3a 100644 --- a/KKdMainLib/STR.cs +++ b/KKdMainLib/STR.cs @@ -1,7 +1,6 @@ using KKdBaseLib; using KKdMainLib.IO; using KKdMainLib.F2nd; -using KKdMainLib.MessagePack; namespace KKdMainLib { @@ -12,7 +11,7 @@ namespace KKdMainLib private long Offset; private long OffsetX; - private POF POF; + private KKdList POF; private Header Header; private Stream IO; @@ -23,13 +22,12 @@ namespace KKdMainLib IO = File.OpenReader(filepath + ext); Header = new Header(); - IO.Format = Main.Format.F; + IO.Format = Format.F; Header.Signature = IO.ReadInt32(); if (Header.Signature == 0x41525453) { - Header = IO.ReadHeader(true); - POF = Header.AddPOF(); - IO.Position = Header.Length; + Header = IO.ReadHeader(true, false); + POF = KKdList.New; long Count = IO.ReadInt32Endian(); Offset = IO.ReadInt32Endian(); @@ -40,7 +38,7 @@ namespace KKdMainLib OffsetX = IO.ReadInt64(); Count = IO.ReadInt64(); IO.Offset = Header.Length; - IO.Format = Main.Format.X; + IO.Format = Format.X; IO.LongOffset += Offset; IO.Position = 0; } @@ -48,13 +46,16 @@ namespace KKdMainLib STRs = new String[Count]; for (int i = 0; i < Count; i++) - STRs[i].ID = IO.ReadInt32Endian(); + { + STRs[i].Str.Offset = IO.ReadInt32Endian(); + STRs[i].ID = IO.ReadInt32Endian(); + } if (IO.IsX) { - IO.Offset = Header.Length; + IO.LongOffset = Header.Length + OffsetX; for (int i = 0; i < Count; i++) - STRs[i].Str.Value = IO.ReadStringAtOffset(STRs[i].Str.Offset + OffsetX); + STRs[i].Str.Value = IO.ReadStringAtOffset(STRs[i].Str.Offset); } else { @@ -63,9 +64,6 @@ namespace KKdMainLib STRs[i].Str.Value = STRs[i].Str.Offset > 0 ? IO.ReadStringAtOffset(STRs[i].Str.Offset) : null; } - - IO.Position = POF.Offset; - IO.ReadPOF(ref POF); } else { @@ -92,20 +90,19 @@ namespace KKdMainLib public void STRWriter(string filepath) { - if (STRs == null || STRs.Length == 0 || Header.Format > Main.Format.F2BE) return; + if (STRs == null || STRs.Length == 0 || Header.Format > Format.F2BE) return; uint Offset = 0; uint CurrentOffset = 0; - IO = File.OpenWriter(filepath + (Header.Format > Main.Format.FT ? ".str" : ".bin"), true); + IO = File.OpenWriter(filepath + (Header.Format > Format.FT ? ".str" : ".bin"), true); IO.Format = Header.Format; - POF = new POF(); - IO.IsBE = IO.Format == Main.Format.F2BE; + POF = KKdList.New; + IO.IsBE = IO.Format == Format.F2BE; long Count = STRs.LongLength; - if (IO.Format > Main.Format.FT) + if (IO.Format > Format.FT) { IO.Position = 0x40; - IO.WriteX(Count); - IO.GetOffset(ref POF); + IO.WriteX(Count, ref POF); IO.WriteX(0x80); IO.Position = 0x80; for (int i = 0; i < Count; i++) IO.Write(0x00L); @@ -120,6 +117,10 @@ namespace KKdMainLib KKdList UsedSTR = KKdList.New; KKdList UsedSTRPos = KKdList.New; int[] STRPos = new int[Count]; + + UsedSTRPos.Add(IO.Position); + UsedSTR.Add(""); + IO.WriteByte(0); for (int i = 0; i < Count; i++) { if (!UsedSTR.Contains(STRs[i].Str.Value)) @@ -127,35 +128,35 @@ namespace KKdMainLib STRPos[i] = IO.Position; UsedSTRPos.Add(STRPos[i]); UsedSTR.Add(STRs[i].Str.Value); - IO.Write(STRs[i].Str.Value + "\0"); + IO.Write(STRs[i].Str.Value); + IO.WriteByte(0); } else for (int i2 = 0; i2 < Count; i2++) - if (UsedSTR[i2] == STRs[i].Str.Value) - { STRPos[i] = UsedSTRPos[i2]; break; } + if (UsedSTR[i2] == STRs[i].Str.Value) { STRPos[i] = UsedSTRPos[i2]; break; } } - if (IO.Format > Main.Format.FT) + if (IO.Format > Format.FT) { IO.Align(0x10); Offset = IO.UIntPosition; IO.Position = 0x80; for (int i = 0; i < Count; i++) { - IO.GetOffset(ref POF); + POF.Add(IO.Position); IO.WriteEndian(STRPos[i]); IO.WriteEndian(STRs[i].ID); } IO.UIntPosition = Offset; - IO.Write(ref POF, 1); + IO.Write(ref POF, 0, false); CurrentOffset = IO.UIntPosition; IO.WriteEOFC(0); Header.DataSize = (int)(CurrentOffset - 0x40); Header.Signature = 0x41525453; Header.SectionSize = (int)(Offset - 0x40); IO.Position = 0; - IO.Write(Header); + IO.Write(Header, true); } else { @@ -179,6 +180,7 @@ namespace KKdMainLib { STRs[i].ID = Strings[i].ReadInt32 ("ID" ); STRs[i].Str.Value = Strings[i].ReadString("Str"); + if (STRs[i].Str.Value == null) STRs[i].Str.Value = ""; } MsgPack = MsgPack.New; @@ -192,8 +194,9 @@ namespace KKdMainLib for (int i = 0; i < STRs.Length; i++) { Strings[i] = MsgPack.New.Add("ID", STRs[i].ID); - if (STRs[i].Str.Value != null || STRs[i].Str.Value != "") - Strings[i] = Strings[i].Add("Str", STRs[i].Str.Value); + if (STRs[i].Str.Value != null) + if (STRs[i].Str.Value != "") + Strings[i] = Strings[i].Add("Str", STRs[i].Str.Value); } STR_.Add(Strings); diff --git a/PD_Tool/Program.cs b/PD_Tool/Program.cs index 94606b0..02bcd6b 100644 --- a/PD_Tool/Program.cs +++ b/PD_Tool/Program.cs @@ -112,9 +112,9 @@ namespace PD_Tool { KKdMain.Choose(1, JSON ? "mp" : "json", out string[] FileNames); if (JSON) foreach (string file in FileNames) - KKdMainLib.MessagePack.MPExt.ToJSON (file.Replace(Path.GetExtension(file), "")); + KKdMainLib.MPExt.ToJSON (file.Replace(Path.GetExtension(file), "")); else foreach (string file in FileNames) - KKdMainLib.MessagePack.MPExt.ToMsgPack(file.Replace(Path.GetExtension(file), "")); + KKdMainLib.MPExt.ToMsgPack(file.Replace(Path.GetExtension(file), "")); } } diff --git a/PD_Tool/Properties/AssemblyInfo.cs b/PD_Tool/Properties/AssemblyInfo.cs index 195dc74..ea2ff75 100644 --- a/PD_Tool/Properties/AssemblyInfo.cs +++ b/PD_Tool/Properties/AssemblyInfo.cs @@ -11,5 +11,5 @@ using System.Runtime.InteropServices; [assembly: AssemblyCulture("")] [assembly: ComVisible(false)] [assembly: Guid("7B5D5A3A-A6F8-4813-C97D-ACFC98F7397E")] -[assembly: AssemblyVersion("0.4.7.0")] -[assembly: AssemblyFileVersion("0.4.7.0")] +[assembly: AssemblyVersion("0.4.7.1")] +[assembly: AssemblyFileVersion("0.4.7.1")] diff --git a/PD_Tool/classes/DIVAFILE.cs b/PD_Tool/classes/DIVAFILE.cs index 8473d0d..a3dfa20 100644 --- a/PD_Tool/classes/DIVAFILE.cs +++ b/PD_Tool/classes/DIVAFILE.cs @@ -8,12 +8,7 @@ namespace PD_Tool public static void Decrypt(string file) { Stream reader = File.OpenReader(file); - if (reader.ReadInt64() != 0x454C494641564944) - { - reader.Close(); - Encrypt(file); - return; - } + if (reader.ReadInt64() != 0x454C494641564944) { reader.Close(); return; } reader.Close(); file.Decrypt(); } @@ -21,13 +16,7 @@ namespace PD_Tool public static void Encrypt(string file) { Stream reader = File.OpenReader(file); - if (reader.ReadInt64() == 0x454C494641564944) - { - reader.Close(); - Decrypt(file); - return; - } - + if (reader.ReadInt64() == 0x454C494641564944) { reader.Close(); return; } file.Encrypt(); } } diff --git a/PD_Tool/classes/Tools/A3D.cs b/PD_Tool/classes/Tools/A3D.cs index 69578ad..4e8f4fe 100644 --- a/PD_Tool/classes/Tools/A3D.cs +++ b/PD_Tool/classes/Tools/A3D.cs @@ -1,7 +1,7 @@ using System; -using KKdMainLib; +using KKdBaseLib; using KKdMainLib.IO; -using KKdMainLib.MessagePack; +using KKdMainLib; using KKdA3DA = KKdMainLib.A3DA.A3DA; using KKdFARC = KKdMainLib.FARC; @@ -19,11 +19,9 @@ namespace PD_Tool.Tools bool MP = false; foreach (string file in FileNames) - if (file.EndsWith(".mp" )) { MP = true; break; } - else if (file.EndsWith(".json")) { MP = true; break; } - else if (file.EndsWith(".farc")) { MP = true; break; } + if (file.EndsWith(".mp") || file.EndsWith(".json") || file.EndsWith(".farc")) { MP = true; break; } - Main.Format Format = Main.Format.NULL; + Format Format = Format.NULL; string format = ""; if (MP) { @@ -42,13 +40,13 @@ namespace PD_Tool.Tools Main.ConsoleDesign(true); Console.WriteLine(); format = Console.ReadLine(); - if (format == "1") Format = Main.Format.DT ; - else if (format == "2") Format = Main.Format.F ; - else if (format == "3") Format = Main.Format.FT ; - else if (format == "4") Format = Main.Format.FT ; - else if (format == "5") Format = Main.Format.F2LE; - else if (format == "6") Format = Main.Format.MGF ; - else if (format == "7") Format = Main.Format.X ; + if (format == "1") Format = Format.DT ; + else if (format == "2") Format = Format.F ; + else if (format == "3") Format = Format.FT ; + else if (format == "4") Format = Format.FT ; + else if (format == "5") Format = Format.F2LE; + else if (format == "6") Format = Format.MGF ; + else if (format == "7") Format = Format.X ; else return; } @@ -79,12 +77,9 @@ namespace PD_Tool.Tools A3DA = A.MsgPackWriter(); A = new KKdA3DA(); A.MsgPackReader(A3DA); - A.IO = File.OpenWriter(); - A.Data._.CompressF16 = Format > Main.Format.FT ? - Format == Main.Format.MGF ? 2 : 1 : 0; + A.Data._.CompressF16 = Format > Format.FT ? Format == Format.MGF ? 2 : 1 : 0; A.Data.Format = Format; - FARC.Files[i].Data = (format != "1" && - format != "3") ? A.A3DCWriter() : A.A3DAWriter(); + FARC.Files[i].Data = (format != "1" && format != "3") ? A.A3DCWriter() : A.A3DAWriter(); } } FARC.Save(); @@ -97,8 +92,7 @@ namespace PD_Tool.Tools else if (ext == ".mp" || ext == ".json") { A.MsgPackReader(filepath, ext == ".json"); - A.Data._.CompressF16 = Format > Main.Format.FT ? - Format == Main.Format.MGF ? 2 : 1 : 0; + A.Data._.CompressF16 = Format > Format.FT ? Format == Format.MGF ? 2 : 1 : 0; A.Data.Format = Format; File.WriteAllBytes(filepath + ".a3da", (format != "1" && diff --git a/PD_Tool/classes/Tools/DEX.cs b/PD_Tool/classes/Tools/DEX.cs index 5bcd82d..6db7442 100644 --- a/PD_Tool/classes/Tools/DEX.cs +++ b/PD_Tool/classes/Tools/DEX.cs @@ -1,6 +1,7 @@ using System; -using KKdMainLib; +using KKdBaseLib; using KKdMainLib.IO; +using KKdMainLib; using KKdDEX = KKdMainLib.DEX; namespace PD_Tool.Tools @@ -39,11 +40,11 @@ namespace PD_Tool.Tools Console.WriteLine(); format = Console.ReadLine(); - Main.Format Format = Main.Format.NULL; - if (format == "1") Format = Main.Format.F ; - else if (format == "2") Format = Main.Format.F2LE; - else if (format == "3") Format = Main.Format.X ; - else if (format == "9" && (MP && _JSON)) Format = Main.Format.NULL; + Format Format = Format.NULL; + if (format == "1") Format = Format.F ; + else if (format == "2") Format = Format.F2LE; + else if (format == "3") Format = Format.X ; + else if (format == "9" && (MP && _JSON)) Format = Format.NULL; else return; foreach (string file in FileNames) @@ -58,7 +59,7 @@ namespace PD_Tool.Tools DEX. DEXReader(filepath, ext ); else DEX.MsgPackReader(filepath, JSON); - if (Format > Main.Format.NULL) + if (Format > Format.NULL) DEX. DEXWriter(filepath, Format); else DEX.MsgPackWriter(filepath, JSON ); DEX = null;