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.
Files changed (313) hide show
  1. ff9mapkit-1.0.0b3/LICENSE +31 -0
  2. ff9mapkit-1.0.0b3/PKG-INFO +155 -0
  3. ff9mapkit-1.0.0b3/README.md +120 -0
  4. ff9mapkit-1.0.0b3/ff9mapkit/__init__.py +18 -0
  5. ff9mapkit-1.0.0b3/ff9mapkit/__main__.py +36 -0
  6. ff9mapkit-1.0.0b3/ff9mapkit/_animdb.py +2994 -0
  7. ff9mapkit-1.0.0b3/ff9mapkit/_animdb_all.py +14125 -0
  8. ff9mapkit-1.0.0b3/ff9mapkit/_fieldtable.py +1516 -0
  9. ff9mapkit-1.0.0b3/ff9mapkit/_fieldtext.py +845 -0
  10. ff9mapkit-1.0.0b3/ff9mapkit/_held_poses.py +44 -0
  11. ff9mapkit-1.0.0b3/ff9mapkit/_itemdb.py +65 -0
  12. ff9mapkit-1.0.0b3/ff9mapkit/_modeldb.py +725 -0
  13. ff9mapkit-1.0.0b3/ff9mapkit/_narrowmap_data.py +10 -0
  14. ff9mapkit-1.0.0b3/ff9mapkit/_npcparams.py +634 -0
  15. ff9mapkit-1.0.0b3/ff9mapkit/_regen_animdb.py +72 -0
  16. ff9mapkit-1.0.0b3/ff9mapkit/_regen_animdb_all.py +66 -0
  17. ff9mapkit-1.0.0b3/ff9mapkit/_regen_fieldtable.py +95 -0
  18. ff9mapkit-1.0.0b3/ff9mapkit/_regen_fieldtext.py +66 -0
  19. ff9mapkit-1.0.0b3/ff9mapkit/_regen_modeldb.py +67 -0
  20. ff9mapkit-1.0.0b3/ff9mapkit/_regen_npcparams.py +123 -0
  21. ff9mapkit-1.0.0b3/ff9mapkit/_regen_scenedb.py +57 -0
  22. ff9mapkit-1.0.0b3/ff9mapkit/_scenedb.py +869 -0
  23. ff9mapkit-1.0.0b3/ff9mapkit/abilities.py +225 -0
  24. ff9mapkit-1.0.0b3/ff9mapkit/animations.py +120 -0
  25. ff9mapkit-1.0.0b3/ff9mapkit/archetypes.py +218 -0
  26. ff9mapkit-1.0.0b3/ff9mapkit/areatitle.py +76 -0
  27. ff9mapkit-1.0.0b3/ff9mapkit/battle/__init__.py +21 -0
  28. ff9mapkit-1.0.0b3/ff9mapkit/battle/abilityfeatures.py +294 -0
  29. ff9mapkit-1.0.0b3/ff9mapkit/battle/actiondelta.py +441 -0
  30. ff9mapkit-1.0.0b3/ff9mapkit/battle/aiauthor.py +305 -0
  31. ff9mapkit-1.0.0b3/ff9mapkit/battle/ailint.py +140 -0
  32. ff9mapkit-1.0.0b3/ff9mapkit/battle/aipatch.py +175 -0
  33. ff9mapkit-1.0.0b3/ff9mapkit/battle/battleai.py +148 -0
  34. ff9mapkit-1.0.0b3/ff9mapkit/battle/battlecsv.py +390 -0
  35. ff9mapkit-1.0.0b3/ff9mapkit/battle/battlepatch.py +395 -0
  36. ff9mapkit-1.0.0b3/ff9mapkit/battle/build.py +558 -0
  37. ff9mapkit-1.0.0b3/ff9mapkit/battle/camera_codec.py +332 -0
  38. ff9mapkit-1.0.0b3/ff9mapkit/battle/camera_data.py +128 -0
  39. ff9mapkit-1.0.0b3/ff9mapkit/battle/characterdelta.py +789 -0
  40. ff9mapkit-1.0.0b3/ff9mapkit/battle/event_data.py +72 -0
  41. ff9mapkit-1.0.0b3/ff9mapkit/battle/extract.py +540 -0
  42. ff9mapkit-1.0.0b3/ff9mapkit/battle/fbx.py +223 -0
  43. ff9mapkit-1.0.0b3/ff9mapkit/battle/reskin.py +149 -0
  44. ff9mapkit-1.0.0b3/ff9mapkit/battle/scene_codec.py +314 -0
  45. ff9mapkit-1.0.0b3/ff9mapkit/battle/scene_data.py +369 -0
  46. ff9mapkit-1.0.0b3/ff9mapkit/battle/scenelint.py +125 -0
  47. ff9mapkit-1.0.0b3/ff9mapkit/battle/seqasm.py +131 -0
  48. ff9mapkit-1.0.0b3/ff9mapkit/battle/seqauthor.py +220 -0
  49. ff9mapkit-1.0.0b3/ff9mapkit/battle/seqcodec.py +300 -0
  50. ff9mapkit-1.0.0b3/ff9mapkit/battle/seqdis.py +106 -0
  51. ff9mapkit-1.0.0b3/ff9mapkit/battle/seqpatch.py +137 -0
  52. ff9mapkit-1.0.0b3/ff9mapkit/battle_bgm.py +133 -0
  53. ff9mapkit-1.0.0b3/ff9mapkit/binutils.py +60 -0
  54. ff9mapkit-1.0.0b3/ff9mapkit/build.py +5445 -0
  55. ff9mapkit-1.0.0b3/ff9mapkit/campaign.py +1276 -0
  56. ff9mapkit-1.0.0b3/ff9mapkit/catalog.py +316 -0
  57. ff9mapkit-1.0.0b3/ff9mapkit/chain.py +358 -0
  58. ff9mapkit-1.0.0b3/ff9mapkit/cli.py +3114 -0
  59. ff9mapkit-1.0.0b3/ff9mapkit/config.py +360 -0
  60. ff9mapkit-1.0.0b3/ff9mapkit/content/__init__.py +13 -0
  61. ff9mapkit-1.0.0b3/ff9mapkit/content/areatitle.py +36 -0
  62. ff9mapkit-1.0.0b3/ff9mapkit/content/ate.py +118 -0
  63. ff9mapkit-1.0.0b3/ff9mapkit/content/camera.py +123 -0
  64. ff9mapkit-1.0.0b3/ff9mapkit/content/chest.py +186 -0
  65. ff9mapkit-1.0.0b3/ff9mapkit/content/choice.py +163 -0
  66. ff9mapkit-1.0.0b3/ff9mapkit/content/conductor.py +217 -0
  67. ff9mapkit-1.0.0b3/ff9mapkit/content/cutscene.py +290 -0
  68. ff9mapkit-1.0.0b3/ff9mapkit/content/encounter.py +41 -0
  69. ff9mapkit-1.0.0b3/ff9mapkit/content/entry_settle.py +50 -0
  70. ff9mapkit-1.0.0b3/ff9mapkit/content/equipment.py +93 -0
  71. ff9mapkit-1.0.0b3/ff9mapkit/content/event.py +191 -0
  72. ff9mapkit-1.0.0b3/ff9mapkit/content/gateway.py +101 -0
  73. ff9mapkit-1.0.0b3/ff9mapkit/content/inventory.py +59 -0
  74. ff9mapkit-1.0.0b3/ff9mapkit/content/itemdata.py +644 -0
  75. ff9mapkit-1.0.0b3/ff9mapkit/content/itemtext.py +168 -0
  76. ff9mapkit-1.0.0b3/ff9mapkit/content/jump.py +114 -0
  77. ff9mapkit-1.0.0b3/ff9mapkit/content/ladder.py +633 -0
  78. ff9mapkit-1.0.0b3/ff9mapkit/content/movement.py +53 -0
  79. ff9mapkit-1.0.0b3/ff9mapkit/content/music.py +97 -0
  80. ff9mapkit-1.0.0b3/ff9mapkit/content/npc.py +348 -0
  81. ff9mapkit-1.0.0b3/ff9mapkit/content/object.py +340 -0
  82. ff9mapkit-1.0.0b3/ff9mapkit/content/onentry.py +135 -0
  83. ff9mapkit-1.0.0b3/ff9mapkit/content/party.py +111 -0
  84. ff9mapkit-1.0.0b3/ff9mapkit/content/pathfind.py +138 -0
  85. ff9mapkit-1.0.0b3/ff9mapkit/content/platform.py +314 -0
  86. ff9mapkit-1.0.0b3/ff9mapkit/content/player.py +168 -0
  87. ff9mapkit-1.0.0b3/ff9mapkit/content/prop.py +75 -0
  88. ff9mapkit-1.0.0b3/ff9mapkit/content/region.py +340 -0
  89. ff9mapkit-1.0.0b3/ff9mapkit/content/reinit.py +59 -0
  90. ff9mapkit-1.0.0b3/ff9mapkit/content/savepoint.py +90 -0
  91. ff9mapkit-1.0.0b3/ff9mapkit/content/shop.py +178 -0
  92. ff9mapkit-1.0.0b3/ff9mapkit/content/sps_trigger.py +66 -0
  93. ff9mapkit-1.0.0b3/ff9mapkit/content/startup.py +71 -0
  94. ff9mapkit-1.0.0b3/ff9mapkit/content/synthesis.py +106 -0
  95. ff9mapkit-1.0.0b3/ff9mapkit/content/text.py +183 -0
  96. ff9mapkit-1.0.0b3/ff9mapkit/content/textcarry.py +290 -0
  97. ff9mapkit-1.0.0b3/ff9mapkit/content/verbatim.py +86 -0
  98. ff9mapkit-1.0.0b3/ff9mapkit/content/walkmesh_hotfix.py +38 -0
  99. ff9mapkit-1.0.0b3/ff9mapkit/data/__init__.py +48 -0
  100. ff9mapkit-1.0.0b3/ff9mapkit/data/_regen_provenance.py +142 -0
  101. ff9mapkit-1.0.0b3/ff9mapkit/data/provenance/blank.es.patch +1 -0
  102. ff9mapkit-1.0.0b3/ff9mapkit/data/provenance/blank.fr.patch +1 -0
  103. ff9mapkit-1.0.0b3/ff9mapkit/data/provenance/blank.gr.patch +1 -0
  104. ff9mapkit-1.0.0b3/ff9mapkit/data/provenance/blank.it.patch +1 -0
  105. ff9mapkit-1.0.0b3/ff9mapkit/data/provenance/blank.jp.patch +1 -0
  106. ff9mapkit-1.0.0b3/ff9mapkit/data/provenance/blank.uk.patch +1 -0
  107. ff9mapkit-1.0.0b3/ff9mapkit/data/provenance/blank.us.patch +1 -0
  108. ff9mapkit-1.0.0b3/ff9mapkit/data/provenance/manifest.json +65 -0
  109. ff9mapkit-1.0.0b3/ff9mapkit/data/provenance/region_template.patch +1 -0
  110. ff9mapkit-1.0.0b3/ff9mapkit/data/reference_arcs.toml +89 -0
  111. ff9mapkit-1.0.0b3/ff9mapkit/data/region_catalog.toml +593 -0
  112. ff9mapkit-1.0.0b3/ff9mapkit/deploystack.py +358 -0
  113. ff9mapkit-1.0.0b3/ff9mapkit/dialogue.py +803 -0
  114. ff9mapkit-1.0.0b3/ff9mapkit/eb/__init__.py +12 -0
  115. ff9mapkit-1.0.0b3/ff9mapkit/eb/_exprtable.py +59 -0
  116. ff9mapkit-1.0.0b3/ff9mapkit/eb/_membertable.py +38 -0
  117. ff9mapkit-1.0.0b3/ff9mapkit/eb/_optables.py +537 -0
  118. ff9mapkit-1.0.0b3/ff9mapkit/eb/_regen_optables.py +76 -0
  119. ff9mapkit-1.0.0b3/ff9mapkit/eb/cmdasm.py +323 -0
  120. ff9mapkit-1.0.0b3/ff9mapkit/eb/disasm.py +332 -0
  121. ff9mapkit-1.0.0b3/ff9mapkit/eb/edit.py +439 -0
  122. ff9mapkit-1.0.0b3/ff9mapkit/eb/exprasm.py +158 -0
  123. ff9mapkit-1.0.0b3/ff9mapkit/eb/model.py +178 -0
  124. ff9mapkit-1.0.0b3/ff9mapkit/eb/opcodes.py +463 -0
  125. ff9mapkit-1.0.0b3/ff9mapkit/eblint.py +177 -0
  126. ff9mapkit-1.0.0b3/ff9mapkit/editor/__init__.py +20 -0
  127. ff9mapkit-1.0.0b3/ff9mapkit/editor/app.py +950 -0
  128. ff9mapkit-1.0.0b3/ff9mapkit/editor/battle_forms.py +240 -0
  129. ff9mapkit-1.0.0b3/ff9mapkit/editor/breadcrumb.py +89 -0
  130. ff9mapkit-1.0.0b3/ff9mapkit/editor/dialogs.py +116 -0
  131. ff9mapkit-1.0.0b3/ff9mapkit/editor/feedback.py +208 -0
  132. ff9mapkit-1.0.0b3/ff9mapkit/editor/forms.py +632 -0
  133. ff9mapkit-1.0.0b3/ff9mapkit/editor/graphview.py +350 -0
  134. ff9mapkit-1.0.0b3/ff9mapkit/editor/jobs.py +342 -0
  135. ff9mapkit-1.0.0b3/ff9mapkit/editor/model.py +243 -0
  136. ff9mapkit-1.0.0b3/ff9mapkit/editor/picker.py +120 -0
  137. ff9mapkit-1.0.0b3/ff9mapkit/editor/theme.py +212 -0
  138. ff9mapkit-1.0.0b3/ff9mapkit/eventscan.py +1441 -0
  139. ff9mapkit-1.0.0b3/ff9mapkit/extract.py +2279 -0
  140. ff9mapkit-1.0.0b3/ff9mapkit/flags.py +693 -0
  141. ff9mapkit-1.0.0b3/ff9mapkit/forkreport.py +1383 -0
  142. ff9mapkit-1.0.0b3/ff9mapkit/hub.py +477 -0
  143. ff9mapkit-1.0.0b3/ff9mapkit/idgated.py +101 -0
  144. ff9mapkit-1.0.0b3/ff9mapkit/infohub.py +580 -0
  145. ff9mapkit-1.0.0b3/ff9mapkit/items.py +63 -0
  146. ff9mapkit-1.0.0b3/ff9mapkit/itemstats.py +346 -0
  147. ff9mapkit-1.0.0b3/ff9mapkit/journey.py +1902 -0
  148. ff9mapkit-1.0.0b3/ff9mapkit/keyitems.py +93 -0
  149. ff9mapkit-1.0.0b3/ff9mapkit/logic_add.py +632 -0
  150. ff9mapkit-1.0.0b3/ff9mapkit/logic_edit.py +728 -0
  151. ff9mapkit-1.0.0b3/ff9mapkit/logic_map.py +526 -0
  152. ff9mapkit-1.0.0b3/ff9mapkit/pack.py +175 -0
  153. ff9mapkit-1.0.0b3/ff9mapkit/playerswap.py +231 -0
  154. ff9mapkit-1.0.0b3/ff9mapkit/prop_archetypes.py +228 -0
  155. ff9mapkit-1.0.0b3/ff9mapkit/provision.py +282 -0
  156. ff9mapkit-1.0.0b3/ff9mapkit/refarc.py +825 -0
  157. ff9mapkit-1.0.0b3/ff9mapkit/save.py +337 -0
  158. ff9mapkit-1.0.0b3/ff9mapkit/save_items.py +1673 -0
  159. ff9mapkit-1.0.0b3/ff9mapkit/scene/__init__.py +11 -0
  160. ff9mapkit-1.0.0b3/ff9mapkit/scene/arena.py +63 -0
  161. ff9mapkit-1.0.0b3/ff9mapkit/scene/bgart.py +140 -0
  162. ff9mapkit-1.0.0b3/ff9mapkit/scene/bgi.py +732 -0
  163. ff9mapkit-1.0.0b3/ff9mapkit/scene/bgs.py +174 -0
  164. ff9mapkit-1.0.0b3/ff9mapkit/scene/bgx.py +185 -0
  165. ff9mapkit-1.0.0b3/ff9mapkit/scene/cam.py +345 -0
  166. ff9mapkit-1.0.0b3/ff9mapkit/scene/guide.py +311 -0
  167. ff9mapkit-1.0.0b3/ff9mapkit/scene/paint.py +506 -0
  168. ff9mapkit-1.0.0b3/ff9mapkit/scene/placeholder.py +107 -0
  169. ff9mapkit-1.0.0b3/ff9mapkit/sjbinary.py +285 -0
  170. ff9mapkit-1.0.0b3/ff9mapkit/sps/__init__.py +17 -0
  171. ff9mapkit-1.0.0b3/ff9mapkit/sps/author.py +294 -0
  172. ff9mapkit-1.0.0b3/ff9mapkit/sps/catalog.py +88 -0
  173. ff9mapkit-1.0.0b3/ff9mapkit/sps/codec.py +264 -0
  174. ff9mapkit-1.0.0b3/ff9mapkit/sps/edit.py +184 -0
  175. ff9mapkit-1.0.0b3/ff9mapkit/sps/lint.py +58 -0
  176. ff9mapkit-1.0.0b3/ff9mapkit/sps/render.py +116 -0
  177. ff9mapkit-1.0.0b3/ff9mapkit/sps/templates.py +47 -0
  178. ff9mapkit-1.0.0b3/ff9mapkit/sps/texture.py +131 -0
  179. ff9mapkit-1.0.0b3/ff9mapkit/walkmesh_hotfixes.py +163 -0
  180. ff9mapkit-1.0.0b3/ff9mapkit/workspace/__init__.py +18 -0
  181. ff9mapkit-1.0.0b3/ff9mapkit/workspace/battledoc.py +985 -0
  182. ff9mapkit-1.0.0b3/ff9mapkit/workspace/builddoc.py +607 -0
  183. ff9mapkit-1.0.0b3/ff9mapkit/workspace/forms_qt.py +586 -0
  184. ff9mapkit-1.0.0b3/ff9mapkit/workspace/importdoc.py +665 -0
  185. ff9mapkit-1.0.0b3/ff9mapkit/workspace/mapview.py +131 -0
  186. ff9mapkit-1.0.0b3/ff9mapkit/workspace/palette.py +85 -0
  187. ff9mapkit-1.0.0b3/ff9mapkit/workspace/savedoc.py +664 -0
  188. ff9mapkit-1.0.0b3/ff9mapkit/workspace/shell.py +6907 -0
  189. ff9mapkit-1.0.0b3/ff9mapkit/workspace/style.py +105 -0
  190. ff9mapkit-1.0.0b3/ff9mapkit/workspace/tuningdialog.py +223 -0
  191. ff9mapkit-1.0.0b3/ff9mapkit.egg-info/PKG-INFO +155 -0
  192. ff9mapkit-1.0.0b3/ff9mapkit.egg-info/SOURCES.txt +311 -0
  193. ff9mapkit-1.0.0b3/ff9mapkit.egg-info/dependency_links.txt +1 -0
  194. ff9mapkit-1.0.0b3/ff9mapkit.egg-info/entry_points.txt +5 -0
  195. ff9mapkit-1.0.0b3/ff9mapkit.egg-info/requires.txt +14 -0
  196. ff9mapkit-1.0.0b3/ff9mapkit.egg-info/top_level.txt +1 -0
  197. ff9mapkit-1.0.0b3/pyproject.toml +87 -0
  198. ff9mapkit-1.0.0b3/setup.cfg +4 -0
  199. ff9mapkit-1.0.0b3/tests/test_abilities.py +69 -0
  200. ff9mapkit-1.0.0b3/tests/test_abilityfeatures.py +204 -0
  201. ff9mapkit-1.0.0b3/tests/test_actiondelta.py +239 -0
  202. ff9mapkit-1.0.0b3/tests/test_ai_phase_insert.py +160 -0
  203. ff9mapkit-1.0.0b3/tests/test_ai_phase_insert_adversary.py +134 -0
  204. ff9mapkit-1.0.0b3/tests/test_aiauthor.py +139 -0
  205. ff9mapkit-1.0.0b3/tests/test_ailint.py +91 -0
  206. ff9mapkit-1.0.0b3/tests/test_aipatch.py +114 -0
  207. ff9mapkit-1.0.0b3/tests/test_animations.py +112 -0
  208. ff9mapkit-1.0.0b3/tests/test_archetypes.py +92 -0
  209. ff9mapkit-1.0.0b3/tests/test_areatitle.py +82 -0
  210. ff9mapkit-1.0.0b3/tests/test_arming.py +76 -0
  211. ff9mapkit-1.0.0b3/tests/test_ate.py +264 -0
  212. ff9mapkit-1.0.0b3/tests/test_battle.py +791 -0
  213. ff9mapkit-1.0.0b3/tests/test_battle_bgm.py +163 -0
  214. ff9mapkit-1.0.0b3/tests/test_battle_forms.py +159 -0
  215. ff9mapkit-1.0.0b3/tests/test_battle_scene_codec.py +229 -0
  216. ff9mapkit-1.0.0b3/tests/test_battle_seq.py +357 -0
  217. ff9mapkit-1.0.0b3/tests/test_battleai.py +115 -0
  218. ff9mapkit-1.0.0b3/tests/test_battlecsv.py +93 -0
  219. ff9mapkit-1.0.0b3/tests/test_battlepatch.py +209 -0
  220. ff9mapkit-1.0.0b3/tests/test_bgart.py +215 -0
  221. ff9mapkit-1.0.0b3/tests/test_bgs.py +53 -0
  222. ff9mapkit-1.0.0b3/tests/test_build.py +926 -0
  223. ff9mapkit-1.0.0b3/tests/test_cameras.py +172 -0
  224. ff9mapkit-1.0.0b3/tests/test_campaign.py +946 -0
  225. ff9mapkit-1.0.0b3/tests/test_capstone.py +71 -0
  226. ff9mapkit-1.0.0b3/tests/test_carry_text_lint.py +103 -0
  227. ff9mapkit-1.0.0b3/tests/test_catalog.py +215 -0
  228. ff9mapkit-1.0.0b3/tests/test_chain.py +232 -0
  229. ff9mapkit-1.0.0b3/tests/test_characterdelta.py +366 -0
  230. ff9mapkit-1.0.0b3/tests/test_choice.py +200 -0
  231. ff9mapkit-1.0.0b3/tests/test_cli_entry.py +46 -0
  232. ff9mapkit-1.0.0b3/tests/test_cmdasm.py +159 -0
  233. ff9mapkit-1.0.0b3/tests/test_cmdasm_relocate.py +146 -0
  234. ff9mapkit-1.0.0b3/tests/test_content.py +1074 -0
  235. ff9mapkit-1.0.0b3/tests/test_deploy_campaign.py +166 -0
  236. ff9mapkit-1.0.0b3/tests/test_deploystack.py +334 -0
  237. ff9mapkit-1.0.0b3/tests/test_dialogue.py +340 -0
  238. ff9mapkit-1.0.0b3/tests/test_eb.py +193 -0
  239. ff9mapkit-1.0.0b3/tests/test_eblint.py +160 -0
  240. ff9mapkit-1.0.0b3/tests/test_editor_app.py +25 -0
  241. ff9mapkit-1.0.0b3/tests/test_editor_breadcrumb.py +48 -0
  242. ff9mapkit-1.0.0b3/tests/test_editor_feedback.py +71 -0
  243. ff9mapkit-1.0.0b3/tests/test_editor_forms.py +304 -0
  244. ff9mapkit-1.0.0b3/tests/test_editor_integration.py +93 -0
  245. ff9mapkit-1.0.0b3/tests/test_editor_jobs.py +275 -0
  246. ff9mapkit-1.0.0b3/tests/test_editor_model.py +141 -0
  247. ff9mapkit-1.0.0b3/tests/test_editor_theme.py +48 -0
  248. ff9mapkit-1.0.0b3/tests/test_entry_settle.py +64 -0
  249. ff9mapkit-1.0.0b3/tests/test_eventscan.py +534 -0
  250. ff9mapkit-1.0.0b3/tests/test_export.py +492 -0
  251. ff9mapkit-1.0.0b3/tests/test_exprasm.py +187 -0
  252. ff9mapkit-1.0.0b3/tests/test_extract_area.py +66 -0
  253. ff9mapkit-1.0.0b3/tests/test_find_field.py +40 -0
  254. ff9mapkit-1.0.0b3/tests/test_flags.py +310 -0
  255. ff9mapkit-1.0.0b3/tests/test_forkreport.py +861 -0
  256. ff9mapkit-1.0.0b3/tests/test_gateway_advance.py +163 -0
  257. ff9mapkit-1.0.0b3/tests/test_graphview.py +84 -0
  258. ff9mapkit-1.0.0b3/tests/test_hub_gen.py +319 -0
  259. ff9mapkit-1.0.0b3/tests/test_idgated.py +61 -0
  260. ff9mapkit-1.0.0b3/tests/test_import_borrow.py +135 -0
  261. ff9mapkit-1.0.0b3/tests/test_infohub.py +197 -0
  262. ff9mapkit-1.0.0b3/tests/test_itemdata.py +739 -0
  263. ff9mapkit-1.0.0b3/tests/test_items.py +42 -0
  264. ff9mapkit-1.0.0b3/tests/test_itemstats.py +142 -0
  265. ff9mapkit-1.0.0b3/tests/test_itemtext.py +279 -0
  266. ff9mapkit-1.0.0b3/tests/test_journey.py +1380 -0
  267. ff9mapkit-1.0.0b3/tests/test_journey_merge.py +97 -0
  268. ff9mapkit-1.0.0b3/tests/test_jump.py +196 -0
  269. ff9mapkit-1.0.0b3/tests/test_ladder.py +638 -0
  270. ff9mapkit-1.0.0b3/tests/test_lint.py +292 -0
  271. ff9mapkit-1.0.0b3/tests/test_logic_add.py +745 -0
  272. ff9mapkit-1.0.0b3/tests/test_logic_edit.py +743 -0
  273. ff9mapkit-1.0.0b3/tests/test_logic_map.py +332 -0
  274. ff9mapkit-1.0.0b3/tests/test_movement.py +247 -0
  275. ff9mapkit-1.0.0b3/tests/test_npc_model.py +62 -0
  276. ff9mapkit-1.0.0b3/tests/test_npc_verbatim.py +275 -0
  277. ff9mapkit-1.0.0b3/tests/test_npcparams.py +74 -0
  278. ff9mapkit-1.0.0b3/tests/test_object_graft.py +319 -0
  279. ff9mapkit-1.0.0b3/tests/test_occlusion.py +304 -0
  280. ff9mapkit-1.0.0b3/tests/test_on_entry.py +321 -0
  281. ff9mapkit-1.0.0b3/tests/test_pack.py +75 -0
  282. ff9mapkit-1.0.0b3/tests/test_paint.py +254 -0
  283. ff9mapkit-1.0.0b3/tests/test_party.py +163 -0
  284. ff9mapkit-1.0.0b3/tests/test_platform.py +214 -0
  285. ff9mapkit-1.0.0b3/tests/test_player_graft.py +373 -0
  286. ff9mapkit-1.0.0b3/tests/test_playerswap.py +175 -0
  287. ff9mapkit-1.0.0b3/tests/test_prop_archetypes.py +45 -0
  288. ff9mapkit-1.0.0b3/tests/test_provision.py +52 -0
  289. ff9mapkit-1.0.0b3/tests/test_refarc.py +518 -0
  290. ff9mapkit-1.0.0b3/tests/test_repaint_native.py +335 -0
  291. ff9mapkit-1.0.0b3/tests/test_reskin.py +139 -0
  292. ff9mapkit-1.0.0b3/tests/test_save.py +228 -0
  293. ff9mapkit-1.0.0b3/tests/test_save_items.py +1180 -0
  294. ff9mapkit-1.0.0b3/tests/test_savepoint.py +148 -0
  295. ff9mapkit-1.0.0b3/tests/test_scene.py +122 -0
  296. ff9mapkit-1.0.0b3/tests/test_scenelint.py +101 -0
  297. ff9mapkit-1.0.0b3/tests/test_scroll.py +109 -0
  298. ff9mapkit-1.0.0b3/tests/test_shared_text_block.py +142 -0
  299. ff9mapkit-1.0.0b3/tests/test_shop.py +265 -0
  300. ff9mapkit-1.0.0b3/tests/test_showcase.py +32 -0
  301. ff9mapkit-1.0.0b3/tests/test_sjbinary.py +214 -0
  302. ff9mapkit-1.0.0b3/tests/test_spawn.py +115 -0
  303. ff9mapkit-1.0.0b3/tests/test_sps.py +574 -0
  304. ff9mapkit-1.0.0b3/tests/test_startstate.py +77 -0
  305. ff9mapkit-1.0.0b3/tests/test_startup.py +205 -0
  306. ff9mapkit-1.0.0b3/tests/test_synthesis.py +236 -0
  307. ff9mapkit-1.0.0b3/tests/test_text.py +121 -0
  308. ff9mapkit-1.0.0b3/tests/test_textcarry.py +302 -0
  309. ff9mapkit-1.0.0b3/tests/test_verbatim.py +554 -0
  310. ff9mapkit-1.0.0b3/tests/test_walkmesh_hotfix.py +140 -0
  311. ff9mapkit-1.0.0b3/tests/test_workspace_style.py +46 -0
  312. ff9mapkit-1.0.0b3/tests/test_world_hub.py +135 -0
  313. 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())