Fire Pro Save Game Structure

slinga

Member
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;
}
 
Last edited:

slinga

Member
More progress:

Code:
CAW slot 0:
Swap name order: no
Name Modifier: space 0
Last Name: Steve
First Name: Austin
Nickname: Stone C
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: Chris
First Name: Candido
Nickname: No Gimm
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: Tommy
First Name: Dreamer
Nickname: “Inavat
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: Shane
First Name: Douglas
Nickname: Franchi
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: Sheng
First Name: Chiang
Nickname: Ye ye y
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: TAZ
First Name: 
Nickname: THIS IS
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: KING
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: Marc
First Name: Mero
Nickname: Wildman
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: Hunte
First Name: rHelmsley
Nickname: HHH
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: Owen
First Name: Hart
Nickname: The Bes
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: Lex
First Name: Luger
Nickname: Flexy L
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: The G
First Name: iant
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: Scott
First Name: Hall
Nickname: Outside
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: Dallas
First Name: Page
Nickname: Diamond
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: NewJa
First Name: ck
Nickname: Gangsta
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: Musta
First Name: fa
Nickname: Gangsta
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.
 
Last edited:

slinga

Member
I think I have the entire Create-A-Wrestler structure parsed. I still need to figure out the encoding for some of things.
 

Attachments

slinga

Member
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.
 

slinga

Member
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

New Member
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

Member
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

New Member
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
 
Top