Releases: GameJawnsInc/Dream-World-IX
Release list
v1.0.0b17
Dream World IX 1.0.0b17 — The moogle letter network, experimental co-op, and living overworld terrain
Dream World IX is a toolkit for building brand-new playable Final Fantasy IX content — and faithfully forking the real game — for the Memoria engine (Steam/GOG FF9). This release gives a custom save moogle a real place in FF9's Mognet letter network (and gives every custom save point the game's full moogle menu), ships the kit's first experimental co-op multiplayer suite — proven on a real two-machine link — grows custom overworld islands real interior terrain and a biome palette, adds a story-event director plus the first fully authored multi-field story campaign, and lands two critical data-safety fixes with a kit-wide hardening pass behind them — 547 commits and 3993 passing tests since b15, plus the first refresh of the public engine bundle since b12 (it now carries the full patch stack, experimental co-op included). Every stable pillar still runs DLL-free or on the older bundle.
Hand your save moogle a mailbag and let it trade letters with the other 41, wipe in a dungeon and wake up at the last camp you passed, carve a real mountain — waterfalls and all — onto an island you minted, and (experimentally) explore, solve puzzles, and fight side by side with a friend over the internet.
Breaking for existing mods: the story-flag safe band moved (8512 → 8712) and cutscene casts now use a single actors = [...] key — details in the sections below.
What's new since v1.0.0b15
✉️ Save points & Mognet — the moogle letter network comes alive
A custom save moogle can now join FF9's real Mognet network as a genuine 42nd identity — giving, accepting, and re-reading letters exactly like the other 41 — while every [[savepoint]] runs the game's own full six-row menu with faithful dialogue instead of a bare save prompt.
- The full six-row moogle menu —
[[savepoint]]now offers FF9's real menu, in FF9's own order: Save / Tent / Mognet / Mogshop / Switch party members / Cancel.tent = trueheals half of max HP and MP (rounded up) per living member for one Tent;shop = <id>opens an in-field Mogshop;party = trueadds Switch party members, andparty_minnow defaults to a runtime clamp on the live party size instead of a hardcoded4— the old fixed value could softlock the switch screen with fewer than four characters available. - The moogle's act, on by default — every save moogle now performs the real save choreography (
act = true): it hops, its book and feather snap into place and open, it writes while the save runs, then everything reverses — one invariant template synthesized from a census of FF9's 55 real save-point fields (57 moogle instances).act_textsets the line,act_hop_toan optional landing spot,act = falsekeeps the old still moogle. [savepoint.mognet]— a new 42nd network identity — give the save moogle a real Mognet rosternameand it speaks the actual give/accept protocol against FF9's own mailbox bytes:accept = [...]for letters delivered to it (shown on the real full-screen letter, moogle portrait and all, with the faithful bottom-left mail-status box announcing who has a letter for whom),give = { variant, to }for its own outbound letter (delivered by any stock moogle — no engine change needed), andreceived = [...]for story-triggered arrivals gated byrequires_flag/requires_scenario. Needs a mintedtext_block(register_text_block = true) and your own FF9 install at build time to source the roster.- Read-mail — the moogle re-displays its own given or received letters on demand, matching stock's third Mognet mechanic, through a faithful 3-row Give / Read / Cancel submenu and the real fixed 16-row which-letter list. Built against a 58-field census of stock's own read-mail screens, verified offline against live save data, and in-game proven (2026-07-19).
- Faithful dialogue everywhere — every attributed line the kit authors (
[[npc]],[[event]],[[choice]], cutscenesaysteps, and the savepoint's own prompts) now renders in FF9's real attribution shape: the speaker's name on its own line, the line itself in literal curly quotes, never"Name:"— derived from a census of 12,711 stock dialogue entries. - Save-moogle fixes — forking a save point on 7 of FF9's 55 real save points (Gizamaluke's Grotto, Mountain Path, Red Rose, and others) used to silently produce no moogle at all, because they use a second model variant (
GEO_NPC_F1_MOG) the kit didn't recognize; a fork whose puppeteer logic can't be carried now warns instead of shipping silent; the save moogle speaks under its own roster name instead of a hardcoded one; and moogle menu windows are pinned top-left exactly like stock, fixing a clipped MOGNET caption. - Hardening — a 21-agent adversarial review confirmed 17 findings: the which-letter window now matches stock's fixed 16-row shape exactly, and the Mognet/flag validators reject out-of-range scenario ids, writes into reserved flag bands, oversized letter payloads, and blank letter fields at build time instead of failing later. A new
tools/mognet_dump.pydecodes a save's live Mognet mailbox — slots, delivered counter, per-letter give/read locks — for offline verification, with--jsonsnapshotting and--compare BEFORE AFTER. - In-game proven (2026-07-18) — the six-row save menu, the moogle's act, the Mognet identity (give and accept, on the user's own save), the kit-wide speaker form, and the party-switch/roster-name/menu-placement fixes; read-mail proven the next day (2026-07-19); the mailbox decode confirmed separately against live save data. See SAVEPOINT.md.
⚠️ Two critical data-safety fixes
A byte-level census of stock gEventGlobal usage — and a matching one of the engine's text-merge behavior — found two ways ordinary play could quietly corrupt a mod's story state or the base game's own dialogue. Both are fixed; one changes the default safe-flag band and needs a rebuild.
- The story-flag safe band moved 8512 → 8712 (BREAKING). The read-mail decode census found the old
FIRST_SAFE_FLAG = 8512sat onByte[1064]— the first byte of stock Mognet's own read-mail payload (variantsByte[1064-1073], sendersByte[1079-1088]), written on every ordinary Mognet visit. Every campaign/journey flag at the default base was living where real play scribbled over it. The safe band now starts at byte 1089 (bit 8712); a[deathrules]outpost word that had landed inside the Mognet read-lock band moved off it too. In-progress campaign saves built against the old band lose custom-flag story state when the mod is rebuilt — it was corruptible where it sat, so this is a correctness fix, not a regression. A flag you placed by hand below 8712 is now a hard build/lint error, and you bump it yourself — the kit's own Stolen Ember example moved its flag base 8600 → 8800 the same way. - The reservation formerly labeled "treasure-chest bitfield" (8376–8511) is the Mognet give/read lock band, byte-identical across ~58 fields. Regions, messages,
SaveReport(chests_opened→mognet_locks), and the docs are all re-attributed to match. text_blockno longer defaults onto a real field's dialogue. The engine merges every field's text into ONE global table with the base game applied first — so a custom field left on a real block (the kit's own default was1073, Black Mage Village; the World Hub's was8, Ice Cavern) silently overwrote that location's shipping dialogue, no stacked mod folder required.text_blocknow defaults to the field's own id and auto-emits itsMessageFileregistration; a fork still keeps its donor's block, since voice acting and the dual-language remap key off it.ff9mapkit lintnow catches a vanilla-block squat offline (lint_text_block, wired intolint_all) — no game install needed, and it flags a fork parked on any real block other than its own donor's.- A journey that would place a text window past the engine's Int16 mesID ceiling now fails at build time with a clear error instead of silently rendering no dialogue for every campaign past the wrap point.
- All twelve shipped kit examples that had been hand-pinned onto real blocks (the waystation, both hub fields, both journey examples, and seven others) were re-pointed to derive their own id. (The Vivi-hut build oracle deliberately keeps its pinned block — it exists to be byte-exact.)
🎮 Co-op & multiplayer suite
⚠️ Experimental — exploration ghost sync, battle co-op, and the declarative puzzle-gate vocabulary all work, and several pillars are proven on a real two-machine link, but the Workspace Co-op tab is only smoke-tested end to end, the network protocol is still changing release to release, and none of it runs without the engine patch set called out below.
Two players can now explore, solve puzzles, and fight side by side on the same field over direct LAN or the internet — each save stays fully independent underneath, but the guest can see, fight alongside, and even watch the host's battles live.
- Ghost sync, on any field you both stand on — the other player appears as a live-synced "ghost": their own current character model, tinted to match the local field's lighting, walking wherever you both happen to be (co-op is no longer locked to one hangout room;
--field Nrestricts it back to a single field if you want that). - One-command session setup —
ff9mapkit coop host|joinfinds or builds the shared co-op room, writes[Netsync]intoMemoria.ini, and mints a session code, over direct LAN (--lan) or an internet relay through a bundled TLS bridge (ff9mapkit coop bridge) gated by that code so only your intended peer connects. An in-game overlay shows the code and pairing st...
v1.0.0b15
Dream World IX 1.0.0b15 — Battle balance rules, a hand-built continent, and Chocobo Hot & Cold
Dream World IX is a toolkit for building brand-new playable Final Fantasy IX content — and faithfully forking the real game — for the Memoria engine (Steam/GOG FF9). This release adds a declarative battle-balance rules engine, closes the last gaps in custom overworld authoring (the first fully custom continent, cliff and beach reshaping, a closed shore-tile vocabulary), and reopens the Chocobo Hot & Cold minigame for custom prizes — 183 commits and 3283 passing tests since b13, all DLL-free.
Scale every enemy's HP for a hard-mode run, give the party a second-wind revive, dig up your own Chocobo Hot & Cold prizes, and sail out to a brand-new island chain built entirely from real FF9 coastline — no engine rebuild required.
What's new since v1.0.0b13
⚔️ Battle balance & rules (the Overload gameplay hub)
A new architecture for hooking the engine's battle-calculation callbacks hosts three declarative, flag-toggleable gameplay features — no Assembly-CSharp rebuild.
[difficulty]scales every enemy once per battle —enemy_hp/enemy_attack/enemy_magic(0.05–20.0), players untouched — with an optionalflaggate so a journey can switch hard mode on/off at runtime (toggle live with F6 → Flags; takes effect next battle).[rebalance]scales the final HP-damage number by the caster's side —player_damage/enemy_damage— the only way to scale what the party deals; composes with[difficulty]. Takes effect live, mid-battle (the 9999 cap needsMemoria.ini [Battle] BreakDamageLimit = 1).[deathrules]owns the party-wipe verdict:second_windcancels a wipe once per battle with a full Phoenix-party revive (queued exactly like the vanilla Eiko default, recharging each battle), with an optionalchanceroll andkeep_rebirth_flame = falsefor a hardcore mode with no auto-revive at all. Fail-safe by construction — any hiccup is a normal defeat, never a canceled wipe with nobody revived.- Discovered here: the GRANULARITY LAW — a flag-gated feature's toggle latency equals its hook's fire cadence.
[rebalance]rides a per-hit hook (flips live mid-fight);[difficulty]rides a per-battle hook (takes effect next fight). Same gate mechanism, different granularity, depending on where in the engine it hooks in. - In-game proven (2026-07-11) —
[difficulty]×2 HP confirmed byte-exact via telemetry (Fang 68→136, Goblin 33→66);[rebalance]2×/0.5× confirmed both directions;[deathrules]wipe → Phoenix revive → second wipe → normal game over → next battle recharged. See SCRIPTS_DLL.md §12.
🥚 Chocobo Hot & Cold — custom dig prizes
Author your own prize/timer lane for the Chocobo's Forest treasure-hunting minigame on a faithfully forked forest.
- A new declarative
[chocobo]block sets the dig prizes and timer tuning for a--verbatimforest fork — no hand-patched.eb, a purpose-built expression-literal edit primitive under the hood. - In-game proven on all three Chocobo Forests (2026-07-10) — Elixir Forest / Phoenix Down Forest / Magic Tag Forest each redeployed with a custom prize and confirmed matching pop-up text to actual item given, every time.
- The F6 debug menu's Flags tab gained a BATCH operator (bit/byte/word story-flag operations in one click, with named presets) to warp straight into a chocobo dig without manually walking there each test.
🏝️ The first hand-built continent, and a closed shore vocabulary
Custom overworld authoring reaches its capstone this release: a fully composed, multi-island continent built entirely from real FF9 coastline, plus the tools to reshape any coast — cliffs, beaches, and growth — by hand.
- The first custom continent — four real, verbatim-carried FF9 islands (a cliff/highland island, a shore/shallow-water island, a real sandy beach, and Uaho — FF9's own air-only islet) fused into one seamless archipelago in open ocean via
world-fuse, deployed and walked in-game with zero seams at any shared border. The layout ships as a worked example (ff9mapkit/examples/continent-v1/). - The coast-morph pillar — reshape any verbatim-transplanted coastline in place: cliff bumps, structural headlands, bays, and multi-lobe combinations (
--cliff-bump/-headland/-bay/-lobes); full beach reshaping and sliding (--beach-reshape/--beach-slide) that moves the whole sand/foam/waterline assembly as one unit; and--in-placemorphs that reshape the REAL, already-shipped map coastline directly, no carrying required. A newworld-morphsscanner catalogs 324 lawful morph windows map-wide (ready-to-run deploy commands included). - The shore tile vocabulary is now closed — the sand band and foam end-caps are fully byte-learned and regeneratable from scratch (
sand_rebuild/cap_rebuild), closing the last gap in FF9's coastal tile language.--beach-mintre-mints a real beach's sand+foam assembly from a chain spec at any width, including its own synthetic land chain — the first fully kit-authored (not just carried) beach. - Underlying growth machinery landed too:
world-transplant --size NxMcarries a multi-cell verbatim landmass as one rigid assembly;RowInsert/chain_row_insertsgrow an island by inserting real lattice columns;spill-clipunlocks growth using an empty neighboring cell's water as slack. - In-game proven throughout July 2026 — the continent (2026-07-09), the coast-morph rungs (2026-07-09 through 2026-07-10), the shore-vocabulary closure (2026-07-11). See the overworld skill/memory for the full 115-law reference.
🗿 Battle-model export gap closed
Every alias id a real FF9 character's battle form can take now exports, previews, reskins, and deploys engine-faithfully.
extract.resolve_prefabreplays the engine's own alias-resolution chain (boss forms, alternate outfits, F1 field-avatar aliases) so all 71 shipped alias ids — not just the 84 primary character/enemy models — round-trip through the custom-model pipeline; the 43 truly-unshipped ids now refuse with an actionable message instead of a wrong export.- Bone display labels —
model-gltf's exported skeleton now carries anatomical names (bone012_R_handinstead of a bare index) for 83% of FF9's bones, derived from family-clustered rest-pose heuristics;--plain-bonesopts back out. Makes hand-editing a skinned mesh in Blender dramatically easier to navigate.
🖼️ Image-to-field improvements
The experimental image-field command (turn any picture into a walkable FF9 room) gained the pieces that make it usable on a real photo, not just a synthesized test image.
--auto-floorautomatically detects the walkable floor region (a refusal-biased seeded region grow) instead of requiring a hand-traced polygon, and pre-loads the browser-based--tracetool for manual correction.- Anchored occluders now depth-sort correctly against the player character (a foreground cut-out's Z is set to the actor's own depth at its floor contact point), so walking behind an object correctly hides behind it.
- A full-resolution cover-crop fix sharpens the deployed background (earlier builds shipped a softened image) — rebuild any pre-existing
image-fieldproject to pick it up. - In-game proven on a real photograph (2026-07-09) — the user's own hallway, traced and deployed as a walkable field.
🎛️ Engine & F6 debug menu
- The F6 debug menu's Flags tab gained the BATCH story-flag operator (bit/byte/word operations, all-or-nothing, named presets) — see Chocobo Hot & Cold above.
- New overworld vehicle-mode and disc-switch tooling in F6's Go tab, reverse-engineered from the dispatcher tables.
- The Position readout now leads with the canonical wrapped coordinate triple every kit tool actually speaks (
world (x,z) · block [x][y] · cell (x,z)) instead of the engine's raw unwrapped position, ending a recurring coordinate-confusion class of bug.
Engine bundle
The b15 public engine bundle is UNCHANGED from b12/b13 — same fork-fidelity patch set (s23–s33) plus the s34 overworld mesh-override plus the F6 in-game debug menu, shipped as dwix-custom-memoria-*.zip.
- If you already have the b12 or b13 engine, you do NOT need to re-download it. Every b15 pillar above is either DLL-free or runs on the existing bundle (the continent/coast-morph/chocobo work all reuses the already-shipped s34 override).
- A newer overlay-texture-cache patch (s35) and an F6 diagnostic addition exist in the patch set but are not yet in this public bundle — held for a future from-source engine rebuild. Nothing in this release depends on them.
- A novel (from-scratch / BG-borrow) field runs on stock Memoria, as do most of this release's headline pillars.
- A forked field, and the overworld synthesis/reshape commands, need the shipped s23–s34 suite (all present in the unchanged bundle).
Getting started
- Windows: grab the installer
.exefrom the release assets — it bootstraps everything, and can optionally install the engine patches (backed-up, version-aware). - From PyPI:
uv tool install "ff9mapkit[gui,assets,save]"thenff9mapkit setup(detects your FF9 install, saves config, extracts base templates, and reports Memoria status). - Already installed?
uv tool upgrade ff9mapkit. - Full walkthrough, prerequisites, and the CLI reference: SETUP.md.
Provenance
Dream World IX ships NO FINAL FANTASY IX game data. It operates only on a copy of the game you already own, reading and patching your local install at build time. Base templates are regenerated from your own install via ff9mapkit extract-templates; no Square-Enix bytes are distributed. This is an unofficial, fan-made toolkit and is **not affiliated with, endorsed by, or as...
Dream World IX 1.0.0b13 — New party members, custom battle scripting, and hand-built overworlds
Dream World IX 1.0.0b13 — New party members, custom battle scripting, and hand-built overworlds
Dream World IX is a toolkit for building brand-new playable Final Fantasy IX content — and faithfully forking the real game — for the Memoria engine (Steam/GOG FF9). This is the biggest content release yet: genuinely new engine party members, a declarative channel for custom battle/field/status scripting, from-scratch 3D models and creatures, synthesized overworld oceans and islands, custom music, and more — 164 commits and 3031 passing tests since b12, almost all of it DLL-free.
Recruit a 14th party member with their own kit, script a life-draining spell in one TOML line, sculpt a walkable island out of open ocean, and drop in your own soundtrack — no engine rebuild required.
What's new since v1.0.0b12
👥 13th & 14th playable characters
A new [[playable]] block mints genuinely new engine party members — a 13th and 14th character alongside all 12 canon — each with their own name, stats, battle model, animset, portrait, and a bespoke ability kit, entirely DLL-free.
[[playable]]defines and recruits a genuinely NEW engineCharacterId(ids 12–15, up to 4 custom characters): its own name in all 7 languages, stats cloned from aborrowdonor then overridden, realB_PARTYADDrecruitment (recruit = true), and save/reload persistence.- Two custom characters proven coexisting — Iviv (id 12, Vivi mage rig) and Steiniv (id 13, Steiner knight rig); the kit auto-allocates distinct CSV / preset / command / ability / model / serial bands per character so they never collide.
custom_battle_modelmints an independent, editable copy of the donor's battle model (own serial + BattleParameters row) so reshaping it in Blender never touches the base character — usable even on scenario-formula donors like Zidane/Garnet.custom_battle_anims+ the newff9mapkit playable-anims <field.toml> --export <GLB>/--edit <GLB> --deploy <MODFOLDER>loop give the minted model its own editable animset — edit named clips (23_attack,27_cast) in Blender and route only the changed ones back;anim_edits = "x.glb"persists them across re-deploys.portrait = "132x190.png"sets a custom party-menu avatar via a loose Face-Atlas override, non-destructive to stock/Moguri faces.[playable.abilities]gives the character its OWN command menu and curated learn list on its ownCharacterPresetId(band 20–23):command1/command2slots (+ trance mirrors) andlearn = [{ ability, ap }].- Mint a UNIQUE command — inline
[playable.abilities.command1]{ name, abilities }creates a brand-newBattleCommandIdwith its own ability pool and per-languagecom_name.mesoverlay (e.g. Iviv's mixed black+white "Spark"). - Mint a CUSTOM ACTIVE ability — an inline
{ name, from, power, element, mp, rate }clones a stock donor into a newActions.csvrow and retunes it; also takesstatus = ["Silence"](auto-mints a StatusSets row) andeffect = "[code=MPCost] 0"(an AbilityFeatures hook for free-in-battle). - In-game proven (2026-07-06): both custom characters recruit, fight with their own models/animsets, cast their minted commands/abilities, and persist through save/reload. Caveats: don't open the in-game rename screen for a custom id (its name comes from the DictionaryPatch), and FF9 renders only the party leader in fields (menu + battle unaffected).
🧬 Scripts-DLL — custom battle, field, and status scripting
A new declarative channel mints genuinely new battle formulas, out-of-combat field effects, and custom status ailments into a per-mod plugin DLL the engine loads alongside its own — with no Assembly-CSharp rebuild.
- Custom battle FORMULAS from one TOML line: a custom ability's
script = { template = "drain_hp" }(or{ body = "<C#>" }) mints a[BattleScript(id>=256)], compiles it into a mod-ownedMemoria.Scripts.<Mod>.dll, and repoints the ability'sscriptId— expressing drain, %-max-HP, and sequencing the data path can't. (A scalarscript = 16is still just a data re-point and needs no DLL.) - Four battle templates cloned from FF9 donors:
drain_hp(deal damage AND heal caster),drain_mp(Osmose),magic_damage, andwhite_wind— each reading the ability's own power/element/mp tuning. - Paired FIELD effects: add
script.field = { template = "field_heal_hp" | "field_white_wind" | "field_chakra" | "field_cure_status" | "field_revive" }and the kit mints a matching[FieldAbilityScript]at the same id, so one curative ability works in AND out of combat. - Custom STATUS ailments:
status = [{ name = "Rebirth", template = "auto_life", power = 50 }]mints a[StatusScript]+ a StatusData row (custom id 33–63) + the inflict; templatesauto_life(revive-once) andauto_attack, or a rawbody/hooksescape hatch. (Honest limit: per-tick DoT is unreachable — the tick hook is mask-gated to vanilla statuses.) - Custom-status HUD icon (
icon = "Regen") borrows a vanilla panel sprite, andover_model = "Haste"clones a vanilla status's on-model SHP/SPS/tint so a buff is visible on the 3D model. ff9mapkit lintnow blocks a scripted ability with no findablecsccompiler ($FF9_CSC override, then VS Build Tools Roslyn, then .NET Framework csc), and each build stamps a<dll>.buildinfo.jsonsidecar so deploy/doctor warn OFFLINE on engine-version drift.ff9mapkit battle-telemetry <mod>installs an IOverload hook logging every battle calc toff9mk_battle_telemetry.jsonl;--reportsummarizes casts, hit%, crit%, and damage per ability/unit (engine defaults transcribed verbatim, every write exception-swallowed).- Mostly in-game proven (2026-07-07) — Soul Leech drain, Lifewell field heal, a Rebirth auto-life revive with on-model chevron, and a real 2-battle telemetry capture. Requires
cscon the build machine; the DLL loads at the title screen, so relaunch after deploy (F6 reload won't pick it up). Seeff9mapkit/docs/SCRIPTS_DLL.md.
🗿 Custom 3D models — round 2
The custom-model pillar grows from editing FF9's models to authoring wholly new animation clips and even whole from-scratch creatures, plus a GUI browser and one-PNG reskins — all still DLL-free.
model-anim-new <model> --deploy MODFOLDER [--glb FILE --action NAME]authors a WHOLLY NEW animation clip (from a Blender.glbaction or a built-in spin demo) via a3DModelAnimationdirective — field anim keys are 16-bit, so new clips mint into the 60000–65535 band (in-game proven: a full-body spin on Beatrix's model at key 60000). It also works on minted models.- A wholly-original creature with ZERO FF9-derived bytes — "Boletta" — ships her own procedural mesh + 5-bone rig + hand-painted texture + authored idle clip, minted as a new GEO id and placed as a talking NPC; she renders, idles, and holds dialogue in-game (worked example
ff9mapkit/examples/boletta/+ tutorialff9mapkit/docs/tutorials/12-creature-from-scratch.md). - Static meshes (weapons, props) are now editable through the skinned pipeline (a trivial 1-bone rig wraps skeleton-less prefabs), proven with an oversized RuneTooth blade in battle; the weapon extractor now reads the correct battle-model bundle path.
- Overworld actor models can be reskinned AND re-animated with no new code, backed by an authoritative world-model → character map (
GEO_SUB_W0_001= Zidane,W0_002= Garnet,W0_003= Chocobo, …); proven with a wide-leg Zidane on the world map. - Three new no-Blender CLI commands:
model-preview(software-render a posed PNG still),model-reskin(export or deploy edited texture PNGs — the cheapest edit), andmodel-deployed(list/revert a mod folder's loose overrides / reskins / mints / anim overrides). - GUI Models tab: an illustrated Workspace browser with real software-rendered thumbnails, a detail pane, and the whole export/import/mint round trip; model thumbnails also appear across the Info Hub and pickers, plus a
[[playable]]character form. - Deploy now preserves foreign
3DModel/3DModelAnimationlines across a redeploy, andmodel-gltf --anims autolabels clips with friendly names (idle/stand/run/walk/turn), preferring on-foot locomotion.
🌊 Custom overworld — synthetic oceans, islands, cliffs, save position
Synthesize brand-new overworld water, islands, and cliffs from scratch — faithful to how FF9 itself builds them — and set exactly where the player stands on the world map.
ff9mapkit world-water --cells X,Ysynthesizes graded open-ocean water from a depth field, laying down the real sea-tile vocabulary (Sea3 mid / Sea5 transition / Sea4 deep) with byte-proven UVs and marching-band Wang tiles so shades seam-match with no visible grid;--deep N|S|E|Wgrades toward a coast.- The synthesized ocean is boat-walkable at the surface (the water walkmesh sits just under Y=0 with the deep-sea topograph) — a boat sails across it while on-foot is blocked, exactly like real ocean.
- A/B fidelity modes:
world-water --verbatim [BX,BY]drops a real block in unchanged as a reference,--reproduce [BX,BY]regenerates a real block with synthesized tiles (validated 17/17 tile-shape match). ff9mapkit world-island --cell BX,BYsynthesizes a fully-custom cliff island — organic coastline + a faithful ~73° rock wall + the real grass language — multi-cell by construction (multi-cell walking is in-game proven; the current capstone is a ~130×88u, 6-block landmass);--lobes 2-3builds asymmetric multi-lobe shapes, and the command refuses to deploy if the coastline fails FF9's measured shape/placement census.world-reclaim --profile cliffturns a reclaimed ocean cell into rolling land that drops via a steep ~73° rock wall to the waterline, textured with the REAL grey-rock atlas (faithful to 208 measured FF9 cliffs).ff9mapkit save-edit --world-pos X,Zrelocates where you spawn on the world map (decoded from `g...
v1.0.0b12
Full Changelog: v1.0.0b10...v1.0.0b12
Dream World IX 1.0.0b12 — custom 3D models + custom overworld
🧍 Custom 3D models
Export any FF9 character/field model to Blender, edit the mesh and its animations, put it back in-game.
model-gltf→ a rigged, textured, animated.glbyou open in Blendermodel-import→ one edited.glbround-trips the mesh and any changed animation clips- Edit keyframes in Blender (or hand-edit clip JSON with
model-anim);model-mintadds brand-new model ids - One-click Import / Export FF9 Model buttons in the Blender add-on
- Robust across the model set (multi-mesh characters, story-evolved appearances, Blender re-sampling)
🗺️ Custom overworld
Reshape and extend the world map.
- Sculpt the terrain —
world-terrainraises hills, carves craters and ridges, and flattens ground by reshaping the real world mesh (seam-continuous, walkable, no DLL) - Turn ocean into new land —
world-reclaimmakes sea cells walkable, andworld-coastcarries a real FF9 coastline onto them (terrain + animated beach, surf, and foam) — the groundwork for whole new continents - Author brand-new overworld entrances from scratch —
world-entrancedrops a!on the map that warps into any field, optionally fronted by a fully-modelled 3D building (built in Blender) that renders, blocks the player, and round-trips cleanly - Re-table the encounters —
world-encounterschanges which monsters roam an area/zone;world-encounter-rateretunes how often they strike - Re-texture the world — reskin atlas tiles or paint new atlas art onto new geometry (three tiers of texturing, all no-DLL)
- Rename & reveal minimap markers (Lindblum → "Falcon City") and author weather & environment effects
- The F6 debug menu now runs on the overworld — live position/cell/disc readout, teleport, vehicle-mode swap, disc 1↔4 switch
🔧 F6 debug menu
4-tab redesign, unified pin list (field warps + overworld teleports), and a "Reload + anims" button.
Get it
- Windows: run
DreamWorldIX-Setup.exebelow (no Python needed) - Terminal:
uv tool upgrade ff9mapkit(orpip install -U "ff9mapkit[gui,assets,save]") - Engine bundle updated this release (adds
s34for the overworld features) — attached below.
Ships no game data; operates only on a copy of FF9 you own. MIT. Not affiliated with Square Enix.
v1.0.0b9
Full Changelog: v1.0.0b8...v1.0.0b9
Dream World IX 1.0.0b8 — dev mode on an installed copy + a clearer installer finish
Dream World IX 1.0.0b8 — dev mode on an installed copy + a clearer installer finish
Dream World IX is a toolkit for building brand-new playable Final Fantasy IX fields — and
faithfully forking the real ones — for the Memoria engine
(Steam/GOG FF9). Author a whole custom field from a single declarative field.toml and compile it into
a drop-in mod — or fork any of FF9's ~674 real fields and carry their content faithfully.
Still an early public beta. A small follow-up to b7 — quality-of-life for developers + an installer
wording fix.
What's new since 1.0.0b7
The installed Workspace can use the dev loop against a checkout
If you have both an installed copy and a source checkout, the installed ff9mapkit-workspace can now light
up the dev test slot (4003) + F6 reload loop: set the FF9_REPO environment variable to your Dream
World IX repo (or just launch the Workspace from inside the checkout) and reopen. Without it, the installed
Workspace stays in end-user mode (Build → Install to game, campaign/journey deploy, Set New Game) — the
dev-only test slot is hidden, now with a tooltip explaining how to enable it.
Installer Finished page wording fix
The Finished page no longer points at "the setup window above" (the bootstrap window closes when it
finishes, so there's nothing above by then). It now tells you to run ff9mapkit setup to check the
engine status, or ff9mapkit setup --install-engine to apply the patches.
Engine bundle (required for forked fields)
A novel field runs on stock, unmodified Memoria. A forked field needs the fork-fidelity patch
set — unchanged (the s23–s33 suite). The installer's "engine patches" task installs
dwix-custom-memoria-1.0.0b8.zip for you; or grab it from the assets below and run
ff9mapkit setup --install-engine <that-zip>, or follow
ff9mapkit/docs/ENGINE.md.
Getting started
- Easiest (Windows): run
DreamWorldIX-Setup.exefrom the assets below. No Python needed. - Terminal:
uv tool install ff9mapkit[gui,assets,save](orpip install …), thenff9mapkit setup. - Already on b7?
uv tool upgrade ff9mapkit(or re-run the installer). - SETUP.md — install, updating/uninstalling, the dev loop (incl.
FF9_REPO), your first field.
Provenance
Dream World IX ships no Final Fantasy IX game data. It operates only on assets read from a copy of the
game you legally own. Unofficial, fan-made, not affiliated with or endorsed by Square Enix.
License
MIT (© 2026 GameJawnsInc) — the Dream World IX / ff9mapkit source. The bundled engine patches
modify Memoria (MIT, © Albeoris).
See Known issues and
Troubleshooting.
Dream World IX 1.0.0b7 — installer installs the engine, the GUI deploys when installed, an app icon
Dream World IX 1.0.0b7 — installer installs the engine, the GUI deploys when installed, an app icon
Dream World IX is a toolkit for building brand-new playable Final Fantasy IX fields — and
faithfully forking the real ones — for the Memoria engine
(Steam/GOG FF9). Author a whole custom field from a single declarative field.toml and compile it into
a drop-in mod — or fork any of FF9's ~674 real fields and carry their content faithfully.
Still an early public beta. Engine work is largely in-game proven; the newest gates ship with the
honesty caveat below. Bug reports and field-authoring questions are welcome.
What's new since 1.0.0b6
The installer can install the engine patches for you ★
Forking real fields needs the patched Memoria build. The Windows installer now bundles it and offers
an opt-in "engine patches" task that installs it for you — no separate download or manual DLL copy:
- It backs up your original Memoria DLLs first (under
<game>\dwix-engine-backups\), and never
touchesMemoria.ini(Memoria auto-detects mod folders). - It's version-aware: if our patched build is already in place it skips; if you later update or
re-patch Memoria (which reverts our DLLs), just re-run it to reapply. - If Memoria isn't installed yet it degrades gracefully — it tells you how to apply it later instead
of erroring.
Prefer the terminal? ff9mapkit setup --install-engine <dwix-custom-memoria-1.0.0b7.zip> does the same.
The Workspace GUI now deploys campaigns + journeys when installed ★
Previously an installed copy (.exe / pip / uv) could build a campaign or journey but couldn't
deploy it (those ran the repo's tools/). Now the multi-field deploys work from an installed copy:
- Build & Deploy → campaign "Deploy to game" and the whole journey flow (preview / deploy /
re-apply links, with single-folder + New-Game options) install straight into your FF9 folder. - "Set New Game" points New Game at any deployed field.
- All reversible — snapshots + a one-click Revert go to a per-user cache.
New CLI commands back these: ff9mapkit deploy-campaign, deploy-journey, and
ff9mapkit newgame <id> (all dry-run by default).
A proper app icon
The Workspace, the installer, and the Start-Menu shortcut now carry a Dream World IX icon.
Updating & uninstalling
- Update:
uv tool upgrade ff9mapkit(or re-run a newerDreamWorldIX-Setup.exe— it upgrades in
place, no uninstall first). - Uninstall: Add/Remove Programs → "Dream World IX". It leaves
uv+ its Python, your
%LOCALAPPDATA%\ff9mapkitdata, and any engine patches applied to your game in place — the
uninstaller points you at<game>\dwix-engine-backups\to restore stock Memoria if you want.
Engine bundle (required for forked fields)
A novel field runs on stock, unmodified Memoria. A forked field needs the fork-fidelity patch
set — unchanged (the s23–s33 suite). The installer's "engine patches" task installs
dwix-custom-memoria-1.0.0b7.zip for you; or grab it from the assets below and run
ff9mapkit setup --install-engine <that-zip>, or follow
ff9mapkit/docs/ENGINE.md. Disc-1 gates plus the s30/s31 walk+occlusion and
s33 menu-LOCATION fixes are in-game proven; the late-disc s29 softlock gates, s32, and the s33 sibling
sweeps ship unverified (identity-safe for real fields) and are being playtested as those zones are forked.
Getting started
- Easiest (Windows): run
DreamWorldIX-Setup.exefrom the assets below. No Python needed — it installs
the toolkit, runsff9mapkit setup(detect FF9 + extract base assets), and can install the engine patches. - Terminal:
uv tool install ff9mapkit[gui,assets,save](orpip install …), thenff9mapkit setup. - FORKING_FF9.md — a guided GUI walkthrough. · SETUP.md — install,
the dev loop, updating/uninstalling, and your first field.
Provenance
Dream World IX ships no Final Fantasy IX game data. It operates only on assets read from a copy of the
game you legally own. Unofficial, fan-made, not affiliated with or endorsed by Square Enix.
License
MIT (© 2026 GameJawnsInc) — the Dream World IX / ff9mapkit source. The bundled engine patches
modify Memoria (MIT, © Albeoris).
See Known issues and
Troubleshooting.
v1.0.0b10
Full Changelog: v1.0.0b9...v1.0.0b10
Dream World IX 1.0.0b3 — pip-installable, plus SPS effects, cutscenes & chests
Dream World IX 1.0.0b3 — pip-installable, plus SPS effects, cutscenes & chests
Dream World IX is a toolkit for building brand-new playable Final Fantasy IX fields — and
faithfully forking the real ones — for the Memoria engine
(Steam FF9). Author a whole custom field from a single declarative field.toml and compile it into a
drop-in mod — or fork any of FF9's ~674 real fields and carry their content faithfully.
Still an early public beta. Engine work is largely in-game proven; the newest gates ship with the
honesty caveat below. Bug reports and field-authoring questions are welcome.
What's new since 1.0.0b2
Easier to install
- Now on PyPI.
pip install ff9mapkit— orpip install ff9mapkit[gui,assets,save]for the
desktop GUI + the fork/import commands + save editing. The headline fork feature is one extra:
ff9mapkit[assets](pulls UnityPy). - One-click Windows installer. A small
DreamWorldIX-Setup.exebootstraps everything via
uv— no system Python required. Prefer the terminal? The same
path isuv tool install ff9mapkit[gui,assets,save]. The installer redistributes nothing but its own
code (dependencies are fetched from PyPI on the user's machine), keeping the distribution
license-clean. ff9mapkit-workspace— the PySide6 Workspace now has a console-less launcher and a Start-Menu
shortcut.
New authoring pillars
- SPS particle-effect authoring — no engine rebuild. Browse, re-skin, edit, and author field
particle effects ([[sps]]/[[sps_edit]]): a round-trip-proven.spscodec, curated effect
templates, walkmesh-auto-grounded placement, a from-scratch creator, and a GUI "Effects" section plus
an Info Hub browser with previews. - Multi-actor cutscenes on verbatim forks. A director-model conductor choreographs several
actors (animated walk included) inside a faithfully-forked field. - More verbatim-fork authoring. Layer your own content onto a
--verbatimfork:[music]to
replace a field's BGM,[[npc]] opens_shop,[[npc]]talk → branch-menu choices, and readable
props (dialogue =).
Content & tooling
- Treasure chests (
[[chest]]) on both the verbatim and from-scratch paths — real openable, savable
chests with model variants (F0–F3), flag-by-name, story-gated appearance, and facing. - Shared story-flag tiers — name a flag once and share it across a campaign, or across a whole
multi-campaign journey, with GUI editors and a documented flag-scope hierarchy; the journey-global
tier now gates members correctly (lint matches build). - Blender-placed entities surface their
scene.tomlposition read-only in the Workspace.
Engine bundle (required for forked fields)
A novel field runs on stock, unmodified Memoria. A forked field needs the fork-fidelity
patch set — unchanged from 1.0.0b2 (the s23–s33 suite). Download
dwix-custom-memoria-1.0.0b3.zip from the assets below (identical to the 1.0.0b2 engine build) and
follow ff9mapkit/docs/ENGINE.md. Disc-1 gates plus the s30/s31
walk+occlusion and s33 menu-LOCATION fixes are in-game proven; the late-disc s29 softlock gates, s32,
and the s33 sibling sweeps ship unverified (identity-safe for real fields) and are being playtested as
those zones are forked.
Getting started
- FORKING_FF9.md — a guided GUI walkthrough: fork a slice of FF9, change a line of
dialogue, and play it back. - SETUP.md — install, prerequisites, the dev loop, and your first field.
- ff9mapkit/docs/ — the full toolkit reference.
Provenance
Dream World IX ships no Final Fantasy IX game data. It operates only on assets read from a copy of
the game you legally own. Unofficial, fan-made, not affiliated with or endorsed by Square Enix.
License
MIT (© 2026 GameJawnsInc) — the Dream World IX / ff9mapkit source. The bundled engine
patches modify Memoria (MIT, © Albeoris).
See Known issues and
Troubleshooting.
1.0.0b2 - GUI/Forking/Authoring Improvements
Made updates to the GUI interface to make it easier and faster to fork real fields.
Made real forked fields compatible with the various field script functions (NPC, Event, Chest, etc)
Added the Blender extension to the release downloads