VNTools/rpatool/README.md
2025-05-01 02:45:55 +03:00

124 lines
5.7 KiB
Markdown

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.