https://github.com/aclios/ajt-tools
RE Engine modding tools
https://github.com/aclios/ajt-tools
ace-attorney apollo-justice-trilogy modding-tools re-engine
Last synced: 5 months ago
JSON representation
RE Engine modding tools
- Host: GitHub
- URL: https://github.com/aclios/ajt-tools
- Owner: Aclios
- License: mit
- Created: 2024-04-14T09:58:41.000Z (about 2 years ago)
- Default Branch: main
- Last Pushed: 2025-09-10T15:42:27.000Z (9 months ago)
- Last Synced: 2025-09-10T19:46:05.941Z (9 months ago)
- Topics: ace-attorney, apollo-justice-trilogy, modding-tools, re-engine
- Language: Python
- Homepage:
- Size: 54.7 KB
- Stars: 12
- Watchers: 0
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# AJT-Tools
RE Engine modding tools. Developed specifically for Apollo Justice Trilogy and Ghost Trick.
Other RE Engine games could be partially supported.
### Supported formats:
Import and export for the following formats are supported:
- Main archive (.pak)
- Textures (.tex)
- Message data (.msg)
- ASRC audio (.asrc)
- Font (.oft)
- Apollo Justice Trilogy script files (.user.2) - AA4, AA5 & AA6
### Supported platforms
The following platforms are supported:
- Android
- Steam
- Nintendo Switch
- PS4
This is only relevant for .tex files, it shouldn't matter for others. Other platforms that don't swizzle textures could be supported.
# Get Started
- Python 3.11 or superior is required.
- Install the required packages by running `python -m pip install -r requirements.txt` in a terminal.
- Fill the path_init.txt with the relevant information. Examples for Apollo Justice Steam are already there.
- **pak_path** is the path of the main archive of the game, which should be named re_chunk_000.pak
- **release_list_path** is the path of the release list of the game and platform, which is required to extract files with their real name. You can find release lists of all RE Engine games here: https://github.com/Ekey/REE.PAK.Tool/tree/main/Projects.
- **extracted_dir** is the path of the folder where all the files of the .pak will be extracted.
- **mod_dir** is the path of the folder where the modded files will be written.
- **patch_pak_path** is the path where the patch pak file will be written. For Steam games, it should be the game folder, for Switch games it can be the mods/contents//romfs of an emulator. This file should be named "re_chunk_000.pak.patch_001.pak". If such files already exist and you want to keep the game updates, name it with the higher id + 1 (If the last update is "re_chunk_000.pak.patch_005.pak", name it "re_chunk_000.pak.patch_006.pak").
- **language** can be set to a specific language if you don't want to extract files specific to the other languages. By default everything will be extracted ("all").
# How to use
- Run EXPORT.bat to unpack the .pak file and extract all supported assets to their respective folders.
- Sort the files by removing the files you won't have to modify.
- Modify the files and run IMPORT.bat. It will copy the concerned files from the extraction folder to the mod folder, import your modify files, and build the .pak.patch file from them. From now, the files will stay in the mod folder, so if you are satisfied you can remove the assets from their folder to speed up the process.
- If you modified a file that isn't supported by AJT Tools (using a 3rd party tool) and want to add it in your mod, you can just simply put it in the mod folder with its correct path. BUILD PAK ONLY.pak can be used to directly build the .patch.pak file for this case of use case.
# As a python module
AJT Tools can also be used as a Python module.
## Pak files
```python
from AJTTools import REPAk, build_pak_from_dir
#extract a pak file
pak = REPak("path_to_pak")
pak.unpack("output_dir", "release_list_path")
#build a .pak file from a folder
build_pak_from_dir("mod_dir",".pak.patch_file_path")
```
## Font files
```python
from AJTTools.plugins.font import REFont
font = REFont("font.oft.1") # read the file
font.export_file("font.otf") # export
font.import_file("newfont.otf") # import
font.save("font.oft.1") # save
```
## Tex files
```python
from AJTTools.plugins.tex import Tex
tex = Tex("image.tex.35") # read the file
tex.export_file("image.png") # export
tex.import_file("newimage.png") # import
tex.save("image.tex.35") # save
```
## MSG files
```python
from AJTTools.plugins.msg import MSGPlugin
## work with csv files
plugin = MSGPlugin("csv")
plugin.export_file("message.msg.22","message.csv") # export
plugin.import_file("message.msg.22","newmessage.csv") # import/save
## work with json files
plugin = MSGPlugin("json")
plugin.export_file("message.msg.22","message.json") # export
plugin.import_file("message.msg.22","newmessage.json") # import/save
## work with txt files (single language)
plugin = MSGPlugin("txt","en") #init and chose english as export/import language
plugin.export_file("message.msg.22","message.txt") # export
plugin.import_file("message.msg.22","newmessage.txt") # import/save
```
## Audio files (asrc)
```python
from AJTTools.plugins.sound import ASRC
asrc = ASRC("se.asrc.31") # read the file
asrc.export_file("se") # export, extension is added automatically depending on the format
asrc.import_file("newse.wav") # import
asrc.save("se.asrc.31") # save
```
## AJT Script files
```python
from AJTTools.plugins.script import AA4Script, AA56Script
## user.2 to txt
script = AA4Script("script.user.2") #aa4 script
script.write_txt("script.txt") #export
script = AA56Script("script.user.2") #aa5 and aa6 script
script.write_txt("script.txt") #export
## txt to user.2
script = AA4Script("script.txt") #aa4
script.write_user2("script.user.2")
script = AA56Script("script.txt") #aa5 & 6
script.write_user2("script.user.2")
```
# Credits
[REE.PAK.Tool](https://github.com/Ekey/REE.PAK.Tool/tree/main) by Ekey and [retool](https://www.patreon.com/FluffyQuack) by FluffyQuack for file format.
Modules and packages used:
| Package | Author | License |
|--- |--- |--- |
| [etcpack](https://github.com/K0lb3/etcpak) | K0lb3 | MIT
| [texture2ddecoder](https://github.com/K0lb3/texture2ddecoder) | K0lb3 | MIT
| [astc-encoder-py](https://github.com/K0lb3/astc-encoder-py) | K0lb3 | MIT
| [REMSG_Converter](https://github.com/dtlnor/REMSG_Converter) | dtlnor | MIT
| [chardet](https://github.com/chardet/chardet) | dan-blanchard | LGPL-2.1
| [mmh3](https://github.com/hajimes/mmh3) | hajimes | MIT
| [Pillow](https://github.com/python-pillow/Pillow) | Jeffrey A. Clark | MIT-CMU
| [soundfile](https://github.com/bastibe/python-soundfile) | bastibe | BSD-3-Clause
| [zstd](https://github.com/sergey-dryabzhinsky/python-zstd) | Sergey Dryabzhinsky, Anton Stuk | BSD-2-Clause