Users browsing this thread: 3 Guest(s)
Persona 4 Arena: Ultimax
#1
While this game doesn't have an awful lot of models, the final boss is a full model, and I really want to try ripping it...

The only problem?

Everything is bundled up in a massive 'bddata.bin' in the PS3 filesystem, and no one has been able to extract it (except one person being a snob and not sharing their tools.) I was wondering if someone could help me out with this?
Reply
Thanked by:
#2
(07-22-2016, 11:38 PM)Carpaccio Wrote: While this game doesn't have an awful lot of models, the final boss is a full model, and I really want to try ripping it...

The only problem?

Everything is bundled up in a massive 'bddata.bin' in the PS3 filesystem, and no one has been able to extract it (except one person being a snob and not sharing their tools.) I was wondering if someone could help me out with this?

If you could upload it I'd look at it Tongue
Reply
Thanked by:
#3
I wasn't sure if I would be able to, but here it is! Fair warning, it's over 5 GB.

Dropbox Link
Reply
Thanked by:
#4
(07-24-2016, 09:15 PM)Carpaccio Wrote: I wasn't sure if I would be able to, but here it is! Fair warning, it's over 5 GB.

Dropbox Link

Alright, from looking at it, it's PS3 SEGS data. You can dump the individual segs files by using this QuickBMS script:
Code:
get FULLSIZE asize
findloc OFFSET string "segs"
for OFFSET = OFFSET < FULLSIZE
    goto OFFSET
    get DUMMY long
    findloc SIZE string "segs" ""
    if SIZE == ""
        math SIZE = FULLSIZE
    endif
    math SIZE -= OFFSET
    log "" OFFSET SIZE
    math OFFSET += SIZE
next


Then you can decompress the individual segs data using this QuickBMS script:
Code:
# AR segs archives - Arc System Works (script 0.1.3)
#   Sonic Unleashed
#   Battle Fantasia
#   BlazBlue
#   Arcana Heart 3
#   Persona 4 Arena (Ultimax)
#   ...
# script for QuickBMS http://quickbms.aluigi.org

get BASE_NAME basename
string BASE_NAME += /
comtype deflate
endian big
getdstring SIGN 4
math WORKAROUND = 0
if SIGN == "segs"
    get DUMMY short
    get CHUNKS short
    get FULL_SIZE long
    get FULL_ZSIZE long
    savepos BASE_OFF
    xmath BASE_OFF "BASE_OFF + (CHUNKS * 8)"
    putvarchr MEMORY_FILE 0 FULL_SIZE
    log MEMORY_FILE 0 0
    append
    for i = 0 < CHUNKS
        get ZSIZE short
        get SIZE short
        get OFFSET long
        math OFFSET -= 1
        if i == 0
        if OFFSET == 0
            math WORKAROUND = 1
        endif
        endif
        if WORKAROUND != 0
            math OFFSET + BASE_OFF
        endif
        if SIZE == 0
            math SIZE = 0x00010000
        endif
        clog MEMORY_FILE OFFSET ZSIZE SIZE
    next i
    append
else
    # pfd
    get SIZE asize
    log MEMORY_FILE 0 SIZE
endif

# the files are just compressed pfd files
# so we handle them here automatically (both!)

goto 0 MEMORY_FILE
get FULL_SIZE asize MEMORY_FILE
endian big
getdstring TYPE 4 MEMORY_FILE
if TYPE == ""   # pfd
    get DUMMY long MEMORY_FILE
    get DUMMY long MEMORY_FILE
    get FILES long MEMORY_FILE
    savepos BASE_OFF MEMORY_FILE
    for BASE_OFF = BASE_OFF < FULL_SIZE
        get HEADDATA_SIZE long MEMORY_FILE
        get SIZE long MEMORY_FILE
        get OFFSET long MEMORY_FILE
        get DUMMY long MEMORY_FILE
        get DUMMY long MEMORY_FILE
        get NAME string MEMORY_FILE
        math OFFSET += BASE_OFF
        set FNAME string BASE_NAME
        string FNAME += NAME
        log FNAME OFFSET SIZE MEMORY_FILE
        math BASE_OFF += HEADDATA_SIZE
        goto BASE_OFF MEMORY_FILE
    next
elif TYPE == "FPAC"
    endian little
    get BASE_OFF long MEMORY_FILE
    get TOT_SIZE long MEMORY_FILE
    if TOT_SIZE != FULL_SIZE
      endian big
      ReverseLong BASE_OFF
      ReverseLong TOT_SIZE
    endif
    get FILES long MEMORY_FILE
    get DUMMY long MEMORY_FILE
    get NAMELEN long MEMORY_FILE
    get DUMMY long MEMORY_FILE
    get DUMMY long MEMORY_FILE
    for i = 0 < FILES
       getdstring NAME NAMELEN MEMORY_FILE
       get FILEID long MEMORY_FILE
       get OFFSET long MEMORY_FILE
       get SIZE long MEMORY_FILE
       Padding 16 MEMORY_FILE 0
       math OFFSET += BASE_OFF
       set FNAME string BASE_NAME
       string FNAME += NAME
       log FNAME OFFSET SIZE MEMORY_FILE
    next i
else
    get NAME basename
    get EXT extension
    string NAME += "_unpacked."
    string NAME += EXT
    set FNAME string BASE_NAME
    string FNAME += NAME
    log FNAME 0 FULL_SIZE MEMORY_FILE
endif

print "\nyou can try to reuse this script with the output files (pac, pfd and so on)\nfor extracting the other files contained in them"

Warning: Use quickbms_4gb files on this; the normal version will stop extracting files from up to 4.37GB big, but if you use the quickbms_4gb, it will extract the segs files properly.
Reply
Thanked by:
#5
Well, that seems to work, however running the resulting files again, ends up with a bunch of other weird formats. There are DDS, which apparently aren't proper DDS...then there's HIP and JONBIN.

This I believe is everything related to the final boss.

Dropbox Link
Reply
Thanked by:
#6
This thread Skyla started seems to have quite a bit of info on these file types; if you're interested take a look here: http://www.vg-resource.com/thread-27359-...#pid601287
Reply
Thanked by:
#7
Well I've got some things working, but the Final Boss is a model, not a sprite...so we need a new method for him.
Reply
Thanked by:


Forum Jump: