Skip to content

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

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:14private PlayerBase _localPlayer = null;. Exactly one, on a static singleton.
  • Zero viewport code project-wide: no splitscreen, viewportRect, PlayerInputManager or localPlayerCount anywhere under Scripts/.
  • Zero cameras in the gameplay scenes — MainMenu.unity, Lobby.unity and NewApartment.unity all have ^Camera: count 0.
  • The entire camera stack was deleted in 44a42fbb. What survives is SingletonCameraController.cs: 17 lines, a static Instance, an Awake that 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.

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.

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.

  • CLAUDE.md:10, :16 and :294 are 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.cs still 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.