ff9mapkit 1.0.0b3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- ff9mapkit-1.0.0b3/LICENSE +31 -0
- ff9mapkit-1.0.0b3/PKG-INFO +155 -0
- ff9mapkit-1.0.0b3/README.md +120 -0
- ff9mapkit-1.0.0b3/ff9mapkit/__init__.py +18 -0
- ff9mapkit-1.0.0b3/ff9mapkit/__main__.py +36 -0
- ff9mapkit-1.0.0b3/ff9mapkit/_animdb.py +2994 -0
- ff9mapkit-1.0.0b3/ff9mapkit/_animdb_all.py +14125 -0
- ff9mapkit-1.0.0b3/ff9mapkit/_fieldtable.py +1516 -0
- ff9mapkit-1.0.0b3/ff9mapkit/_fieldtext.py +845 -0
- ff9mapkit-1.0.0b3/ff9mapkit/_held_poses.py +44 -0
- ff9mapkit-1.0.0b3/ff9mapkit/_itemdb.py +65 -0
- ff9mapkit-1.0.0b3/ff9mapkit/_modeldb.py +725 -0
- ff9mapkit-1.0.0b3/ff9mapkit/_narrowmap_data.py +10 -0
- ff9mapkit-1.0.0b3/ff9mapkit/_npcparams.py +634 -0
- ff9mapkit-1.0.0b3/ff9mapkit/_regen_animdb.py +72 -0
- ff9mapkit-1.0.0b3/ff9mapkit/_regen_animdb_all.py +66 -0
- ff9mapkit-1.0.0b3/ff9mapkit/_regen_fieldtable.py +95 -0
- ff9mapkit-1.0.0b3/ff9mapkit/_regen_fieldtext.py +66 -0
- ff9mapkit-1.0.0b3/ff9mapkit/_regen_modeldb.py +67 -0
- ff9mapkit-1.0.0b3/ff9mapkit/_regen_npcparams.py +123 -0
- ff9mapkit-1.0.0b3/ff9mapkit/_regen_scenedb.py +57 -0
- ff9mapkit-1.0.0b3/ff9mapkit/_scenedb.py +869 -0
- ff9mapkit-1.0.0b3/ff9mapkit/abilities.py +225 -0
- ff9mapkit-1.0.0b3/ff9mapkit/animations.py +120 -0
- ff9mapkit-1.0.0b3/ff9mapkit/archetypes.py +218 -0
- ff9mapkit-1.0.0b3/ff9mapkit/areatitle.py +76 -0
- ff9mapkit-1.0.0b3/ff9mapkit/battle/__init__.py +21 -0
- ff9mapkit-1.0.0b3/ff9mapkit/battle/abilityfeatures.py +294 -0
- ff9mapkit-1.0.0b3/ff9mapkit/battle/actiondelta.py +441 -0
- ff9mapkit-1.0.0b3/ff9mapkit/battle/aiauthor.py +305 -0
- ff9mapkit-1.0.0b3/ff9mapkit/battle/ailint.py +140 -0
- ff9mapkit-1.0.0b3/ff9mapkit/battle/aipatch.py +175 -0
- ff9mapkit-1.0.0b3/ff9mapkit/battle/battleai.py +148 -0
- ff9mapkit-1.0.0b3/ff9mapkit/battle/battlecsv.py +390 -0
- ff9mapkit-1.0.0b3/ff9mapkit/battle/battlepatch.py +395 -0
- ff9mapkit-1.0.0b3/ff9mapkit/battle/build.py +558 -0
- ff9mapkit-1.0.0b3/ff9mapkit/battle/camera_codec.py +332 -0
- ff9mapkit-1.0.0b3/ff9mapkit/battle/camera_data.py +128 -0
- ff9mapkit-1.0.0b3/ff9mapkit/battle/characterdelta.py +789 -0
- ff9mapkit-1.0.0b3/ff9mapkit/battle/event_data.py +72 -0
- ff9mapkit-1.0.0b3/ff9mapkit/battle/extract.py +540 -0
- ff9mapkit-1.0.0b3/ff9mapkit/battle/fbx.py +223 -0
- ff9mapkit-1.0.0b3/ff9mapkit/battle/reskin.py +149 -0
- ff9mapkit-1.0.0b3/ff9mapkit/battle/scene_codec.py +314 -0
- ff9mapkit-1.0.0b3/ff9mapkit/battle/scene_data.py +369 -0
- ff9mapkit-1.0.0b3/ff9mapkit/battle/scenelint.py +125 -0
- ff9mapkit-1.0.0b3/ff9mapkit/battle/seqasm.py +131 -0
- ff9mapkit-1.0.0b3/ff9mapkit/battle/seqauthor.py +220 -0
- ff9mapkit-1.0.0b3/ff9mapkit/battle/seqcodec.py +300 -0
- ff9mapkit-1.0.0b3/ff9mapkit/battle/seqdis.py +106 -0
- ff9mapkit-1.0.0b3/ff9mapkit/battle/seqpatch.py +137 -0
- ff9mapkit-1.0.0b3/ff9mapkit/battle_bgm.py +133 -0
- ff9mapkit-1.0.0b3/ff9mapkit/binutils.py +60 -0
- ff9mapkit-1.0.0b3/ff9mapkit/build.py +5445 -0
- ff9mapkit-1.0.0b3/ff9mapkit/campaign.py +1276 -0
- ff9mapkit-1.0.0b3/ff9mapkit/catalog.py +316 -0
- ff9mapkit-1.0.0b3/ff9mapkit/chain.py +358 -0
- ff9mapkit-1.0.0b3/ff9mapkit/cli.py +3114 -0
- ff9mapkit-1.0.0b3/ff9mapkit/config.py +360 -0
- ff9mapkit-1.0.0b3/ff9mapkit/content/__init__.py +13 -0
- ff9mapkit-1.0.0b3/ff9mapkit/content/areatitle.py +36 -0
- ff9mapkit-1.0.0b3/ff9mapkit/content/ate.py +118 -0
- ff9mapkit-1.0.0b3/ff9mapkit/content/camera.py +123 -0
- ff9mapkit-1.0.0b3/ff9mapkit/content/chest.py +186 -0
- ff9mapkit-1.0.0b3/ff9mapkit/content/choice.py +163 -0
- ff9mapkit-1.0.0b3/ff9mapkit/content/conductor.py +217 -0
- ff9mapkit-1.0.0b3/ff9mapkit/content/cutscene.py +290 -0
- ff9mapkit-1.0.0b3/ff9mapkit/content/encounter.py +41 -0
- ff9mapkit-1.0.0b3/ff9mapkit/content/entry_settle.py +50 -0
- ff9mapkit-1.0.0b3/ff9mapkit/content/equipment.py +93 -0
- ff9mapkit-1.0.0b3/ff9mapkit/content/event.py +191 -0
- ff9mapkit-1.0.0b3/ff9mapkit/content/gateway.py +101 -0
- ff9mapkit-1.0.0b3/ff9mapkit/content/inventory.py +59 -0
- ff9mapkit-1.0.0b3/ff9mapkit/content/itemdata.py +644 -0
- ff9mapkit-1.0.0b3/ff9mapkit/content/itemtext.py +168 -0
- ff9mapkit-1.0.0b3/ff9mapkit/content/jump.py +114 -0
- ff9mapkit-1.0.0b3/ff9mapkit/content/ladder.py +633 -0
- ff9mapkit-1.0.0b3/ff9mapkit/content/movement.py +53 -0
- ff9mapkit-1.0.0b3/ff9mapkit/content/music.py +97 -0
- ff9mapkit-1.0.0b3/ff9mapkit/content/npc.py +348 -0
- ff9mapkit-1.0.0b3/ff9mapkit/content/object.py +340 -0
- ff9mapkit-1.0.0b3/ff9mapkit/content/onentry.py +135 -0
- ff9mapkit-1.0.0b3/ff9mapkit/content/party.py +111 -0
- ff9mapkit-1.0.0b3/ff9mapkit/content/pathfind.py +138 -0
- ff9mapkit-1.0.0b3/ff9mapkit/content/platform.py +314 -0
- ff9mapkit-1.0.0b3/ff9mapkit/content/player.py +168 -0
- ff9mapkit-1.0.0b3/ff9mapkit/content/prop.py +75 -0
- ff9mapkit-1.0.0b3/ff9mapkit/content/region.py +340 -0
- ff9mapkit-1.0.0b3/ff9mapkit/content/reinit.py +59 -0
- ff9mapkit-1.0.0b3/ff9mapkit/content/savepoint.py +90 -0
- ff9mapkit-1.0.0b3/ff9mapkit/content/shop.py +178 -0
- ff9mapkit-1.0.0b3/ff9mapkit/content/sps_trigger.py +66 -0
- ff9mapkit-1.0.0b3/ff9mapkit/content/startup.py +71 -0
- ff9mapkit-1.0.0b3/ff9mapkit/content/synthesis.py +106 -0
- ff9mapkit-1.0.0b3/ff9mapkit/content/text.py +183 -0
- ff9mapkit-1.0.0b3/ff9mapkit/content/textcarry.py +290 -0
- ff9mapkit-1.0.0b3/ff9mapkit/content/verbatim.py +86 -0
- ff9mapkit-1.0.0b3/ff9mapkit/content/walkmesh_hotfix.py +38 -0
- ff9mapkit-1.0.0b3/ff9mapkit/data/__init__.py +48 -0
- ff9mapkit-1.0.0b3/ff9mapkit/data/_regen_provenance.py +142 -0
- ff9mapkit-1.0.0b3/ff9mapkit/data/provenance/blank.es.patch +1 -0
- ff9mapkit-1.0.0b3/ff9mapkit/data/provenance/blank.fr.patch +1 -0
- ff9mapkit-1.0.0b3/ff9mapkit/data/provenance/blank.gr.patch +1 -0
- ff9mapkit-1.0.0b3/ff9mapkit/data/provenance/blank.it.patch +1 -0
- ff9mapkit-1.0.0b3/ff9mapkit/data/provenance/blank.jp.patch +1 -0
- ff9mapkit-1.0.0b3/ff9mapkit/data/provenance/blank.uk.patch +1 -0
- ff9mapkit-1.0.0b3/ff9mapkit/data/provenance/blank.us.patch +1 -0
- ff9mapkit-1.0.0b3/ff9mapkit/data/provenance/manifest.json +65 -0
- ff9mapkit-1.0.0b3/ff9mapkit/data/provenance/region_template.patch +1 -0
- ff9mapkit-1.0.0b3/ff9mapkit/data/reference_arcs.toml +89 -0
- ff9mapkit-1.0.0b3/ff9mapkit/data/region_catalog.toml +593 -0
- ff9mapkit-1.0.0b3/ff9mapkit/deploystack.py +358 -0
- ff9mapkit-1.0.0b3/ff9mapkit/dialogue.py +803 -0
- ff9mapkit-1.0.0b3/ff9mapkit/eb/__init__.py +12 -0
- ff9mapkit-1.0.0b3/ff9mapkit/eb/_exprtable.py +59 -0
- ff9mapkit-1.0.0b3/ff9mapkit/eb/_membertable.py +38 -0
- ff9mapkit-1.0.0b3/ff9mapkit/eb/_optables.py +537 -0
- ff9mapkit-1.0.0b3/ff9mapkit/eb/_regen_optables.py +76 -0
- ff9mapkit-1.0.0b3/ff9mapkit/eb/cmdasm.py +323 -0
- ff9mapkit-1.0.0b3/ff9mapkit/eb/disasm.py +332 -0
- ff9mapkit-1.0.0b3/ff9mapkit/eb/edit.py +439 -0
- ff9mapkit-1.0.0b3/ff9mapkit/eb/exprasm.py +158 -0
- ff9mapkit-1.0.0b3/ff9mapkit/eb/model.py +178 -0
- ff9mapkit-1.0.0b3/ff9mapkit/eb/opcodes.py +463 -0
- ff9mapkit-1.0.0b3/ff9mapkit/eblint.py +177 -0
- ff9mapkit-1.0.0b3/ff9mapkit/editor/__init__.py +20 -0
- ff9mapkit-1.0.0b3/ff9mapkit/editor/app.py +950 -0
- ff9mapkit-1.0.0b3/ff9mapkit/editor/battle_forms.py +240 -0
- ff9mapkit-1.0.0b3/ff9mapkit/editor/breadcrumb.py +89 -0
- ff9mapkit-1.0.0b3/ff9mapkit/editor/dialogs.py +116 -0
- ff9mapkit-1.0.0b3/ff9mapkit/editor/feedback.py +208 -0
- ff9mapkit-1.0.0b3/ff9mapkit/editor/forms.py +632 -0
- ff9mapkit-1.0.0b3/ff9mapkit/editor/graphview.py +350 -0
- ff9mapkit-1.0.0b3/ff9mapkit/editor/jobs.py +342 -0
- ff9mapkit-1.0.0b3/ff9mapkit/editor/model.py +243 -0
- ff9mapkit-1.0.0b3/ff9mapkit/editor/picker.py +120 -0
- ff9mapkit-1.0.0b3/ff9mapkit/editor/theme.py +212 -0
- ff9mapkit-1.0.0b3/ff9mapkit/eventscan.py +1441 -0
- ff9mapkit-1.0.0b3/ff9mapkit/extract.py +2279 -0
- ff9mapkit-1.0.0b3/ff9mapkit/flags.py +693 -0
- ff9mapkit-1.0.0b3/ff9mapkit/forkreport.py +1383 -0
- ff9mapkit-1.0.0b3/ff9mapkit/hub.py +477 -0
- ff9mapkit-1.0.0b3/ff9mapkit/idgated.py +101 -0
- ff9mapkit-1.0.0b3/ff9mapkit/infohub.py +580 -0
- ff9mapkit-1.0.0b3/ff9mapkit/items.py +63 -0
- ff9mapkit-1.0.0b3/ff9mapkit/itemstats.py +346 -0
- ff9mapkit-1.0.0b3/ff9mapkit/journey.py +1902 -0
- ff9mapkit-1.0.0b3/ff9mapkit/keyitems.py +93 -0
- ff9mapkit-1.0.0b3/ff9mapkit/logic_add.py +632 -0
- ff9mapkit-1.0.0b3/ff9mapkit/logic_edit.py +728 -0
- ff9mapkit-1.0.0b3/ff9mapkit/logic_map.py +526 -0
- ff9mapkit-1.0.0b3/ff9mapkit/pack.py +175 -0
- ff9mapkit-1.0.0b3/ff9mapkit/playerswap.py +231 -0
- ff9mapkit-1.0.0b3/ff9mapkit/prop_archetypes.py +228 -0
- ff9mapkit-1.0.0b3/ff9mapkit/provision.py +282 -0
- ff9mapkit-1.0.0b3/ff9mapkit/refarc.py +825 -0
- ff9mapkit-1.0.0b3/ff9mapkit/save.py +337 -0
- ff9mapkit-1.0.0b3/ff9mapkit/save_items.py +1673 -0
- ff9mapkit-1.0.0b3/ff9mapkit/scene/__init__.py +11 -0
- ff9mapkit-1.0.0b3/ff9mapkit/scene/arena.py +63 -0
- ff9mapkit-1.0.0b3/ff9mapkit/scene/bgart.py +140 -0
- ff9mapkit-1.0.0b3/ff9mapkit/scene/bgi.py +732 -0
- ff9mapkit-1.0.0b3/ff9mapkit/scene/bgs.py +174 -0
- ff9mapkit-1.0.0b3/ff9mapkit/scene/bgx.py +185 -0
- ff9mapkit-1.0.0b3/ff9mapkit/scene/cam.py +345 -0
- ff9mapkit-1.0.0b3/ff9mapkit/scene/guide.py +311 -0
- ff9mapkit-1.0.0b3/ff9mapkit/scene/paint.py +506 -0
- ff9mapkit-1.0.0b3/ff9mapkit/scene/placeholder.py +107 -0
- ff9mapkit-1.0.0b3/ff9mapkit/sjbinary.py +285 -0
- ff9mapkit-1.0.0b3/ff9mapkit/sps/__init__.py +17 -0
- ff9mapkit-1.0.0b3/ff9mapkit/sps/author.py +294 -0
- ff9mapkit-1.0.0b3/ff9mapkit/sps/catalog.py +88 -0
- ff9mapkit-1.0.0b3/ff9mapkit/sps/codec.py +264 -0
- ff9mapkit-1.0.0b3/ff9mapkit/sps/edit.py +184 -0
- ff9mapkit-1.0.0b3/ff9mapkit/sps/lint.py +58 -0
- ff9mapkit-1.0.0b3/ff9mapkit/sps/render.py +116 -0
- ff9mapkit-1.0.0b3/ff9mapkit/sps/templates.py +47 -0
- ff9mapkit-1.0.0b3/ff9mapkit/sps/texture.py +131 -0
- ff9mapkit-1.0.0b3/ff9mapkit/walkmesh_hotfixes.py +163 -0
- ff9mapkit-1.0.0b3/ff9mapkit/workspace/__init__.py +18 -0
- ff9mapkit-1.0.0b3/ff9mapkit/workspace/battledoc.py +985 -0
- ff9mapkit-1.0.0b3/ff9mapkit/workspace/builddoc.py +607 -0
- ff9mapkit-1.0.0b3/ff9mapkit/workspace/forms_qt.py +586 -0
- ff9mapkit-1.0.0b3/ff9mapkit/workspace/importdoc.py +665 -0
- ff9mapkit-1.0.0b3/ff9mapkit/workspace/mapview.py +131 -0
- ff9mapkit-1.0.0b3/ff9mapkit/workspace/palette.py +85 -0
- ff9mapkit-1.0.0b3/ff9mapkit/workspace/savedoc.py +664 -0
- ff9mapkit-1.0.0b3/ff9mapkit/workspace/shell.py +6907 -0
- ff9mapkit-1.0.0b3/ff9mapkit/workspace/style.py +105 -0
- ff9mapkit-1.0.0b3/ff9mapkit/workspace/tuningdialog.py +223 -0
- ff9mapkit-1.0.0b3/ff9mapkit.egg-info/PKG-INFO +155 -0
- ff9mapkit-1.0.0b3/ff9mapkit.egg-info/SOURCES.txt +311 -0
- ff9mapkit-1.0.0b3/ff9mapkit.egg-info/dependency_links.txt +1 -0
- ff9mapkit-1.0.0b3/ff9mapkit.egg-info/entry_points.txt +5 -0
- ff9mapkit-1.0.0b3/ff9mapkit.egg-info/requires.txt +14 -0
- ff9mapkit-1.0.0b3/ff9mapkit.egg-info/top_level.txt +1 -0
- ff9mapkit-1.0.0b3/pyproject.toml +87 -0
- ff9mapkit-1.0.0b3/setup.cfg +4 -0
- ff9mapkit-1.0.0b3/tests/test_abilities.py +69 -0
- ff9mapkit-1.0.0b3/tests/test_abilityfeatures.py +204 -0
- ff9mapkit-1.0.0b3/tests/test_actiondelta.py +239 -0
- ff9mapkit-1.0.0b3/tests/test_ai_phase_insert.py +160 -0
- ff9mapkit-1.0.0b3/tests/test_ai_phase_insert_adversary.py +134 -0
- ff9mapkit-1.0.0b3/tests/test_aiauthor.py +139 -0
- ff9mapkit-1.0.0b3/tests/test_ailint.py +91 -0
- ff9mapkit-1.0.0b3/tests/test_aipatch.py +114 -0
- ff9mapkit-1.0.0b3/tests/test_animations.py +112 -0
- ff9mapkit-1.0.0b3/tests/test_archetypes.py +92 -0
- ff9mapkit-1.0.0b3/tests/test_areatitle.py +82 -0
- ff9mapkit-1.0.0b3/tests/test_arming.py +76 -0
- ff9mapkit-1.0.0b3/tests/test_ate.py +264 -0
- ff9mapkit-1.0.0b3/tests/test_battle.py +791 -0
- ff9mapkit-1.0.0b3/tests/test_battle_bgm.py +163 -0
- ff9mapkit-1.0.0b3/tests/test_battle_forms.py +159 -0
- ff9mapkit-1.0.0b3/tests/test_battle_scene_codec.py +229 -0
- ff9mapkit-1.0.0b3/tests/test_battle_seq.py +357 -0
- ff9mapkit-1.0.0b3/tests/test_battleai.py +115 -0
- ff9mapkit-1.0.0b3/tests/test_battlecsv.py +93 -0
- ff9mapkit-1.0.0b3/tests/test_battlepatch.py +209 -0
- ff9mapkit-1.0.0b3/tests/test_bgart.py +215 -0
- ff9mapkit-1.0.0b3/tests/test_bgs.py +53 -0
- ff9mapkit-1.0.0b3/tests/test_build.py +926 -0
- ff9mapkit-1.0.0b3/tests/test_cameras.py +172 -0
- ff9mapkit-1.0.0b3/tests/test_campaign.py +946 -0
- ff9mapkit-1.0.0b3/tests/test_capstone.py +71 -0
- ff9mapkit-1.0.0b3/tests/test_carry_text_lint.py +103 -0
- ff9mapkit-1.0.0b3/tests/test_catalog.py +215 -0
- ff9mapkit-1.0.0b3/tests/test_chain.py +232 -0
- ff9mapkit-1.0.0b3/tests/test_characterdelta.py +366 -0
- ff9mapkit-1.0.0b3/tests/test_choice.py +200 -0
- ff9mapkit-1.0.0b3/tests/test_cli_entry.py +46 -0
- ff9mapkit-1.0.0b3/tests/test_cmdasm.py +159 -0
- ff9mapkit-1.0.0b3/tests/test_cmdasm_relocate.py +146 -0
- ff9mapkit-1.0.0b3/tests/test_content.py +1074 -0
- ff9mapkit-1.0.0b3/tests/test_deploy_campaign.py +166 -0
- ff9mapkit-1.0.0b3/tests/test_deploystack.py +334 -0
- ff9mapkit-1.0.0b3/tests/test_dialogue.py +340 -0
- ff9mapkit-1.0.0b3/tests/test_eb.py +193 -0
- ff9mapkit-1.0.0b3/tests/test_eblint.py +160 -0
- ff9mapkit-1.0.0b3/tests/test_editor_app.py +25 -0
- ff9mapkit-1.0.0b3/tests/test_editor_breadcrumb.py +48 -0
- ff9mapkit-1.0.0b3/tests/test_editor_feedback.py +71 -0
- ff9mapkit-1.0.0b3/tests/test_editor_forms.py +304 -0
- ff9mapkit-1.0.0b3/tests/test_editor_integration.py +93 -0
- ff9mapkit-1.0.0b3/tests/test_editor_jobs.py +275 -0
- ff9mapkit-1.0.0b3/tests/test_editor_model.py +141 -0
- ff9mapkit-1.0.0b3/tests/test_editor_theme.py +48 -0
- ff9mapkit-1.0.0b3/tests/test_entry_settle.py +64 -0
- ff9mapkit-1.0.0b3/tests/test_eventscan.py +534 -0
- ff9mapkit-1.0.0b3/tests/test_export.py +492 -0
- ff9mapkit-1.0.0b3/tests/test_exprasm.py +187 -0
- ff9mapkit-1.0.0b3/tests/test_extract_area.py +66 -0
- ff9mapkit-1.0.0b3/tests/test_find_field.py +40 -0
- ff9mapkit-1.0.0b3/tests/test_flags.py +310 -0
- ff9mapkit-1.0.0b3/tests/test_forkreport.py +861 -0
- ff9mapkit-1.0.0b3/tests/test_gateway_advance.py +163 -0
- ff9mapkit-1.0.0b3/tests/test_graphview.py +84 -0
- ff9mapkit-1.0.0b3/tests/test_hub_gen.py +319 -0
- ff9mapkit-1.0.0b3/tests/test_idgated.py +61 -0
- ff9mapkit-1.0.0b3/tests/test_import_borrow.py +135 -0
- ff9mapkit-1.0.0b3/tests/test_infohub.py +197 -0
- ff9mapkit-1.0.0b3/tests/test_itemdata.py +739 -0
- ff9mapkit-1.0.0b3/tests/test_items.py +42 -0
- ff9mapkit-1.0.0b3/tests/test_itemstats.py +142 -0
- ff9mapkit-1.0.0b3/tests/test_itemtext.py +279 -0
- ff9mapkit-1.0.0b3/tests/test_journey.py +1380 -0
- ff9mapkit-1.0.0b3/tests/test_journey_merge.py +97 -0
- ff9mapkit-1.0.0b3/tests/test_jump.py +196 -0
- ff9mapkit-1.0.0b3/tests/test_ladder.py +638 -0
- ff9mapkit-1.0.0b3/tests/test_lint.py +292 -0
- ff9mapkit-1.0.0b3/tests/test_logic_add.py +745 -0
- ff9mapkit-1.0.0b3/tests/test_logic_edit.py +743 -0
- ff9mapkit-1.0.0b3/tests/test_logic_map.py +332 -0
- ff9mapkit-1.0.0b3/tests/test_movement.py +247 -0
- ff9mapkit-1.0.0b3/tests/test_npc_model.py +62 -0
- ff9mapkit-1.0.0b3/tests/test_npc_verbatim.py +275 -0
- ff9mapkit-1.0.0b3/tests/test_npcparams.py +74 -0
- ff9mapkit-1.0.0b3/tests/test_object_graft.py +319 -0
- ff9mapkit-1.0.0b3/tests/test_occlusion.py +304 -0
- ff9mapkit-1.0.0b3/tests/test_on_entry.py +321 -0
- ff9mapkit-1.0.0b3/tests/test_pack.py +75 -0
- ff9mapkit-1.0.0b3/tests/test_paint.py +254 -0
- ff9mapkit-1.0.0b3/tests/test_party.py +163 -0
- ff9mapkit-1.0.0b3/tests/test_platform.py +214 -0
- ff9mapkit-1.0.0b3/tests/test_player_graft.py +373 -0
- ff9mapkit-1.0.0b3/tests/test_playerswap.py +175 -0
- ff9mapkit-1.0.0b3/tests/test_prop_archetypes.py +45 -0
- ff9mapkit-1.0.0b3/tests/test_provision.py +52 -0
- ff9mapkit-1.0.0b3/tests/test_refarc.py +518 -0
- ff9mapkit-1.0.0b3/tests/test_repaint_native.py +335 -0
- ff9mapkit-1.0.0b3/tests/test_reskin.py +139 -0
- ff9mapkit-1.0.0b3/tests/test_save.py +228 -0
- ff9mapkit-1.0.0b3/tests/test_save_items.py +1180 -0
- ff9mapkit-1.0.0b3/tests/test_savepoint.py +148 -0
- ff9mapkit-1.0.0b3/tests/test_scene.py +122 -0
- ff9mapkit-1.0.0b3/tests/test_scenelint.py +101 -0
- ff9mapkit-1.0.0b3/tests/test_scroll.py +109 -0
- ff9mapkit-1.0.0b3/tests/test_shared_text_block.py +142 -0
- ff9mapkit-1.0.0b3/tests/test_shop.py +265 -0
- ff9mapkit-1.0.0b3/tests/test_showcase.py +32 -0
- ff9mapkit-1.0.0b3/tests/test_sjbinary.py +214 -0
- ff9mapkit-1.0.0b3/tests/test_spawn.py +115 -0
- ff9mapkit-1.0.0b3/tests/test_sps.py +574 -0
- ff9mapkit-1.0.0b3/tests/test_startstate.py +77 -0
- ff9mapkit-1.0.0b3/tests/test_startup.py +205 -0
- ff9mapkit-1.0.0b3/tests/test_synthesis.py +236 -0
- ff9mapkit-1.0.0b3/tests/test_text.py +121 -0
- ff9mapkit-1.0.0b3/tests/test_textcarry.py +302 -0
- ff9mapkit-1.0.0b3/tests/test_verbatim.py +554 -0
- ff9mapkit-1.0.0b3/tests/test_walkmesh_hotfix.py +140 -0
- ff9mapkit-1.0.0b3/tests/test_workspace_style.py +46 -0
- ff9mapkit-1.0.0b3/tests/test_world_hub.py +135 -0
- ff9mapkit-1.0.0b3/tests/test_yaw_movement.py +60 -0
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 GameJawnsInc
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
The MIT license above covers the ff9mapkit SOURCE CODE only.
|
|
26
|
+
|
|
27
|
+
It does NOT cover, and ff9mapkit does not grant any rights to, FINAL FANTASY IX
|
|
28
|
+
game data. Any FF9-derived bytes (field scripts, walkmeshes, scene/camera data,
|
|
29
|
+
text, art) belong to Square Enix. ff9mapkit reads such data from the user's own
|
|
30
|
+
legally-owned installation; a clean public distribution should not redistribute
|
|
31
|
+
it (see docs/ENGINE.md). Background art you create is your own.
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: ff9mapkit
|
|
3
|
+
Version: 1.0.0b3
|
|
4
|
+
Summary: Author novel custom field maps for Final Fantasy IX (Memoria engine) from a declarative TOML project file.
|
|
5
|
+
Author: GameJawnsInc
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/GameJawnsInc/Dream-World-IX
|
|
8
|
+
Project-URL: Repository, https://github.com/GameJawnsInc/Dream-World-IX
|
|
9
|
+
Project-URL: Issues, https://github.com/GameJawnsInc/Dream-World-IX/issues
|
|
10
|
+
Keywords: final-fantasy-ix,ff9,memoria,modding,field,map
|
|
11
|
+
Classifier: Development Status :: 4 - Beta
|
|
12
|
+
Classifier: Intended Audience :: Developers
|
|
13
|
+
Classifier: Operating System :: OS Independent
|
|
14
|
+
Classifier: Programming Language :: Python :: 3
|
|
15
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
19
|
+
Classifier: Topic :: Games/Entertainment
|
|
20
|
+
Classifier: Topic :: Software Development :: Build Tools
|
|
21
|
+
Requires-Python: >=3.11
|
|
22
|
+
Description-Content-Type: text/markdown
|
|
23
|
+
License-File: LICENSE
|
|
24
|
+
Requires-Dist: Pillow>=9.0
|
|
25
|
+
Provides-Extra: dev
|
|
26
|
+
Requires-Dist: pytest>=7; extra == "dev"
|
|
27
|
+
Requires-Dist: pytest-xdist>=3; extra == "dev"
|
|
28
|
+
Provides-Extra: save
|
|
29
|
+
Requires-Dist: pycryptodome>=3.10; extra == "save"
|
|
30
|
+
Provides-Extra: assets
|
|
31
|
+
Requires-Dist: UnityPy; extra == "assets"
|
|
32
|
+
Provides-Extra: gui
|
|
33
|
+
Requires-Dist: PySide6-Essentials>=6.5; extra == "gui"
|
|
34
|
+
Dynamic: license-file
|
|
35
|
+
|
|
36
|
+
# FF9 Map Kit (`ff9mapkit`)
|
|
37
|
+
|
|
38
|
+
Author **novel custom field maps** for *Final Fantasy IX* (Steam, via the
|
|
39
|
+
[Memoria engine](https://github.com/Albeoris/Memoria)) from a single declarative
|
|
40
|
+
`field.toml`, compiled into a drop-in Memoria mod.
|
|
41
|
+
|
|
42
|
+
> Part of the **[Dream World IX](../README.md)** project — `ff9mapkit` is the toolkit/package name
|
|
43
|
+
> (unchanged), `pip install`ed and imported as `ff9mapkit`.
|
|
44
|
+
|
|
45
|
+
> **Feature-complete and in-game-verified.** The productized form of a proven
|
|
46
|
+
> pipeline for minting brand-new playable FF9 fields, end to end. A **novel** field runs on a
|
|
47
|
+
> **stock, unmodified Memoria install**; a **forked** field needs the small bundled engine patch
|
|
48
|
+
> set for fork fidelity (see [`docs/ENGINE.md`](docs/ENGINE.md)).
|
|
49
|
+
|
|
50
|
+
**Headline capabilities:** author **any camera angle** from scratch (single / scrolling / multi-camera)
|
|
51
|
+
with a pixel-accurate paint guide · **fork any of ~674 real fields** — camera, walkmesh, art, *and* its
|
|
52
|
+
exits/encounters/music · NPCs, dialogue, gateways, encounters, events, story branching, and cutscenes from
|
|
53
|
+
one `field.toml`. Author it in TOML, a **form-based editor**, or a **[Blender add-on](blender/README.md)**.
|
|
54
|
+
|
|
55
|
+
> **Full capability list & command reference → [`docs/FEATURES.md`](docs/FEATURES.md)** (with a before/now
|
|
56
|
+
> comparison) and [`SETUP.md`](../SETUP.md) (the 59-command CLI reference). [`docs/gallery/`](docs/gallery/)
|
|
57
|
+
> collects screenshots/GIFs as they're captured.
|
|
58
|
+
|
|
59
|
+
## What it does
|
|
60
|
+
|
|
61
|
+
Given a `field.toml` describing one field — its camera, painted background layers, walkmesh,
|
|
62
|
+
NPCs, dialogue, gateways, encounter, and music — `ff9mapkit build` emits everything a custom
|
|
63
|
+
field needs:
|
|
64
|
+
|
|
65
|
+
- the background scene (`.bgx` camera + overlay PNGs) and walkmesh (`.bgi`),
|
|
66
|
+
- the field event script (`.eb`) for all seven languages,
|
|
67
|
+
- dialogue text (`.mes`),
|
|
68
|
+
- and the `DictionaryPatch` / `BattlePatch` registration + `ModDescription.xml`.
|
|
69
|
+
|
|
70
|
+
## What stays a human task — the way the originals were made
|
|
71
|
+
|
|
72
|
+
FF9's backgrounds are **pre-rendered**: the original artists built each room as a 3D scene, shot it
|
|
73
|
+
through a fixed camera to bake a 2D plate, and the game projects the live 3D characters back onto that
|
|
74
|
+
plate through the *same* camera. `ff9mapkit` deliberately follows that pipeline instead of hiding it.
|
|
75
|
+
You place the camera; the kit hands you a **pixel-accurate paint guide** — the floor and walls
|
|
76
|
+
projected onto the canvas, the modern stand-in for the layout render the original artists painted over
|
|
77
|
+
— and you paint the background to match. Your hand-modeled `.obj` walkmesh is converted to the
|
|
78
|
+
engine's `.bgi` and projected through that identical camera, so characters stand exactly where the art
|
|
79
|
+
says they should. Painting the art and (optionally) modeling the geometry stay yours; everything in
|
|
80
|
+
between is the kit.
|
|
81
|
+
|
|
82
|
+
## Quickstart
|
|
83
|
+
|
|
84
|
+
```powershell
|
|
85
|
+
pip install -e . # from the ff9mapkit\ package dir
|
|
86
|
+
py -m ff9mapkit doctor # verify it found your FF9 install
|
|
87
|
+
py -m ff9mapkit import <field> --out myroom --verbatim # fork a real field — or `new` for original art
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
> **Full setup → [`SETUP.md`](../SETUP.md)**: extras (`gui`/`save`/`dev`), game-path resolution, the
|
|
91
|
+
> one-time `extract-templates` (the kit ships no game data — see [Provenance](docs/PROVENANCE.md)),
|
|
92
|
+
> `doctor`, the dev loop, and a guided first-field walkthrough.
|
|
93
|
+
|
|
94
|
+
**Prefer not to touch TOML?** Author the *logic* (dialogue, events, story flags, encounters, music,
|
|
95
|
+
cutscenes) in the form-based editor — `ff9mapkit edit <field.toml>`. The visual side has a front-end too:
|
|
96
|
+
the [**Blender add-on**](blender/README.md) poses the camera, models the walkmesh, places markers, and
|
|
97
|
+
writes a `scene.toml`. So the suite splits cleanly — **Blender = where things are, the editor = what they
|
|
98
|
+
do** — and `build` compiles both. There's also a one-window [PySide6 Workspace GUI](../SETUP.md#6-the-gui-workspace-optional).
|
|
99
|
+
|
|
100
|
+
## Commands
|
|
101
|
+
|
|
102
|
+
59 subcommands — run `ff9mapkit -h` (or `py -m ff9mapkit -h`) for the full list. A taste of the families:
|
|
103
|
+
|
|
104
|
+
- **Author** — `new` (scaffold) · `guide` (paint guide for your camera) · `walkmesh` · `edit` (form editor)
|
|
105
|
+
- **Build & ship** — `build` · `lint` · `pack` · `export-art`
|
|
106
|
+
- **Fork a real field** — `import` (`--editable`/`--native`/`--verbatim`) · `import-chain` · `fork-report`
|
|
107
|
+
- **Campaigns & journeys** — `new-campaign` / `build-all` · `gen-hub` / `assemble-journey`
|
|
108
|
+
- **Battle maps & tuning** — `battle-import` / `battle-build` · `battle-scene` / `battle-ai`
|
|
109
|
+
- **Dialogue, catalogs & saves** — `dialogue` · `catalog` / `models` / `archetypes` · `flags-inspect` · `items-inspect`
|
|
110
|
+
|
|
111
|
+
> **The full grouped command reference (all 59, with flags) is in [`SETUP.md` §7](../SETUP.md#7-cli-command-reference).**
|
|
112
|
+
|
|
113
|
+
## Docs
|
|
114
|
+
|
|
115
|
+
- [`SETUP.md`](../SETUP.md) — **start here:** install, configure, the dev loop, and your first field (setup + quickstart).
|
|
116
|
+
- [`docs/TUTORIAL.md`](docs/TUTORIAL.md) — the focused ~10-minute first-field walkthrough.
|
|
117
|
+
- [`docs/FEATURES.md`](docs/FEATURES.md) — **the full capability list** (+ before/now comparison).
|
|
118
|
+
- [`docs/gallery/`](docs/gallery/) — collects screenshots/GIFs as they're captured.
|
|
119
|
+
- [`docs/FORMAT.md`](docs/FORMAT.md) — the `field.toml` schema.
|
|
120
|
+
- [`docs/PIPELINE.md`](docs/PIPELINE.md) — the full authoring workflow.
|
|
121
|
+
- [`docs/ENGINE.md`](docs/ENGINE.md) — engine requirements (stock Memoria) + provenance notes.
|
|
122
|
+
- [`docs/PROVENANCE.md`](docs/PROVENANCE.md) — **the kit ships no game data**: how the base assets are
|
|
123
|
+
regenerated from your own FF9 install (`extract-templates`), and why that's legally clean.
|
|
124
|
+
- [`docs/TECHNICAL.md`](docs/TECHNICAL.md) — the hard problems solved (camera math, `.eb` format, import).
|
|
125
|
+
- [`docs/GLOSSARY.md`](docs/GLOSSARY.md) — terms used across the docs (walkmesh, gateway, fork, GLOB flag…).
|
|
126
|
+
- [`docs/TROUBLESHOOTING.md`](docs/TROUBLESHOOTING.md) — common first-run failures → fixes.
|
|
127
|
+
- [`docs/KNOWN_ISSUES.md`](docs/KNOWN_ISSUES.md) — beta limitations + the Workspace GUI gaps.
|
|
128
|
+
- [`examples/vivi-hut/`](examples/vivi-hut) — a complete worked example.
|
|
129
|
+
- [`blender/`](blender/README.md) — the **Blender add-on**: visually author the camera + walkmesh,
|
|
130
|
+
then export a `field.toml` for `build` (Blender 4.2+/5.x).
|
|
131
|
+
|
|
132
|
+
## How it's built / trusted
|
|
133
|
+
|
|
134
|
+
The library is split into `eb` (the event-script codec + content injectors), `scene`
|
|
135
|
+
(camera math, `.bgx`, `.bgi` walkmesh, paint guides), `build` (the `field.toml` compiler),
|
|
136
|
+
and `pack`. Correctness is proven by an **offline golden-master test suite**: every codec
|
|
137
|
+
round-trips your install's field assets byte-for-byte (regenerated locally via `extract-templates`
|
|
138
|
+
— the kit ships none), and compiling the example reproduces an in-game-verified field's script exactly.
|
|
139
|
+
|
|
140
|
+
```bash
|
|
141
|
+
pip install -e ".[dev]" && pytest # the full suite
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
## About
|
|
145
|
+
|
|
146
|
+
I make games — including an FFIX-inspired RPG of my own — so this started as the tool I wanted while
|
|
147
|
+
learning how FF9's fields actually work, not a drive-by experiment. The aim was to build a new room
|
|
148
|
+
the way the game's creators did: paint a background against a 3D-derived guide, then walk on geometry
|
|
149
|
+
projected through the same camera — so authoring a field feels like level design rather than blind
|
|
150
|
+
byte-hacking. Months of reverse-engineering the field format, the projection math, and the event
|
|
151
|
+
bytecode went into making that the easy path. If you're poking at FF9's internals too, I hope it
|
|
152
|
+
saves you the same dig.
|
|
153
|
+
|
|
154
|
+
Built on (and grateful for) the [Memoria engine](https://github.com/Albeoris/Memoria) — none of this
|
|
155
|
+
is possible without it.
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
# FF9 Map Kit (`ff9mapkit`)
|
|
2
|
+
|
|
3
|
+
Author **novel custom field maps** for *Final Fantasy IX* (Steam, via the
|
|
4
|
+
[Memoria engine](https://github.com/Albeoris/Memoria)) from a single declarative
|
|
5
|
+
`field.toml`, compiled into a drop-in Memoria mod.
|
|
6
|
+
|
|
7
|
+
> Part of the **[Dream World IX](../README.md)** project — `ff9mapkit` is the toolkit/package name
|
|
8
|
+
> (unchanged), `pip install`ed and imported as `ff9mapkit`.
|
|
9
|
+
|
|
10
|
+
> **Feature-complete and in-game-verified.** The productized form of a proven
|
|
11
|
+
> pipeline for minting brand-new playable FF9 fields, end to end. A **novel** field runs on a
|
|
12
|
+
> **stock, unmodified Memoria install**; a **forked** field needs the small bundled engine patch
|
|
13
|
+
> set for fork fidelity (see [`docs/ENGINE.md`](docs/ENGINE.md)).
|
|
14
|
+
|
|
15
|
+
**Headline capabilities:** author **any camera angle** from scratch (single / scrolling / multi-camera)
|
|
16
|
+
with a pixel-accurate paint guide · **fork any of ~674 real fields** — camera, walkmesh, art, *and* its
|
|
17
|
+
exits/encounters/music · NPCs, dialogue, gateways, encounters, events, story branching, and cutscenes from
|
|
18
|
+
one `field.toml`. Author it in TOML, a **form-based editor**, or a **[Blender add-on](blender/README.md)**.
|
|
19
|
+
|
|
20
|
+
> **Full capability list & command reference → [`docs/FEATURES.md`](docs/FEATURES.md)** (with a before/now
|
|
21
|
+
> comparison) and [`SETUP.md`](../SETUP.md) (the 59-command CLI reference). [`docs/gallery/`](docs/gallery/)
|
|
22
|
+
> collects screenshots/GIFs as they're captured.
|
|
23
|
+
|
|
24
|
+
## What it does
|
|
25
|
+
|
|
26
|
+
Given a `field.toml` describing one field — its camera, painted background layers, walkmesh,
|
|
27
|
+
NPCs, dialogue, gateways, encounter, and music — `ff9mapkit build` emits everything a custom
|
|
28
|
+
field needs:
|
|
29
|
+
|
|
30
|
+
- the background scene (`.bgx` camera + overlay PNGs) and walkmesh (`.bgi`),
|
|
31
|
+
- the field event script (`.eb`) for all seven languages,
|
|
32
|
+
- dialogue text (`.mes`),
|
|
33
|
+
- and the `DictionaryPatch` / `BattlePatch` registration + `ModDescription.xml`.
|
|
34
|
+
|
|
35
|
+
## What stays a human task — the way the originals were made
|
|
36
|
+
|
|
37
|
+
FF9's backgrounds are **pre-rendered**: the original artists built each room as a 3D scene, shot it
|
|
38
|
+
through a fixed camera to bake a 2D plate, and the game projects the live 3D characters back onto that
|
|
39
|
+
plate through the *same* camera. `ff9mapkit` deliberately follows that pipeline instead of hiding it.
|
|
40
|
+
You place the camera; the kit hands you a **pixel-accurate paint guide** — the floor and walls
|
|
41
|
+
projected onto the canvas, the modern stand-in for the layout render the original artists painted over
|
|
42
|
+
— and you paint the background to match. Your hand-modeled `.obj` walkmesh is converted to the
|
|
43
|
+
engine's `.bgi` and projected through that identical camera, so characters stand exactly where the art
|
|
44
|
+
says they should. Painting the art and (optionally) modeling the geometry stay yours; everything in
|
|
45
|
+
between is the kit.
|
|
46
|
+
|
|
47
|
+
## Quickstart
|
|
48
|
+
|
|
49
|
+
```powershell
|
|
50
|
+
pip install -e . # from the ff9mapkit\ package dir
|
|
51
|
+
py -m ff9mapkit doctor # verify it found your FF9 install
|
|
52
|
+
py -m ff9mapkit import <field> --out myroom --verbatim # fork a real field — or `new` for original art
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
> **Full setup → [`SETUP.md`](../SETUP.md)**: extras (`gui`/`save`/`dev`), game-path resolution, the
|
|
56
|
+
> one-time `extract-templates` (the kit ships no game data — see [Provenance](docs/PROVENANCE.md)),
|
|
57
|
+
> `doctor`, the dev loop, and a guided first-field walkthrough.
|
|
58
|
+
|
|
59
|
+
**Prefer not to touch TOML?** Author the *logic* (dialogue, events, story flags, encounters, music,
|
|
60
|
+
cutscenes) in the form-based editor — `ff9mapkit edit <field.toml>`. The visual side has a front-end too:
|
|
61
|
+
the [**Blender add-on**](blender/README.md) poses the camera, models the walkmesh, places markers, and
|
|
62
|
+
writes a `scene.toml`. So the suite splits cleanly — **Blender = where things are, the editor = what they
|
|
63
|
+
do** — and `build` compiles both. There's also a one-window [PySide6 Workspace GUI](../SETUP.md#6-the-gui-workspace-optional).
|
|
64
|
+
|
|
65
|
+
## Commands
|
|
66
|
+
|
|
67
|
+
59 subcommands — run `ff9mapkit -h` (or `py -m ff9mapkit -h`) for the full list. A taste of the families:
|
|
68
|
+
|
|
69
|
+
- **Author** — `new` (scaffold) · `guide` (paint guide for your camera) · `walkmesh` · `edit` (form editor)
|
|
70
|
+
- **Build & ship** — `build` · `lint` · `pack` · `export-art`
|
|
71
|
+
- **Fork a real field** — `import` (`--editable`/`--native`/`--verbatim`) · `import-chain` · `fork-report`
|
|
72
|
+
- **Campaigns & journeys** — `new-campaign` / `build-all` · `gen-hub` / `assemble-journey`
|
|
73
|
+
- **Battle maps & tuning** — `battle-import` / `battle-build` · `battle-scene` / `battle-ai`
|
|
74
|
+
- **Dialogue, catalogs & saves** — `dialogue` · `catalog` / `models` / `archetypes` · `flags-inspect` · `items-inspect`
|
|
75
|
+
|
|
76
|
+
> **The full grouped command reference (all 59, with flags) is in [`SETUP.md` §7](../SETUP.md#7-cli-command-reference).**
|
|
77
|
+
|
|
78
|
+
## Docs
|
|
79
|
+
|
|
80
|
+
- [`SETUP.md`](../SETUP.md) — **start here:** install, configure, the dev loop, and your first field (setup + quickstart).
|
|
81
|
+
- [`docs/TUTORIAL.md`](docs/TUTORIAL.md) — the focused ~10-minute first-field walkthrough.
|
|
82
|
+
- [`docs/FEATURES.md`](docs/FEATURES.md) — **the full capability list** (+ before/now comparison).
|
|
83
|
+
- [`docs/gallery/`](docs/gallery/) — collects screenshots/GIFs as they're captured.
|
|
84
|
+
- [`docs/FORMAT.md`](docs/FORMAT.md) — the `field.toml` schema.
|
|
85
|
+
- [`docs/PIPELINE.md`](docs/PIPELINE.md) — the full authoring workflow.
|
|
86
|
+
- [`docs/ENGINE.md`](docs/ENGINE.md) — engine requirements (stock Memoria) + provenance notes.
|
|
87
|
+
- [`docs/PROVENANCE.md`](docs/PROVENANCE.md) — **the kit ships no game data**: how the base assets are
|
|
88
|
+
regenerated from your own FF9 install (`extract-templates`), and why that's legally clean.
|
|
89
|
+
- [`docs/TECHNICAL.md`](docs/TECHNICAL.md) — the hard problems solved (camera math, `.eb` format, import).
|
|
90
|
+
- [`docs/GLOSSARY.md`](docs/GLOSSARY.md) — terms used across the docs (walkmesh, gateway, fork, GLOB flag…).
|
|
91
|
+
- [`docs/TROUBLESHOOTING.md`](docs/TROUBLESHOOTING.md) — common first-run failures → fixes.
|
|
92
|
+
- [`docs/KNOWN_ISSUES.md`](docs/KNOWN_ISSUES.md) — beta limitations + the Workspace GUI gaps.
|
|
93
|
+
- [`examples/vivi-hut/`](examples/vivi-hut) — a complete worked example.
|
|
94
|
+
- [`blender/`](blender/README.md) — the **Blender add-on**: visually author the camera + walkmesh,
|
|
95
|
+
then export a `field.toml` for `build` (Blender 4.2+/5.x).
|
|
96
|
+
|
|
97
|
+
## How it's built / trusted
|
|
98
|
+
|
|
99
|
+
The library is split into `eb` (the event-script codec + content injectors), `scene`
|
|
100
|
+
(camera math, `.bgx`, `.bgi` walkmesh, paint guides), `build` (the `field.toml` compiler),
|
|
101
|
+
and `pack`. Correctness is proven by an **offline golden-master test suite**: every codec
|
|
102
|
+
round-trips your install's field assets byte-for-byte (regenerated locally via `extract-templates`
|
|
103
|
+
— the kit ships none), and compiling the example reproduces an in-game-verified field's script exactly.
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
pip install -e ".[dev]" && pytest # the full suite
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## About
|
|
110
|
+
|
|
111
|
+
I make games — including an FFIX-inspired RPG of my own — so this started as the tool I wanted while
|
|
112
|
+
learning how FF9's fields actually work, not a drive-by experiment. The aim was to build a new room
|
|
113
|
+
the way the game's creators did: paint a background against a 3D-derived guide, then walk on geometry
|
|
114
|
+
projected through the same camera — so authoring a field feels like level design rather than blind
|
|
115
|
+
byte-hacking. Months of reverse-engineering the field format, the projection math, and the event
|
|
116
|
+
bytecode went into making that the easy path. If you're poking at FF9's internals too, I hope it
|
|
117
|
+
saves you the same dig.
|
|
118
|
+
|
|
119
|
+
Built on (and grateful for) the [Memoria engine](https://github.com/Albeoris/Memoria) — none of this
|
|
120
|
+
is possible without it.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"""ff9mapkit — author novel custom field maps for Final Fantasy IX (Memoria engine).
|
|
2
|
+
|
|
3
|
+
The kit compiles a declarative per-field TOML project into a drop-in Memoria mod:
|
|
4
|
+
field background scene (.bgx + overlay PNGs), walkmesh (.bgi), event script (.eb, all
|
|
5
|
+
languages), dialogue text (.mes), and the DictionaryPatch / BattlePatch registration —
|
|
6
|
+
everything a custom field needs at runtime on a *stock* (unmodified) Memoria install.
|
|
7
|
+
|
|
8
|
+
Public surface is organized as:
|
|
9
|
+
ff9mapkit.config — game/mod path resolution + the FF9 mod folder layout
|
|
10
|
+
ff9mapkit.binutils — little-endian struct helpers shared by the binary codecs
|
|
11
|
+
ff9mapkit.eb — the field event-script (.eb) library (model / edit / disasm / opcodes)
|
|
12
|
+
ff9mapkit.scene — camera math, .bgx scene, .bgi walkmesh, paint guides
|
|
13
|
+
ff9mapkit.content — generalized script-content injectors (npc/gateway/encounter/...)
|
|
14
|
+
ff9mapkit.build — the field.toml -> mod-folder builder
|
|
15
|
+
ff9mapkit.battle — the battle.toml -> custom battle-background (BBG) builder (fork/edit/build a 3D battle map)
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
__version__ = "1.0.0b3" # keep in lockstep with [project] version in pyproject.toml
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"""Enable ``python -m ff9mapkit ...`` (identical to the ``ff9mapkit`` console command).
|
|
2
|
+
|
|
3
|
+
Handy when the package isn't pip-installed on PATH -- run it from the repo:
|
|
4
|
+
py -m ff9mapkit build my_room.field.toml --out dist
|
|
5
|
+
|
|
6
|
+
Robustness: running ``python -m ff9mapkit`` from a directory whose child folder is ALSO named
|
|
7
|
+
``ff9mapkit`` (e.g. the repo *parent* that contains the ``ff9mapkit/`` project) makes Python pick
|
|
8
|
+
up that folder as an empty PEP-420 namespace package, shadowing the real install -- so
|
|
9
|
+
``from . import __version__`` blows up with "cannot import name ... (unknown location)". This file
|
|
10
|
+
lives at the real package's true path, so we detect the shadow and repoint the import there.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
import sys
|
|
14
|
+
from pathlib import Path
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def _ensure_real_package() -> None:
|
|
18
|
+
"""If ``ff9mapkit`` resolved to a namespace shadow (a folder with no __init__), repoint it at the
|
|
19
|
+
real package -- the directory holding THIS file -- so the absolute import below loads code."""
|
|
20
|
+
pkg = sys.modules.get("ff9mapkit")
|
|
21
|
+
if pkg is not None and getattr(pkg, "__file__", None) is not None:
|
|
22
|
+
return # already the real, importable package -- nothing to do
|
|
23
|
+
real_parent = str(Path(__file__).resolve().parent.parent) # dir that CONTAINS the real ff9mapkit/
|
|
24
|
+
sys.path.insert(0, real_parent)
|
|
25
|
+
for name in [m for m in sys.modules if m == "ff9mapkit" or m.startswith("ff9mapkit.")]:
|
|
26
|
+
if name != __name__: # keep this running module
|
|
27
|
+
del sys.modules[name]
|
|
28
|
+
import importlib
|
|
29
|
+
importlib.invalidate_caches()
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
_ensure_real_package()
|
|
33
|
+
from ff9mapkit.cli import main # noqa: E402 (must follow the sys.path repair above)
|
|
34
|
+
|
|
35
|
+
if __name__ == "__main__":
|
|
36
|
+
sys.exit(main())
|