HomeForumsWhat's newResources 
 
 
Fire Pro Save Game Structure
slinga - Aug 31, 2020
 slinga Aug 31, 2020
I've made a little bit of progress understanding the FPS:6MS save format. Basically my strategy is to edit something in a CAW and diff the changes in the save. It appears to be working but it's slow. I've also figured out the checksum. Here are my results so far:

Code:
  
// 20308 bytes in internal memory
// 31820 bytes in cartridge memory
struct FPS_save{

    char magic[8] // FPS_DATA on internal, FPS_EDIT on cart
    unsigned char isCAWSlotUsed[16]; // if 1 the slot contains a CAW, if 0 the slot is free. 16 on internal memory, 64 on cart

   CAW caw[16]; // array of created wrestlers

    ?? - some region here contains the renamed promotions and wrestlers

    unsigned int checksum; // Sum of all the bytes in the save excluding the checksum
}

// 0x1f0
struct isCAWS
{
    unsigned char weightClass; // 1 = hvy, 2 = jr hv, 3 = free
    unsigned char nameModifier; // high bit is to toggle first/last name
                                // low nibble is the seperator betwen the names
                                // 0 = space
                                // 1 = centered "."
                                // 2 = "="
                                // 3 = no space between first last names

    char last_name_sjis[14]; // 14 characters for last name in SJIS. Last two bytes are for NULL terminator??
    char first_name_sjis[20]; // how can it be an odd number? likely overlapped with a zero-ed field Last two bytes are for NULL terminator??
    char nickname[26]; // how can it be an odd number? likely overlapped with a zero-ed field Last two bytes are for NULL terminator??

    // 0x3e
    unsigned char ht_in_cms;
    unsigned char wt_in_kgs;

    // 0x40
    unsigned char birthplace; 0-31
    unsigned char dob_year_since_1900;
    unsigned char dob_month;
    unsigned char dob_date;
    unsigned char promotion;
    unsigned char style;
    unsigned char def;
    unsigned char res;

    // 0x48
    unsigned char res_cut;
    unsigned char air;
    unsigned char air_cut;
    unsigned char fcs;
    unsigned char fsc_cut;
    unsigned char neck;
    unsigned char arms;
    unsigned char wast;

    // 0x50
    unsigned char legs;
    unsigend char move_speed;
    unsigend char ring_climb;
    unsigned char can_climb;
    unsigned char critical;
    unsigned char ring_return; 0-20
    unsigned char teamwork; 0-2
    unsigned char song;

    // 0x58
    unsigned char voice1;
    unsigned char sound1;
    unsigned char voice2;
    unsigned char sound2;


    0x5d
    unsigned char stance; 0-8 strong - ko-budou(old budo)
    unsigned char size; 0-2 s, m, l

    0x172
    RGB colors[34]; 68 bytes of wrestler RGB values

    0x1b6
        unsigned char finisher_sjis[40];



    0x1e1
    unsigned char face; 0-0xCB

    0x1e2
    // BUGBUG don't understand this
    unsigned char chest; // this has the size encoded as well, not sure how

    0x1e3
    unsigned char waist; // not sure how this is encoded

    0x1e4
    unsigned char upper_arm; // not sure how this is encoded

    0x1e5
    unsigned char lower_arm; // not sure how this is encoded

    0x1e6
    unsigned char knee; 0-25; bare legs - kuma

    0x1e7
    unsigned char thigh;  // not sure how this is encoded

    0x1e8
    unsigned char wrist; 0-2 bare hand - taping
    ?? also wrist? buttom bits are writst???

    0x1e9
    unsigned char ankle; 0-14 bare-feet- kuma

}


// 2 byte struct
// each CAW has 34 of these
struct RGB{

    unsigned char red:5;
    unsigned char green:5;
    unsigned char blue:5;
    unsigned char unused:1;
}

 slinga Sep 1, 2020
More progress:

Code:
  
CAW slot 0:
Swap name order: no
Name Modifier: space 0
Last Name: 
First Name: 
Nickname: 
Stance: 2
Size: 1
Face: 129
Knee: 3
Wrist: 0
Ankle: 3

CAW slot 1:
Swap name order: no
Name Modifier: space 0
Last Name: 
First Name: 
Nickname: 
Stance: 0
Size: 7
Face: 114
Knee: 3
Wrist: 0
Ankle: 1

CAW slot 2:
Swap name order: no
Name Modifier: space 0
Last Name: 
First Name: 
Nickname: “
Stance: 0
Size: 0
Face: 32
Knee: 12
Wrist: 0
Ankle: 2

CAW slot 3:
Swap name order: no
Name Modifier: space 0
Last Name: 
First Name: 
Nickname: 
Stance: 0
Size: 0
Face: 79
Knee: 3
Wrist: 0
Ankle: 1

CAW slot 4:
Swap name order: no
Name Modifier: space 0
Last Name: 
First Name: 
Nickname: 
Stance: 0
Size: 0
Face: 86
Knee: 0
Wrist: 0
Ankle: 3

CAW slot 5:
Swap name order: no
Name Modifier: no space 3
Last Name: 
First Name: 
Nickname: 
Stance: 2
Size: 11
Face: 71
Knee: 25
Wrist: 0
Ankle: 1

CAW slot 6:
Swap name order: no
Name Modifier: no space 3
Last Name: 
First Name: 
Nickname: 
Stance: 5
Size: 4
Face: 196
Knee: 22
Wrist: 2
Ankle: 6

CAW slot 7:
Swap name order: no
Name Modifier: space 0
Last Name: 
First Name: 
Nickname: 
Stance: 6
Size: 8
Face: 104
Knee: 3
Wrist: 0
Ankle: 1

CAW slot 8:
Swap name order: no
Name Modifier: no space 3
Last Name: 
First Name: 
Nickname: 
Stance: 1
Size: 7
Face: 113
Knee: 5
Wrist: 0
Ankle: 2

CAW slot 9:
Swap name order: no
Name Modifier: space 0
Last Name: 
First Name: 
Nickname: 
Stance: 0
Size: 0
Face: 123
Knee: 3
Wrist: 0
Ankle: 1

CAW slot 10:
Swap name order: no
Name Modifier: space 0
Last Name: 
First Name: 
Nickname: 
Stance: 0
Size: 0
Face: 74
Knee: 3
Wrist: 0
Ankle: 2

CAW slot 11:
Swap name order: no
Name Modifier: no space 3
Last Name: 
First Name: 
Nickname: 
Stance: 0
Size: 0
Face: 102
Knee: 2
Wrist: 0
Ankle: 1

CAW slot 12:
Swap name order: no
Name Modifier: space 0
Last Name: 
First Name: 
Nickname: 
Stance: 0
Size: 0
Face: 197
Knee: 3
Wrist: 0
Ankle: 1

CAW slot 13:
Swap name order: no
Name Modifier: space 0
Last Name: 
First Name: 
Nickname: 
Stance: 0
Size: 0
Face: 169
Knee: 8
Wrist: 0
Ankle: 3

CAW slot 14:
Swap name order: no
Name Modifier: no space 3
Last Name: 
First Name: 
Nickname: 
Stance: 0
Size: 0
Face: 175
Knee: 10
Wrist: 0
Ankle: 9

CAW slot 15:
Swap name order: no
Name Modifier: no space 3
Last Name: 
First Name: 
Nickname: 
Stance: 0
Size: 0
Face: 27
Knee: 11
Wrist: 0
Ankle: 9

I found the bytes for the Chest, Waist, Upper Arm, Lower Arm, and Thigh as well but the encoding is not obvious to me. Those values include a size field as well (S, M, L, D). I would assume that it would be some sort of bitfield but that doesn't work. and D, the biggest size, is 0.

 slinga Sep 3, 2020
I think I have the entire Create-A-Wrestler structure parsed. I still need to figure out the encoding for some of things.

 slinga Sep 5, 2020
I have enough of the save figured out to create a dumper\injector for renaming the promotions and wrestlers: slinga-homebrew/6MS-Save-Editor....

One issues I'm having is that the output files are UTF-8 but when I edit them on Linux it's inserting ASCII characters.

 Malenko Sep 5, 2020
Amazing work!

 slinga Sep 5, 2020
At offset 0x3a680 in 1ST.bin is an array of 160 prebuild wrestlers. I was able to figure out the structure and dump the data.

Code:
  
// 0x1ac
struct _PREBUILT_WRESTLER{

    unsigned char CHARACTER_weightClass; // 1 = hvy, 2 = jr hv, 3 = free
    unsigned char RENAME_nameModifier; // high bit is to toggle first/last name
                                       // low nibble is the seperator betwen the names
                                       // 0 = space
                                       // 1 = centered "."
                                       // 2 = "="
                                       // 3 = no space between first last names
    char RENAME_last_name_sjis[14]; // 14 characters for last name in SJIS. Last two bytes are for NULL terminator??
    char RENAME_first_name_sjis[20]; // how can it be an odd number? likely overlapped with a zero-ed field Last two bytes are for NULL terminator??
    char RENAME_nickname[26]; // how can it be an odd number? likely overlapped with a zero-ed field Last two bytes are for NULL terminator??

    // 0x3a6be
    // 0x3e
    unsigned char CHARACTER_ht_in_cms;
    unsigned char CHARACTER_wt_in_kgs;

    // 0x40
    unsigned char CHARACTER_origin; // 0-31
    unsigned char CHARACTER_dob_year_since_1900;
    unsigned char CHARACTER_dob_month;
    unsigned char CHARACTER_dob_date;
    unsigned char CHARACTER_promotion; // move to another promotion
    unsigned char CHARACTER_style;
    unsigned char CHARACTER_def;
    unsigned char CHARACTER_res;

    // 0x48
    unsigned char CHARACTER_res_cut;
    unsigned char CHARACTER_air;
    unsigned char CHARACTER_air_cut;
    unsigned char CHARACTER_fcs;
    unsigned char CHARACTER_fcs_cut;
    unsigned char CHARACTER_neck;
    unsigned char CHARACTER_arms;
    unsigned char CHARACTER_waist;

    // 0x50
    unsigned char CHARACTER_legs;
    unsigned char CHARACTER_move_speed;
    unsigned char CHARACTER_ring_climb;
    unsigned char CHARACTER_can_climb;
    unsigned char CHARACTER_critical;
    unsigned char CHARACTER_ring_return; // 0-20
    unsigned char CHARACTER_teamwork; // 0-2
    unsigned char CHARACTER_song;

    // 0x58
    unsigned char CHARACTER_voice1;
    unsigned char CHARACTER_sound1;
    unsigned char CHARACTER_voice2;
    unsigned char CHARACTER_sound2;

    //0x5c
    unsigned char FEATURE_stance; // 0-8 strong - ko-budou(old budo)
    unsigned char FEATURE_size; // 0-2 s, m, l

    // 0x3a6de
    // 0x14 bytes
    unsigned char ATTRIBUTES_offense[10]; // starts at 3 not 0
    unsigned char ATTRIBUTES_defense[10];

    //  0x3a6f2
    //    0x70
    MOVE ACT_moves[56]; array of wrestling moves structs. I don't believe this matches the order on the

    // 0x3a762
    // 8e bytes
    LOGIC; 0x8e bytes

    FEATURE features[6];

    unsigned char unused??[6]
}

I think it wouldn't be too hard to extract the rename information from a translated save and inject that into 1ST.BIN. That would mean you wouldn't need a save file to get the translated wrestler names. And we wouldn't need to mess with unlocks or anything.

Other things we can do is edit default wrestlers moves, skills, etc. I tried changing what promotion a wrestler belonged to and it just removed them. So not clear how to do that yet.

One weird thing I did notice is that there isn't any RGB data in the struct like there is with the Create-A-Wrestlers. And are finishers not named for builtin wrestlers?

 Malenko Sep 6, 2020
I believe the built in wrestlers just use the generic name for a finisher, much like a CAW does if you dont make a custom finisher name. In case you havent figured it out, yuou have to take the finisher flag OFF of down+C and move it to another move to rename the finisher. If you want the finisher to still be down+C and rename it, you have to move the flag, then move it back to down+C

 slinga Sep 6, 2020
I'm going to spend some time trying to find the RGB colors. It's weird that it's not in this structure.

Also I'm missing the wrestlers from 160-200 which are built in appearance only, not in logic or moves.

 Malenko Sep 6, 2020
160 through 200 are probably the edit wrestlers , when you change the head it alters the costume to match the wrestler. Its where Razon Ramon is