Author novel custom field maps for Final Fantasy IX (Memoria engine) from a declarative TOML project file.
Project description
FF9 Map Kit (ff9mapkit)
Author novel custom field maps for Final Fantasy IX (Steam, via the
Memoria engine) from a single declarative
field.toml, compiled into a drop-in Memoria mod.
Part of the Dream World IX project —
ff9mapkitis the toolkit/package name (unchanged),pip installed and imported asff9mapkit.
Feature-complete and in-game-verified. The productized form of a proven pipeline for minting brand-new playable FF9 fields, end to end. A novel field runs on a stock, unmodified Memoria install; a forked field needs the small bundled engine patch set for fork fidelity (see
docs/ENGINE.md).
Headline capabilities: author any camera angle from scratch (single / scrolling / multi-camera)
with a pixel-accurate paint guide · fork any of ~674 real fields — camera, walkmesh, art, and its
exits/encounters/music · NPCs, dialogue, gateways, encounters, events, story branching, and cutscenes from
one field.toml. Author it in TOML, a form-based editor, or a Blender add-on.
Full capability list & command reference →
docs/FEATURES.md(with a before/now comparison) andSETUP.md(the 59-command CLI reference).docs/gallery/collects screenshots/GIFs as they're captured.
What it does
Given a field.toml describing one field — its camera, painted background layers, walkmesh,
NPCs, dialogue, gateways, encounter, and music — ff9mapkit build emits everything a custom
field needs:
- the background scene (
.bgxcamera + overlay PNGs) and walkmesh (.bgi), - the field event script (
.eb) for all seven languages, - dialogue text (
.mes), - and the
DictionaryPatch/BattlePatchregistration +ModDescription.xml.
What stays a human task — the way the originals were made
FF9's backgrounds are pre-rendered: the original artists built each room as a 3D scene, shot it
through a fixed camera to bake a 2D plate, and the game projects the live 3D characters back onto that
plate through the same camera. ff9mapkit deliberately follows that pipeline instead of hiding it.
You place the camera; the kit hands you a pixel-accurate paint guide — the floor and walls
projected onto the canvas, the modern stand-in for the layout render the original artists painted over
— and you paint the background to match. Your hand-modeled .obj walkmesh is converted to the
engine's .bgi and projected through that identical camera, so characters stand exactly where the art
says they should. Painting the art and (optionally) modeling the geometry stay yours; everything in
between is the kit.
Quickstart
pip install -e . # from the ff9mapkit\ package dir
py -m ff9mapkit doctor # verify it found your FF9 install
py -m ff9mapkit import <field> --out myroom --verbatim # fork a real field — or `new` for original art
Full setup →
SETUP.md: extras (gui/save/dev), game-path resolution, the one-timeextract-templates(the kit ships no game data — see Provenance),doctor, the dev loop, and a guided first-field walkthrough.
Prefer not to touch TOML? Author the logic (dialogue, events, story flags, encounters, music,
cutscenes) in the form-based editor — ff9mapkit edit <field.toml>. The visual side has a front-end too:
the Blender add-on poses the camera, models the walkmesh, places markers, and
writes a scene.toml. So the suite splits cleanly — Blender = where things are, the editor = what they
do — and build compiles both. There's also a one-window PySide6 Workspace GUI.
Commands
59 subcommands — run ff9mapkit -h (or py -m ff9mapkit -h) for the full list. A taste of the families:
- Author —
new(scaffold) ·guide(paint guide for your camera) ·walkmesh·edit(form editor) - Build & ship —
build·lint·pack·export-art - Fork a real field —
import(--editable/--native/--verbatim) ·import-chain·fork-report - Campaigns & journeys —
new-campaign/build-all·gen-hub/assemble-journey - Battle maps & tuning —
battle-import/battle-build·battle-scene/battle-ai - Dialogue, catalogs & saves —
dialogue·catalog/models/archetypes·flags-inspect·items-inspect
The full grouped command reference (all 59, with flags) is in
SETUP.md§7.
Docs
SETUP.md— start here: install, configure, the dev loop, and your first field (setup + quickstart).docs/TUTORIAL.md— the focused ~10-minute first-field walkthrough.docs/FEATURES.md— the full capability list (+ before/now comparison).docs/gallery/— collects screenshots/GIFs as they're captured.docs/FORMAT.md— thefield.tomlschema.docs/PIPELINE.md— the full authoring workflow.docs/ENGINE.md— engine requirements (stock Memoria) + provenance notes.docs/PROVENANCE.md— the kit ships no game data: how the base assets are regenerated from your own FF9 install (extract-templates), and why that's legally clean.docs/TECHNICAL.md— the hard problems solved (camera math,.ebformat, import).docs/GLOSSARY.md— terms used across the docs (walkmesh, gateway, fork, GLOB flag…).docs/TROUBLESHOOTING.md— common first-run failures → fixes.docs/KNOWN_ISSUES.md— beta limitations + the Workspace GUI gaps.examples/vivi-hut/— a complete worked example.blender/— the Blender add-on: visually author the camera + walkmesh, then export afield.tomlforbuild(Blender 4.2+/5.x).
How it's built / trusted
The library is split into eb (the event-script codec + content injectors), scene
(camera math, .bgx, .bgi walkmesh, paint guides), build (the field.toml compiler),
and pack. Correctness is proven by an offline golden-master test suite: every codec
round-trips your install's field assets byte-for-byte (regenerated locally via extract-templates
— the kit ships none), and compiling the example reproduces an in-game-verified field's script exactly.
pip install -e ".[dev]" && pytest # the full suite
About
I make games — including an FFIX-inspired RPG of my own — so this started as the tool I wanted while learning how FF9's fields actually work, not a drive-by experiment. The aim was to build a new room the way the game's creators did: paint a background against a 3D-derived guide, then walk on geometry projected through the same camera — so authoring a field feels like level design rather than blind byte-hacking. Months of reverse-engineering the field format, the projection math, and the event bytecode went into making that the easy path. If you're poking at FF9's internals too, I hope it saves you the same dig.
Built on (and grateful for) the Memoria engine — none of this is possible without it.
Project details
Release history Release notifications | RSS feed
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 ff9mapkit-1.0.0b8.tar.gz.
File metadata
- Download URL: ff9mapkit-1.0.0b8.tar.gz
- Upload date:
- Size: 1.7 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bb4765b872924a3dda0096a1bc769aed694e33daa5721682535d559cd26b9c4f
|
|
| MD5 |
ce11f183e270feec7982241ec79a5eff
|
|
| BLAKE2b-256 |
388958cbc5cde37d7585d81d0155ffd3b8c97408fac3b80a4b82c1c08198fd20
|
Provenance
The following attestation bundles were made for ff9mapkit-1.0.0b8.tar.gz:
Publisher:
release.yml on GameJawnsInc/Dream-World-IX
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ff9mapkit-1.0.0b8.tar.gz -
Subject digest:
bb4765b872924a3dda0096a1bc769aed694e33daa5721682535d559cd26b9c4f - Sigstore transparency entry: 2022357486
- Sigstore integration time:
-
Permalink:
GameJawnsInc/Dream-World-IX@6cd4e3d504dc23f7515ef8b25e2a3fb3e443e8e4 -
Branch / Tag:
refs/tags/v1.0.0b8 - Owner: https://github.com/GameJawnsInc
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@6cd4e3d504dc23f7515ef8b25e2a3fb3e443e8e4 -
Trigger Event:
push
-
Statement type:
File details
Details for the file ff9mapkit-1.0.0b8-py3-none-any.whl.
File metadata
- Download URL: ff9mapkit-1.0.0b8-py3-none-any.whl
- Upload date:
- Size: 1.4 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
94b297cbdef9c3f9df19285d5e403ef9a3b3022207010c6fa529f0ded07eb29e
|
|
| MD5 |
09ff7665eb82ab915e6de4b2feb057e5
|
|
| BLAKE2b-256 |
5b3599edc5854fc7c5d5671f2fdecd66577814b94bc22ed45ca0a07f4e925bcf
|
Provenance
The following attestation bundles were made for ff9mapkit-1.0.0b8-py3-none-any.whl:
Publisher:
release.yml on GameJawnsInc/Dream-World-IX
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ff9mapkit-1.0.0b8-py3-none-any.whl -
Subject digest:
94b297cbdef9c3f9df19285d5e403ef9a3b3022207010c6fa529f0ded07eb29e - Sigstore transparency entry: 2022357563
- Sigstore integration time:
-
Permalink:
GameJawnsInc/Dream-World-IX@6cd4e3d504dc23f7515ef8b25e2a3fb3e443e8e4 -
Branch / Tag:
refs/tags/v1.0.0b8 - Owner: https://github.com/GameJawnsInc
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@6cd4e3d504dc23f7515ef8b25e2a3fb3e443e8e4 -
Trigger Event:
push
-
Statement type: