Doom Controller

Doom Controller icon

doom-c is the smartphone touch controller for the RCWeb doom viewer. Open it by scanning the viewer's QR code or visit /doom-c/?r=<room> with the same room as the display.

About the game

The paired viewer runs Doom's original 1993 shareware campaign, Episode 1: Knee-Deep in the Dead. It is a nine-level single-player journey through the UAC facilities on Phobos, where the player explores interconnected maps, finds keys and supplies, fights demons, and reaches each level exit. The phone is only the input device: the complete game, WebAssembly engine, graphics, music, and sound effects stay on the shared display.

Connection and ownership

  • The first connected phone owns Doom's single-player controls. A later controller waits until the owner leaves the RCWeb room or its presence has been missing for seven seconds.
  • The controller stores its RCWeb identity in the browser. Refreshing the page reconnects with that identity and reclaims the active controls automatically.
  • Viewer and network status are shown at the top of the controller. Back to apps returns to the controller catalog when that route is available.

Controls

  • Drag the movement stick up/down to move and left/right to turn. Diagonal drags send both directions together, allowing movement and turning at the same time.
  • Drag the Strafe slider left or right for sideways movement. Release the slider to stop and recenter it.
  • Multi-touch controls let you hold Fire, Use, or Run while steering or strafing. Fire also acts as Select in menus.
  • Tap Weapon to cycle weapon slots 1-7.
  • Use the prominent top Menu button to open or close Doom's menu, then use the stick for one-item navigation and Select or Fire to confirm.
  • Reset game asks the connected Doom viewer to reload.

How controls reach the viewer

Both apps connect to RCWeb with the same room ID. Touch input is reduced to named press and release events, and the controller sends them with rc.sendFunctionCall to the doom app target. RCWeb forwards those calls only to Doom viewers in the same room.

Every message includes the current RCWeb client ID and the controller identity saved in local storage. The viewer uses both values to reject input from waiting phones while allowing the owning phone to recover after a refresh changes its WebSocket connection. The controller announces its presence every two seconds, and the viewer sends readiness and ownership state directly back to that controller client.

The viewer converts accepted actions into Doom's keyboard input. Because forward, backward, turning, strafing, running, using, and firing have independent press/release state, several controls can remain active together. Menu and weapon commands are short taps. When the controller is hidden, blurred, refreshed, or closed, it releases its local actions and asks the viewer to release all held keys; the viewer also clears them if the controller disappears or times out.

No gameplay data is processed by the phone or persisted by the RCWeb server. The controller sends input intent only; the paired viewer remains the authoritative Doom session.

DocumentationServer TelemetryServer StatsServer HTTP LogServer WebSocket Log