Repository navigation
Conversation
Confetti3
left a comment
There was a problem hiding this comment.
Thanks, hiding the native VS menus while the automatic route runs and gating pad input from the game-thread snapshot (so it holds before the next drawn frame) are both good ideas, and the change is small. The main thing to fix is when the cover ends: it is derived from session state that does not always mean "automatic entry is still running".
1. A cancellation after entry leaves "Starting match..." up during teardown. MatchLoading is Preparing && (atMainMenu || entered) (src/netplay/MatchLoading.hxx:7, published at src/sf4e/sf4e__NetplayRuntime__Status.cxx:329). When the table cancels after the route has started, AbortLocalMatch (src/sf4e/sf4e__NetplayRuntime__Match.cxx:255, called from src/sf4e/sf4e__NetplayRuntime__Room.cxx:609) aborts the session and sets recoveringMatch, but applies no controller event and leaves matchEntered true. The controller stays in Preparing until the battle tears down or MatchRecovered fires back at the main menu (src/sf4e/sf4e__NetplayRuntime__Match.cxx:532), so for that whole stretch the player is told the match is starting and every input is blocked. Because the cover now blocks all input at the main menu, any path that leaves the controller in Preparing there also leaves the player with nothing they can do. Please publish an explicit automatic-entry flag from the game thread: set it when EnterAuthorizedMatch returns Entered (src/sf4e/sf4e__NetplayRuntime__Match.cxx:486) and clear it on abort, rejection, match end and readiness, and have MatchLoading use that rather than combining Preparing, atMainMenu and matchEntered. The new test goes straight from Preparing to PostMatch (src/tests/overlay_presentation_test.cxx:33); please add a case for an abort after entry and before the match is running.
2. The cover is painted over the warnings and notices. DrawMatchLoading() runs last (src/sf4e/sf4e__Overlay.cxx:483) and fills the screen on the foreground draw list, so it covers every ImGui window and the controller warning and match notice drawn just before it (src/sf4e/sf4e__Overlay.cxx:456 to :474). GGPO is already active while it synchronises and the cover is still up, so a "reconnect your controller" warning or a disconnect or cancellation notice raised then is hidden. Please draw the cover first (the background draw list, or before the other windows) and the warning and notice layer above it, skipping the telemetry strip while loading.
3. The new strings are English in every other catalog. match.loading_title and match.loading_detail were added to all thirteen non-English .po files with the English text as the translation (for example locales/ja.po:3587), so those players get English on the new screen. Please supply translations, as the rest of these catalogs have.
4. Suggestion: decide where the cover should end. It ends when the session reaches Playing, which happens once GGPO reports Running (src/sf4e/sf4e__NetplayRuntime__Match.cxx:491). GGPO starts when the battle's tasks are registered, but the game's own initialisation and the loaded barrier are gated separately in fVsBattle::HasInitialized (src/sf4e/sf4e__GameEvents.cxx:237), so the cover can drop while the battle is still loading. That is past the menus, so it only shows the game's own load. If the intent is to cover until the first battle frame, end the flag from item 1 at native readiness; if not, say so in the comment on MatchLoading.
This still needs a check in the game: the automatic route from the main menu and from a rematch, a spectator joining, a cancel while the native menus are running, and a two-PC start.
Extract this focused change from the locally tested development build. Keep other features out of the upstream review; the pull request records implementation details, prior integration evidence, and outstanding isolated validation.
f2bfa65 to
117433e
Compare
Keep every key and translated value intact while avoiding unrelated PR additions at the shared country-list tail.
The game briefly exposes its native VS menus during Ember's automatic match entry, which can make players think they need to press buttons. This adds an opaque Starting match cover and holds physical input while that automatic route runs.
The branch is based directly on current release
cd4daa5c(v1.3.0), independently of the other open PRs.Lifecycle and review fixes
The game thread owns a dedicated
automaticMatchEntryflag. It becomes true only whenEnterAuthorizedMatchreturnsEntered. Waiting for somebody to leave Training/Options does not activate the cover.The flag clears on cancellation/rejection, native teardown (including a battle closing without a session), entry reset/room close, and accepted match-end/gameplay-loss events. This works even when the controller remains
PreparingandmatchEnteredstays set during teardown. Snapshot publication includes the flag in its change fingerprint.The cover deliberately stays until
fVsBattle::HasInitializedpasses native initialization, the initialization hold, and the session loaded barrier. GGPO reaching Running alone does not remove it. No game timing or synchronization barrier is bypassed.The existing overlay input owner reads the published flag, so pad caches and button getters are gated before the next rendered frame. Existing release checks prevent a held Confirm/Start from leaking when the cover closes. Keyboard/window-message capture follows focus; pad capture also applies in the background. The native observer remains free to advance its automatic route.
Drawing and localization
The current release's
DrawOverlayLayersboundary draws the cover on ImGui's background list. Controller warnings and match notices remain ordinary windows above it, including before GGPO becomes active. Telemetry, frame meters, training controls and shortcuts are suppressed during loading.Both loading strings have translations in all 13 non-English catalogs. Existing training, replay, spectator and controller behavior is preserved; there is no derived
Preparing && (atMainMenu || entered)condition.Restoration checks (17 October 2026)
Restored the same final source revision that was present before withdrawal. The target
releasebranch is unchanged atcd4daa5c2fb19ee5a3ecd14d0e2d9cbee753aa4f. All six restored submissions (#44, #51, #98, #100, #102 and #104) passgit diff --check, merge individually with that release, and merge cleanly in all 15 pairwise combinations.Review #44 before #100, and #51 plus #104 before #102. The dependent branches contain those exact prerequisite heads; after a squash/rebase merge, refresh the dependents as described below. #98 is independent of those sequences.
This restoration did not change code or rerun builds/gameplay. The build, rendering and network-test results below are previously recorded evidence, including earlier combined tests with other contribution branches that remain closed.
Validation
The runtime regression invokes the actual cancellation/publication seam: it arms an entered match, aborts it while the controller remains Preparing and matchEntered remains true, and verifies the published cover is gone. It also checks that Running keeps the cover until the native-ready callback, and exercises match end, sessionless teardown and reset.
The render regression exercises loading both before and after GGPO becomes active, with controller warning, match notice and both independently. It verifies that the background list is first, the appropriate windows remain drawn, and no foreground telemetry or passive layers leak through. Existing locale/font coverage remains part of validation.
Native acceptance still needed
Automated checks do not establish native gameplay acceptance. Matching builds still need a two-PC start, main-menu entry, rematch entry, a spectator joining, and cancellation while the native menus run. Discord SDK-enabled builds were not run. No binaries or release packages are included.
Compatibility update (17 October 2026)
Moved the loading-cover localization entries beside the existing room-wait text without changing keys or translations. The dependent spectator Start change in #100 preserves the loading input guard.
Previously checked all 16 then-open contribution PRs against
releaseatcd4daa5c2fb19ee5a3ecd14d0e2d9cbee753aa4f. All 120 PR pairs merge cleanly; three complete merge orders produce the same source tree. The four dependent PRs document the additional branch refresh required after a prerequisite squash merge. These checks cover the exact branch heads linked in this update, not future upstream edits.Validation of the combined tree:
relay_unreachable; its full rerun passed on unchanged code. Both logs are retained.The current pass did not run the full Discord SDK, Inno Setup installer integration, a physical-controller session inside SSFIV, or a real match between two PCs. No new release assets or private test package were published. Earlier feature-specific results above remain identified separately where applicable.