@@ -12,7 +12,37 @@ public class SklbFormat
12
12
{
13
13
private const string MAGIC = "blks" ;
14
14
15
- public byte [ ] PreHavokData { get ; set ; }
15
+ public short Header1 { get ; set ; }
16
+ public short Header2 { get ; set ; }
17
+
18
+ [ DependsOn ( nameof ( Header1 ) , nameof ( Header2 ) ) ]
19
+ public bool OldHeader
20
+ {
21
+ get
22
+ {
23
+ switch ( Header2 )
24
+ {
25
+ case 0x3132 :
26
+ return true ;
27
+
28
+ case 0x3133 :
29
+ return false ;
30
+
31
+ default :
32
+ Log . Warning ( $ "Unknown sklb headers: Part 1: 0x{ Header1 . ToString ( "X" ) } , Part 2: 0x{ Header2 . ToString ( "X" ) } - Assume it's new for now") ;
33
+ return false ;
34
+ }
35
+ }
36
+ }
37
+
38
+ public int Unk1 { get ; set ; }
39
+
40
+ public int Skeleton { get ; set ; }
41
+ public int [ ] ParentSkeletons { get ; set ; }
42
+
43
+ public byte [ ] Unk2 { get ; set ; }
44
+ public byte [ ] Unk3 { get ; set ; }
45
+
16
46
public byte [ ] HavokData { get ; set ; }
17
47
18
48
public SklbFormat ( BinaryReader reader )
@@ -23,51 +53,82 @@ public SklbFormat(BinaryReader reader)
23
53
throw new Exception ( "Invalid sklb file - magic incorrect" ) ;
24
54
25
55
// Read header
26
- int header1 = reader . ReadInt16 ( ) ;
27
- int header2 = reader . ReadInt16 ( ) ;
28
- bool oldHeader ;
56
+ Header1 = reader . ReadInt16 ( ) ;
57
+ Header2 = reader . ReadInt16 ( ) ;
58
+ Log . Debug ( $ "Sklb headers were: Part 1: 0x { Header1 . ToString ( "X" ) } , Part 2: 0x { Header2 . ToString ( "X" ) } " ) ;
29
59
30
- Log . Debug ( $ "Sklb headers were: Part 1: 0x{ header1 . ToString ( "X" ) } , Part 2: 0x{ header2 . ToString ( "X" ) } ") ;
31
-
32
- switch ( header2 )
33
- {
34
- case 0x3132 :
35
- oldHeader = true ;
36
- break ;
37
-
38
- case 0x3133 :
39
- oldHeader = false ;
40
- break ;
41
-
42
- default :
43
- Log . Warning ( $ "Unknown sklb headers: Part 1: 0x{ header1 . ToString ( "X" ) } , Part 2: 0x{ header2 . ToString ( "X" ) } - Assume it's new for now") ;
44
- oldHeader = false ;
45
- break ;
46
- }
47
-
48
- // Havok offset
60
+ // Offsets
49
61
int havokOffset ;
50
- if ( oldHeader )
62
+ int unknownOffset ;
63
+ if ( OldHeader )
51
64
{
52
- reader . BaseStream . Seek ( 10 , SeekOrigin . Begin ) ;
65
+ unknownOffset = reader . ReadInt16 ( ) ;
53
66
havokOffset = reader . ReadInt16 ( ) ;
54
67
}
55
68
else
56
69
{
57
- reader . BaseStream . Seek ( 12 , SeekOrigin . Begin ) ;
70
+ unknownOffset = reader . ReadInt32 ( ) ;
58
71
havokOffset = reader . ReadInt32 ( ) ;
72
+ Unk1 = reader . ReadInt32 ( ) ;
59
73
}
60
74
61
- // Havok data
62
- reader . BaseStream . Seek ( 0 , SeekOrigin . Begin ) ;
63
- this . PreHavokData = reader . ReadBytes ( havokOffset ) ;
75
+ Skeleton = reader . ReadInt32 ( ) ;
76
+
77
+ ParentSkeletons = new int [ 4 ] ;
78
+ for ( int i = 0 ; i < ParentSkeletons . Length ; ++ i )
79
+ {
80
+ ParentSkeletons [ i ] = reader . ReadInt32 ( ) ;
81
+ }
82
+
83
+ this . Unk2 = reader . ReadBytes ( ( int ) ( unknownOffset - reader . BaseStream . Position ) ) ;
84
+
85
+ this . Unk3 = reader . ReadBytes ( ( int ) ( havokOffset - reader . BaseStream . Position ) ) ;
86
+
64
87
this . HavokData = reader . ReadBytes ( ( int ) reader . BaseStream . Length - havokOffset ) ;
65
88
}
66
89
67
90
public void Serialize ( BinaryWriter writer )
68
91
{
69
- writer . Write ( this . PreHavokData ) ;
92
+ writer . WriteEncodedString ( MAGIC ) ;
93
+ writer . Write ( Header1 ) ;
94
+ writer . Write ( Header2 ) ;
95
+
96
+ if ( OldHeader )
97
+ {
98
+ writer . Write ( ( short ) 0 ) ;
99
+ writer . Write ( ( short ) 0 ) ;
100
+ }
101
+ else
102
+ {
103
+ writer . Write ( ( int ) 0 ) ;
104
+ writer . Write ( ( int ) 0 ) ;
105
+ writer . Write ( Unk1 ) ;
106
+ }
107
+
108
+ writer . Write ( Skeleton ) ;
109
+ for ( int i = 0 ; i < ParentSkeletons . Length ; ++ i )
110
+ {
111
+ writer . Write ( ParentSkeletons [ i ] ) ;
112
+ }
113
+
114
+ writer . Write ( Unk2 ) ;
115
+ int firstOffset = ( int ) writer . BaseStream . Position ;
116
+ writer . Write ( Unk3 ) ;
117
+
118
+ int havokOffset = ( int ) writer . BaseStream . Position ;
70
119
writer . Write ( this . HavokData ) ;
120
+
121
+ writer . BaseStream . Seek ( 8 , SeekOrigin . Begin ) ;
122
+ if ( OldHeader )
123
+ {
124
+ writer . Write ( ( short ) firstOffset ) ;
125
+ writer . Write ( ( short ) havokOffset ) ;
126
+ }
127
+ else
128
+ {
129
+ writer . Write ( ( int ) firstOffset ) ;
130
+ writer . Write ( ( int ) havokOffset ) ;
131
+ }
71
132
}
72
133
73
134
public byte [ ] ToBytes ( )
0 commit comments