449 Commits
Author SHA1 Message Date
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
Oliver Hamlet b607fb259f Update changelog and version for 0.24.4 2024-10-08 10:59:31 +01:00
Oliver Hamlet 18dbb58964 Update changelog and version for 0.24.3 2024-10-05 16:49:58 +01:00
Oliver Hamlet 2c7c4ce7bf Update changelog and version for 0.24.2 2024-10-05 13:17:05 +01:00
Oliver Hamlet 924ee8982e Update changelog and version for 0.24.1 2024-09-15 19:10:01 +01:00
Oliver Hamlet cfa2835c2f Set 0.24.0's release date 2024-09-14 08:25:49 +01:00
Oliver Hamlet 5ce09aa754 Update changelog and version for 0.24.0 2024-09-13 22:17:18 +01:00
Oliver Hamlet e9321ae544 Update changelog and version for 0.23.1 release 2024-08-24 11:28:30 +01:00
Oliver Hamlet 1d2ebf5572 Fix links in changelog 2024-08-24 11:27:54 +01:00
Oliver Hamlet f3eabb639b Update changelog and version for 0.23.0 release 2024-06-29 22:09:55 +01:00
Oliver Hamlet 03baecec4c Update changelog and version for 0.22.4 release 2024-05-03 07:15:26 +01:00
Oliver Hamlet e5f4bf041f Update Sphinx to fix build failures
One of Sphinx's default extensions now requires a newer version of Sphinx than what was used.
2024-04-25 08:27:28 +01:00
Oliver Hamlet b23e33144e Update changelog and version for 0.22.3 release 2023-12-06 19:02:23 +00:00
Oliver Hamlet 8463e9ee7c Update changelog and version for 0.22.2 release 2023-11-25 17:05:41 +00:00
Oliver Hamlet 2614e02dbf Update version and changelog for v0.22.1 release 2023-10-06 14:49:16 +01:00
Oliver Hamlet 8a21b8321b Update version and changelogs for v0.22.0 release 2023-09-29 17:15:38 +01:00
Oliver Hamlet bf1a2fc98e Update release date 2023-09-13 10:04:54 +01:00