HalfBrick Studios Fruit Ninja/Mortar Engine *.UISCREEN

Extraction and unpacking of game archives and compression, encryption, obfuscation, decoding of unknown files
LolHacksRule
Posts: 865
Joined: Fri Apr 20, 2018 12:41 am

HalfBrick Studios Fruit Ninja/Mortar Engine *.UISCREEN

Post by LolHacksRule »

The game previously used XML files, but as Fruit Ninja PIB, UISCREEN files are used which is a binary form of a screen XML. I tried to document the format. Anyone want to help me with it? Thanks.

Code: Select all

//------------------------------------------------
//--- 010 Editor v10.0.2 Binary Template
//
//      File: Halfbrick Studios Fruit Ninja/Mortar Engine UI Screen Binary File
//      Authors: LolHacksRule
//      Version: 1
//      Purpose: Gets data out of the binary.
//      Category: Deserializing
//      File Mask: FSIU
//      ID Bytes:
//      History:
//------------------------------------------------

struct UIScreenFileBin {
    struct UIScreenFileHeader {
        char   UIScreenFileHdrStr[4]<bgcolor=cGreen>; //Should be UISF/FSIU
        if (UIScreenFileHdrStr == "UISF")
        BigEndian();
        else if (UIScreenFileHdrStr == "FSIU")
        LittleEndian();
        //isLE = true;
        byte   unk;
        byte   unkCnt;
        byte   unkCnt2;
        byte   unkCnt3;
        byte   unkCnt4;
        byte   unkCnt5;
        byte   unkCnt6;
        byte   unkCnt7;
        //if (isLE = true);
        byte   unknown[32];
        byte   dummy[8];
    } UISFHeader<bgcolor=cGreen>;

    //UISB

    struct UIScreenBlock {
        char   UIScreenBlockHdrStr[4];
        int    UIScreenVersionStrSize;
        char   UIScreenVersionStr[UIScreenVersionStrSize];
        //char   UIScreenSKUStr;
   
        //if (isLE = true)
   
        struct UIStringTableBlock {
            char   UISTHdrStr[4]<bgcolor=cGreen>;
            int    UISTDummy;
            int    UISTDummy2;
            int    UISTStringSize;
            char   UIScreenVersionStr[UISTStringSize];
            byte   UISTUnkBytes[23];
            byte   UISTUnkBytes2[25];
            } UISTBlock;
   
        struct UIComponent {
            char   UICOMPStr[4]<bgcolor=cGreen>;
            int    UICOMPUNK;
            } UICOMPBlock;
   
        struct UIComponentHeader {
            char   UICOMPHdrStr[4]<bgcolor=cGreen>;
            byte   UICOMPHdrUNK[13];
            } UICHHdr;

        string nextBlock;
   
        //struct UITab {
            //char UITABHdrStr[3];
            //byte UITabUNK[29];
            //} UITabContent;
   
        //struct UITab2 {
            //char UITAB2HdrStr[3];
            //byte UITab2UNK[17];
            //} UITab2Content;

        if (nextBlock = "SPMC")

            struct UISPMC {
            } UISPMCContent;

            nextBlock;
   
        /* else if (nextBlock = "UICH")

        struct UIComponentHeader2 {
            char   UICOMPHdr2Str[4]<bgcolor=cGreen>;
            byte   UICOMPHdr2UNK[13];
            } UICH2Hdr;

            nextBlock;
   
        else if (nextBlock = "TAB")

            struct UITab3 {
                char UITAB3HdrStr[3];
                byte UITab3UNK[17];
            } UITab3Content;

            nextBlock;
   
        else if (nextBlock = "UIME")
   
            struct UIMetadataEnd {
                char UIMetaHdrStr[4];
                byte unk[20];
            } UIMetaEnd;
           
            nextBlock;
           
        else if (nextBlock = "MAIUBAIU")
            struct UIUNKASHECK {
            byte zero[4];
            } UIUNKASHECKEND;

            nextBlock;
   
            else if (nextBlock = "UISE")
   
                struct UIScreenEndHeader {
                char   UIScreenEndHdrStr[4]<bgcolor=cGreen>;
            } UIScreenEnd; */
        } UIScreenBlockContent;
} UIScreenFile;