Jump to content

Tekken 6 xbox360 customization textures missing


Go to solution Solved by h3x3r,

Recommended Posts

Posted (edited)

So I did everything as told here but some alt color textures are missing(this applies to all characters as well and lots of other outfits) after extraction.
These are the textures I ripped, showing the denim skirt for example:

skirtssamplecolors.thumb.png.63e36d86f492032519e35739c0c8f9c4.png

And the missing ones are inside the rectangle(yellow, blue, light blue and orange):

TEKKEN6clr.thumb.png.dc99bae81a02bb9a7450cd2bf91d61d3.png

It's the same thing with other characters wherein the colors that aren't included are on the 1st and last rows of the cusomization screen

TEKKEN.thumb.png.59ca444518f55a53e9376e819901a061.png

If anybody knows how to extract all textures out mygosh you're a hero 🙏🫡
I'm also looking into getting the texts and button input icons out

Edited by MightyMable
removed the spoilers for easier viewing
  • 2 weeks later...
  • Engineers
  • Solution
Posted

So after i decompressed BIN i used this bms from luigi to unpack it but without file names.

Spoiler
# Tekken 6 (script 0.2.3)
# script for QuickBMS http://quickbms.aluigi.org

endian big
open FDDE "idx"
open FDDE "bin" 1 EXISTS
if EXISTS == 0
    get TMP basename
    string TMP + "_.bin"
    open FDSE TMP 1
endif

math ALIGN = 0x8000
math DO_CHUNKS = 1

get FILES asize
math FILES / 8
goto -8
    get OFFSET long
get BIN_SIZE asize 1
math OFFSET * ALIGN
if OFFSET u> BIN_SIZE
    math ALIGN = 0x80
    math DO_CHUNKS = 0
endif

goto 0
for i = 0 < FILES
    get OFFSET long
    get SIZE long
    if SIZE != 0xffffffff
    if SIZE != 0
        math OFFSET * ALIGN
        callfunction DUMP 1
    endif
    endif
next i

startfunction DUMP
    if DO_CHUNKS == 0
        log "" OFFSET SIZE 1
    else
        goto OFFSET 1
        get CHUNKS long 1
        if CHUNKS u< 0x200  # some files are chunked and others aren't... no way to know it!
            for x = 0 < CHUNKS
                get CHUNK_OFF long 1
                get CHUNK_SIZE long 1
                math CHUNK_OFF + OFFSET
                if CHUNK_SIZE != 0

                    savepos TMP_OFF 1
                    goto CHUNK_OFF 1
                    get TMP long 1
                    goto TMP_OFF 1
                    math TMP * 8
                    math TMP + 4
                    math TMP x 0x10
                    if TMP == CHUNK_SIZE
                        # just an empty index, skip it
                    else
                        log "" CHUNK_OFF CHUNK_SIZE 1
                    endif
                endif
            next x
        else
            log "" OFFSET SIZE 1
        endif
    endif
endfunction

 

You'll get *.NTX files. These are textures. I wrote Noesis script for them.

from inc_noesis import *
import noesis
import rapi
import os

def registerNoesisTypes():
   handle = noesis.register("Tekken 6 - Xbox 360 Texture", ".ntx")
   noesis.setHandlerTypeCheck(handle, noepyCheckType)
   noesis.setHandlerLoadRGBA(handle, noepyLoadRGBA)
   noesis.logPopup()
   return 1
        
def noepyCheckType(data):
   bs = NoeBitStream(data,NOE_BIGENDIAN)
   if len(data) < 20:
      return 0
   return 1
   
def noepyLoadRGBA(data, texList):
    bs = NoeBitStream(data,NOE_BIGENDIAN)
    BaseName = rapi.getExtensionlessName(rapi.getLocalFileName(rapi.getInputName()))
    bs.read(7)
    TextureCount = bs.readUByte()
    bs.read(8)

    for i in range(TextureCount):
        TextureNum = "_{:04d}".format(i)
        cPos = bs.tell()
        bs.read(8)
        RawDataSize = bs.readUInt()
        RawDataOffset = bs.readUShort()
        Var3 = bs.readUShort()
        MipMaps = bs.readUShort()
        PixelFormat = bs.readUShort()
        TextureWidth = bs.readUShort()
        TextureHeight = bs.readUShort()
        
        bs.seek(cPos, NOESEEK_ABS)
        bs.read(RawDataOffset)
        data = bs.readBytes(RawDataSize)
            
        if PixelFormat == 0:
            data = rapi.swapEndianArray(data, 2)
            texFmt = noesis.NOESISTEX_DXT1
        elif PixelFormat == 1:
            data = rapi.swapEndianArray(data, 2)
            texFmt = noesis.NOESISTEX_DXT3
        elif PixelFormat == 2:
            data = rapi.swapEndianArray(data, 2)
            texFmt = noesis.NOESISTEX_DXT5
            
        texList.append(NoeTexture(BaseName + TextureNum, TextureWidth, TextureHeight, data, texFmt))
    return 1

 

  • Like 1
  • Engineers
Posted

Here's bms to dump texture only if you care...

get BaseFileName basename
endian big

for
	findloc NTXOffset binary "\x4E\x54\x58\x52"
    goto NTXOffset
	getdstring Dummy 0x07
	get TextureCount ubyte
	getdstring Dummy 0x08
	
	for i = 0 < TextureCount
		savepos Offset
		get FileSize uint32
		goto Offset
		getdstring Data FileSize
		string FileName p= "%s/0x%04x.ntx" BaseFileName Offset
		log FileName Offset FileSize
	next i
next

And I must also update Noesis script to work with them.

Spoiler
from inc_noesis import *
import noesis
import rapi
import os

def registerNoesisTypes():
   handle = noesis.register("Tekken 6 - Xbox 360 Texture", ".ntx")
   noesis.setHandlerTypeCheck(handle, noepyCheckType)
   noesis.setHandlerLoadRGBA(handle, noepyLoadRGBA)
   noesis.logPopup()
   return 1
        
def noepyCheckType(data):
   bs = NoeBitStream(data,NOE_BIGENDIAN)
   if len(data) < 20:
      return 0
   return 1
   
def noepyLoadRGBA(data, texList):
    bs = NoeBitStream(data,NOE_BIGENDIAN)
    BaseName = rapi.getExtensionlessName(rapi.getLocalFileName(rapi.getInputName()))

    cPos = bs.tell()
    bs.read(8)
    RawDataSize = bs.readUInt()
    RawDataOffset = bs.readUShort()
    Var3 = bs.readUShort()
    MipMaps = bs.readUShort()
    PixelFormat = bs.readUShort()
    TextureWidth = bs.readUShort()
    TextureHeight = bs.readUShort()
    
    bs.seek(RawDataOffset, NOESEEK_ABS)
    data = bs.readBytes(RawDataSize)
        
    if PixelFormat == 0:
        data = rapi.swapEndianArray(data, 2)
        texFmt = noesis.NOESISTEX_DXT1
        print("Pixel Format > DXT1 ",PixelFormat)
    elif PixelFormat == 1:
        data = rapi.swapEndianArray(data, 2)
        texFmt = noesis.NOESISTEX_DXT3
        print("Pixel Format > DXT3 ",PixelFormat)
    elif PixelFormat == 2:
        data = rapi.swapEndianArray(data, 2)
        texFmt = noesis.NOESISTEX_DXT5
        print("Pixel Format > DXT5 ",PixelFormat)
    elif PixelFormat == 19:
        data = rapi.swapEndianArray(data, 2)
        data = rapi.imageDecodeRaw(data, TextureWidth, TextureHeight, "r8g8b8a8")
        texFmt = noesis.NOESISTEX_RGBA32
        print("Pixel Format > RGBA ",PixelFormat)
    elif PixelFormat == 20:
        data = rapi.swapEndianArray(data, 2)
        data = rapi.imageDecodeRaw(data, TextureWidth, TextureHeight, "r8g8b8a8")
        texFmt = noesis.NOESISTEX_RGBA32
        print("Pixel Format > RGBA ",PixelFormat)
        
    texList.append(NoeTexture(BaseName, TextureWidth, TextureHeight, data, texFmt))
    return 1

 

 

  • Like 1
Posted

 

20 hours ago, h3x3r said:

Here's bms to dump texture only if you care...

get BaseFileName basename
endian big

for
	findloc NTXOffset binary "\x4E\x54\x58\x52"
    goto NTXOffset
	getdstring Dummy 0x07
	get TextureCount ubyte
	getdstring Dummy 0x08
	
	for i = 0 < TextureCount
		savepos Offset
		get FileSize uint32
		goto Offset
		getdstring Data FileSize
		string FileName p= "%s/0x%04x.ntx" BaseFileName Offset
		log FileName Offset FileSize
	next i
next

And I must also update Noesis script to work with them.

  Reveal hidden contents
from inc_noesis import *
import noesis
import rapi
import os

def registerNoesisTypes():
   handle = noesis.register("Tekken 6 - Xbox 360 Texture", ".ntx")
   noesis.setHandlerTypeCheck(handle, noepyCheckType)
   noesis.setHandlerLoadRGBA(handle, noepyLoadRGBA)
   noesis.logPopup()
   return 1
        
def noepyCheckType(data):
   bs = NoeBitStream(data,NOE_BIGENDIAN)
   if len(data) < 20:
      return 0
   return 1
   
def noepyLoadRGBA(data, texList):
    bs = NoeBitStream(data,NOE_BIGENDIAN)
    BaseName = rapi.getExtensionlessName(rapi.getLocalFileName(rapi.getInputName()))

    cPos = bs.tell()
    bs.read(8)
    RawDataSize = bs.readUInt()
    RawDataOffset = bs.readUShort()
    Var3 = bs.readUShort()
    MipMaps = bs.readUShort()
    PixelFormat = bs.readUShort()
    TextureWidth = bs.readUShort()
    TextureHeight = bs.readUShort()
    
    bs.seek(RawDataOffset, NOESEEK_ABS)
    data = bs.readBytes(RawDataSize)
        
    if PixelFormat == 0:
        data = rapi.swapEndianArray(data, 2)
        texFmt = noesis.NOESISTEX_DXT1
        print("Pixel Format > DXT1 ",PixelFormat)
    elif PixelFormat == 1:
        data = rapi.swapEndianArray(data, 2)
        texFmt = noesis.NOESISTEX_DXT3
        print("Pixel Format > DXT3 ",PixelFormat)
    elif PixelFormat == 2:
        data = rapi.swapEndianArray(data, 2)
        texFmt = noesis.NOESISTEX_DXT5
        print("Pixel Format > DXT5 ",PixelFormat)
    elif PixelFormat == 19:
        data = rapi.swapEndianArray(data, 2)
        data = rapi.imageDecodeRaw(data, TextureWidth, TextureHeight, "r8g8b8a8")
        texFmt = noesis.NOESISTEX_RGBA32
        print("Pixel Format > RGBA ",PixelFormat)
    elif PixelFormat == 20:
        data = rapi.swapEndianArray(data, 2)
        data = rapi.imageDecodeRaw(data, TextureWidth, TextureHeight, "r8g8b8a8")
        texFmt = noesis.NOESISTEX_RGBA32
        print("Pixel Format > RGBA ",PixelFormat)
        
    texList.append(NoeTexture(BaseName, TextureWidth, TextureHeight, data, texFmt))
    return 1

 

 

Tried this out, It seems I can't preview the .ntx files from Noesis and it asks me to export right away. I must've made a misstep in the middle of the process 😕

Posted
2 hours ago, MightyMable said:

 

Tried this out, It seems I can't preview the .ntx files from Noesis and it asks me to export right away. I must've made a misstep in the middle of the process 😕

Have you put the Noesis script in the Noesis plugins/python folder?  It won't work otherwise.

 

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...