Got it working, including folders now

Code:
# Summon Night Granthese
# script for QuickBMS http://quickbms.aluigi.org
# By aaa801
goto 2048
get TYPE long
get SECTION_SIZE long
get SECTION_END long
get FILE_NAME_COUNT long
# Array for names
PutArray 0 FILE_NAME_COUNT ""
# Array for offsets
PutArray 1 FILE_NAME_COUNT 0
# Array for folder names + ranges
PutArray 2 0 ""
PutArray 3 0 0
# Array for max sizes
PutArray 4 FILE_NAME_COUNT 0
# Read names
Set NAMES_PROCESSED long 0
Set FOLDERS_PROCESSED long 0
SavePos OFFSET
Do
get TYPE long
If TYPE == 1002 # Folder
# TODO folder
get FOLDER_ENTRIES_END long # end of folder entries for this folder containing folders / files
get UNK long
get UNK long
get UNK long
get STR_LEN long
GetDString FOLDER_NAME STR_LEN
Math FOLDER_ENTRIES_END + OFFSET # To get true end
PutArray 2 FOLDERS_PROCESSED FOLDER_NAME
PutArray 3 FOLDERS_PROCESSED FOLDER_ENTRIES_END
Math FOLDERS_PROCESSED + 1
Elif TYPE == 1003 # File
get UNK long # size of entry?
get FILE_ID long # seems to increase from a base number atleast
get STR_LEN long
GetDString FILE_NAME STR_LEN
# Process folder name
set NEW_NAME string ""
for i = 0 < FOLDERS_PROCESSED
GetArray FOLDER_NAME 2 i
GetArray FOLDER_ENTRIES_END 3 i
If FOLDER_ENTRIES_END > OFFSET
string NEW_NAME + FOLDER_NAME
string NEW_NAME + "/"
Endif
next i
string NEW_NAME + FILE_NAME
PutArray 0 NAMES_PROCESSED NEW_NAME
Math NAMES_PROCESSED + 1
Else
print "Unknown Type: %TYPE%"
Endif
SavePos OFFSET
While OFFSET < SECTION_END
If NAMES_PROCESSED != FILE_NAME_COUNT
print "Didn't read enough names :|"
exit
Endif
# Read offsets
goto SECTION_END
get TYPE long # 1020
get SECTION_SIZE long
get FILE_OFFSET_COUNT long
get UNK long
If FILE_OFFSET_COUNT != FILE_NAME_COUNT
print "Mismatch of counts :|"
exit
Endif
# Read offsets to file headers
for i = 0 < FILE_OFFSET_COUNT
get F_HEADER_OFFSET long
get F_MAX_SIZE long
get UNK long
PutArray 1 i F_HEADER_OFFSET
PutArray 4 i F_MAX_SIZE
next i
# Parse headers
for i = 0 < FILE_OFFSET_COUNT
GetArray HEADER_OFFSET 1 i
goto HEADER_OFFSET
GetArray F_NAME 0 i
GetArray F_MAX_SIZE 4 i
get TYPE long # 50 = nice good raw file, 12 = no idea :|
If TYPE != 50
# Cursed file
get UNK1 long # All seem to be 0's
get UNK2 long # All seem to be 0's
get UNK3 long # All seem to be 0's
SavePos F_OFFSET
Math F_MAX_SIZE - 16 # No idea if this is correct
log F_NAME F_OFFSET F_MAX_SIZE
Elif TYPE == 50
get F_CHUNK_SIZE long # size of the chunk containing this file
get F_SIZE long # actual file size
GetDString EXT 4
SavePos F_OFFSET
log F_NAME F_OFFSET F_SIZE
Else
print "%i%"
print "Unhandled file: %F_NAME%"
print "Type: %TYPE%"
SavePos F_OFFSET
print "Offset: %F_OFFSET%"
exit
Endif
next i