Reverse engineering tools for 'Project IGI' game
Project description
igipy
Reverse engineering tools for Project I.G.I and Project I.G.I 2: Covert Strike game files.
igipy is a Python CLI tool for converting proprietary game file formats from IGI 1 and IGI 2 into standard, open formats. It is a direct successor and refactor of the tool published at https://github.com/NEWME0/Project-IGI/.
Installation
Requires Python 3.13.
pip install --upgrade igipy
Quick Start
-
Run
igipyonce to generate the configuration file:igipy
-
Edit
igipy.json— point each game'sgame_dirat your installation. The generated file has a block per game (igi1andigi2). Each pipeline endpoint can be a directory (*_is_zip: false) or a single.ziparchive (*_is_zip: true, path must end in.zip):{ "igi1": { "collect_is_zip": false, "convert_is_zip": false, "game_dir": "C:/Games/ProjectIGI", "collect_path": "igi1_collected.zip", "convert_path": "igi1_converted.zip" }, "igi2": { "collect_is_zip": false, "convert_is_zip": false, "game_dir": "C:/Games/ProjectIGI2", "collect_path": "igi2_collected.zip", "convert_path": "igi2_converted.zip" } }
-
Collect the game files, then convert them — use the
igi1origi2command group for the game you want:igipy igi1 collect # gather IGI 1 files into collect_path igipy igi1 convert-tex-to-tga # run an IGI 1 converter into convert_path igipy igi2 collect # gather IGI 2 files into collect_path igipy igi2 convert-all # convert everything into convert_path
Commands
The workflow is two-stage: collect gathers raw game files from game_dir into the collect
endpoint (copying loose files and unpacking .res archives), then the convert-* commands read
from the collect endpoint and write converted assets to the convert endpoint. Both endpoints are a
directory or a .zip depending on collect_is_zip / convert_is_zip. Every convert-* command
accepts --dry to preview without writing.
igipy igi1 …
| Command | Description |
|---|---|
collect |
Gather IGI 1 game files into the collect endpoint (loose files + unpacked .res, language .res → JSON). |
convert-qvm-to-qsc |
Decompile .qvm bytecode to .qsc script source. |
convert-tex-to-tga |
Convert .tex / .spr / .pic textures to .tga. |
convert-wav-to-wav |
Decode ADPCM .wav audio to standard PCM .wav. |
res-to-zip <file.res> |
Convert a single .res file to .zip (binary) or .json (strings). |
extensions-of-game |
Print a file-type count table for the game install directory. |
extensions-of-collect |
Print a file-type count table for the collect endpoint. |
extensions-of-convert |
Print a file-type count table for the convert endpoint. |
igipy igi2 …
| Command | Description |
|---|---|
collect |
Gather IGI 2 game files into the collect endpoint (loose files + unpacked .res, language .res → JSON). |
convert-all |
Run every IGI 2 converter below in sequence. |
convert-raw |
Copy raw assets (.mp3, .bmp, .jpg, .tga, .json) through unchanged. |
convert-qvm-to-qsc |
Decompile .qvm → .qsc. |
convert-wav-to-wav |
Decode ADPCM .wav → standard .wav. |
convert-tex-to-tga |
.tex / .spr / .pic → .tga. |
convert-fnt-to-zip |
.fnt bitmap font → BMFont (.fnt + .tga) zip. |
convert-thm-to-tga |
.thm terrain heightmaps → grayscale .tga. |
convert-tmm-to-tga |
.tmm terrain material maps → palette .tga. |
convert-tlm-to-tga |
.tlm terrain lightmaps → .tga. |
convert-olm-to-tga |
.olm object lightmaps → .tga. |
convert-syn-to-json |
.syn lip-sync envelopes → .json. |
convert-dat-forest-to-json |
forest_*.dat vegetation placement → .json. |
convert-dat-graph-to-json |
graph*.dat AI navigation graphs → .json. |
convert-dat-graphcover-to-json |
graphcover*.dat AI cover/visibility data → .json. |
convert-iff-to-json |
.iff skeletal animation → .json. |
convert-iff-to-gltf |
.iff skeletal animation → glTF. |
convert-iff-to-fbx |
.iff skeletal animation → FBX. |
convert-iff-to-qsc |
.iff skeletal animation → .bef text source. |
convert-mef-to-fbx |
.mef 3D model → FBX. |
convert-mef-to-gltf |
.mef 3D model → glTF. |
convert-mef-to-qsc |
.mef 3D model → text source. |
res-to-zip <file.res> |
Convert a single .res file to .zip / .json. |
extensions-of-game |
Print a file-type count table for the game install directory. |
extensions-of-collect |
Print a file-type count table for the collect endpoint. |
extensions-of-convert |
Print a file-type count table for the convert endpoint. |
igipy core …
| Command | Description |
|---|---|
count-extensions <path> |
Count files by extension in a directory or .zip. |
copy-files <src> <dst> |
Copy filtered game files between directories (skips .res / .mtp and .dat paired with .mtp). |
printable <file> |
Print printable ASCII strings found in a binary file. |
gconv [args…] |
Run the bundled gconv.exe. |
Documentation
Full documentation is split by scope — shared core formats, igi1, and igi2. See the documentation table of contents:
- docs/README.md — index of all format references, game structure notes, and per-game file extension inventories.
License
MIT
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file igipy-1.0.0.tar.gz.
File metadata
- Download URL: igipy-1.0.0.tar.gz
- Upload date:
- Size: 431.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e8b4dcd745a3008d8700083784b436e88d6f9adc4d35c97b8b8e8a0a5496d01d
|
|
| MD5 |
f9a817b36171138cf4c64468a184e0bf
|
|
| BLAKE2b-256 |
e80c4b6c3a71753bcf23c4d17949e12664a854885ec1b4d9ddd08cbbd5b8f9e8
|
File details
Details for the file igipy-1.0.0-py3-none-any.whl.
File metadata
- Download URL: igipy-1.0.0-py3-none-any.whl
- Upload date:
- Size: 382.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
324d8ff24954510a27ca8d43d109a3ff2ef5756b7bb9bfff12537fa36492ed50
|
|
| MD5 |
f99a1afa63a3be8f14dce7b7d76338f0
|
|
| BLAKE2b-256 |
4158e994a7d528cd1540a7a75b12191e7c0f9d4c4cc448524ac98cb4c2600059
|