Converting Game Assets
In order to get started with modding, it is a good idea to start with the game's assets. To begin browsing the assets, it needs to be unpacked to unveil the thousands of assets the game has.
The game assets are stored in packages at the root of the game directory and they are not convenient to modify. They need to be converted into a format that allows for easy modification. These assets include, but are not limited to, textures, models and audio.
Converter
Note: The tool in this section is still in an experimental phase, and does not support unpacking every type of asset into a usable format.
The converter is an executable file capable of two-way conversion. This allows it to be able to convert game assets into usable formats, and vice versa.
The executable is assumed to be in the root of the game's directory to properly work
by default. When executed without providing any arguments, the converter begins unpacking
and creates a .unpacked
folder in the current directory where assets will be dumped
into. Once the tool has finished running, feel free to browse the folder for assets.
If you require more advanced use cases of the tool such as packing or specifying
the source/ destination paths, run the converter in a terminal with the --help
flag for options.
The following is a flowchart that will give an idea of what is happening when you use this tool. Start of the flowchart indicates the moment the converter is executed.
flowchart TB; subgraph converter[converter::main]; converter_start([Start]) --> converter_input[/input source\nand destination/]; converter_input --> repacker_unpack[[repacker::unpack]]; repacker_unpack --> converter_final([End]); end; subgraph repacker[repacker::unpack]; repacker_start([Start]) --> repacker_condition1{Is source\na file?}; repacker_condition1 -->|yes| repacker_run_unpack1[[repacker::run_unpack]]; repacker_condition1 -->|no| repacker_condition2{Is source\na directory?}; repacker_condition2 -->|yes| repacker_loop[/Get next entry in\nsource directory/]; repacker_condition2 -->|no| repacker_final([End]); repacker_loop --> repacker_condition3{Is entry\na file?}; %% Invisible line to order start and loop to the top repacker_loop ~~~ repacker_condition3; repacker_condition3 -->|yes| repacker_run_unpack2[[repacker::run_unpack]]; repacker_condition3 -->|no| repacker_condition4{Entries\nremaining?}; repacker_condition4 -->|no entries\nremaining| repacker_final([End]); repacker_condition4 -->|entries\nremaining| repacker_loop; repacker_run_unpack2 --> repacker_condition4; repacker_run_unpack1 --> repacker_final; end; subgraph repacker2[repacker::run_unpack]; repacker2_start([Start]) --> repacker2_input1[/Read four bytes\nof source file\nto get magic/]; repacker2_input1 --> repacker2_condition1{Is magic\nvalid?}; repacker2_condition1 -->|yes| repacker2_metadata_unpack[[metadata::MagicBytes::unpack]]; repacker2_condition1 -->|no| repacker2_final([End]); repacker2_metadata_unpack --> repacker2_final; end; converter --> repacker; repacker --> repacker2;