#include typedef unsigned short word; typedef unsigned long dword; typedef struct { dword unkSize; dword skelSize; dword dataSize; } Header; typedef struct { dword tag1; dword tag2; char name[64]; dword bodyOffset; dword bodyArgs[11]; dword animOffset; dword animArgs[11]; char desc[64]; } SkelHeader; typedef struct { dword tags[6]; dword reserved; dword number; char name[40]; dword childOffset; dword numChildren,numChildren2; dword posFlagsOffset; dword numPosTypes,numPosTypes2; dword posDataOffset; dword posDataSize,posDataSize2; dword flags; } Bone; typedef struct { dword tags[2]; dword polyTexOffset; dword numPolyTex,numPolyTex2; dword floats[20]; dword res[5]; char textureName[40]; dword floats2[61]; dword objCountOffset; dword numObjs,numObjs2; dword polysOffset; dword numPolys,numPolys2; dword res2[4]; dword meshOffset; dword numPoints; dword textureOffset; dword res3[3]; dword normalsOffset; dword negOneOffset; dword res4[6]; dword floats3[3]; } BoneExt; typedef struct { dword tags[2]; char name[64]; dword firstBoneOffset; dword size; dword floats[10]; char rootName[40]; dword floats2[9]; } AnimHeader; typedef struct { word type; word res1; word numItems; word res2; word res3; word itemSize; } PositionHeader; static void readSkeleton(FILE *f,int indent); static void readAnimation(FILE *f,int numAnim,int indent); static dword unkStart,skelStart,dataStart; int main(int argc,char *argv[]) { FILE *f; Header header; SkelHeader skelHeader; if (argc!=2) { printf("usage: %s [filename]\n",argv[0]); exit(1); } f=fopen(argv[1],"r"); fread(&header,1,sizeof(Header),f); unkStart=ftell(f); fseek(f,header.unkSize+unkStart,SEEK_SET); //next chunk skelStart=ftell(f); fseek(f,header.skelSize+skelStart,SEEK_SET); //next chunk dataStart=ftell(f); fseek(f,skelStart,SEEK_SET); fread(&skelHeader,1,sizeof(SkelHeader),f); printf("%s\n",skelHeader.name); printf("%s\n",skelHeader.desc); fseek(f,skelStart+skelHeader.bodyOffset,SEEK_SET); readSkeleton(f,0); printf("-----\n"); printf("%x\n",skelStart+skelHeader.animOffset); fseek(f,skelStart+skelHeader.animOffset,SEEK_SET); readAnimation(f,skelHeader.animArgs[0],0); fclose(f); } static char tabstr[255]; static char *tab(int indent) { if (indent>254) indent=254; memset(tabstr,' ',indent); tabstr[indent]=0; return tabstr; } static void readSkeleton(FILE *f,int indent) { Bone bone; BoneExt boneExt; dword *children; int i; PositionHeader *posHead; union { long l; float f; } fl; fread(&bone,1,sizeof(Bone),f); printf("%s%d: %s\n",tab(indent),bone.number,bone.name); if (bone.flags&0x20) { dword numPoints,numTexPoints; fread(&boneExt,1,sizeof(BoneExt),f); printf("%s Texture: %s\n",tab(indent),boneExt.textureName); fseek(f,skelStart+boneExt.polyTexOffset,SEEK_SET); for (i=0;i>16) { numTexPoints=(boneExt.normalsOffset-boneExt.textureOffset)/4; numPoints&=0xffff; } fseek(f,dataStart+boneExt.meshOffset,SEEK_SET); for (i=0;i