# Ai Sp@ce (script 0.1.1a) # script for QuickBMS http://quickbms.aluigi.org quickbmsver 0.4.5 getdstring SIGN 4 if SIGN != "FPMF" print "you must use this script only with the files having the HED extension (FPMF archives) because QuickBMS will extract all the files inside the 0000.dat files automatically!" cleanexit endif get DUMMY short get DUMMY short get DATA_SIZE long get DUMMY long savepos OFFSET get DUMMY byte # this is the key but at the moment I don't have the game to reverse the key generation algorithm get ZERO short if ZERO == 0x16f6 encryption rot "\x0B\xF6\x16\xB7\x6D\x61\x21\x40\x75\x76\x15\x27\x88\xF1\x59\xAB\x88\xE7\xF1\xDA\x0F\x8B\x50\x6A\xB1\xBD\x24\xB0\x73\xC6\x04\xFC\x43\x09\xB3\xCD\xEB\xC7\xB1\x66\x96\x8A\xC0\x13\xC8\xA0\x56\xD0\x65\x55\x4F\x0A\xB2\x69\x9C\x97\x31\x06\x12\x8A\x0F\xBF\x0F\x40" "" 1 elif ZERO == 0x84d4 encryption rot "\x5f\xd4\x84\xe0\xc1\x5c\x0c\x3d\xed\x9b\xf6\x08\x79\x36\x01\x3d\x34\x40\x78\x3a\xce\xb1\x00\xa8\xe2\x08\x79\xb8\x75\x8b\x10\x18\x0e\xa0\xd9\xd5\x4d\x8f\x60\x58\xd1\xae\x9a\x34\xef\xd6\xa0\xe3\xe6\x15\x04\x7c\xa5\xae\xce\x60\xd4\x4e\xff\x1d\x3c\x56\x3c\xfa" "" 1 elif ZERO == 0xa725 # pandora saga, but the script has not been udpated to support it encryption rot "\xB9\xB6\xDF\x15\x0A\xE4\xCC\x01\x55\xC1\x54\xC3\x4D\xFD\x8D\xFF\xE5\x23\x64\xFA\x61\x36\x4D\xB8\xFB\x6F\x51\x4D\xA5\xD9\x8A\x1D\x93\x18\xF7\x02\x03\xB7\x08\x59\x43\xB2\x1E\x12\x38\xEE\x34\xA3\xA8\x58\x2B\xE6\xB5\xAF\x4C\xF2\x0C\xAC\x93\xDB\x86\x08\x2F\xAF\xBF\xB1\x21\xCF\xC1\xA7\xBF\xE0\x98\x69\xA3\x5B\x57\xC3\xFE\x56\xE3\x46\xE0\x4B\x5C\xB4\x6A\x89\x0A\xBB\x6D\x71\xA0\x01\xDF\x14\x02\xEB\xEC\x51\xEF\x79\x05\xA8\xF7\xB2\x49\xC9\xAF\x57\x8B\x0E\x6F\x4E\x49\x89\x5D\x20\x2E\xC0\x2B\x5B\xAB\x8C\xC0\xCF\x31\x4D\x6D\x73\x93\x5B\x3A\x57\xCD\x51\x80\x26\xB2\x6A\x29\x4C\x81\xAC\x3A\x5A\xFE\x77\xD3\xAC\x2A\x20\xF7\x60\x0A\xFF\x4E\xE6\xEC\xF6\x1A\x77\x9E\x99\x2B\xFE\x15\xB6\xEA\x81\xA2\x74\xFA\xF9\x11\xC4\x15\x65\xB5\xA0\x02\xFF\xD8\x95\x29\x50\x36\xEF\x48\x73\xF1\xC3\x8C\xD4\xE2\x45\x62\x5C\xFC\xF2\xB4\x4A\xF6\xDE\x94\x08\xB6\xBF\xE2\x85\x54\x39\x36\x1A\xCD\x78\xC5\xEA\x21\xFB\x5E\x52\x71\xC3\xBF\x08\x20\x1A\x67\x36\xCF\x5A\xF0\x52\xBD\x12\x8A\xB8\xA8\x86\x0B\x2B\xC0\x12\x6E\x5A\xB7\xCF\x23\xEE\x41\xC0\x24\x9D\x57\xC1\xE4" "" 1 else print "unknown key (%ZERO|x%), contact me" cleanexit endif log MEMORY_FILE OFFSET DATA_SIZE encryption "" "" get DUMMY long MEMORY_FILE get DUMMY long MEMORY_FILE get NAMESZ byte MEMORY_FILE math NAMESZ *= 2 getdstring NAME NAMESZ MEMORY_FILE set BASE_NAME unicode NAME get DUMMY long MEMORY_FILE get DUMMY long MEMORY_FILE get DUMMY long MEMORY_FILE get DUMMY long MEMORY_FILE get KEY_SIZE long MEMORY_FILE getdstring KEY KEY_SIZE MEMORY_FILE get DUMMY long MEMORY_FILE get DUMMY long MEMORY_FILE get FILES long MEMORY_FILE math PREV_PACKNUM = -1 for i = 0 < FILES get FOLDERSZ byte MEMORY_FILE math FOLDERSZ *= 2 getdstring FOLDER FOLDERSZ MEMORY_FILE set FOLDER unicode FOLDER get NAMESZ byte MEMORY_FILE math NAMESZ *= 2 getdstring NAME NAMESZ MEMORY_FILE set NAME unicode NAME get PACKNUM long MEMORY_FILE get OFFSET long MEMORY_FILE get SIZE long MEMORY_FILE get CRC long MEMORY_FILE get ZERO long MEMORY_FILE if PACKNUM != PREV_PACKNUM string TMP printf BASE_NAME PACKNUM open FDSE TMP 1 math PREV_PACKNUM = PACKNUM endif set FULLNAME string FOLDER string FULLNAME += NAME encryption rot KEY "" 1 KEY_SIZE log FULLNAME OFFSET SIZE 1 encryption "" "" next i