Repository navigation
Classic Mode 2-Player Co-op - #229
Merged
Merged
Conversation
gEnhancements.ClassicCoop (default ON) is latched once at boot so the "Classic Co-op (Needs reload)" checkbox only applies on the next launch, plus the classic-context flag the VS CSS uses to know which mode it is serving. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Four-commit sequence on decomp feature/classic-coop: P2 handoff fields and scrubs; VS CSS serving Classic mode; manager enrollment / lose rule / continue; per-stage setup, bonus stages, and co-op death rules. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…elf-pipe ProbeReadable wrote the probed bytes to /dev/null, whose driver (XNU nullwrite / Linux write_null) discards the request without copying from the source buffer — the probe reported every address readable. On any game-coroutine crash, WalkFPChain then stepped onto the adjacent coroutine stack's PROT_NONE guard page at the chain's base frame and SIGBUSed inside the signal handler, losing the original backtrace and re-raising the wrong signal (see docs/bugs/macos_crash_2026-06-10.txt). Probe via a self-pipe instead: pipe writes copyin the source bytes and genuinely fail with EFAULT on unreadable memory. Fds are created at watchdog init (pipe(2) is not async-signal-safe) with O_NONBLOCK + FD_CLOEXEC, and each successful probe drains its bytes so the pipe never fills. Verified by re-triggering the original crash: one CRASH line, full 13-frame coroutine-stack backtrace with the true faulting function at frame 0, process exits with the original signal. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Second-pad-dead family fixed: routing no longer reverts on device events, the Nth new pad auto-assigns to the first free port, and ports 2-4 get default gamepad mappings at init. Write-up in docs/bugs/controller_port_routing_2026-06-10.md. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
gEnhancements.ClassicCoopFriendlyFire (default OFF) with a "Co-op Friendly Fire" checkbox under the Classic Co-op toggle; read live at each stage setup so flipping it applies from the next stage. Decomp bump brings the CSS slot lock, wider spawn separation, P2 on the intro screen, and the team-attack overrides. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…endly fire) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
TechnicallyComputers
pushed a commit
to TechnicallyComputers/BattleShip
that referenced
this pull request
Jul 10, 2026
Classic Mode 2-Player Co-op
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Adds 2-player co-op to Classic (1P) mode, gated behind a default-ON "Classic Co-op (Needs reload)" toggle. With the toggle on, Classic mode opens the VS-mode character select screen so a second player can join the entire run — every battle stage, Break the Targets / Board the Platforms (shared completion in P1's character's map), Race to the Finish, and Master Hand. Challenger duels stay P1-solo. Full design notes in
docs/classic_coop.md.Highlights:
sc1PManagerIsCoopActive()).Bonus fixes that rode along:
/dev/null, which never copies from the source buffer, so it approved every address and the handler SIGBUSed on coroutine guard pages, losing the original backtrace. Now probes via self-pipe (docs/bugs/crash_handler_devnull_probe_2026-06-10.md).#1/#2labels (docs/bugs/controller_port_routing_2026-06-10.md).Submodule bumps: decomp →
f96117676(pushed toport-patches), libultraship →b58e7063(pushed tossb64).Test plan
🤖 Generated with Claude Code