Important information: this site is currently scheduled to go offline indefinitely by end of the year.

FINAL FANTASY TYPE-0 HD PC

The Original Forum. Game archives, full of resources. How to open them? Get help here.
chrrox
Moderator
Posts: 2602
Joined: Sun May 18, 2008 3:01 pm
Has thanked: 57 times
Been thanked: 1422 times

FINAL FANTASY TYPE-0 HD PC

Post by chrrox »

Here is a quikbms script for this game
You do not have the required permissions to view the files attached to this post.
ShivShubh
n00b
Posts: 18
Joined: Tue Sep 02, 2014 4:58 pm
Has thanked: 2 times

Re: FINAL FANTASY TYPE-0 HD PC

Post 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.
chrrox
Moderator
Posts: 2602
Joined: Sun May 18, 2008 3:01 pm
Has thanked: 57 times
Been thanked: 1422 times

Re: FINAL FANTASY TYPE-0 HD PC

Post by chrrox »

Its a bug in quickbms.
hit r to rename files instead of skipping them.
ShivShubh
n00b
Posts: 18
Joined: Tue Sep 02, 2014 4:58 pm
Has thanked: 2 times

Re: FINAL FANTASY TYPE-0 HD PC

Post 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.
EcheloCross
veteran
Posts: 88
Joined: Sat Feb 27, 2010 6:57 pm
Has thanked: 40 times
Been thanked: 77 times

Re: FINAL FANTASY TYPE-0 HD PC

Post 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]
You do not have the required permissions to view the files attached to this post.
Last edited by EcheloCross on Tue Aug 25, 2015 10:17 pm, edited 1 time in total.
ShivShubh
n00b
Posts: 18
Joined: Tue Sep 02, 2014 4:58 pm
Has thanked: 2 times

Re: FINAL FANTASY TYPE-0 HD PC

Post 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.
Aegrus
ultra-n00b
Posts: 1
Joined: Sun Aug 23, 2015 9:04 am
Has thanked: 1 time

Re: FINAL FANTASY TYPE-0 HD PC

Post 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.
ssringo
veteran
Posts: 98
Joined: Sat Apr 19, 2014 8:02 am
Has thanked: 46 times
Been thanked: 13 times

Re: FINAL FANTASY TYPE-0 HD PC

Post 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.
Clixias
ultra-n00b
Posts: 2
Joined: Wed Aug 26, 2015 2:28 pm
Has thanked: 1 time

Re: FINAL FANTASY TYPE-0 HD PC

Post 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?
User avatar
aagems
advanced
Posts: 75
Joined: Wed May 30, 2012 6:07 pm
Has thanked: 6 times
Been thanked: 1 time

Re: FINAL FANTASY TYPE-0 HD PC

Post 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
Great things require hard work!!
amido
ultra-n00b
Posts: 1
Joined: Sun Aug 30, 2015 4:43 am

Re: FINAL FANTASY TYPE-0 HD PC

Post 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*
ayuanx
ultra-n00b
Posts: 6
Joined: Mon Oct 13, 2014 12:23 pm
Been thanked: 9 times

Re: FINAL FANTASY TYPE-0 HD PC

Post 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.
ayuanx
ultra-n00b
Posts: 6
Joined: Mon Oct 13, 2014 12:23 pm
Been thanked: 9 times

Re: FINAL FANTASY TYPE-0 HD PC

Post 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.
ayuanx
ultra-n00b
Posts: 6
Joined: Mon Oct 13, 2014 12:23 pm
Been thanked: 9 times

Re: FINAL FANTASY TYPE-0 HD PC

Post 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/
You do not have the required permissions to view the files attached to this post.
User avatar
aagems
advanced
Posts: 75
Joined: Wed May 30, 2012 6:07 pm
Has thanked: 6 times
Been thanked: 1 time

Re: FINAL FANTASY TYPE-0 HD PC

Post by aagems »

Wonderful, thanks for the tools :)
Great things require hard work!!
Post Reply