Skip to content
View in the app

A better way to browse. Learn more.

ResHax

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.
Help us keep the site running.

SEGA NN Framework *.BNK

Featured Replies

  • Author
  • Localization

LolHacksRule, posted Thu Feb 27, 2020 5:59 pm (54295)


So the Transformers Human Alliance arcade game was finally dumped and I wanted to datamine it, but the majority (3GB!) of the game data is in 153 BNK files. They use a unique header (most likely its own file) of IZCA (? ? Compressed/Container Archive? Chunk Array) and they end with a footer of EOFC (End Of File Container? Chunk) before a bunch of null bytes, heck some BNK files have multiple IZCA archives in the IZCA archives in them! offzip -s/a doesn't really help on them. Can someone crack 'em so extraction is possible? Will upload samples soon. If there's other games using this, this page will be updated to relate to multiple. DBLK (DATABLOCK)[SCNE], models (ZNO/ZNM), sounds (extensionless ADX/AHXs?), texts (MFNT? HNFN?, BBTF?, MBUN? [not mentioned in EXE]?), textures (DDS, DDM DSFN [DeSign File Number?], HTEX) Games with this appear to run off the NN library and use the Sega CANVAS engine for graphics. CriWare packs (CPKs) UPDATE: https://drive.google.com/open?id=1MwbSr ... OwrXl3pCFc, I think H in names means Hydro or Hyuga, probably that one and I to be Izumi. This plugin set for Blender could help https://github.com/Argx2121/Sega_NN_tools.

Code:
I tried
MAIN ARCHIVE:
METADATA (32bytes):
4bytes: Header (IZCA, 495A4341)   
2-4bytes: Filesize for container data (little endian)
1byte: 10 (appears to always be 10 idk why)
7bytes: zero
1byte: 01 (appears to always be 01 idk why)
7bytes: zero
1byte: 20 (appears to always be 20 idk why)
3bytes: zero
1byte: File count?
BEYOND (Archive data):
TBC
FILE ARCHIVE END (16bytes):
4bytes: EOFC (454F4643)
4bytes: zero
1byte: 10 (appears to always be 10 idk why)
7bytes: zero

SUB-ARCHIVE (Subtitle archives use this):
METADATA (16bytes):
4bytes: Header (IZCA, 495A4341)
2-4bytes: Filesize for container data (little endian)
1byte: 14 (appears to always be 14 idk why)
7bytes: zero
1byte: 01 (appears to always be 01 idk why)
7bytes: zero
1byte: 20 (appears to always be 20 idk why)
3bytes: zero
1byte: File count?


Other pages regarding IZCA extraction:
viewtopic.php?t=679
viewtopic.php?f=9&t=11711

SegaNNExtract_MOD.bms

  • Author
  • Localization

LolHacksRule, posted Thu Feb 27, 2020 9:05 pm (54299)


Thanks so much, that's not it in these archives tho... There's some more. But how would I extract the BNKs?
  • Author
  • Localization

LokiReborn, posted Fri Feb 28, 2020 5:06 am (54303)


LolHacksRule wrote:
Thanks so much, that's not it in these archives tho... There's some more. But how would I extract the BNKs?

The container format is super simple
Code:
49 5A 43 41 //Magic
DC B7 00 00 //Container Size
10 00 00 00
00 00 00 00
01 00 00 00
00 00 00 00
20 00 00 00
03 00 00 00 //Count
   2C 00 00 00 //Start offsets of files (not relative)
   8C 33 00 00
   BC 36 00 00
---- Will be first file
  • Author
  • Localization

LolHacksRule, posted Fri Feb 28, 2020 5:34 am (54305)


Thanks so much
  • Author
  • Localization

SporeAltair, posted Mon Jan 18, 2021 8:37 pm (61728)


Why aren't all files completely unpacked? for example, from Starscream's model, I can get only his weapon.
From a 60MB file, I got 9MB.
  • Author
  • Localization

LolHacksRule, posted Tue Jan 19, 2021 6:14 pm (61749)


The 8 DDS files are consuming the majority of the said file (55MB), that's not a problem with the script, it just excludes extraction of files that are not models. Dragon Unpacker's HyperRipper or RavioliGameTools RExplorer can help find and extract them (without proper names).
  • Author
  • Localization

LolHacksRule, posted Sun Aug 08, 2021 4:49 am (65590)


Bored so I made this WIP script! Upon looking at the exe, IZCA likely stands for IZumi Chunk Array.

Code:
//------------------------------------------------
//--- 010 Editor v11.0.1 Binary Template
//
//      File: Sega Izumi Chunk Array (WIP!)
//    Authors: LolHacksRule
//    Version: 1
//    Purpose: Reading of IZCA format from Sega's Izumi Engine
//   Category: Modding
// File Mask: IZCA
//   ID Bytes: 495A4341
//    History:
//------------------------------------------------


LittleEndian();

typedef enum {
   NZObject = 1,
   NZTextureList = 2,
} NZIFContentType;
      
struct IZumiChunkArray {
   struct IZCAHdr {
      char      IZCAStr[4];
      int32      IZCASize;
      int32      padding[5];
        int32      cBlkCnt;
        int32      cBlkOffset[izumiContainerArchiveHdr.cBlkCnt];
        //ubyte     Content[IZCASize];
   } izumiContainerArchiveHdr;
   Printf("IZumi ContAiner\nFileSize:\nContentBlockCount:\n");
   struct ContentBlock
   {
      char blockType[4];
      if (blockType == "HMDL")
      {
         Printf("Hydrogen Model detected.");
         struct HydrogenModelBlock
         {
            uint32 blockHdrSize;
            uint64 blockPadding;
            } hydrogenMdlHdr;
            struct ZNInfoBlock
         {
             char  znoInfBlkHdr[4];
             int32 padding; //Offset from it?
             NZIFContentType contentType; //Content type?
             int32 unkVal;
             int32 NZxToNOF0Size;
             int32 NZIFToNOF0Size;
             int32 N0F0HdrSize;
             int32 dummy;
                char  nextBlockType[4];
             if (nextBlockType == "NZOB") //NZ/ZN O/Object
             {
                 Printf("ZNO Model detected.");
                struct ZNOObjBinBlock
                {
                   int32 NZOBinSize;
                   int32 unk;
                   int32 unkVal[2];
                    } znoObjBin;
                }
                else if (nextBlockType == "NZTL") //NZ/ZN Texture List
             {
                    Printf("NZ/ZN Texture List detected.");
                struct ZNOTexListBinBlock
                {
                   uint32 blockSize;
                    int32  unk;
                        int64  nothing;
                } ZNOTexListBin;
             }
            } znInfoBlk;
        }
        else if (blockType == "HCAM") //Hydrogen Camera Surface Animation
      {
          Printf("Hydrogen CAMera detected.");
         struct HydrogenCamBlock
         {
            uint32 blockSize;
            uint64 blockPadding;
         } hydrogenCam;
      }
      else if (blockType == "HCSA") //Hydrogen Camera Surface Animation
      {
          Printf("Hydrogen Camera Surface Animation detected.");
         struct HydrogenSfcCamBlock
         {
            uint32 blockSize;
            uint64 blockPadding;
         } hydrogenSfcCam;
      }
        else if (blockType == "HNFN") //Hydrogen Font?
        {
            Printf("HydrogeN FoNt?");
            struct HydrogenFont
            {
                uint32 SubArcblockSize;
            uint64 blockPadding;
            } hGenFont;
            struct IzumiSubArc
                {
                    char    IZSubArc[4];
                    int32   IZCASubSize;
                  int32   padding;
                    int32   dummyBytes;
                  //int32   subArcBlkOffset[subArcBlkCnt];
                    struct BBTFBlk
                    {
                        char    BBTFBlkHdr[4];
                        int32   padding[5];
                        int32   unknown;
                        int32   unknown2;
                    } bbtfBlkContent;
                    struct MFNTBlock
                    {
                        char    BBTFBlkHdr[4];
                        int32   unknown;
                        int32   padding[2];
                        int32   unknown2;
                    } bbtfBlkContent;
                    char finalBlockType[4];
                    if (finalBlockType == "EOFC") //End Of File Container
                    {
                        Printf("End Of File Container");
                        struct EndOfFileContaner_HFNT
                        {
                            int32 dummy[3];
                        } EOFC_FntHdr;
                    }
                } iZSubArc;
        }
      else if (blockType == "HSND") //Hydrogen SouND
      {
          Printf("Hydrogen SouND detected.");
         struct HydrogenSoundBlock
         {
            uint32 blockHdrSize;
            uint64 blockPadding;
            char   criSndBinBlk[4];
            struct CriSoundBinaryContainer
            {
               uint32 ACBFileSize;
               uint64 blockPadding;
               ubyte  ACBFile[ACBFileSize];
               int32  dummyACBBytes;
            } criSndBin;
                char finalBlockType[4];
                if (finalBlockType == "EOFC") //End Of File Container
                {
                    Printf("End Of File Container");
                    struct EndOfFileContaner_HSND
                    {
                        int32 dummy[3];
                    } EOFC_SndHdr;
                }
         } hydrogenSoundBlock;
      }
      else if (blockType == "HMAT") //Hydrogen Material Animation
        {
          Printf("Hydrogen Material detected.");      
         struct HydrogenMatBlock
         {
            uint32 blockHdrSize;
            uint64 blockPadding;
         } hydrogenMat;
      }
      //else if (blockType == "HCAM") //Hydrogen CAMera
      //else if (blockType == "HMAT") //Hydrogen MATerial
         //uint32 blockHdrSize;
         //uint64 blockPadding;
      //} hydrogenMatHdr;
   } contentBlock[izumiContainerArchiveHdr.cBlkCnt];
    char endBlockType[4];
    if (endBlockType == "EOFC") //End Of File Container
    {
        Printf("End Of File Container");
        struct EndOfFileContaner
        {
            int32 dummy[3];
        } EOFCHdr;
    }
    //if (blockType == "DBLKSCNE") //Data BLoCk SCeNE
    //if (blockType == "DBLKTEXC") //Data BLoCk TEXture Compressed
   //if (blockType == "NZMA") //NZ/ZN Animation
    //else if (blockType == "HMAT") //Hydrogen MATerial
            //uint32 blockHdrSize;
            //uint64 blockPadding;
         //} hydrogenMatHdr;
} IZCAChunkBin;
  • Author
  • Localization

Argg, posted Mon Aug 09, 2021 11:57 am (65644)


I've added partial .bnk file support - It only extracts textures and files using the nn library.
It skips extracting the files to HMDL and other in between file formats and goes directly to and zno file for convenience.
Modelwise, the normal maps in the samples were channel packed so they're ignored on import.

https://github.com/Argx2121/Sega_NN_tools/releases

If there's any issues please tell me in the discord server - I don't check here very often.

Image
  • Author
  • Localization

LolHacksRule, posted Wed Aug 11, 2021 3:00 pm (65679)


Thank you, I'll try it out soon.
Guest
This topic is now closed to further replies.

Account

Navigation

Search

Search

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.