Skip to content

Refuse a ZBD with no chapter folders, and say why a menu flight failed (#177) - #178

Merged
Laeresh merged 2 commits into
mainfrom
ccr-9e2e72f1-7xq0jw
Oct 9, 2026
Merged

Laeresh merged 2 commits into
mainfrom
ccr-9e2e72f1-7xq0jw

Conversation

@Laeresh

@Laeresh Laeresh commented Oct 9, 2026

Copy link
Copy Markdown
Owner

Addresses #177. On Linux, both FLY MISSION and Free Flight went back to the main menu with no message.

Cause

The reporter's log shows every build failing in GameZ.Load with a DirectoryNotFoundException on extracted/C3/gamez.zip. The extraction summary in the same log lists only the 7 shared archives at the root of ZBD (interp, planes, rimage, soundsh, soundsl, zrdr, messages) and no chapter archive, so extracted/C3 was never written. The folder they picked (.../GAME, "CD content") looks like a disc's contents: ZBD with its shared archives and GOSDATA/ASSETS, but no C1..C5 subfolders.

Filename case is not the cause. ZbdExtraction walks ZBD recursively and ignores case, and the reader's path uses ZbdTree's case.

Changes

  • InstallLocator.Check used to accept any ZBD that held one .zbd. It now returns a new NoChapters result when no subfolder of ZBD holds an archive, with a message saying the folder looks like a disc's contents or a partial install. Such a folder extracts the menus and every flight then fails, so it is refused before anything is written.
  • Launcher: when a build launched from the Original menu fails, the menu now shows its warning box instead of a bare top level. If no chapter folder under extracted/ holds its GameZ (new SessionPaths.HasAnyChapterWorld), the box tells the player to extract again from a full install. For any other failure it points to the "Open logs folder" icon.
  • The two test installs that held only a root archive (ExtractionFlowTests, ExtractionScreenSuites) now also hold a C1 chapter archive.
  • New unit tests: AZbdWithOnlyItsRootArchivesIsNoInstall, AChapterWorldIsFoundZippedOrUnpackedAndNeverAtTheRoot.
  • Updated the InstallLocator entry in docs/architecture/Extraction.md.

Verification

  • Ran on Linux, with no Godot and no PowerShell available. dotnet build of CSVM.Tests is clean with 0 warnings.
  • dotnet test: 6107 passed, 0 failed, 314 skipped (the skipped tests need a real install).
  • dotnet format --verify-no-changes on the changed files reports only end-of-line markers, which come from the LF checkout.
  • Not run: .\RunTests.ps1, the in-engine suites (ExtractionScreenSuites' test install changed) and the commit gate scripts. Run .\RunTests.ps1 before merging.

🤖 Generated with Claude Code

https://claude.ai/code/session_016NwFhBqAixt71XkAgFcQPx


Generated by Claude Code

claude added 2 commits October 9, 2026 12:34
#177)

#177: on Linux, FLY MISSION and Free Flight both returned to the main menu
with no message. The reporter's log shows every build failing in
GameZ.Load on extracted/C3/gamez.zip, a DirectoryNotFoundException. The
extraction summary in the same log lists only the seven root archives of
ZBD (interp, planes, rimage, soundsh, soundsl, zrdr, messages) and no
chapter archive, so extracted/C3 was never written. The picked folder
(".../GAME", "CD content") held a disc's contents: ZBD with its shared
archives and GOSDATA/ASSETS, but no C1..C5 subfolders. Case is not the
cause: ZbdExtraction walks ZBD recursively and case-insensitively, and the
reader's path takes ZbdTree's case.

Two CSVM faults made that a silent bounce:

- InstallLocator.Check accepted any ZBD holding one .zbd. It now answers
  NoChapters when no subfolder of ZBD holds an archive, with a message
  naming a disc's contents or a partial install. The menus extract from
  such a folder and every flight fails, so it is refused before writing.
- A failed menu build stood the Original top level bare. Launcher now
  raises Original's warning box. When no chapter folder under extracted/
  holds its GameZ (SessionPaths.HasAnyChapterWorld) the box names the fix,
  re-extracting from a full install; otherwise it points at the logs icon.

The two extraction fixtures that held only a root archive gain a C1 chapter
archive. New units: AZbdWithOnlyItsRootArchivesIsNoInstall,
AChapterWorldIsFoundZippedOrUnpackedAndNeverAtTheRoot.

Verification: on Linux (no Godot, no pwsh), dotnet build of CSVM.Tests is
clean with 0 warnings; dotnet test passes 6107, fails 0, skips 314 (those
need an install). dotnet format --verify-no-changes over the changed files
reports end-of-line markers only, an artefact of the LF checkout. Not run:
.\RunTests.ps1, the in-engine suites (ExtractionScreenSuites' fixture
changed) and the commit-content gate scripts.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016NwFhBqAixt71XkAgFcQPx
The checks job's comment-cap gate blocked CSVM/src/Extraction/InstallLocator.cs:34 at 26 words
against a cap of 25. The summary now says the same in two sentences.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016NwFhBqAixt71XkAgFcQPx

Laeresh commented Oct 9, 2026

Copy link
Copy Markdown
Owner Author

engine suites (tier:ci, headless) fails on net-combat-events ("the smoker resolves and the host's seat carries a pylon and the session's screens"). This PR didn't cause it: the same suite fails the same way on main at a08972a (run 37902933127), with 195 passed and 1 failed in both runs. This PR touches no network or SMOKER code, and the extraction suites whose test install it changed pass. There is no fix for it yet to port into this PR.

The three checks jobs failed on this PR's own comment-cap violation (InstallLocator.cs:34, 26 words). That is fixed in 9d0cf1b.


Generated by Claude Code

@Laeresh
Laeresh merged commit dfe1438 into main Oct 9, 2026
3 of 4 checks passed
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.

2 participants