Qhimm.com Forums
Miscellaneous Forums => Troubleshooting => Topic started by: MaTiAz on 2005-06-07 15:02:47
-
Ok, so I need a program that can calculate the checksum. I've treid to get past the "Data is ruined" message by patching the FF7.exe, but it didn't work. The program doesn't need to be complicated, eg. command line program that just shows the checksum in the window, so it doesn't need to patch the file. I know that it can be made from Jenova sources, but I'm still learning only the basics of C++, so I can't really make it myself, so if someone could make a program to calculate checksum, I'd be very thankful.
Thanks in advance.
-
Oh, My God!
-
I know, that this post had been digged from the grave, but... MaTiAz, if you still need help with that checksum, PM me.
dziugo
----------------------------
Edit:
Wanted it, so here it goes:
Checksum calculator (http://republika.pl/dziugo/ff7/checksum.zip)
What it does:
Get's a ff7 save-file and writes the correct checksum to every single save game in it.
Usage:
checksum.exe sourcefile.ff7 destinationfile.ff7 //makes a new file
or
checksum.exe file.ff7 //overwrites the original file
Source:
#include <stdio.h>
#include <stdlib.h>
using namespace std;
const long FF7_SAVE_GAME_SIZE = 0xFE55;
const long FF7_SAVE_GAME_FIRST_CHECKSUM = 0x09;
const long FF7_SAVE_GAME_SLOT_SIZE = 0x10F4;
int ff7_checksum( void* qw )
{
int i = 0, t, d;
long r = 0xFFFF, len = 4336;
long pbit = 0x8000;
char* b=(char*)qw;
while( len-- ) {
t = b[i++];
r ^= t << 8;
for(d=0;d<8;d++) {
if( r & pbit )
r = ( r << 1 ) ^ 0x1021;
else
r <<= 1;
}
r &= ( 1 << 16 ) - 1;
}
return (r^0xFFFF)&0xFFFF;
}
int ff7_writechecksums(char *file_name_read, char *file_name_write)
{
FILE * file;
void * data;
long file_size;
if(file_name_read)
{
file = fopen(file_name_read, "rb");
if(file)
{
fseek(file, 0, SEEK_END);
file_size = ftell(file);
if(file_size == FF7_SAVE_GAME_SIZE)
{
rewind(file);
data = (void*) malloc(file_size);
if(!data)
{
printf("Memory allocation problem.\0");
return 0;
}
fread(data, 1, file_size, file);
fclose(file);
for(int i=0, checksum=0; i<15; i++)
{
char * data_pointer = ((char*)data + FF7_SAVE_GAME_FIRST_CHECKSUM + \
FF7_SAVE_GAME_SLOT_SIZE*i + 0x04);
checksum = ff7_checksum(data_pointer);
data_pointer -= 4;
data_pointer[0] = (char)((checksum)&0xFF);
data_pointer[1] = (char)((checksum>>8)&0xFF);
data_pointer[2] = (char)((checksum>>16)&0xFF);
data_pointer[3] = (char)((checksum>>24)&0xFF);
}
if(!file_name_write)
file_name_write = file_name_read;
file = fopen(file_name_write, "wb");
if(file)
{
fwrite(data, 1, file_size, file);
fclose(file);
free(data);
return 1;
}else
{
printf("Couldn't open dest-file: %s", file_name_write);
}
free(data);
}
}else
{
printf("Couldn't open source-file: %s", file_name_read);
}
}
return 0;
}
int main(int argc, char *argv[])
{
int return_value = 0;
if(argc > 1)
{
if(argc == 2)
return_value = ff7_writechecksums(argv[1], NULL);
else
return_value = ff7_writechecksums(argv[1], argv[2]);
}else
{
printf("Not enough parameters.\nUsage: checksum.exe srcfile.ff7 dstfile.ff7\n\n\0");
}
if(!return_value)
{
printf("There were some errors.\0");
}
return EXIT_SUCCESS;
}
That's all folks :P
-
Thanks a lot! :)