Skip to content

Instantly share code, notes, and snippets.

@cra0kalo
Created November 26, 2015 02:36
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save cra0kalo/c92c589b9d6e2ee9e9f8 to your computer and use it in GitHub Desktop.
Save cra0kalo/c92c589b9d6e2ee9e9f8 to your computer and use it in GitHub Desktop.
//Need for Speed Underground 2
//.BUN .BIN .GEO
// @cra0kalo
//----------------------
//.TPK -> 00 00 30 B3
//.GEO -> 00 40 13 80
//.ANI -> 00 41 03 80
LittleEndian();
//Defines
typedef float vec2[2];
typedef float vec3[3];
typedef float vec4[4];
typedef float quat4[4];
typedef string asciiz;
typedef char magic4[4];
typedef int bool;
#define true 1
#define false 0
//functions
long PaddingAlign(long num, int alignTo)
{
if (num % alignTo == 0)
{
return 0;
}
else
{
return alignTo - (num % alignTo);
}
}
bool AlignFS4()
{
local int b2skip = PaddingAlign(FTell(),4);
FSkip(b2skip);
return 1;
}
typedef struct
{
uint32 chunkHeader; //00 40 13 80 -
uint32 chunkSize;
} CHUNK_GEO_HEAD;
typedef struct
{
uint32 chunkHead;
uint32 chunkSize;
} CHUNK_NULL;
typedef struct
{
uint32 chunkHeader; //01 40 13 80
uint32 chunkSize;
} CHUNK_GEO_Block1;
typedef struct
{
uint32 chunkHeader; //02 40 13 80
uint32 chunkSize;
uint32 blnk1;
uint32 blnk2;
uint32 tTagA;
uint32 tTagB;
asciiz path;
uint32 UniqueFmt;
uint32 unkData[7];
uint32 unkVarA;
uint32 unkVarB;
uint32 unkVarC;
uint32 unkData2[7];
} CHUNK_GEO_Block2;
typedef struct
{
uint32 chunkHeader; //03 40 13 80
uint32 chunkSize;
uint16 unkValA_a;
uint16 unkValA_b;
uint32 unkValB;
} CHUNK_GEO_Block3;
typedef struct
{
uint32 chunkHeader; //08 40 13 80
uint32 chunkSize;
} CHUNK_GEO_Block8;
typedef struct
{
uint32 chunkHeader; //10 40 13 80
uint32 chunkSize;
} CHUNK_GEO_Block10;
typedef struct
{
uint32 chunkHeader; //11 40 13 80
uint32 chunkSize;
byte padding[8];
uint32 blnk1;
uint32 blnk2;
uint32 blnk3;
uint32 unkA;
uint16 unkB_a;
uint16 unkB_b;
uint32 unkC;
uint32 unkD;
uint32 unkE;
vec3 bBox1;
uint32 blnk4;
vec3 bBox2;
uint32 blnk5;
float matrix64[16];
uint32 unkF;
uint32 unkG;
uint32 ParA[2];
uint32 unkH;
vec4 unkVector;
asciiz chunkName;
AlignFS4();
} CHUNK_GEO_Block11;
typedef struct
{
uint32 chunkHeader; //12 40 13 80
uint32 chunkSize;
uint16 unkVarA_a;
uint16 unkVarA_b;
uint32 blankVal1;
uint16 unkVarB_a;
uint16 unkVarB_b;
uint32 blankVal2;
uint16 unkVarC_a;
uint16 unkVarC_b;
uint32 blankVal3;
} CHUNK_GEO_Block12;
typedef struct
{
vec3 v_pos;
uint32 v_unk;
vec2 v_uv;
} GEO_VERTEX;
typedef struct
{
uint16 vA;
uint16 vB;
uint16 vC;
} GEO_FACE;
typedef struct
{
uint32 chunkHeader; //01 4B 13 00
uint32 chunkSize;
local int strtPt = FTell();
local int padskip = FTell();
local byte rVal;
while(ReadByte(FTell()) == 0x11)
{
padskip++;
FSeek(padskip);
}
local int curPos = FTell();
while(curPos < strtPt + chunkSize)
{
GEO_VERTEX vtx;
curPos+= 24;
}
} CHUNK_GEO_VERTEXBUFFER;
typedef struct
{
uint32 chunkHeader; //02 4B 13 00
uint32 chunkSize;
} CHUNK_GEO_VERTEXPOST;
typedef struct
{
uint32 chunkHeader; //03 4B 13 00
uint32 chunkSize;
local int strtPt = FTell();
local int curPos = FTell();
while(curPos < strtPt + chunkSize)
{
GEO_FACE vFace;
curPos+= 12;
}
} CHUNK_GEO_INDEXBUFFER;
typedef struct
{
uint32 chunkHeader; //00 00 30 B3
uint32 chunkSize;
} CHUNK_B_main_TPK;
typedef struct
{
uint32 chunkHeader; //00 00 31 B3
uint32 chunkSize;
} CHUNK_B_sub_TPK;
typedef struct
{
uint32 chunkHeader; //00 00 32 B3
uint32 chunkSize;
} CHUNK_B_sub_inner_TPK;
//---------------------------------------------------------
local int bstart1;
CHUNK_GEO_HEAD c0;
//FSkip(chunk1.chunkSize);
CHUNK_NULL cn1;
FSkip(cn1.chunkSize);
CHUNK_GEO_Block1 c1;
CHUNK_GEO_Block2 c2;
CHUNK_GEO_Block3 c3;
CHUNK_GEO_Block8 c8;
CHUNK_GEO_Block10 c10;
bstart1 = FTell() + 8;
CHUNK_GEO_Block11 c11;
FSeek(bstart1 + c11.chunkSize);
CHUNK_GEO_Block12 c12;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment