ADR-0003: Drop local split-screen; Racoon Riot is online-only
- Date: 2026-08-22
- Status: Accepted
- Decision maker: Joao Miranda (product owner)
- Ticket: RIOT-74
Context
Section titled “Context”The documentation claimed local split-screen was the shipped mode, and claimed it confidently:
CLAUDE.md:10— “Local split-screen is the shipped mode”CLAUDE.md:16— “Multiplayer: Local split-screen, plus online multiplayer in progress”CLAUDE.md:294— “Always consider split-screen impact for new features”
git diff dev purrnet-implementation -- CLAUDE.md shows both of the first two are additions on
this branch, replacing “Local multiplayer only (online planned for future)”. Somebody reviewed
that section deliberately and wrote a fresh, confident statement — which is what made it the most
misleading text in the repo, since freshly-edited prose gets trusted more than obviously-stale
prose.
The code contradicted it in four independent ways:
LocalPlayerManager.cs:14—private PlayerBase _localPlayer = null;. Exactly one, on a static singleton.- Zero viewport code project-wide: no
splitscreen,viewportRect,PlayerInputManagerorlocalPlayerCountanywhere underScripts/. - Zero cameras in the gameplay scenes —
MainMenu.unity,Lobby.unityandNewApartment.unityall have^Camera:count 0. - The entire camera stack was deleted in
44a42fbb. What survives isSingletonCameraController.cs: 17 lines, a staticInstance, anAwakethat destroys duplicates, no camera logic, declared in the global namespace.
Four open GitHub issues (#169, #390, #391, #393) are split-screen bug reports against a subsystem that no longer exists.
Decision
Section titled “Decision”Local split-screen is not a product requirement. Racoon Riot is online multiplayer only.
One local player per connection is a decided invariant, not an accident of the current
implementation. LocalPlayerManager holding a single PlayerBase is correct and must stay that
way.
Alternatives considered
Section titled “Alternatives considered”Keep split-screen alongside online. Rejected. It is effectively a separate project:
per-connection multi-identity ownership in the PurrNet layer, PlayerInputManager device pairing,
N viewport cameras, N HUDs, and recovery of the deleted camera stack from 44a42fbb^ as local
code which then has to be networked. Weeks to months, and it contradicts decisions already taken —
ADR-0001 assumes one owner per connection, and RIOT-41/RIOT-49 treat LocalID as one value per
peer (PlayerBase.cs:112 resolves every remote player to NotLocalPlayer).
Defer. Rejected as the highest-total-cost option. It was the status quo, and it meant every downstream ticket got written against an unstated assumption and then revisited.
Consequences
Section titled “Consequences”CLAUDE.md:10,:16and:294are corrected in the same commit as this ADR. The full rewrite stays with RIOT-3.- GitHub issues #169, #390, #391 and #393 are queued for closure as obsolete in the triage ticket (RIOT-194 / RIOT-132).
- RIOT-51, RIOT-41 and RIOT-49 are annotated: one local player per connection is decided, not assumed.
SingletonCameraController.csstill needs a disposition (RIOT-200). It is not a camera system under either option and this ADR does not rescue it.- If split-screen is ever reinstated, the ownership model is a rewrite rather than an extension. That risk is accepted knowingly.
Open question, separate from this decision
Section titled “Open question, separate from this decision”Ask Ashton/Resipate whether split-screen was deliberately dropped in 44a42fbb or was
collateral damage. It does not change this decision, but it changes how much of the deleted camera
stack is worth recovering for the single-player-view case. Bundle with RIOT-62.