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.

[PS2/XBOX] Fight Club *.ark / *.spb / *.pcf / *.tex / *.pvf / *.xmf /*.psf etc..

Featured Replies

Hello, can anyone check these file formats to see if you can extract anything from them? I’ve already tried without any luck, but I figured some of you might know.
This link contains the dump I created, so you can skim through the files and take a look. If possible, could you also suggest or maybe even create
any plugins or tools that might help open them?

https://drive.google.com/drive/folders/1kqHk6ULPWuRH6yAyc3tQuH_Vlivf8ysB?usp=drive_link

Solved by jmancoder

  • Localization

WMA is an audio file format (Windows Media Audio) and can be played by VLC. SFD seems to be a font file but FontForge can't open it

ARK files seems to be archive containers that contain inside them another ARK files and another files

Edit: SFD is a video file format that can be played by VLC too

Here is a python script with batch file to extract the contents of the ARK files, drag and drop one or more ARK files onto the batch (.bat) file

Also an ARK.hexpat file you can use in ImHex

ARK_File_Parser.rar

 

ARK.rar

Edited by haruse31

  • Author
8 hours ago, haruse31 said:

WMA is an audio file format (Windows Media Audio) and can be played by VLC. SFD seems to be a font file but FontForge can't open it

ARK files seems to be archive containers that contain inside them another ARK files and another files

Edit: SFD is a video file format that can be played by VLC too

Here is a python script with batch file to extract the contents of the ARK files, drag and drop one or more ARK files onto the batch (.bat) file

Also an ARK.hexpat file you can use in ImHex

ARK_File_Parser.rar 1.14 kB · 1 download

 

ARK.rar 435 B · 1 download

Okay, thank you. Is there any way to open the formats contained in the exported .ARK files? It’s difficult to figure out where the models and textures are because the files are scattered everywhere, almost like an infinite loop. This image shows just some of the several formats found in the exported .ARK files.

 

Screenshot 2025-09-13 105817.png

Screenshot 2025-09-13 105800.png

Edited by Ad_lolz

  • Localization
2 hours ago, Ad_lolz said:

Okay, thank you. Is there any way to open the formats contained in the exported .ARK files? It’s difficult to figure out where the models and textures are 

Screenshot 2025-09-13 105800.png

Textures seem to be TCF files. Models are probably XCF

 I dont know how to reverse PS2/XBOX textures and models

  • Author
27 minutes ago, haruse31 said:

Textures seem to be TCF files. Models are probably XCF

 I dont know how to reverse PS2/XBOX textures and models

Darn, thank you though! 👍

  • Supporter

room.xmf (needs a suiting PS2 tri strips algorithm):

mesh_viewer_room-xmf.png

or simply smaller sub meshes:

mesh_viewer_5i5YiFzhhE.png.dc94d85fb786953e790d72f3b62a50e7.png

Tyler, head:

mesh_viewer_Tyler_head.png.9f5d1a3306269ff2506904e9461aa95a.png

Edited by shak-otay

  • Author
4 hours ago, shak-otay said:

room.xmf (needs a suiting PS2 tri strips algorithm):

mesh_viewer_room-xmf.png

or simply smaller sub meshes:

mesh_viewer_5i5YiFzhhE.png.dc94d85fb786953e790d72f3b62a50e7.png

Tyler, head:

mesh_viewer_Tyler_head.png.9f5d1a3306269ff2506904e9461aa95a.png

That's interesting, What program are you using to view the models, and how did you convert the file to an obj?

  • 4 months later...
  • Author

As of now, I haven’t made much progress with textures and related stuff. If anyone comes across this post, I’d really appreciate any help.

I noticed that the company (Genuine Games) that developed Fight Club (2004) also worked on 50 Cent: Bulletproof, so I figured using the 50 Cent: Bulletproof .ARK QuickBMS script on the Fight Club .ARK files might get me somewhere but no luck. It just sends me into a spiral of file types nested inside other files.😵

Edited by Ad_lolz

  • Supporter
14 hours ago, Ad_lolz said:

As of now, I haven’t made much progress with textures and related stuff.

You should specify what you're talking about? PS2 or XBOX?

.tex or .xtf? (Dunno, what haruse31 meant with .TCF)

xtf

Quote

Texture Format

.xtf - (Xbox Texture File is the Xbox Equivalent to the VTF. Includes Preload Image as holdover till full res image is loaded from HDD)

For .xtf I can't confirm this, though:

Quote

Noesis - (Noesis is a multitool program that just about anything from viewing .xtf textures to mocap "Motion capture" animations.)

IrfanView:

luna-xtf-32BPP.png.124bd27ec3c088c703763d94ecd6f932.png

 

Edited by shak-otay

  • Author
6 hours ago, shak-otay said:

You should specify what you're talking about? PS2 or XBOX?

I’d say Xbox, because it’s generally easier to work with and usually has higher-quality models than the PS2 versions. But honestly, any platform would be good it still shows that progress is being made.

Edited by Ad_lolz

  • Localization
2 hours ago, Ad_lolz said:

I’d say Xbox, because it’s generally easier to work with and usually has higher-quality models than the PS2 versions. But honestly, any platform would be good it still shows that progress is being made.

I extracted the original Xbox version, and it seems more or less the same as what you uploaded via Google Drive. I've attached a work-in-progress Noesis plugin for the .xcf models, though I'm not sure about the triangle layouts. There seem to be inverted and missing triangles, especially on the torsos.

fmt_fight_club_xcf.py

  • Localization

The attached Noesis plugin should work on the .xtf textures. The colours might still need some tweaking, as they look a bit greyed out. The section after the header might be a colour palette, though I don't know how to parse it.

fmt_fight_club_xtf.py

  • Supporter
5 hours ago, jmancoder said:

I extracted the original Xbox version, and it seems more or less the same as what you uploaded via Google Drive. I've attached a work-in-progress Noesis plugin for the .xcf models, though I'm not sure about the triangle layouts. There seem to be inverted and missing triangles, especially on the torsos.

OK, I think I found the problem. Mesh6 has 3 blocks of faces, you are reading only the 1st one(because the other meshes have only 1, so some meshes have more entries in face info(each entry is 0x18 bytes). Now, in mesh header you can see the face entry count, it is after "face_info_off = bs.readInt()". Here is mesh6 header and those bytes are 03 00 00 00:
01 00 00 00 04 00 00 00 FF FF FF FF FF FF FF FF F0 0A 00 00 03 00 00 00. I modified your script, here is it and a screenshot(I added some prints here and there too):

tyler.PNG

fmt_fight_club_xcf.py

  • Supporter
5 hours ago, jmancoder said:

The attached Noesis plugin should work on the .xtf textures. The colours might still need some tweaking, as they look a bit greyed out. The section after the header might be a colour palette, though I don't know how to parse it.

Yes, there are two types at offset 0x34: 1 = Diffuse, 4 = Normal map. So Diffuse has a palette at 0x80, you can do this:
 

from inc_noesis import *

def registerNoesisTypes():
    handle = noesis.register("Fight Club Textures (Xbox)", ".xtf")
    noesis.setHandlerTypeCheck(handle, noepyCheckType)
    noesis.setHandlerLoadRGBA(handle, noepyLoadRGBA)
    return 1

def noepyCheckType(data):
    bs = NoeBitStream(data)
    return bs.readBytes(8) == b"\x58\x54\x46\x5F\x30\x30\x30\x30"

def noepyLoadRGBA(data, texList):
    bs = NoeBitStream(data)

    # name
    bs.seek(0x08)
    tex_name = bs.readString()

    # size + type
    bs.seek(0x30)
    w = bs.readUShort()
    h = bs.readUShort()
    tex_type = bs.readUInt()  # 1 = diffuse, 4 = normal

    # offsets
    bs.seek(0x40)
    img_off = bs.readUInt()
    pal_off = bs.readUInt()

    # -------------------------
    # DIFFUSE (8bpp + palette)
    # -------------------------
    if tex_type == 1:
        # read index buffer
        bs.seek(img_off)
        idx_buf = bs.readBytes(w * h)

        # read palette (BGRA)
        bs.seek(pal_off)
        pal_buf = bs.readBytes(4 * 256)

        # decode palette
        img_buf = rapi.imageDecodeRawPal(idx_buf, pal_buf, w, h, 8, "b8g8r8a8")


        # unswizzle
        img_buf = rapi.imageFromMortonOrder(img_buf, w, h, 4)

        tex = NoeTexture(tex_name, w, h, img_buf, noesis.NOESISTEX_RGBA32)
        texList.append(tex)
        return 1

    # -------------------------
    # NORMAL MAP (RGBA)
    # -------------------------
    elif tex_type == 4:
        bs.seek(img_off)
        raw = bs.readBytes(w * h * 4)

        raw = rapi.imageFromMortonOrder(raw, w, h, 4)

        tex = NoeTexture(tex_name, w, h, raw, noesis.NOESISTEX_RGBA32)
        texList.append(tex)
        return 1

    print("Unknown texture type:", tex_type)
    return 0

It is based in other script for xbox textures that we made before. Palette and image data have the same format so there you go 😉

  • Author

Wow, that’s sick! I was looking through the Fight Club dump and noticed file types like .xmf, .col, and .wpf. I’m not sure if they contain models or textures, though I wouldn’t really know since I’ve never tried extracting Xbox files to this extent 🤷‍♂️

These file types can usually be found in the Arena files located in the Levels folder in the Fight Club dump. I decided to parse the env.ark file located in the Arena5a (shown below). From what I can tell, these files (the xmf files) might be models, but I’m not entirely sure.

By the way, these files were found in the env.ark files located in Arena5a (located in the levels file in the fight club dump) after parsing both ark files (Arena51 and env.ark) with the ARK Parser
sorry, if this doesn't sound smooth i've tried to word it as good as I can
https://drive.google.com/drive/folders/1zOhUsewuQdKHEXqBjA4cafODG9X2lBRG
 

https://drive.google.com/drive/folders/12E6-jgNubHw7RyKyxKKw76RO3Clu30kL?usp=sharing
These are the folders I was referring to: env and Arena5a
There are more file types inside Arena5a, I just uploaded the env file separately.
Screenshot2026-01-21180235.thumb.png.77e10b69fca33b3edda20ea698659875.png Screenshot2026-01-21181009.thumb.png.7f3886bd010fff8902fbd180f27bcc2c.png

Edited by Ad_lolz

  • Author
On 9/13/2025 at 1:55 PM, shak-otay said:

room.xmf (needs a suiting PS2 tri strips algorithm):

mesh_viewer_room-xmf.png

or simply smaller sub meshes:

mesh_viewer_5i5YiFzhhE.png.dc94d85fb786953e790d72f3b62a50e7.png

Tyler, head:

mesh_viewer_Tyler_head.png.9f5d1a3306269ff2506904e9461aa95a.png

I forgot about this post, but I guess that answers my question. I’m just wondering if there’s an easier way to do this without digging through hex and all that 🤔?I’ve been trying to reverse engineer an XMF file, but I keep running into index mismatches (vertex chaos) no matter what I change in the python script.
it's getting kind of tideous trying to find the correct offset :classic_sleep:

Edited by Ad_lolz

  • Supporter
1 hour ago, Ad_lolz said:

I forgot about this post, but I guess that answers my question. I’m just wondering if there’s an easier way to do this without digging through hex and all that 🤔?I

That was about PS2.

Quote

it's getting kind of tideous trying to find the correct offset 

If there doesn't exist a profund analysis already it always starts with getting the parameters for the first sub mesh. This may be very tedious, yes.

But then it's a matter of getting the idea, i.e. VIF tags for PS2, or, for different platforms/formats some other signature before the vertex block.

Or, if you're lucky, you'll find some "magic table" containing offsets and/or counts for all the sub meshes.

  • Localization
  • Solution
16 hours ago, Ad_lolz said:

I forgot about this post, but I guess that answers my question. I’m just wondering if there’s an easier way to do this without digging through hex and all that 🤔?I’ve been trying to reverse engineer an XMF file, but I keep running into index mismatches (vertex chaos) no matter what I change in the python script.
it's getting kind of tideous trying to find the correct offset :classic_sleep:

Try the attached script for XMF files. I also adjusted the XCF script to read the triangles strips a bit differently, though both mesh types still have some random edges. There were also some DX textures in the level archive, so I added support for them to the XTF script.

fmt_fight_club_xcf.py fmt_fight_club_xmf.py

fmt_fight_club_xtf.py

Edited by jmancoder

  • 3 weeks later...
  • Author

Okay, so I found another file type 😵. It seems that the .xdf files store some models, based on the names and sizes of the files in the provided link (https://drive.google.com/drive/folders/1CTF2GbJZbRh-Uzeta4foSbszrtfpTYOb?usp=sharing). I’ve noticed that most of these files are located within the level.ark files. If anyone can find a Noesis plugin online, please let me know I’ve looked everywhere and couldn’t find anything. 👎

  • Localization
16 hours ago, Ad_lolz said:

Okay, so I found another file type 😵. It seems that the .xdf files store some models, based on the names and sizes of the files in the provided link

The attached Noesis plugin should work. I think either the triangles strips or normals are slightly incorrect in the script, but I don't know enough about old packed mesh formats to fix that.

fmt_fight_club_xdf.py

Create an account or sign in to comment

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.