Overworld tileset compiler for Pokémon Generation III decompilation projects
  • C++ 80.9%
  • C 16.2%
  • Jinja 1.2%
  • Python 1.1%
  • CMake 0.4%
  • Other 0.2%
Find a file
grunt-lucas 4c244d587c
Added find-tileset-color and dump-tileset-colors commands for debugging tilesets (#378)
Added a `find-tileset-color` command that locates every pixel of a given
color in a tileset's RGBA layer images and animation frames, displaying
each metatile / animation frame subtile match as ASCII art with the
relevant pixels highlighted. Also added a `dump-tileset-colors` command
that lists every color with pixel counts and compares the unique color
total against the configured color limit.

Closes #270
2026-09-05 08:19:23 -07:00
.claude/skills Style guide and remove some old agent files [no ci] 2026-06-08 16:34:42 -07:00
.codex/skills/fix-includes Add codex files [no ci] 2026-07-06 14:16:11 -07:00
.github Fix versioned release macOS tap test for Homebrew 6.0 Tap Trust 2026-08-27 13:35:29 -07:00
.idea Add configurable packing strategies, FireRed metatile support, and script modernization (#192) 2026-03-17 08:18:41 -07:00
.vscode File and dir name refactor plus versioned builds (#308) 2026-06-01 18:42:20 -07:00
docs README and doxygen homepage updates [no ci] 2026-06-09 10:46:35 -07:00
legacy Backport a DFS/BFS improvement from modern Porytiles onto legacy (#355) 2026-08-25 12:42:42 -07:00
porytiles Added find-tileset-color and dump-tileset-colors commands for debugging tilesets (#378) 2026-09-05 08:19:23 -07:00
resources Allow fallback options when parsing anim frame names (#364) 2026-08-27 09:13:25 -07:00
scripts Added scripts/release.py which drives RELEASE_PROCESS.md interactively [no ci] 2026-08-28 07:17:21 -07:00
.clang-tidy Release prep document and release process phase A complete (#306) 2026-05-31 07:12:52 -07:00
.gitignore Implement completely customizable metatile attributes, removing the clunky BaseGame system (#341) 2026-07-10 15:27:04 -07:00
.porytiles-marker-file Moved rest of warnings onto new diag system 2025-04-27 09:07:40 -07:00
.rgignore Big filename refactor, more to come 2024-10-14 07:16:29 -07:00
AGENTS.md Add codex files [no ci] 2026-07-06 14:16:11 -07:00
AI_POLICY.md Update AI policy and README [no ci] 2026-06-25 07:45:27 -07:00
CHANGELOG.md Added find-tileset-color and dump-tileset-colors commands for debugging tilesets (#378) 2026-09-05 08:19:23 -07:00
CLAUDE.md Remarks and warnings are now opt-in (#356) 2026-08-26 10:01:05 -07:00
CMakeLists.txt Setup builds from step D (#309) 2026-06-03 07:40:26 -07:00
CONTRIBUTING.md More doc fixes [no ci] 2026-06-06 08:34:48 -07:00
LICENSE Some new classes, refactoring, and code cleanup (#194) 2026-03-31 12:35:48 -07:00
README.md Fix broken snapshot release flow 2026-08-25 07:45:31 -07:00
RELEASE_PROCESS.md Added scripts/release.py which drives RELEASE_PROCESS.md interactively [no ci] 2026-08-28 07:17:21 -07:00
STYLE.md Implement completely customizable metatile attributes, removing the clunky BaseGame system (#341) 2026-07-10 15:27:04 -07:00
VERSION Bump VERSION to 2.0.0, migrate CHANGELOG, tweak RELEASE_PROCESS.md 2026-08-27 11:48:48 -07:00

Porytiles

Porytiles Snapshot Release Porytiles Versioned Release

Overworld tileset compiler for use with the pokeruby, pokefirered, and pokeemerald Pokémon Generation III decompilation projects from pret. Also compatible with pokeemerald-expansion from rh-hideout. Builds Porymap-ready assets from RGBA (or indexed) input assets.

PokemonHearth Pokémon Hearth by PurrfectDoodle. Tile art inserted via Porytiles. Used with permission.

Why Should I Use This Tool?

Porytiles makes importing from-scratch tilesets (or editing existing tilesets) easier than ever. Think of it this way: Poryscript, another popular community tool, takes a .script file and generates a corresponding .inc file. Comparably, Porytiles takes a source folder containing RGBA (or indexed) tile assets and generates a corresponding metatiles.bin, metatile_attributes.bin, indexed tiles.png, indexed anim folder, and a populated palettes folder -- all as part of your build!

For more info, please see this wiki page which explains what Porytiles can do in more detail.

Getting Started

For quick installation instructions, see Release Cadence below.

If you want more detailed installation instructions as well as the full quick start guide, take a look at the user documentation Installation and Quick Start pages, respectively.

Release Cadence

Porytiles publishes both versioned releases and a rolling snapshot.

Versioned releases follow semantic versioning (vX.Y.Z) and are tagged on the master branch. Each tag triggers a permanent GitHub release with platform-specific zip files and updates the porytiles Homebrew formula. The CHANGELOG lists what changed in each release.

Snapshot releases are published automatically on every push to develop. Each one gets its own snapshot-<utc-timestamp> GitHub release and repoints the porytiles-snapshot Homebrew formula at that tag. Snapshots are for users who want the latest changes, as they are not considered stable. Only the newest snapshot is retained: you can't re-install previous snapshots.

Install the latest versioned release via Homebrew:

brew install grunt-lucas/porytiles/porytiles

Install the latest rolling snapshot via Homebrew:

# Make sure to use `brew update` before installing snapshots so you don't confuse brew into installing an old deleted release
brew update && brew install grunt-lucas/porytiles/porytiles-snapshot

Alternatively, download platform-specific zip files directly from the releases page.

Either install path provides two binaries: porytiles (the modern compiler) and porytiles-legacy (the preserved pre-1.0.0 compiler). Homebrew works on Linux, macOS, and WSL. On Linux and WSL, follow the Homebrew on Linux setup instructions.

Building From Source

See the developer documentation for build instructions.

Note For Aseprite Users

GitHub user PKGaspi has created a collection of useful scripts here. Of particular interest is this export_layers script, which allows you to save each sprite layer to a different file. This may be useful, since Porytiles requires each tile layer in a separate PNG file.