# Rune Factory 4 / Present files # # Written by HenryEx # # script for QuickBMS http://quickbms.aluigi.org idstring "NLCL" get FLAGS long get HDUMMY1 long get HDUMMY2 long # check flags so we don't operate on silly files if FLAGS != 0x 20130228 print "[!] Unexpected flags!" CleanExit endif open FDSE "rf3TxtItem_split2_1.eng" 1 idstring 1 "TEXT" get NUM_NAMES long 1 #setup a virtual memory file math TMP = 1 math TMP *= 0x8000 log MEMORY_FILE 0 0 putvarchr MEMORY_FILE TMP 0 # improves the speed with pre-allocation log MEMORY_FILE 0 0 # reset the position and size of the file set MBEGIN string "\"" putct MBEGIN string -1 MEMORY_FILE get FILENAME basename string FILENAME += ".csv" get FILESIZE asize set CSV string "\";\"" # set the csv string to ";" set LINEBREAK binary "\"\x0D\x0A\"" # end with ", linebreak, start with " get BLOCKNUM long get TOC_P long # Set up CSV header putct "Set" string -1 MEMORY_FILE # data block, relates to like/dislike categories putct CSV string -1 MEMORY_FILE putct "ID" string -1 MEMORY_FILE # Item / Category ID putct CSV string -1 MEMORY_FILE putct "Name" string -1 MEMORY_FILE # Name for items, or "Category" for categories putct CSV string -1 MEMORY_FILE putct "Effect" string -1 MEMORY_FILE # effect in FP putct LINEBREAK string -1 MEMORY_FILE if BLOCKNUM > 1 for i = 1 < BLOCKNUM xmath TOSPOS "TOC_P + (0x10 * i) + 4" xmath NEXT "i + 1" goto TOSPOS get OFF_BLOCK long if NEXT >= BLOCKNUM xmath LEN_BLOCK "TOC_P - OFF_BLOCK" else xmath TOSPOS "TOC_P + (0x10 * i) + 20" goto TOSPOS get NEXT_BLOCK long xmath LEN_BLOCK "NEXT_BLOCK - OFF_BLOCK" endif goto OFF_BLOCK get NUM_ENTRY long xmath LEN_ENTRY "(LEN_BLOCK - 4) / NUM_ENTRY" if LEN_ENTRY != 4 print "[!] Unexpected entry length %LEN_ENTRY%! \n Data Block: %i%, Offset %OFF_BLOCK%, Block Length %LEN_BLOCK%, Entries %NUM_ENTRY%" CleanExit endif for j = 0 < NUM_ENTRY get ITEMID short get IEFFECT signed_short xmath ISCATI "ITEMID & 0x8000" if ISCATI > 0 xmath ISCATG "ITEMID & 0x0100" math ITEMID & 0xFF else math ISCATG = 0 math ITEMID & 0x0FFF endif if ITEMID > NUM_NAMES print "[!] Item ID %ITEMID% out of bounds. Exiting..." CleanExit endif xmath PTR_NAME "(ITEMID * 8) + 8" goto PTR_NAME 1 get LEN_NAME long 1 get POS_NAME long 1 goto POS_NAME 1 getdstring INAME LEN_NAME 1 if ISCATI > 0 string INAME = "[Item Type]" endif if ISCATG > 0 math ITEMID + 1 string INAME = "[Category]" endif putct i string -1 MEMORY_FILE putct CSV string -1 MEMORY_FILE putct ITEMID string -1 MEMORY_FILE putct CSV string -1 MEMORY_FILE putct INAME string -1 MEMORY_FILE putct CSV string -1 MEMORY_FILE putct IEFFECT string -1 MEMORY_FILE putct LINEBREAK string -1 MEMORY_FILE next j putct LINEBREAK string -1 MEMORY_FILE next i else print "[!] Script is not meant for one block files!" CleanExit endif // write the finished table to the disk get MLENGTH asize MEMORY_FILE math MLENGTH - 1 # get rid of last trailing double quote log FILENAME 0 MLENGTH MEMORY_FILE print "[---] SUCCESS! [---]"