# Atelier Sophie / Firis (A17/A18) PAK and GZ (script 0.1.2b) # info from A17_decrypt.c and A18_decrypt.c by Lily # script for QuickBMS http://quickbms.aluigi.org math AUTOMATIC_UNCOMPRESS = 1 get EXT extension if EXT == "gz" get NAME basename math OFFSET = 0 get SIZE asize callfunction ATELIER_GZIP 1 cleanexit endif math KEYSZ = 20 get DUMMY long # 0x20000 get FILES long get DUMMY long # 0x10 get DUMMY long # 0x0d savepos INFO_OFF # header is the same for both A17 and A18 so we have to "guess" A18 getdstring NAME 128 get SIZE long getdstring KEY KEYSZ get OFFSET long get OFFSET64 long get ZERO long get DUMMY long get ZERO2 long get ZERO3 long get ZERO4 long get ZERO5 long math IS_A18 = 0 if ZERO == 0 # otherwise it's part of the filename in A17 math IS_A18 = 1 elif ZERO2 == 0 # Atelier Ryza 2 math IS_A18 = 2 math KEYSZ = 32 endif for EXTRACT = 0 < 2 goto INFO_OFF for i = 0 < FILES getdstring NAME 128 get SIZE long getdstring KEY KEYSZ if IS_A18 == 0 get OFFSET long get ZERO long else if IS_A18 >= 2 get DUMMY long # 0xa81c42... no idea endif get OFFSET longlong get ZERO long get DUMMY long endif if EXTRACT != 0 math OFFSET + BASE_OFF math skip_decode = 1 for x = 0 < KEYSZ getvarchr TMP KEY x if TMP != 0 math skip_decode = 0 endif next x if skip_decode == 0 for j = 0 < 128 getvarchr C NAME j math x = j math x % KEYSZ getvarchr K KEY x math C ^ K putvarchr NAME j C next j encryption xor KEY "" 0 KEYSZ endif set EXT extension NAME if EXT == "gz" && AUTOMATIC_UNCOMPRESS != 0 set NAME FULLBASENAME NAME callfunction ATELIER_GZIP 1 else log NAME OFFSET SIZE endif encryption "" "" endif next i savepos BASE_OFF next EXTRACT startfunction ATELIER_GZIP log MEMORY_FILE2 OFFSET SIZE encryption "" "" # necessary for disabling the log encryption! get TMP long MEMORY_FILE2 if TMP == 0x45415243 # CRAE / EARC, some files have .gz but not compressed log NAME 0 SIZE MEMORY_FILE2 else math CHUNK_SIZE = 0x4000 xmath TMP "SIZE * 4" putvarchr MEMORY_FILE TMP 0 # pre-allocation may help log MEMORY_FILE 0 0 append for OFFSET = 0 != SIZE goto OFFSET MEMORY_FILE2 get CHUNK_ZSIZE long MEMORY_FILE2 if CHUNK_ZSIZE == 0 break endif savepos OFFSET MEMORY_FILE2 clog MEMORY_FILE OFFSET CHUNK_ZSIZE CHUNK_SIZE MEMORY_FILE2 next OFFSET + CHUNK_ZSIZE append get SIZE asize MEMORY_FILE log NAME 0 SIZE MEMORY_FILE endif endfunction