save files *can* be edited without much ado. pseudocode definition of a single soldier header from a savefile included:
void parseSoldierHeader( void ) {
parseRecord( "class" );
parseInt32( "unknown (important!)" );
parseRecord( "origin" );
parseRecord( "name/surname" );
parseRecord( "race" );
parseInt32( "faceNr" );
parseRecord( "origin" );
printf( "\n" );
parseInt32( "tu" );
parseInt32( "hp" );
parseInt32( "str" );
parseInt32( "acc" );
parseInt32( "ref" );
parseInt32( "bra" );
parseInt32( "base tu" );
parseInt32( "base hp" );
parseInt32( "base str" );
parseInt32( "base acc" );
parseInt32( "base ref" );
parseInt32( "base bra" );
parseInt32( "stat?" );
parseInt32( "missions1" );
parseInt32( "missions2" );
parseInt32( "kills" );
parseInt32( "stat?" );
parseInt32( "stat?" );
parseInt32( "stat?" );
parseInt32( "stat?" );
parseInt32( "stat?" );
parseInt32( "stat?" );
parseInt32( "unknown" );
printf( "\n" );
parseRecord( "regiment" );
parseRecord( "experience" );
parseInt32( "unknown" );
parseRecord( "assigned to" );
parseInt32( "unknown" );
parseInt32( "unknown" );
parseUInt8( "unknown" );
parseRecord( "role" );
parseInt32( "unknown" );
parseUInt8( "unknown" );
parseRecord( "dead" );
printf( "\n" );
}
A record consists of int32 n and then n bytes of text data. All major soldier stats are stored as int32, with some offset from the actual game values (-2 in my case, i.e. for 70 stat the stored value was 68); you can easily edit that with XVI32 or any other hex editor. If you figure out the meanings of some of the "unknown" values, feel free to PM me.