465 Commits
Author SHA1 Message Date
Oliver Hamlet 20d583ba43 Update changelog and version for 0.26.2 2025-05-13 20:41:15 +01:00
Oliver Hamlet c6747a85c8 Use uv to manage docs Python dependencies
UV's use of a lockfile makes building the docs more reliable, and it installs the dependencies faster too (though in CI that's largely hidden by having to install Doxygen every time).
2025-05-12 17:21:58 +01:00
Oliver Hamlet 0e58606e30 Update sphinx to v8.2.3 2025-05-12 08:55:03 +01:00
Oliver Hamlet f29f6cd0f6 Update Breathe to v4.36.0
The new version of Breathe requires Doxygen v1.9.2+, so also upgrade
Doxygen in the Windows CI builds.
2025-05-12 08:42:55 +01:00
Oliver Hamlet 7707626b9b Update sphinx_rtd_theme to v3.0.2 2025-05-12 07:51:28 +01:00
Oliver Hamlet 766b4af256 Fix Breathe function parsing errors 2025-05-12 07:47:41 +01:00
Oliver Hamlet 856fae4912 Fix some incorrect Doxygen config 2025-05-12 07:47:24 +01:00
Oliver Hamlet 070822f37f Update changelog and version for 0.26.1 2025-05-01 21:48:52 +01:00
Oliver Hamlet 7bbf55cbb7 Update changelogs and version for 0.26.0 2025-04-19 21:58:39 +01:00
Oliver Hamlet 61eeb7ef85 Update metadata conditions docs 2025-04-19 21:58:39 +01:00
Oliver Hamlet 575e6d5c93 Add support for "constraint" in File metadata 2025-04-07 08:24:27 +01:00
Oliver Hamlet 2d96ba13d9 Update changelog and version for 0.25.5 2025-03-15 21:16:08 +00:00
Oliver Hamlet 59901d2318 Update changelog and version for 0.25.4 2025-03-04 19:22:51 +00:00
Oliver Hamlet db6d39bd93 Update changelog and version for 0.25.3 2025-02-23 16:10:35 +00:00
Oliver Hamlet a49075aaa9 Update changelog and version for 0.25.2 2025-02-10 09:48:32 +00:00
Oliver Hamlet f865167997 Update changelog and version for 0.25.1 2025-02-03 21:19:07 +00:00
Oliver Hamlet 06937ffc83 Update changelog and version for 0.25.0 2025-02-02 21:32:30 +00:00
Oliver Hamlet c26b495c03 Update libloadorder to 18.2.1 2025-02-02 21:32:06 +00:00
Oliver Hamlet c8381617a8 Make plugin loading and sorting more granular
- Don't clear the cache in LoadPlugins()
- Don't load plugins in SortPlugins(), and make it take a vector of strings, not paths.
- Add a ClearLoadedPlugins() method to clear the loaded plugins cache.
- Remove IdentifyMainMasterFile()

Instead of calling IdentifyMainMasterFile(), callers can use LoadPlugins() to initially load all plugin headers only, then omit the main master file when calling LoadPlugins() to fully load plugins.
2025-02-02 18:01:19 +00:00
Oliver Hamlet d8a3604b0c Update changelog 2025-02-01 22:00:00 +00:00
Oliver Hamlet 84c0cca534 Implement support for OpenMW
Most of the complexity is handled by libloadorder, but it's worth noting that:

- The game path is OpenMW's install path, not Morrowind's
- OpenMW doesn't force master-flagged plugins to load before others
- OpenMW doesn't provide a way to record the load order of inactive plugins
- .omwgame and .omwaddon plugins are equivalent to .esm and .esp respectively, while .omwscripts plugins have a completely different format with none of the metadata that libloot uses.
- OpenMW effectively relies on additional data paths to load Morrowind's (and mods') files, and the last directory listed that contains a given filename is used to load a file with that filename, with the main data path effectively being the first listed.
- I've disabled support for ghosted plugins for OpenMW because it makes the multi-path stuff more confusing and may not provide any benefit.
2025-02-01 21:36:03 +00:00
Oliver Hamlet 1532c932af Update sorting doc to reflect groups changes 2025-01-18 22:29:50 +00:00
Oliver HamletandOliver Hamlet 997631667f Overhaul how group edges are added during sorting
The new logic is conceptually simpler, with fewer special cases to
handle. Unlike the old implementation, the new approach avoids cycles.

It basically does depth-first searches through the group graph, adding
edges from each group's plugins to the plugins in the group's
successors.

This involved reversing the direction of edges in the group graph, as
this switches the logic from trying to find predecessors to trying to
successors: the new direction matches that of plugin graph edges, so
it's less confusing.

I can't think of a situation in which the iteration order of plugins
within a group matters. I tested it manually with my test load order of
~1600 plugins, and saw no difference when the order was randomly
shuffled. I've added a test case but it's a relatively simple scenario
and there may be a more complex scenario where it would matter that I
haven't thought of.

A buffer is used to hold the plugins in the previous groups in the
current path, because that's noticeably faster than just recording the
path and looking up the plugins for each group in the path. It does
duplicate the group vectors, but that's an insignificant amount of
memory used.

The new approach has a negative performance impact, with sorting now 15%
slower than before.

A more efficient solution could be to implement a custom DFS algorithm
that doesn't stop when it reaches a vertex it's already visited (which
would be fine since the graph has already been validated to be acyclic),
as then only the root vertices would need to be searched from.
2025-01-17 23:36:02 +00:00
Oliver Hamlet 44008ea720 Update changelog and version for 0.24.5 2024-10-24 10:40:20 +01:00
Oliver Hamlet a1de089f67 Update sorting doc 2024-10-24 10:40:19 +01:00