#include "ma_fpk.h" char *CMassFpk::GetIdent( void ) { static char Ident[] = "FPK (Civilization 4)"; return Ident; } char *CMassFpk::GetExtension( void ) { static char Ext[] = "FPK"; return Ext; } int CMassFpk::CheckFileType( void ) { if ( massf == NULL ) return 0; char buf[ 100 ]; fseek( massf, 4, SEEK_SET ); fread( buf, 4, 1, massf ); if ( memcmp( buf, "FPK_", 4 ) == 0 ) return 1; else return 0; } void CMassFpk::GetFileMainInfo( void ) { files_count = 0; if ( massf == NULL ) return; fseek( massf, 0, SEEK_END ); filesize = ftell( massf ); fseek( massf, 0, SEEK_SET ); fread( &FpkHeader, sizeof( FpkHeader ), 1, massf ); files_count = FpkHeader.filecount; lib_start = 13; lib_size = 0; data_start = 0; } int CMassFpk::ReadRec( long num ) { if ( massf == NULL ) return 0; if (( (unsigned long)num >= files_count ) && ( num != -1 )) return 0; if (( num == -1 ) && (( ! next_set ) || ((unsigned long)next_rec_num >= files_count )) ) return 0; memset( &FileRec, 0, sizeof( FileRec ) ); if ( num == -1 ) { if ( fseek( massf, next_rec_pos, SEEK_SET ) != 0 ) return 0; num = next_rec_num; pos = next_rec_num - 1; } else { if ( fseek( massf, lib_start, SEEK_SET ) != 0 ) return 0; pos = 0; } //read do { if ( fread( &FpkRec.namelen, 4, 1, massf ) != 1 ) return 0; if ( FpkRec.namelen > FileNameWithPathMaxLen-1 ) { FpkRec.namelenskip = FpkRec.namelen - (FileNameWithPathMaxLen-1); FpkRec.namelen = (FileNameWithPathMaxLen-1); fseek( massf, FpkRec.namelenskip, SEEK_CUR ); } fread( FpkRec.name, FpkRec.namelen, 1, massf ); FpkRec.name[ FpkRec.namelen ] = 0; for( FpkRec.namelenskip=0; FpkRec.namelenskip= (long)files_count ) next_set = false; else next_set = true; //get info FileRec.SetName( FpkRec.name ); FileRec.offset = FpkRec.offset; FileRec.size = FpkRec.fsize; FileRec.set = 1; /* char buf[ 1024 ]; sprintf( buf, " %02X %02X,6: %02X %02X %02X %02X %02X %02X", FpkRec.u1[ 0 ], FpkRec.u1[ 1 ], FpkRec.u2[ 0 ], FpkRec.u2[ 1 ], FpkRec.u2[ 2 ], FpkRec.u2[ 3 ], FpkRec.u2[ 4 ], FpkRec.u2[ 5 ] ); strcat( FileRec.name, buf ); for( FpkRec.namelenskip=0; FpkRec.namelenskip