Skip to content

Add FF12 basic game plugin#230

Open
ffgriever-pl wants to merge 4 commits into
ModOrganizer2:masterfrom
ffgriever-pl:feat-add-ff12-support
Open

Add FF12 basic game plugin#230
ffgriever-pl wants to merge 4 commits into
ModOrganizer2:masterfrom
ffgriever-pl:feat-add-ff12-support

Conversation

@ffgriever-pl
Copy link
Copy Markdown

Summary

This PR adds built-in basic game support for Final Fantasy XII The Zodiac Age in Mod Organizer 2.

Source plugin repository:
https://github.com/FF12-Modding/FF12-MO2-Plugin

This change is intended to let users manage FF12 mods in MO2 by default, without installing a separate external MO2 plugin first.

What is included

  • Added plugin's main file game_ff12.py
  • Added FF12 support modules from ff12 directory

Feature set includes:

  • FF12 mod management integration in MO2
  • Launcher handling
  • Save and ini support
  • Save browsing and basic save management
  • Archive browsing and export support for VBF files
  • Optional update notification flow for plugin updates

Stability and testing

This plugin has already seen long-term public usage before this merge:

No issues were reported during that period that didn't turn out to be a user error.

Linting was also run with ruff, and the plugin passes without errors.

Update checker behavior

The plugin includes an update checker. Current behavior:

  • Checks GitHub releases for newer versions
  • Never installs automatically without explicit user consent
  • Prompts the user to choose:
    • Update now
    • Remind me later
    • Skip this version
    • Cancel
  • Can be fully disabled by the user in plugin settings

I did not find a clear rule in MO2 contribution guidelines about this pattern, so I wanted to call it out explicitly. My preference is to keep it enabled because it allows faster delivery of plugin-side fixes and improvements between MO2 releases. If this is not acceptable for MO2 policy, I can disable version checks for the upstream integration.

External runtime requirement

FF12 itself requires an external modding loader tool (called FF12 External File Loader) to enable modding:

Note: supports Steam/PC version of the game. MS Store version is not supported.

This loader is not bundled with the plugin because it changes frequently.
If it is not detected, users are prompted to install it as a mod.

Notes for reviewers

If preferred, I can prepare a follow-up adjustment to:

  1. Disable update checks in the upstream MO2-integrated version.
  2. Keep all other FF12 support functionality unchanged.

Disclaimer

All contributors (well, all two of us: @Xeavin and me, @ffgriever-pl) agreed to merge it into MO2 repository.

@ffgriever-pl
Copy link
Copy Markdown
Author

ffgriever-pl commented Jun 1, 2026

Looks like I'll have to fix a lot more linter issues. They all passed locally when tested in isolation ;)

@ffgriever-pl ffgriever-pl marked this pull request as draft June 1, 2026 12:42
@ffgriever-pl
Copy link
Copy Markdown
Author

It will take a while. We didn't use strict typing when working on this plugin. I set it as draft for now.

@ffgriever-pl
Copy link
Copy Markdown
Author

The typing issues were fixed, but we need to test it, as some changes were not trivial.

Adds support for Final Fantasy XII The Zodiac Age Steam/PC version.
@ffgriever-pl ffgriever-pl force-pushed the feat-add-ff12-support branch from b1e8c87 to 47229ec Compare June 1, 2026 16:33
@ffgriever-pl ffgriever-pl force-pushed the feat-add-ff12-support branch from d7f7257 to f97cffb Compare June 1, 2026 19:19
@ffgriever-pl ffgriever-pl marked this pull request as ready for review June 1, 2026 19:28
@ffgriever-pl
Copy link
Copy Markdown
Author

I simplified some of the pyright fixes and removed some of the overengineered code.

Works fine on both current master and MO2 2.5.2.

Note on absolutePath: In commit cc5c3f2 BasicLocalSavegames changed to accept IPluginGame instead of QDir. On older releases (2.5.2) the old BasicLocalSavegames still expects a QDir like object and calls .absolutePath() on it directly during __init__. Since IPluginGame doesn't define absolutePath, older releases fail without it.

I kept absolutePath on FF12TZAGame returning self.savesDirectory().absolutePath() — this is what the old BasicLocalSavegames.__init__ needs. On master the new BasicLocalSavegames calls self._game.savesDirectory() instead, so absolutePath is unused but harmless.

This is a compatibility shim. It can be removed once 2.5.2 support is dropped.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant