ZenHAX

Free Game Research Forum | Official QuickBMS support | twitter @zenhax | SSL HTTPS://zenhax.com
It is currently Fri Aug 17, 2018 4:00 am

All times are UTC




Post new topic  Reply to topic  [ 11 posts ] 
Author Message
PostPosted: Fri Nov 28, 2014 11:30 am 

Joined: Wed Aug 13, 2014 10:00 am
Posts: 137
So I finally managed to make a texture converting BMS scripts for both, the .binfont and .texture files.

For easier localization, there would by neat to have some tool/script to convert/import/export strings from l??n.bin file (editing is doable via hex or Notepad++, but plain text would be better) :(

EDIT2: Mipmaps in .texture files are supported now :mrgreen:

Code:
# This War of Mine
# BINFONT to DDS converter
# by MerlinSVK    Nov 2014
# version 1.0
# script for QuickBMS    http://aluigi.org/papers.htm#quickbms

get SIZE asize
get NAME basename
string HNAME = NAME
string TNAME = NAME
string HNAME += ".head"
string TNAME += ".tail"
string NAME += ".dds"

idstring "\xE3\x0A\xF2\x23"
get UNK long
get TYPE byte
get COUNT long
math HEIGHT = 0

for i = 0 < COUNT
   get TMP long
   math HEIGHT += TMP
next i
savepos OFFSET

xmath DATASZ "(SIZE / 0x1000) * 0x1000"      # length of texture data
xmath TOFFSET "OFFSET + DATASZ"            # start of tail
xmath TSIZE "SIZE - TOFFSET"            # length of tail

if COUNT > 1 then
   xmath OFFSET "(COUNT * 4) + (OFFSET - 4)"
endif

if TYPE == 1      # L8A8 format
   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\x00\x00\x00\x00\x4D\x45\x52\x4C\x49\x4E\x3A\x29\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\x00\x00\x00\x20\x00\x00\x00\x01\x00\x02\x00\x00\x00\x00\x00\x10\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
   xmath WIDTH "(DATASZ / HEIGHT) / 2"
else            # L8 format
   set MEMORY_FILE binary "\x44\x44\x53\x20\x7C\x00\x00\x00\x0F\x10\x00\x00\xAA\xAA\xAA\xAA\xBB\xBB\xBB\xBB\xCC\xCC\xCC\xCC\x00\x00\x00\x00\x01\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\x00\x00\x02\x00\x00\x00\x00\x00\x08\x00\x00\x00\xFF\x00\x00\x00\xFF\x00\x00\x00\xFF\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"
   xmath WIDTH "DATASZ / HEIGHT"
endif

putVarChr MEMORY_FILE 0XC HEIGHT long
putVarChr MEMORY_FILE 0x10 WIDTH long
putVarChr MEMORY_FILE 0x14 DATASZ long

append
log MEMORY_FILE OFFSET DATASZ
append

get DDSSIZE asize MEMORY_FILE
log HNAME 0 OFFSET            # save header
log TNAME TOFFSET TSIZE         # save tail (char descriptions)
log NAME 0 DDSSIZE MEMORY_FILE   # save DDS texture


Code:
# This War of Mine
# DDS to BINFONT converter
# version 1.0
# by MerlinSVK    Nov 2014
# script for QuickBMS    http://aluigi.org/papers.htm#quickbms

open FDDE DDS 0
open FDDE HEAD 1
open FDDE TAIL 2

get NAME basename
string NAME += ".binfont_NEW"

get DSIZE asize 0
get HSIZE asize 1
get TSIZE asize 2

math DSIZE -= 0x80            # subtract the DDS header

log MEMORY_FILE 0 HSIZE 1      # copy header into memory_file
append
log MEMORY_FILE 0x80 DSIZE 0   # append texture data
log MEMORY_FILE 0 TSIZE 2      # append tail
append

get BINSZ asize MEMORY_FILE
log NAME 0 BINSZ MEMORY_FILE



Code:
# This War of Mine
# TEXTURE to DDS converter
# by MerlinSVK          Dec 2014
# version 1.2         (added support for RGBA format & mipmaps)
# script for QuickBMS   http://aluigi.org/papers.htm#quickbms

get SIZE asize
get NAME basename
string HNAME = NAME
string MNAME = NAME
string HNAME += ".head"
string NAME += ".dds"

get WIDTH long
get HEIGHT long
get TYPE long
get MIPS long

xmath DATASZ "SIZE - 0x90"

if TYPE == "0x31545844"         # DXT1
   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\x01\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 == "0x33545844"      # DXT3
   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\x01\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\x33\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 == "0x35545844"      # DXT5
   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\x01\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"
elif TYPE == "0x15"            # RGBA8
   set MEMORY_FILE binary "\x44\x44\x53\x20\x7C\x00\x00\x00\x0F\x10\x00\x00\x41\x41\x41\x41\x42\x42\x42\x42\x43\x43\x43\x43\x43\x00\x00\x00\x01\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\x41\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\xFF\x00\x00\xFF\x00\x00\xFF\x00\x00\x00\x00\x00\x00\xFF\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
endif

   putVarChr MEMORY_FILE 0XC HEIGHT long
   putVarChr MEMORY_FILE 0x10 WIDTH long
   putVarChr MEMORY_FILE 0x14 DATASZ long

if MIPS == 1
   append
   log MEMORY_FILE 0x90 DATASZ
   append
else
   putVarChr MEMORY_FILE 0XA 0x0A byte
   putVarChr MEMORY_FILE 0X1C MIPS long
   putVarChr MEMORY_FILE 0X6C 0x08 byte
   putVarChr MEMORY_FILE 0X6E 0x40 byte

   math MIPOFFSET = 0x90               # offset of the smallest mipmap
   for i = 1 <= MIPS                  # read mipmap lenghts
      get MIPWIDTH short
      get MIPHEIGHT short
      get MIPSIZE[i] long

      set MIPSTART[i] long MIPOFFSET
      set MIPSZ long MIPSIZE[i]
      xmath MIPOFFSET "MIPOFFSET + MIPSZ"   # calculate next mipmap offset
   next i
         
   append
   for i = MIPS >= 1                  # writing mipmaps in reversed order
      log MEMORY_FILE MIPSTART[i] MIPSIZE[i]
   next i - 1
   append
endif

get DDSSIZE asize MEMORY_FILE
log HNAME 0 0x90            # save header
log NAME 0 DDSSIZE MEMORY_FILE   # save DDS texture



Code:
# This War of Mine
# DDS to TEXTURE converter
# by MerlinSVK          Dec 2014
# version 1.1         (added support for mipmaps)
# script for QuickBMS   http://aluigi.org/papers.htm#quickbms

open FDDE DDS 0
open FDDE HEAD 1

get NAME basename
string NAME += ".texture_NEW"

get DSIZE asize 0
get HSIZE asize 1

goto 0xC 1                  # read number of mipmaps from header
get MIPS long 1

math DDSSIZE = DSIZE
math DSIZE -= 0x80            # subtract the DDS header
log MEMORY_FILE 0 HSIZE 1      # copy header into memory_file

if MIPS == 1
   append
   log MEMORY_FILE 0x80 DSIZE 0   # append whole texture data
   append
else
   for i = 1 <= MIPS            # read mipmap lenghts
      get MIPWIDTH short 1
      get MIPHEIGHT short 1
      get MIPSIZE[i] long 1
   next i

   math MIPOFFSET = 0x80         # offset of the biggest texture
   for i = MIPS >= 1
      set MIPSTART[i] long MIPOFFSET
      set MIPSZ long MIPSIZE[i]
      xmath MIPOFFSET "MIPOFFSET + MIPSZ"         # calculate next mipmap offset
   next i - 1
         
   append
   for i = 1 <= MIPS                        # writing mipmaps in reversed order
      log MEMORY_FILE MIPSTART[i] MIPSIZE[i]
   next i
   append
endif

get BINSZ asize MEMORY_FILE
log NAME 0 BINSZ MEMORY_FILE



Code:
Bin file with strings, if somebody wants to look at it.
https://www.dropbox.com/s/dz1ygg7uv2koh82/l01n.7z


Last edited by MerlinSVK on Tue Dec 09, 2014 12:33 pm, edited 3 times in total.

Top
   
PostPosted: Fri Nov 28, 2014 12:26 pm 

Joined: Sun Aug 10, 2014 12:49 pm
Posts: 266
Not simple text format it is text container containig all languages.. Doing the template right now...


Top
   
PostPosted: Fri Nov 28, 2014 12:36 pm 

Joined: Wed Aug 13, 2014 10:00 am
Posts: 137
Yep. 4503 (4505 after update) files O.o

And I also have partially done font description reader, for those who would like to add new letters into font textures.
But I don't know what UNK1 and UNK2 represents.

Image

Code:
https://www.dropbox.com/s/dtamrn1ulg9nx0y/font_example.7z


Code:
# This War of Mine
# Font descripion reader (from .tail file)

get COUNT long
for i = 0 < COUNT
   get CHAR short
   get UNK1 short
   get UNK2 short
   get X1 short
   get X2 short
   get Y1 short
   get Y2 short
   xmath WIDTH  "X2 - X1"
   xmath HEIGHT "Y2 - Y1"
   print "Char: %CHAR|h%, X1: %X1%, Y1: %Y1%, X2: %X2%, Y2: %Y2%, Width: %WIDTH%, Height: %HEIGHT%"
next i


Top
   
PostPosted: Fri Nov 28, 2014 1:54 pm 

Joined: Sun Aug 10, 2014 12:49 pm
Posts: 266
I dont know exact struct with this text container, there is something very strange :( I can extract and import EN texts, but with no any checks or test...


Top
   
PostPosted: Fri Nov 28, 2014 2:18 pm 

Joined: Wed Aug 13, 2014 10:00 am
Posts: 137
Import could be sufficient. There are no defined string lengths or offsets.


Top
   
PostPosted: Fri Nov 28, 2014 2:44 pm 
Site Admin
User avatar

Joined: Wed Jul 30, 2014 9:32 pm
Posts: 8613
@ MerlinSVK
Happy to see that the -H option of quickbms is used at least by one person in the world :D


Top
   
PostPosted: Fri Nov 28, 2014 3:08 pm 

Joined: Wed Aug 13, 2014 10:00 am
Posts: 137
-X is also fun :D


Top
   
PostPosted: Fri Nov 28, 2014 3:40 pm 

Joined: Sun Aug 10, 2014 12:49 pm
Posts: 266
Can you try make at least 1 string longer then original. Just to make sure that it wont crash ?


Last edited by michalss on Sat Nov 29, 2014 7:53 am, edited 1 time in total.

Top
   
PostPosted: Sat Nov 29, 2014 4:54 am 
User avatar

Joined: Sun Aug 17, 2014 7:27 pm
Posts: 1116
textures-s3\ui\radiob01.texture, radiob02.texture to .DDS etc error .DDS
fix script?


Top
   
PostPosted: Sat Nov 29, 2014 6:03 pm 

Joined: Wed Aug 13, 2014 10:00 am
Posts: 137
Support for RGBA format was added, but there is still problem with mipmap order. I don't know how to solve this :(


Top
   
PostPosted: Tue Dec 09, 2014 12:37 pm 

Joined: Wed Aug 13, 2014 10:00 am
Posts: 137
MerlinSVK wrote:
Support for RGBA format was added, but there is still problem with mipmap order. I don't know how to solve this :(


Nah, from today it's not true anymore. Mipmaps are written in correct order.
The only "disadvantage" is that you can't change: format of texture (DXT, RGBA, etc.), resolution or number of mipmaps, because DDS to TEXTURE script reads the original .head file. But if you don't change any of these, everything is OK.


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 11 posts ] 

All times are UTC


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Powered by phpBB® Forum Software © phpBB Limited