//First the type definition of a string in Volition's code
typedef struct STRING
{
int len;
char text[len];
}
//Then some constants
#define PLRVERSION_FREESPACE1 100 //64 hex
#define PLRVERSION_FREESPACE2 140 //8C hex
//------------------------------------------------------------------
//Now to the file format itself
char signature[4]; // "FSPF" = FreeSpace Player File
int version; // FreeSpace 1: $64/100 - FreeSpace 2: $8C/140
if (version==PLRVERSION_FREESPACE1)
{
int unknown1;
short mainhall; //FS1: 0=Galatea, 1=Bastion
STRING pilot_pic;
STRING current_campaign;
STRING ship_name;
BYTE unknown5;
short DataBlock1[210];
BYTE DataBlock2[113];
int num_lastplayedmissions;
STRING lastplayedmission[num_missions];
int score;
int unknown6;
int assists;
int DataBlock3[16]; //unknown
int num_ship_destroyed_entries;
int ship_destroyed_entry[num_ship_destroyed_entries];
}
if (version==PLRVERSION_FREESPACE2)
{
int unknown1;
short mainhall; //FS2: 0=Aquitaine (Terran), 1=Psamtik (Vasudan)
int unknown3;
STRING pilot_pic;
STRING squad_name;
STRING squad_pic;
int unknown4;
STRING ship_name;
BYTE unknown5;
short DataBlock1[216];
BYTE DataBlock2[1177];
int num_lastplayedmissions;
STRING lastplayedmission[num_missions];
int score;
int unknown6;
int assists;
int DataBlock3[18]; //unknown
int num_ship_destroyed_entries;
short ship_destroyed_entry[num_ship_destroyed_entries];
}
//In both cases now the interesting data comes
int unknown7;
int num_kills;
int pri_shots;
int sec_shots;
int pri_hits;
int sec_hits;
int pri_friendly_hits;
int sec_friendly_hits;
//What now follows is 27 more ints and lots of other unknown and rather uninteresting information
...