New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add support for Starfield #1882
Comments
People have started preloading the game now, and while the files are still encrypted, the files within Starfield's
The files within the
As such the |
I've taken a look through the code to see what questions need to be answered for Starfield support:
Thanks to Pickysaurus from Nexus Mods I now have a copy of Starfield on Steam and a copy from the Microsoft Store through a 3-month Game Pass subscription, so I'll be able to get answers to these questions myself. I expect that most will be fairly straightforward to answer, the plugin file format questions will probably need a little trial-and-error parsing to check assumptions. It may be tricky to work out the ins and outs of how load order works, but the basics should be obvious with a little testing. |
For Starfield - It's size is around 62 MB and it can't be opened with a simple text editor. |
Viewing |
While viewing
Searching for
Searching for
|
I'm playing a bit with console commands. In In FO4, you could use
where I'm currently unable to replicate this behaviour in Starfield. While
On the other hand
worked, and using another |
I was able to use So instead of |
Starfield Default Values for All Known Valid INI Settings compiled by @DoubleYouC |
In Process Monitor it looks like Starfield also looks for some files (including plugins and BA2 files) under
It's hopefully not using %USERPROFILE% to resolve the path, IIRC there's a folder ID for getting the My Games path, but I can't remember what it's called. I imagine it's using that, so it's not necessarily at Other observations from Process Monitor:
libloot already has support for loading from multiple data paths, but the CCC file being loaded from multiple paths is new to me and not currently supported. It's currently read by LOOT and libloadorder, and it's probably easier to just add special handling for it. |
I've been able to handmake a plugin that changes the name of the "Eon" pistol: it's FormID However, I'm only able to see the change in-game when I replace one of the hardcoded plugins (e.g. I also haven't been able to create a new record (not one that just overrides one in Starfield.esm) and have that show up in game, and none of the records added by |
Interesting... I created a copy of the Eon pistol's record and gave it a different EDID value (ZVP - again I only had 3 bytes to play with) and a FormID of So it looks like:
I then changed the first instance of I'm not sure what to draw from this, as despite changing both strings the game recognised that the plugins it was trying to load weren't the usual official plugin names, but then loading seems to have failed as the changes weren't visible in-game (not just my new pistol, but also the edit to the Eon didn't show up). I'm not sure this says much about plugin loading in general either, as the official plugins may well go through a different path to the rest. I also tried changing the file extension to .esp, but got the same results as for .esl. Unsetting the light plugin flag for copies of the three hardcoded plugins revealed the order they load in is:
It may be worth noting that |
I renamed
That's pretty much what I was expecting, except |
aers on the RE discord confirmed that |
aers on the SkyrimSE RE discord has also found that the 0x200 TES4 flag (which was previously the light plugin flag) now suppresses the light plugin flag being set for plugins with a .esl extension (but doesn't do anything if that flag is already set in the file). Here is where most of the discussion starts. The logic (as written by Elminster) boils down to:
I've verified this in-game: I renamed my test plugin to test.esl, made sure it didn't have the flag set, added it to StarfieldCustom.ini as sTestFile1=test.esl under [General], and then used FindForm to check its record's FormID in game. Without 0x200 set, it was I should update esplugin to account for the suppression behaviour, so that plugins don't get treated as light when the flag is suppressed. I'm not yet sure what to do about the "squashing". |
It uses ShGetFolderPathA to resolve the user's personal Documents folder, so yes it will work no matter where it is located. |
Thanks, I was thinking of |
@aers I ran those tests you suggested, plus a few extra:
Most of the tests above suggest that a plugin that has the 0x200 flag applied (after the logic found by aers and described by Elminster runs) does not take up a mod index slot, which affects checking if active plugin limits have been reached and displaying plugin load order indexes, so esplugin will need to expose that info for use by libloadorder and LOOT. However, the last test shows that there are cases in which the 0x200 flag is ignored other than those already described. I need to do more investigation to narrow down the cause for that test case. I also don't understand why the ZVM/ZVL record vanished in that test case, All I did was change the flags on |
Doing some more testing to understand the game's behaviour with the 0x200 flag:
That makes sense to me: ZVL overrides ZVM, so doesn't use up a new mod index, while YVL is a new record that gets squashed down to Starfield.esm's mod index. Is it squashing down to Starfield.esm's mod index though, or the mod index of the first master listed?
This gets the same result as the last test case in my previous comment, and what's common between them is that the first master is not ZVM should have mod index 02, but it and ZVL have vanished and YVL has mod index 02. I think what's happened is that ZVM was overridden by ZVL, but they were both overwritten by YVL, because all three have the same FormID.
Here ZVL and YVL are both new records that have been squashed down into test.esm's mod index, and ZVM no longer exists because it's been overwritten (not overridden) by YVL.
Here YVL uses a different object index from ZVM/ZVL, so ZVL overrides ZVM as expected, and YVL squashes into test.esm as expected. |
I think I've got everything I need to add support for Starfield to esplugin and loot-condition-interpreter, and to libloot itself. However, as I've been so far unable to figure out how to get the game to load non-hardcoded plugins without using ini settings, I can't complete support in libloadorder. It looks like adding support for Starfield will involve a couple of breaking changes to libloot's API, so I might just assume that Starfield uses the same load order system as Skyrim SE and Fallout 4 so that I can include the breaking changes in the next libloot release - I don't have any reason to expect figuring out the load order system to involve breaking API changes in libloot or libloadorder, so it would be easier to patch in any corrections later. Aside from basic functionality, it would be good to support:
|
I don't know if this will be helpful, but Elminster (xEdit dev) mentioned in the Starfield Discord that it's likely Bethesda has blocked or commented out the code for loading plugins.txt. It looks like it's still present, just block off; likely until an official update for "mod support". |
I'm already aware, I've been talking to him saying the same sort of thing, though what you've said isn't quite correct: the game does read plugins.txt, but we don't yet know what it does with the contents. I've got the code open in in a disassembler, but I've been avoiding it (I don't enjoy reading assembly). |
Starfield Repository |
Correction about BA2 loading: if I've got |
Another test case checking if the 0x200 flag affects the master flag getting set for a .esm plugin:
So the master flag is still applied. I renamed test.esm to test.esl and got the same results. |
I've been slowly making my way through the disassembly for some of the |
Now that my Game Pass copy of Starfield has unlocked, I've started it up and gotten past character creation then made a save, and taken a look at what files were accessed where:
Weirdly, although I made a save and loaded it, I can't find it anywhere, and ProcMon doesn't show any .sfs file accesses, aside from one attempt to open a save at |
And according to the following japanese news article - the section that includes
(DeepL translation) |
Starfield has received it's first post-launch patch - Link |
Microsoft Store version of the game also uses |
Thanks, I'd already got an answer for this one (I've got Game Pass), but forgot to tick it off, sorry! |
A new Patch is available - Notes |
While Starfield.exe looks for Starfield.ccc, plugins listed in it aren't currently loaded, same as plugins.txt. I've just finished adding support for reading sTestFile ini properties to libloadorder, which is used by other games and is also currently the only way to load plugins for Starfield, but I don't intend to support changing those ini property values (they're also only used to activate plugins, not set load order). |
Considering that
How about adding a basic ("view only") support for Starfield to LOOT? As in, you can select the game, see plugins that are found in the And as soon as loading plugins via Just some ideas .. |
Yeah, that's the direction I'm heading in, I've got it so that libloadorder will error if you try to save changes, so I was going to disable the apply changes button in LOOT, but thinking about it again, disabling sorting entirely makes more sense since you can't do anything with the results. |
This is what LOOT using I think it's great that LOOT immediately informs the users about things like header versions being lower than the game's minimum header version. The ability to sort currently enables me to see the CRC32 values of all the different plugins, as well as if LOOT detects plugins to be invalid: These information are nice to have and we would miss out on them for Starfield, as long as sorting would be disabled. But I think it would be okay, given the circumstances. Starfield being recognized by LOOT and the ability to see the plugins (and potential messages for them) seems like a good first step. |
@pStyl3 It's not obvious, but you get CRC calculation and full plugin parsing if you use the conflict filter. |
True. Seems like I haven't used the conflict filter for quite some time. 😄 Well, then all the more reason to disable sorting for Starfield, until loading plugins via |
I've disabled sorting and checking for ambiguous load orders when the current game is Starfield, as in both cases there's nothing the user can do with the result, and I've updated the warning message displayed for Starfield to reflect this. In other news, I've hit an issue with implementing support for the
The |
Also, I've intentionally limited support in libloadorder so that it will ignore plugins.txt and Starfield.ccc since the game doesn't currently activate plugins listed in those files if they exist. |
Nukem has posted an SFSE plugin that enables |
@Infernio Do you know where (if anywhere) the source code is available for that? I don't really want to use it to verify game behaviour without knowing how much it changes. |
So in what is probably today's winner for "weird but true fact", pStyl3 shared with me a screenshot of a screenshot that Picksaurus had shared in the Starfield Modding Discord server of a comment Nukem made in Discord that deleting What I haven't seen mentioned elsewhere yet is that it also (like the SFSE plugin linked a few comments above) makes the game pay attention to Also, Starfield with plugins.txt enabler SFSE plugin: With plugins.txt: *test.esp It loaded at index 02. With plugins.txt: *test.esm test.esm loaded at 01, test2.esm loaded at 02 With plugins.txt: *test2.esm test.esm loaded at 02, test2.esm loaded at 01 If I edit OldMars.esm to not be a light plugin, with plugins.txt: *test2.esm OldMars.esm loads at 01, test2.esm loaded at 02, test.esm loaded at 03 If I edit Constellation.esm to not be a light plugin, with plugins.txt: *test2.esm Constellation.esm loads at 01, test2.esm loaded at 02, test.esm loaded at 03 With OldMars.esm back to normal and plugins.txt: *test.esm test.esm loads at 01, test2.esm loads at 02, and test.esp loads at 04. That means BlueprintShips-Starfield.esm must load at 03, so it's implicitly active but not an early loader. With plugins.txt: *test2.esm and sTestFile1=test.esm, only test.esm is loaded With plugins.txt: *test2.esm and Starfield.ccc: test.esm test.esm loads at 01, test2.esm loads at 02, and test.esp loads at 04 With Starfield.ccc: test2.esm and sTestFile1=test.esm, only test.esm is loaded With Starfield.ccc: test2.esm test.esm loaded at 02, test2.esm loaded at 01 With Starfield.ccc: test.esm test.esm loaded at 01, test2.esm loaded at 02 |
Done as of 9dbc06f. |
After Starfield was first announced during E3 2018, it is now scheduled to be released on the 6th of September 2023.
Platforms:
There might be GOG/EGS releases planned at some point, but as far as I know this hasn't been officially talked about yet.
Minimum System Requirements:
It probably might be a good idea to calculate with more than 125 GB storage space, official DLCs and mods will come on top of that.
Videos:
Creation Engine 2
https://twitter.com/BethesdaStudios/status/1404124165658009601
Starfield is build using the CE 2, which is said to be vastly improved compared to it's predecessors. There are some snippets of information floating around, but not much is known until now. We should very carefully observe everything around the CE 2, since it might mean that there are substantial differences in regards to load order as well.
Of course, besides updating the LOOT application itself, a new masterlist will need to be created, too.
Closing Thoughts:
I bought the Digital Premium Edition from Steam, as such I will have early access to it 5 days prior to the official release, and I will also get the first planned story expansion, aka DLC "Shattered Space". For testing purposes, it might be good to have a few people owning the game through the Microsoft Store, any help on this front will be welcome!
Let's see how the game will perform and get received, I'm looking forward to it.
The text was updated successfully, but these errors were encountered: