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.

The Suffering and The Suffering: Ties That Bind (Riot Engine, from the early 2000's. .sdu_mdl.file .tdu.file)

Featured Replies

I have been trying to Rip Models and Maps from this game for a while now. The steam user "tchaek" seems to have figured out how to rip the models as they have made Gmod models of the Monsters and Ghosts, they used their own python scripts. Is there anybody who knows how to do so. I have used Game Extractor to get all of the Textures, from the NPCs to the Map Textures.image.thumb.png.d5f8f07fd62a5a1997df28009a500a31.png

  • Zorg-Sinister changed the title to The Suffering and The Suffering: Ties That Bind (Riot Engine, from the early 2000's. .sdu_mdl.file .tdu.file)
  • Localization
On 5/17/2026 at 11:34 PM, Zorg-Sinister said:

I have been trying to Rip Models and Maps from this game for a while now. The steam user "tchaek" seems to have figured out how to rip the models as they have made Gmod models of the Monsters and Ghosts, they used their own python scripts. Is there anybody who knows how to do so. I have used Game Extractor to get all of the Textures, from the NPCs to the Map Textures.image.thumb.png.d5f8f07fd62a5a1997df28009a500a31.png

Would love to get the animations as well, such a great game!

  • Supporter

Isn't sdu sound?

I checked them but i think that table is in another file. The small one. The big ones are just data holders.

  • Supporter

Well i figured out *.tdu format. Looks like it has it's own table.

O.K all files have same table but resource type varies. And also one resource can be serialized from multiple resources. Starting with header i guess and then data.

I noticed it at models, they have separated vertices, uv, normals etc.

This will require some debug to get at least proper resource types, but i can guess them anyway as usual.

I was able get the NPC but there is no head? I checked face indices which are surprisingly tri-strip. And vertices doesn't seem to have head vertices. So may be it's in another resource which tells me that heads are variable for this body type. Also normals are still nowhere to be found.

UV's looks fine but not sure where is material index for texture.

image.thumb.png.ec5ce02d3b3a571e744cd3f9618f86e9.png

So here's bms to unpack any of *.*DU files.

There's no file name. Only file id i think.

###################################
#      The Suffering - *.*DU      #
###################################
get BaseFileName basename
get TotalFileSize asize
get Ext extension

idstring "SRSC"
get Flags ushort
get TableOffset uint32
get TOCIndex uint32

goto TableOffset

for i = 0 < TOCIndex
	get ResourceType ubyte
	get Unknown ubyte
	get ResourceId uint32
	get ResourceOffset uint32
	get ResourceSize uint32

	set MEMORY_FILE binary "\x00\x00\x00\x00\x00\x00\x00\x00"
	putVarChr MEMORY_FILE 0x0 ResourceSize uint32
	putVarChr MEMORY_FILE 0x4 ResourceType uint32

	string FileName p= "%s_%s/0x%04x.%u" BaseFileName Ext ResourceId ResourceType
	append 0
	log FileName 0 8 MEMORY_FILE
	log FileName ResourceOffset ResourceSize
next i

And here Noesis script for files with *.64 extension. These are textures. Mostly in *.TDU files.

from inc_noesis import *
import noesis
import rapi
import os

def registerNoesisTypes():
   handle = noesis.register("The Suffering - Texture", "64")
   noesis.setHandlerTypeCheck(handle, noepyCheckType)
   noesis.setHandlerLoadRGBA(handle, noepyLoadRGBA)
   noesis.logPopup()
   return 1
        
def noepyCheckType(data):
   bs = NoeBitStream(data)
   if len(data) < 20:
      return 0
   return 1
   
def noepyLoadRGBA(data, texList):
    ctx = rapi.rpgCreateContext()
    bs = NoeBitStream(data)
    baseName = rapi.getExtensionlessName(rapi.getLocalFileName(rapi.getInputName()))
    
    ResourceSize = bs.readUInt()
    ResourceType = bs.readUInt()
    TextureWidth = bs.readUInt()
    TextureHeight = bs.readUInt()
    Unknown_0 = bs.readUInt()
    PixelFormat = bs.readUInt()
    bs.read(32)
    TextureBuffer = bs.read(ResourceSize - 48)

    if PixelFormat == 4:
        texFmt = noesis.NOESISTEX_DXT1
    elif PixelFormat == 8:
        texFmt = noesis.NOESISTEX_DXT5
    texList.append(NoeTexture(rapi.getInputName(), TextureWidth, TextureHeight, TextureBuffer, texFmt))
    return 1

 

Edited by h3x3r

  • Author

Also here are the texture.files for the guards/C.O.s for you to test with. I used Watto's Game Extractor.
Heads:
UnnamedFile000056.sdu_tex.png.4cfad0350a6de442969042179bd387d9.pngUnnamedFile000054.sdu_tex.png.f34d1fdffb2492802f8320d987de663a.pngUnnamedFile000071.sdu_tex.png.3e8863a31c91d9e9cd134634d53bddcd.pngUnnamedFile000057.sdu_tex.png.a76992ea61f2118bece7d5cea2cb1458.pngUnnamedFile000066.sdu_tex.png.a16ebe16ba9f3e444441b5bc41d05b12.pngUnnamedFile000072.sdu_tex.png.827f7a4b276a3d55734a67360a7f2aab.pngUnnamedFile000073.sdu_tex.png.c5782201257a034a43ad99d40040b76d.pngUnnamedFile000076.sdu_tex.png.ac3ea069b8be8cc59222ae0ce4600bee.pngUnnamedFile000077.sdu_tex.png.2d94ba15dc3404815e56f574f9cfbf80.pngUnnamedFile000078.sdu_tex.png.0aea7ff79fd48bb727d3ec7633f6d2c6.png
Main body:
UnnamedFile000053.sdu_tex.png.d07a48992cca088e073e0c512477a419.png

Pants:
UnnamedFile000055.sdu_tex.png.396379d1cd420e600019d5cadcfbb2a8.png.

Unnamed File 000057.sdu_tex.png

Unnamed File 000066.sdu_tex.png

Unnamed File 000071.sdu_tex.png

Edited by Zorg-Sinister

  • Supporter

I have no problem with textures. I can get them just fine. Which file you tried to unpack? Maybe it has different struct.

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.