//-------------------------------------- //--- 010 Editor v5.0 Binary Template // // File: SRF.bt // Author: Yann Le Brech // Version: 1.0 // Purpose: Parse SRF archive files used in games like You Don't Know Jack. // Category: Archive // File Mask: *.srf // ID Bytes: 73 72 66 31 //srf1 // History: // 1.0 Yann Le Brech: Initial release //-------------------------------------- /* val1 : 0, 12, 16, 167 12 semble dire "stop" 16 semble dire "répéter cette frame à la suivante" ou placer un marqueur, une pause au milieu d'une animation 32 ou 48 semble demander d'utiliser une autre ressource image (exemple le curseur de saisie) */ typedef struct { ubyte imgnum; // N° de l'image ubyte val; // Flags binaires : 4 = ?, 8 = ?, 32 = texte. short left; short top; short right; short bottom; ushort imgindex; // On a autant d'images que la valeur max... :-) } IMGDEF; typedef struct { ushort sameoffset; // Si différent de 0, alors on prend les mêmes images qu'à l'offset indiqué short left; // Position des images short top; short right; short bottom; ushort nbimg; // Nombre d'images à afficher local int64 currentpos4 = FTell(); if (sameoffset != 0) FSeek(headersize+sameoffset*12); if (nbimg > 0) IMGDEF imgs[nbimg]; if (sameoffset != 0) FSeek(currentpos4); } DEF; typedef struct { ushort offset; if (offset > 0) { local int64 currentpos3 = FTell(); FSeek(headersize+(offset-1)*12); DEF def; FSeek(currentpos3); } } ARRAYDEF; typedef struct { ushort u400; //400/6 = 66, 66 ms par frame ? ushort u6; ushort nbframes; local long headersize = FTell()+nbframes*2; ARRAYDEF array[nbframes] ; } ARRAYIMG; typedef struct { SetBackColor( cLtGreen ); ulong offset; ushort sizex; ushort sizey; local int64 currentpos2 = FTell(); FSeek(fileoffset+offset); SetBackColor( cLtBlue ); char data[4] ; SetBackColor( cLtGreen ); FSeek(currentpos2); } IMAGE; typedef struct { SetBackColor( cLtGreen ); ushort imagenum1; ushort imagenum2; if (imagenum1 > 0) IMAGE image[imagenum1] ; } IMAGELIST; typedef struct { SetBackColor( cLtGreen ); ulong ImagesStartPointer; SetBackColor( cNone ); //ushort Unknown[(ImagesStartPointer-4)/2] ; local int64 currentpos = FTell(); ARRAYIMG arrayimg; FSeek(currentpos+ImagesStartPointer-4); IMAGELIST imagelist; } IMAGEFILE; typedef struct { SetBackColor( cLtGreen ); ushort header1[14]; // Aucune différence, que ce soit un wav normal ou un AIFC... ushort bitrate; // 22050 a priori toujours ushort header2[6]; // header2[5] : FE3C (aifc) ou FF3C (wav) long samples; // Nombre d'échantillons, à 16 bits il faut donc multiplier par 2 (en aifc, cette valeur est utilisée dans le fichier aifc, position 0x24) ushort header3[7]; char compression[4]; // ima4 (aifc) ou rien (wav) ushort header4[10]; // header4[2] : 16 (wav) ou 0 (aifc), header4[6] : FFFF (aifc) ou 0 (wav), header4[9] : 16 (aifc) ou 0 (wav) ubyte snddata[filesize-84] ; // wav : il faut reverse les octets } SOUNDFILE; typedef struct { SetBackColor( cLtGreen ); char str[filesize] ; } STRING; typedef struct { SetBackColor( cLtGreen ); char strl[filesize] ; } STRINGLIST; typedef struct { SetBackColor( cLtGreen ); ulong nbans; ubyte ans[nbans]; } ANSLIST; typedef struct { ubyte strlen; char str[strlen] ; } STRING2; typedef struct { SetBackColor( cLtGreen ); ushort nbstr; STRING2 strl[nbstr] ; } STRINGLIST2; typedef struct { SetBackColor( cLtGreen ); ushort filelength; char id[3] ; ubyte u2; char u3; ubyte u4; ubyte QuestionValue; // 1 = 1000F, 2 = 2000F, 3 = 3000F ubyte QuestionType; // 0 = Question normale, (1 inutilisé), 2 = Giberrish, 3 = DisOrDat, 4 = JackAttack, 5 = Fiber (Drelin-Drelin) ubyte u5; ubyte SubQuestionType; // 0 = pas une question normale, 1 = question normale, 2 = bouche-trou, 3 = qui c'est celui là, 4 = ouvrez les yeux ubyte u6[4] ; char title[64] ; char file[64] ; ushort u7; ubyte answer; if (filelength > 147) ubyte u8[filelength-147] ; } QHDR; typedef struct { SetBackColor( cLtGreen ); long subname; ulong fileoffset; ulong filesize; local int64 currentpos = FTell(); FSeek(fileoffset); SetBackColor( cLtBlue ); if (filename[0] == 'o' && filename[1] == 'f' && filename[2] == 'f' && filename[3] == '4') IMAGEFILE images ; else if (filename[0] == 's' && filename[1] == 'n' && filename[2] == 'd' && filename[3] == ' ') SOUNDFILE sound ; else if (filename[0] == 'M' && filename[1] != 't' && filename[2] != 'c' && filename[3] == 'h') SOUNDFILE sound ; else if (filename[0] == 'S' && filename[1] == 'T' && filename[2] == 'R' && filename[3] == ' ') STRING str ; else if (filename[0] == 'S' && filename[1] == 'T' && filename[2] == 'R' && filename[3] == 'L') STRINGLIST strl ; else if (filename[0] == 'W' && filename[1] == 'r' && filename[2] == 'd' && filename[3] == 's') STRINGLIST strl ; else if (filename[0] == 'A' && filename[1] == 'N' && filename[2] == 'S' && filename[3] == '#') ANSLIST strl ; else if (filename[0] == 'S' && filename[1] == 'T' && filename[2] == 'R' && filename[3] == '#') STRINGLIST2 strl ; else if (filename[0] == 'q' && filename[1] == 'h' && filename[2] == 'd' && filename[3] == 'r') QHDR qhdr ; else char data[filesize] ; SetBackColor( cLtGreen ); FSeek(currentpos); } SUBFILE; typedef struct { SetBackColor( cLtGreen ); char filename[4] ; // Ma00 -> Ma99 (audio), Me/Mh... (audio), STRL = String List (séparées par des 0x00), off4 = images/animations ulong subcount; SUBFILE sub[subcount] ; } FILE; BigEndian(); SetBackColor( cLtYellow ); char headersrf1[4] ; ulong archive_size; ulong header_size; while (FTell() < header_size) FILE file;