Skip to content

proof of concept: press to join#688

Draft
briaguya0 wants to merge 7 commits intoHarbourMasters:mainfrom
briaguya0:press-to-join-plan
Draft

proof of concept: press to join#688
briaguya0 wants to merge 7 commits intoHarbourMasters:mainfrom
briaguya0:press-to-join-plan

Conversation

@briaguya0
Copy link
Copy Markdown
Contributor

@briaguya0 briaguya0 commented Apr 17, 2026

includes:

see docs/press-to-join.md for details

screencast-fixed.mp4

briaguya0 and others added 7 commits April 16, 2026 21:51
Kenix3/libultraship#972 changed the OpenGL backend to load a single
combined default.shader.glsl instead of separate .fs and .vs files.
The assets were never updated to match, breaking the OpenGL renderer.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Design doc for a press-to-join system that replaces manual controller
assignment for multiplayer. Device identity never matters — only user
actions drive assignment. Addresses the pain points from LUS #792/#793
simplification without reintroducing device persistence (#1058) or
auto-distribution (#964).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Configure needs -DCMAKE_BUILD_TYPE=Debug to avoid -Wincompatible-pointer-types
errors in courses/*/course_offsets.c on GCC 15.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Call MultiplayerStart(gPlayerCount) when confirming game mode with 2+
players. Poll MultiplayerGetPortStatus each frame on PLAYER_ONE during
character select, filling each port's cursor position as its controller
joins. Block the "all selected" transition while any active port is
still unjoined.

MultiplayerStopPressToJoin on leave to map select,
MultiplayerStartPressToJoin on return, MultiplayerStop on B back to
main menu.

Bump libultraship to include the input editor toggle, per-port
gamepad defaults, and release-edge assignment.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Always render every active player's cursor at its default grid slot,
and use gSPGrayscale to desaturate it until MultiplayerGetPortStatus
returns joined. Keeps the colored frame and number badge visible but
makes waiting slots clearly distinct from claimed ones.

Single source of truth for "is this port joined" is now the port status
bridge rather than piggybacking on grid selection == 0. Init always
sets grid to i+1, the auto-assign block only plays the join sound on a
status 0->1 transition, and the all-selected gate asks the bridge
directly.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Document the activation grace period, release-edge assignment, and
StopMultiplayer ignore-list wipe. Rewrite Part 5 around
MultiplayerGetPortStatus as single source of truth for joined state.
Record actual hook locations in Part 6 and note that the
MAIN_MENU_MODE_SELECT hook wasn't needed. Add Part 8 for the POC
default-mappings-on-all-ports loop in ControlDeck::Init, and a "POC
Limitations / Known Gaps" section listing the one-off "stolen input"
report, keyboard release-edge gap, and analog-stick feel concern.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
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.

1 participant