Page 1 of 3

FINAL FANTASY TYPE-0 HD PC

Posted: Thu Aug 20, 2015 10:51 pm
by chrrox
Here is a quikbms script for this game

Re: FINAL FANTASY TYPE-0 HD PC

Posted: Fri Aug 21, 2015 5:15 am
by ShivShubh
Great work :) Can you please also create a script for movie files (.hxmf) of this game ? And BTW, why some or many of the files extracted are of 0 bytes ? I have all the pack files at one place.

Re: FINAL FANTASY TYPE-0 HD PC

Posted: Fri Aug 21, 2015 10:19 am
by chrrox
Its a bug in quickbms.
hit r to rename files instead of skipping them.

Re: FINAL FANTASY TYPE-0 HD PC

Posted: Fri Aug 21, 2015 11:40 am
by ShivShubh
chrrox wrote:Its a bug in quickbms.
hit r to rename files instead of skipping them.
Yes I know but still some files like "alb03_05.bin", "alb07_01.bin", "ale01_02.bin" etc.. inside "JP\bg\bin" folder are extracted as 0 bytes and during extraction there's no option for replace or rename for those files.

Re: FINAL FANTASY TYPE-0 HD PC

Posted: Fri Aug 21, 2015 5:41 pm
by EcheloCross
ShivShubh, quite a few entrys in the .fsd file have 0 sizes. Not sure if they are further down in the package under the same name with a valid size, but if they have a 0 size in the fsd, its possible only their name and the blank fsd entry are still there, just not the file data.

Ker-schploink!
Image

Here is the layout I see so far:

Code: Select all

//--------------------------------------
// File: Final Fantasy Type-0 HD Model Binary Template
// Author: Echelo
// Revision: 0.06 info only
//--------------------------------------

local int i;
local int j;
LittleEndian();

struct MODEL_FILE
{
    struct MODEL_HEADER
    {
        uint unknown01 <bgcolor=0x0000FF>;
        uint unknown02 <bgcolor=0x0000FF>;
        uint vertexInfoPointer1 <bgcolor=0x00FF00>;
        uint unknown04 <bgcolor=0x0000FF>;
        ushort count02 <bgcolor=0xFFCC00>;
        ushort count01 <bgcolor=0xFFCC00>;
        ushort materialCount <bgcolor=0xFFCC00>;
        ushort textureCount <bgcolor=0xFFCC00>;
        ushort count06 <bgcolor=0xFFCC00>;
        ushort count05 <bgcolor=0xFFCC00>;
        ushort count07 <bgcolor=0xFFCC00>;
        ushort count08 <bgcolor=0xFFCC00>;
        uint64 address01 <bgcolor=0xFF8800>;
        uint64 materialInfoAddress <bgcolor=0xFF8800>;
        uint64 textureInfoAddress <bgcolor=0xFF8800>;
        uint64 address04 <bgcolor=0xFF8800>;
        uint64 address05 <bgcolor=0xFF8800>;
        uint64 address06 <bgcolor=0xFF8800>;
        uint64 address07 <bgcolor=0xFF8800>;
        uint64 vertexInfoPointer2 <bgcolor=0x00FF00>;
        uint64 address09 <bgcolor=0xFF8800>;
        uint64 address10 <bgcolor=0xFF8800>;
        uint64 address11 <bgcolor=0xFF8800>;
        uint64 address12 <bgcolor=0xFF8800>;
        uint64 address13 <bgcolor=0xFF8800>;
        uint64 address14 <bgcolor=0xFF8800>;
        uint64 address15 <bgcolor=0xFF8800>;
        uint64 address16 <bgcolor=0xFF8800>;
        uint unknown05 <bgcolor=0x0000FF>;
        ushort modelCount <bgcolor=0x00FF00>;
        ushort unknown06 <bgcolor=0x0099FF>;
        uint unknown07 <bgcolor=0x0000FF>;
        ushort unknown08 <bgcolor=0x0000FF>;
        ushort unknown09 <bgcolor=0x0000FF>;
    } modelHeader;

    if (modelHeader.count01 != 0)
    {
        
        FSeek(modelHeader.address01);
        struct TABLE_01
        {
            for (i = 0; i < modelHeader.count01; i++)
            {
                struct TABLE_01_ENTRY
                {
                    uint unknown01;
                    uint unknown02;
                    uint unknown03;
                    uint unknown04;
                } table01Entry;
            }
        } table01 <bgcolor=0x0099FF>;
    }

    if (modelHeader.materialCount != 0)
    {
        FSeek(modelHeader.materialInfoAddress);
        struct MATERIAL_INFO_TABLE
        {
            for (i = 0; i < modelHeader.materialCount; i++)
            {
                struct MATERIAL_INFO_ENTRY
                {
                    ushort diffuseMapIndex;
                    ushort normalMapIndex;
                    ushort specularMapIndex;
                    ushort unknown04;
                    ushort unknown05;
                    ushort unknown06;
                    ushort unknown07;
                    ushort unknown08;
                    ushort unknown09;
                    ushort unknown10;
                    ushort unknown11;
                    ushort unknown12;
                    ushort unknown13;
                    ushort unknown14;
                    ushort unknown15;
                    ushort unknown16;
                    ushort unknown17;
                    ushort specularLevelMapIndex; //not sure what kind of map this is ??
                    ushort unknown19;
                    ushort unknown20;
                    ushort unknown21;
                } materialInfoEntry;
            }
        } materialInfoTable <bgcolor=0x00FF00>;
    }

    if (modelHeader.textureCount != 0)
    {
        FSeek(modelHeader.textureInfoAddress);
        struct TEXTURE_INFO_TABLE
        {
            for (i = 0; i < modelHeader.textureCount; i++)
            {
                struct TEXTURE_INFO_ENTRY
                {
                    ushort textureWidth;
                    ushort textureHeight;
                    uint textureSize;
                    uint textureAddress;
                    uint unknown04;
                } textureInfoEntry;
            }
        } textureInfoTable <bgcolor=0x00FF00>;
    }

    if (modelHeader.count05 != 0)
    {
        FSeek(modelHeader.address05);
        struct TABLE_05
        {
            for (i = 0; i < modelHeader.count05; i++)
            {
                struct TABLE_05_ENTRY
                {
                    float unknown01;
                    float unknown02;
                    float unknown03; //?? not sure if float as only seen null here
                    byte unknown04;
                    byte unknown05;
                    byte unknown06;
                    byte unknown07;
                } table05Entry;
            }
        } table05 <bgcolor=0x0099FF, comment="fvf table?">;
    }

    if (modelHeader.address06 != 0)
    {
        FSeek(modelHeader.address06);
        struct TABLE_06
        {
            uint unknown01;
            float unknown02;
            float unknown03;
            float unknown04;
            ushort unknown05;
            ushort unknown06;
            uint unknown07;
            uint unknown08;
            uint unknown09;
            uint unknown10;
            uint unknown11;
            float boundingBoxCornerA_xPosition;
            float boundingBoxCornerA_yPosition;
            float boundingBoxCornerA_zPosition;
            float boundingBoxCornerB_xPosition;
            float boundingBoxCornerB_yPosition;
            float boundingBoxCornerB_zPosition;
            uint unknown12;
            uint unknown13;
            uint unknown14;
            uint unknown15;
        } table06 <bgcolor=0x0099FF>;
    }

    if (modelHeader.address07 != 0)
    {
        FSeek(modelHeader.address07);
        struct TABLE_07
        {
            uint unknown01;
            uint unknown02;
            uint unknown03;
            uint unknown04;
            uint unknown05;
            uint unknown06;
            uint unknown07;
            ushort unknown08;
        } table07 <bgcolor=0x0000FF>;
    }

    if (modelHeader.address13 != 0)
    {
        FSeek(modelHeader.address13);
        ushort unknownA;
        ushort table13_count;
        struct TABLE_13
        {
            for (i = 0; i < table13_count; i++)
            {
                struct TABLE_13_ENTRY
                {
                    ushort index;
                } table13Entry;
            }
        } table13 <bgcolor=0x00FFFF>;
    }

    if (modelHeader.vertexInfoPointer1 != 0)
    {
        FSeek(modelHeader.vertexInfoPointer1);
        if (modelHeader.modelCount == 0)
        {
            uint vertexInfoAddress;
            uint vertexInfoCount;
            ushort vertexInfoStride;
            ushort unknown01;
            uint unknown02;
            uint unknown03;
            uint unknown04;
            uint unknown05;
            uint unknown06;
            uint unknown07;
            uint unknown08;
            uint unknown09;
            uint unknown10;
            uint meshPartCount;
        
            /*for (i = 0; i < meshPartCount; i++)
            {
                struct FACE_GROUP_INFO
                {
                    uint faceIndexCountA <bgcolor=0xFFCC00>;
                    uint faceIndexCountB <bgcolor=0xFFCC00>;
                    byte unknownF01 <bgcolor=0x0000FF>;
                    byte unknownF02 <bgcolor=0x0000FF>;
                    byte materialIndex <bgcolor=0xFF00AA>;
                    byte unknownF03 <bgcolor=0x0000FF>;
        
                    struct FACE_GROUP
                    {
                        for (j = 0; j < (faceIndexCountA / 3); j++)
                        {
                            struct FACE_ENTRY
                            {
                                uint triangleIndex0;
                                uint triangleIndex1;
                                uint triangleIndex2;
                            } faceEntry;
                        }
                    } faceGroup;
                    
                } faceGroupInfo <bgcolor=0x879E2B>;
            }
        
            FSeek(vertexInfoAddress);
            struct VERTEX_INFO_ENTRYS
            {
                for (i = 0; i < vertexInfoCount; i++)
                {
                    struct VERTEX_INFO_ENTRY
                    {
                        if (vertexInfoStride == 0x44)
                        {
                            float xPosition;
                            float yPosition;
                            float zPosition;
                            byte unknown01;
                            byte unknown02;
                            byte unknown03;
                            byte unknown04;
                            byte unknown05;
                            byte unknown06;
                            byte unknown07;
                            byte unknown08;
                            uint unknown09;
                            uint unknown10;
                            uint unknown11;
                            uint unknown12;
                            uint unknown13;
                            uint unknown14;
                            byte unknown15;
                            byte unknown16;
                            byte unknown17;
                            byte unknown18;
                            float tu;
                            float tv;
                            float tu1;
                            float tv1;
                            float tu2;
                            float tv2;
                        }
                    } vertexInfoEntry;
                }
            } vertexInfoEntrys <bgcolor=0xFF3300>;*/
        }
        else
        {
            struct MODEL_INFO_ADDRESSES
            {
                for (i = 0; i < modelHeader.modelCount; i++)
                {
                    struct MODEL_ADDRESS
                    {
                        uint64 address;
                    } modelAddress;
                }
            } modelInfoAddresses <bgcolor=0x33FF00>;

            struct MODEL_INFO_ENTRYS
            {
                for (i = 0; i < modelHeader.modelCount; i++)
                {
                    FSeek(modelInfoAddresses.modelAddress[i].address);
                    struct MODEL_INFO_ENTRY
                    {
                        uint vertexInfoAddress;
                        uint vertexInfoCount;
                        ushort vertexInfoStride;
                        ushort unknown01;
                        uint unknown02;
                        uint unknown03;
                        uint unknown04;
                        uint unknown05;
                        uint unknown06;
                        uint unknown07;
                        uint unknown08;
                        uint unknown09;
                        uint unknown10;
                        uint meshPartCount;
                    } modelInfoEntry;
                }
            } modelInfoEntrys <bgcolor=0xCC8800>;
        }
    }
} modelFile;
[/size]

Re: FINAL FANTASY TYPE-0 HD PC

Posted: Sun Aug 23, 2015 8:10 am
by ShivShubh
Can anyone tell me what's the differences between normal and 4 GB version of QuickBMS ? cause with 4 GB edition, it gives error at some point while importing, but with normal edition it works fine, this also happened with some other games. So wanted to know if it will cause any problems or not by using normal edition of QuickBMS on this game files, and yes some files are larger than 2 GB in this game.

Re: FINAL FANTASY TYPE-0 HD PC

Posted: Wed Aug 26, 2015 1:14 pm
by Aegrus
Unless I'm seriously misunderstanding (I apologize, I'm new to this) this is a script for extracting models. (people are probably looking at me and saying 'derp' right now, sorry again). Is there any way I can extract textures? I'm not able to find many non-corrupted ones when I extract with this script.

Re: FINAL FANTASY TYPE-0 HD PC

Posted: Wed Aug 26, 2015 8:01 pm
by ssringo
This just unpacks the main packages. Don't have a way to extract usable models or textures afaik.

Edit. Didn't notice the edited post above. Haven't been able to test it.

Re: FINAL FANTASY TYPE-0 HD PC

Posted: Wed Aug 26, 2015 8:18 pm
by Clixias
Aegrus wrote:Unless I'm seriously misunderstanding (I apologize, I'm new to this) this is a script for extracting models. (people are probably looking at me and saying 'derp' right now, sorry again). Is there any way I can extract textures? I'm not able to find many non-corrupted ones when I extract with this script.
It will extract all files within the .pac file you chose.It will take a long time depending on your computer.

Also, does anyone know in which pack.pac the texture files are located and, if so , in which format?

Re: FINAL FANTASY TYPE-0 HD PC

Posted: Fri Aug 28, 2015 7:26 pm
by aagems
Is there any way to decrypt option file?I think the *.bin file is encrypted and it's not using usual *.ini or *.cfg to change custom resolution manually

Re: FINAL FANTASY TYPE-0 HD PC

Posted: Sun Aug 30, 2015 4:54 am
by amido
any way to compress back after change any model? in this script i can change doors style and compress back to game? =o


*sorry for bad english, not is my mother language*

Re: FINAL FANTASY TYPE-0 HD PC

Posted: Sat Sep 12, 2015 12:51 pm
by ayuanx
The script is buggy. Certain files have completely wrong data. It's not encryption since some files with the same extension name are correct.

Re: FINAL FANTASY TYPE-0 HD PC

Posted: Sat Sep 12, 2015 12:58 pm
by ayuanx
aagems wrote:Is there any way to decrypt option file?I think the *.bin file is encrypted and it's not using usual *.ini or *.cfg to change custom resolution manually
Forget about that. It doesn't store screen resolution height/width in the option file.
There is only a template value in option file for screen resolution: 0 for 1280x720; 1 for 1920x1080.
You can't customize resolution by modifying option file.

Re: FINAL FANTASY TYPE-0 HD PC

Posted: Sun Sep 13, 2015 5:00 pm
by ayuanx
Final Fantasy Type-0 HD PC Decryptor + Encryptor
By AyuanX, v1.0, 2015-09-14

Usage: FFType0HD_Cryptor.exe [-d] [-e] INPUT_FILE [OUTPUT_FILE]
-d (Decryption)
-e (Encryption)
OUTPUT_FILE (Optional, can be omitted)

Examples:
FFType0HD_Cryptor.exe -d EPSC01.hxmf
FFType0HD_Cryptor.exe -e TYPE0SYS.BIN

PS:
There are two kinds of files that are encrypted in FFType-0 HD PC:
A) All save data files (e.g. TYPE0SYS.BIN / TYPE0DAT.BIN)
They are meaningful binary files after decryption.

B) All pre-rendered movie files (e.g. *.hxmf)
They are standard MP4/H264 files after decryption.

PPS:
This tool is capable to encrypt modified files back to the game.
This is a command-line tool.
Both x86 and x64 versions are provided.
Minimum operating system: Windows Vista and later, up to Windows 10.

Alternative download:
https://ayuanx.wordpress.com/2015/09/14 ... d-cryptor/

Re: FINAL FANTASY TYPE-0 HD PC

Posted: Sat Sep 26, 2015 9:31 am
by aagems
Wonderful, thanks for the tools :)