rpatool ======= This is modified version of a [rpatool](https://github.com/shizmob/rpatool) by [shizmob](https://github.com/shizmob). This is a simple tool allowing you to create, modify and extract Ren'Py Archive (.rpa/.rpi) files. Currently, only writing to RPAv2/RPAv3 archives is supported. Usage ----- rpatool [-l|-x|-c|-d|-a] [-o OUTFILE] [-2] [-3] [-k KEY] [-p COUNT] [-h] [-v] [-V] ARCHIVE [FILE [FILE ...]] positional arguments: ARCHIVE The Ren'py archive file to operate on FILE Zero or more files to operate on actions: -l, --list List files in archive ARCHIVE -x, --extract Extract FILEs from ARCHIVE -c, --create Creative ARCHIVE from FILEs -d, --delete Delete FILEs from ARCHIVE -a, --append Append FILEs to ARCHIVE optional arguments: -o OUTFILE, --outfile OUTFILE An alternative output archive file when appending to or deleting from archives, or output directory when extracting. -2, --two Use the RPAv2 format for creating/appending to archives -3, --three Use the RPAv3 format for creating/appending to archives (default) -k KEY, --key KEY The obfuscation key used for creating RPAv3 archives (default: 0xDEADBEEF) -p COUNT, --padding COUNT The maximum number of bytes of padding to add between files (default: 0) --all If specified, extracts all .rpa archives in the current directory -h, --help Print this help and exit -v, --verbose Be a bit more verbose while performing operations -V, --version Show version information The FILE argument can optionally be in ARCHIVE=REAL format, mapping a file in the archive file system to a file on your real file system. An example of this is: rpatool -x test.rpa script.rpyc=/home/foo/test.rpyc Examples -------- rpatool -x foo.rpa Will extract every file from `foo.rpa`into the current directory, making subdirectories when necessary. rpatool -o output -x foo.rpa script.rpyc ui.png Will extract the files `script.rpyc` and `ui.png` from `foo.rpa` into the directory `output`. rpatool -c bar.rpa test.jpg script.rpy sprites Will create the archive `bar.rpa`, containing the files `test.jpg`, `script.rpy` and the directory `sprites`. rpatool -p 25 -k 12345 -c bar.rpa movies=C:\projects\vn\movies Will create the archive `bar.rpa` with the obfuscation key `0x12345` and maximum padding of `25`, taking files from `C:\projects\vn\movies` and placing them in the archive folder `movies`. rpatool -l baz.rpa Will list all files in the archive `baz.rpa`. rpatool -v -a foo.rpa sprites=sprites_new Will add all files from the directory `sprites_new` to the directory `sprites` in the archive, giving more information about what it's doing. rpatool -o bar_new.rpa -d bar.rpa foo.jpg Will remove the file `foo.jpg` from the archive `bar.rpa`, storing the result archive in `bar_new.rpa`. rpatool -all game/ Will extract all the files from all .rpa archives in a `game/` folder. API --- `rpatool` can also be included in any other project (following the license conditions, of course) to provide the `RenPyArchive` class. A small overview: RenPyArchive([file = None], [version = 3], [padlength = 0], [key = 0xDEADBEEF], [verbose = False]) The constructor, which will optionally load an archive file. `file`: the archive file to open. If None, no archive will be attempted to open. `version`: the archive format version used to save the archive when `RenPyArchive.save([file])` is called. Default: 3 `padlength`: the maximum number of bytes of padding to put between files when saving. Default: 0 `key`: the obfuscation key used when saving RPAv3 archives. Default: 0xDEADBEEF `verbose`: print info on what we are doing to the command line. Default: False RenPyArchive.load(filename) Loads an archive file from `filename`. Will raise an `IOError` if the file can't be accessed, or a `ValueError` if the file is not detected as a Ren'Py archive. RenPyArchive.save([filename]) Save the archive to `filename`. Will raise `ValueError` if the filename isn't given with `filename`, nor previously defined, or an `IOError` if it couldn't save the file. RenPyArchive.list() Give a list of all filenames currently in the archive. RenPyArchive.has_file(filename) Returns True if `filename` is found in the archive, False otherwhise. RenPyArchive.add(filename, content) Add a file to the archive with file `filename` and contents `content`. Will raise a `ValueError` if the filename already exists in the archive. RenPyArchive.change(filename, content) Change the contents of a current file in the archive. Will raise an `IOError` if the file isn't known in the archive. RenPyArchive.remove(filename) Remove `filename` from the archive. Will raise an `IOError` if the filename isn't known in the archive. RenPyArchive.read(filename) Read and return the content of file `filename` in the archive. Will raise an `IOError` if the filename isn't known in the archive. Disclaimer ---------- This tool is intended for use with files on which the authors allowed modification of and/or extraction from ONLY and the unpermitted use on files where such consent was not given is highly discouraged, and most likely a license violation as well. Support requests for help with dealing with such files will not be answered. Credits ------- Credits for the creation of the Ren'Py archive format and the reference code in Ren'Py go to renpytom.