Broken Age .tex files

Textures, recreate headers, conversions, algorithms and parsing of image files
makc_ar
Posts: 1193
Joined: Sun Aug 17, 2014 7:27 pm

Broken Age .tex files

Post by makc_ar »

MerlinSVK
Posts: 165
Joined: Wed Aug 13, 2014 10:00 am

Re: Broken Age .tex files

Post by MerlinSVK »

TEX to DDS

Code: Select all

# Game: Broken Age (PC)
# TEX to DDS converter
# by MerlinSVK    May 2015
# script for QuickBMS    http://aluigi.org/papers.htm#quickbms

get NAME basename
string DNAME = NAME
string DNAME += ".dds"
string HNAME = NAME
string HNAME += ".head"

log HNAME 0 0x20         # save header separately

comtype deflate
IDstring "TEX "
get WIDTH short
get HEIGHT short
get MIPS byte
get TYPE byte      # 0x03 = DXT1, 0x05 = DXT5
get PAD short      # some padding marker or what

if MIPS > 0x01
 math WIDTH / 2
 math HEIGHT / 2
endif

if TYPE == 0x03
 set MEMORY_FILE binary "\x44\x44\x53\x20\x7C\x00\x00\x00\x07\x10\x08\x00\xAA\xAA\xAA\xAA\xBB\xBB\xBB\xBB\xCC\xCC\xCC\xCC\x00\x00\x00\x00\xDD\x00\x00\x00\x4D\x45\x52\x4C\x49\x4E\x3A\x29\x01\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x04\x00\x00\x00\x44\x58\x54\x31\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
elif TYPE == 0x05
 set MEMORY_FILE binary "\x44\x44\x53\x20\x7C\x00\x00\x00\x07\x10\x08\x00\xAA\xAA\xAA\xAA\xBB\xBB\xBB\xBB\xCC\xCC\xCC\xCC\x00\x00\x00\x00\xDD\x00\x00\x00\x4D\x45\x52\x4C\x49\x4E\x3A\x29\x01\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x04\x00\x00\x00\x44\x58\x54\x35\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
endif

if PAD == 0x00
 goto 0x14
 get ZSIZE long
 get SIZE long
else PAD == 0x02
 get ZSIZE long
 get SIZE long
endif

putVarChr MEMORY_FILE 0XC HEIGHT long
putVarChr MEMORY_FILE 0x10 WIDTH long
putVarChr MEMORY_FILE 0x14 SIZE long
putVarChr MEMORY_FILE 0x1C MIPS byte

append
 clog MEMORY_FILE 0x20 ZSIZE SIZE
append

get DDSSIZE asize MEMORY_FILE
log DNAME 0 DDSSIZE MEMORY_FILE



DDS to TEX

Code: Select all

# Game: Broken Age (PC)
# DDS to TEX converter
# by MerlinSVK    May 2015
# script for QuickBMS    http://aluigi.org/papers.htm#quickbms

open FDDE DDS 0
open FDDE HEAD 1

get NAME basename
string NAME += ".tex_NEW"

get DSIZE asize 0
math DSIZE -= 0x80
get HSIZE asize 1

math FINAL_SIZE = HSIZE + DSIZE
putvarchr MEMORY_FILE FINAL_SIZE 0
log MEMORY_FILE 0 0

log MEMORY_FILE 0 HSIZE 1      # copy header into memory_file
comtype deflate_compress
append
 clog MEMORY_FILE 0x80 DSIZE DSIZE 0   # append texture data
append

get ZSIZE asize MEMORY_FILE
math ZSIZE -= HSIZE

goto 0x0A 1
get PAD short 1
if PAD == 0x00
 putvarchr MEMORY_FILE 0x14 ZSIZE long
elif PAD == 0x02
 putvarchr MEMORY_FILE 0x0C ZSIZE long
endif

get TEXSIZE asize MEMORY_FILE
log NAME 0 TEXSIZE MEMORY_FILE


I don't have this game so I could't test if it works with the "_new" textures.
makc_ar
Posts: 1193
Joined: Sun Aug 17, 2014 7:27 pm

Re: Broken Age .tex files

Post by makc_ar »

Thx MerlinSVK
Font Editing texture
Image


Unknowns
Example: https://yadi.sk/d/gwVTiDC3gPwe6
Errors etc:
Image
Fix?
aluigi
Site Admin
Posts: 12984
Joined: Wed Jul 30, 2014 9:32 pm

Re: Broken Age .tex files

Post by aluigi »

The format is a bit more complex with two parts of dds file and data that can be also non-compressed:

Code: Select all

# Game: Broken Age (PC)
# TEX to DDS converter
# by MerlinSVK    May 2015
# script for QuickBMS    http://aluigi.org/papers.htm#quickbms

get NAME basename
set DNAME string NAME   # necessary for filenames that starts with numbers
string DNAME += ".dds"
set HNAME string NAME
string HNAME += ".head"

comtype deflate
IDstring "TEX "
get WIDTH short
get HEIGHT short
get MIPS byte
get TYPE byte      # 0x03 = DXT1, 0x05 = DXT5
get PAD short      # some padding marker or what

if MIPS > 0x01
 math WIDTH / 2
 math HEIGHT / 2
endif

if TYPE == 0x03
 set MEMORY_FILE binary "\x44\x44\x53\x20\x7C\x00\x00\x00\x07\x10\x08\x00\xAA\xAA\xAA\xAA\xBB\xBB\xBB\xBB\xCC\xCC\xCC\xCC\x00\x00\x00\x00\xDD\x00\x00\x00\x4D\x45\x52\x4C\x49\x4E\x3A\x29\x01\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x04\x00\x00\x00\x44\x58\x54\x31\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
elif TYPE == 0x05
 set MEMORY_FILE binary "\x44\x44\x53\x20\x7C\x00\x00\x00\x07\x10\x08\x00\xAA\xAA\xAA\xAA\xBB\xBB\xBB\xBB\xCC\xCC\xCC\xCC\x00\x00\x00\x00\xDD\x00\x00\x00\x4D\x45\x52\x4C\x49\x4E\x3A\x29\x01\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x04\x00\x00\x00\x44\x58\x54\x35\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
endif

math FULL_SIZE = 0
math FILES = 2      # needs to be improved?
#if PAD == 2
#    math FILES = 1
#endif
savepos OFFSET
xmath OFFSET "OFFSET + (FILES * (4 + 4)) + 4"
log HNAME 0 OFFSET         # save header separately

append
for i = 0 < FILES
    get ZSIZE long
    get SIZE long

    if SIZE == ZSIZE
        log MEMORY_FILE OFFSET SIZE
    else
        clog MEMORY_FILE OFFSET ZSIZE SIZE
    endif

    math OFFSET + ZSIZE
    math FULL_SIZE + SIZE
next i
append

putVarChr MEMORY_FILE 0XC HEIGHT long
putVarChr MEMORY_FILE 0x10 WIDTH long
putVarChr MEMORY_FILE 0x14 FULL_SIZE long
putVarChr MEMORY_FILE 0x1C MIPS byte

get DDSSIZE asize MEMORY_FILE
log DNAME 0 DDSSIZE MEMORY_FILE
aluigi
Site Admin
Posts: 12984
Joined: Wed Jul 30, 2014 9:32 pm

Re: Broken Age .tex files

Post by aluigi »

Or alternatively it's enough to fix the OFFSET value in the original script to match the first or second part of data (0x20 + first_ZSIZE)
MerlinSVK
Posts: 165
Joined: Wed Aug 13, 2014 10:00 am

Re: Broken Age .tex files

Post by MerlinSVK »

Thanks Luigi :)
makc_ar
Posts: 1193
Joined: Sun Aug 17, 2014 7:27 pm

Re: Broken Age .tex files

Post by makc_ar »

Thx aluigi