Most of the game's data is in the CRASH.BD
file. It was extracted by the help of MrShasoft
Use Twinsanity Editor by Neo_Kesha (twinsanity-hacking.tigersoftware.ru) to open rm2 (Objects) and sm2 (Terrain)
Graphic section -> Models (ID:2) Format:
Int32 number of submodels
Submodel:
Int32 Vertexes
UInt32 BlockSize
UInt16 k - depends on vertex count
UInt16 c - constant in most cases
<---Block starts here->
UInt32 Null1 - always null
UInt32 Something - always constant in every model
UInt32 Null2 - nuff said
Groups (Number of groups are not listed\ found. Check for Vertex count and block size):
UInt32 SomeNum1
Byte Vertexes
Byte Some80h - 80 in most cases. Maybe boolean var?
UInt32 Null1
UInt32 SomeNum2
UInt32 SomeNum3
UInt32 Null2
UInt32 Signature1
UInt32 SomeShit1 - looks like structure header with one element, but Editor not errors while reading like this
UInt32 SomeShit2
UInt32 SomeShit3
UInt32 VertexHead (03 80 XX 68) XX - Count of records, equal to Vertexes in group
Vertexes Count times Vertex structure
UInt32 WeightHead (04 80 XX 6C) XX - Count of records, equal to Vertexes in group
Vertexes Count times Weight structure
UInt32 NormalHead (05 80 XX 68) XX - Count of records, equal to Vertexes in group
Vertexes Count times Normal structure
UInt32 ColorHead (06 80 XX 6A) XX - Count of records, equal to Vertexes in group
Vertexes Count times Color structure
UInt32 EndSignature1
UInt32 EndSignature2
Byte array of leftovers nulls (Length is BlockSize - readed bytes length, if that group is last)
Vertex Format : X,Y,Z floats
Weight Format : Some Vector3 (X,Y,Z floats), 7F, CONN byte and 00 00
Where CONN equals either 00, or 80
If thrid vertex in face has CONN = 80, that face shoud not be drawn.
Normal Format: X, Y, Z floats
Color Format: B, G, R, A bytes
Most of the game's data is in the CRASH.BD
file. It was extracted by the help of MrShasoft
Use Twinsanity Editor by Neo_Kesha (twinsanity-hacking.tigersoftware.ru) to open rm2 (Objects) and sm2 (Terrain)
Graphic section -> Models (ID:2) Format:
Int32 number of submodels
Submodel:
Int32 Vertexes
UInt32 BlockSize
UInt16 k - depends on vertex count
UInt16 c - constant in most cases
<---Block starts here->
UInt32 Null1 - always null
UInt32 Something - always constant in every model
UInt32 Null2 - nuff said
Groups (Number of groups are not listed\ found. Check for Vertex count and block size):
UInt32 SomeNum1
Byte Vertexes
Byte Some80h - 80 in most cases. Maybe boolean var?
UInt32 Null1
UInt32 SomeNum2
UInt32 SomeNum3
UInt32 Null2
UInt32 Signature1
UInt32 SomeShit1 - looks like structure header with one element, but Editor not errors while reading like this
UInt32 SomeShit2
UInt32 SomeShit3
UInt32 VertexHead (03 80 XX 68) XX - Count of records, equal to Vertexes in group
Vertexes Count times Vertex structure
UInt32 WeightHead (04 80 XX 6C) XX - Count of records, equal to Vertexes in group
Vertexes Count times Weight structure
UInt32 NormalHead (05 80 XX 68) XX - Count of records, equal to Vertexes in group
Vertexes Count times Normal structure
UInt32 ColorHead (06 80 XX 6A) XX - Count of records, equal to Vertexes in group
Vertexes Count times Color structure
UInt32 EndSignature1
UInt32 EndSignature2
Byte array of leftovers nulls (Length is BlockSize - readed bytes length, if that group is last)
Vertex Format : X,Y,Z floats
Weight Format : Some Vector3 (X,Y,Z floats), 7F, CONN byte and 00 00
Where CONN equals either 00, or 80
If thrid vertex in face has CONN = 80, that face shoud not be drawn.
Normal Format: X, Y, Z floats
Color Format: B, G, R, A bytes