You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Borea needs to read which game build is installed.
RFC 0017 gives an ordered chain: KSA.dll PE FileVersion, then PE ProductVersion, then the build field of the newest Content/Versions/*.json. This issue covers the first two; the Content/Versions fallback is a follow-up.
IInstalledGameVersionProvider in Borea.Core/Game, implemented in Borea.Storage/Game, following the ILatestVersionPing and IGamePathProvider precedent of interface in Core, I/O outside it.
Take the directory from IGamePathProvider.GetGameDirectoryPath(), which is nullable. Read FileVersionInfo, try FileVersion then ProductVersion. GameVersion.TryParse already accepts a leading v, a -suffix and a +hash, so ProductVersion parses unchanged.
Return the parsed GameVersion? next to the raw string, mirroring LatestVersionInfo. RFC 0017 says an unparseable version "becomes Unknown rather than being discarded", so the string stays displayable.
Three failure modes: the game path is null, KSA.dll is missing (GetVersionInfo throws), and the file has no version resource (FileVersion comes back null).
Tests in Borea.Storage.Tests, where TestGamePathProvider already roots a temp game folder per test: path null, KSA.dll missing, present but unparseable, present and valid.
For the valid case add a tiny fixture class library under tests/Borea.Storage.Tests/Fixtures/ with <FileVersion>2026.8.3.5117</FileVersion> and copy its output in as KSA.dll.
Borea needs to read which game build is installed.
RFC 0017 gives an ordered chain:
KSA.dllPE FileVersion, then PE ProductVersion, then thebuildfield of the newestContent/Versions/*.json. This issue covers the first two; theContent/Versionsfallback is a follow-up.IInstalledGameVersionProviderinBorea.Core/Game, implemented inBorea.Storage/Game, following theILatestVersionPingandIGamePathProviderprecedent of interface in Core, I/O outside it.IGamePathProvider.GetGameDirectoryPath(), which is nullable. ReadFileVersionInfo, tryFileVersionthenProductVersion.GameVersion.TryParsealready accepts a leadingv, a-suffixand a+hash, so ProductVersion parses unchanged.GameVersion?next to the raw string, mirroringLatestVersionInfo. RFC 0017 says an unparseable version "becomes Unknown rather than being discarded", so the string stays displayable.KSA.dllis missing (GetVersionInfothrows), and the file has no version resource (FileVersioncomes back null).Borea.Storage.Tests, whereTestGamePathProvideralready roots a temp game folder per test: path null,KSA.dllmissing, present but unparseable, present and valid.For the valid case add a tiny fixture class library under
tests/Borea.Storage.Tests/Fixtures/with<FileVersion>2026.8.3.5117</FileVersion>and copy its output in asKSA.dll.Do not build a read seam around
FileVersionInfo.