Files
branderson 1306a88b0e fix(streaming): hide Flash Player's menu bar without full screen
Some games break in Flash Player's full-screen mode: in Bloons darts
make a sound but never fly. Instead of pressing Ctrl+F, the streamer
stretches the projector's window to the display and moves it up by the
menu bar's height, measured from the window's opening height and the
movie's. The session manager now passes the game's exact size as
GAME_WIDTH/GAME_HEIGHT and rounds only the display size to even.
2026-10-14 17:25:27 -07:00
..

Streamer

Runs a Flashpoint game natively on the server and streams it to the browser with Selkies, for platforms that cannot run in a browser. One container plays one game, set by GAME_ID. It launches games the way Flashpoint's Linux launcher does, so Java applets, Shockwave and Flash run, as do Windows games installed under LocalGames/<name>/ with an application path of LocalGames\<name>\<game>.exe.

Requirements

A Linux Flashpoint install. The streamer uses the Infinity build's Server/FlashpointGameServer, FPSoftware/Java and FPSoftware/Wine, which Ultimate's archives only include for Windows. scripts/setup-flashpoint.sh --infinity adds them without overwriting anything.

Running one by hand

The session manager normally starts these. To debug a game on its own:

docker build -t dotcom-arcade-streamer streaming/streamer
docker run --rm --shm-size 1g -p 3001:3001 \
  -v /path/to/flashpoint:/flashpoint:ro \
  -e GAME_ID=<game id> -e SELKIES_MANUAL_WIDTH=800 -e SELKIES_MANUAL_HEIGHT=600 \
  -e RESTART_APP=true -e NO_DECOR=true \
  dotcom-arcade-streamer

Open https://<host>:3001 and accept the self-signed certificate. The launch log is at /config/fp-launch.log inside the container.

How it works

fp-launch follows the Flashpoint launcher's Linux launch sequence: it starts the game server, mounts the game's zip through the server's mountzip API, and runs the game's application with its HTTP proxy pointed at the game server. Selkies restarts the game when it exits (RESTART_APP).

appletviewer lacks two things applets got from the browser's Java plugin, so the image adds them: a netscape.javascript.JSObject stand-in whose window has a document.cookie that persists to /config/saves/cookies.txt, and a policy allowing HTTP requests through the game server's proxy. The same jar (applet-support/) is loaded as a Java agent that removes appletviewer's menu bar and status line.

Other games go through fp-command, which applies the launcher's rules: it maps the application path through Data/execs.json, swaps .bat for .sh, and runs .exe files under Flashpoint's bundled Wine. Windows programs run from a writable mirror of the install, since they write beside themselves; a Director projector's Prefs, where it saves, is linked into /config/saves, as is Flash Player's save directory, so the session manager syncs both to the player's browser. OldCPUSimulator hangs under Wine, so its target runs under cpulimit at the same share of the CPU. A Flash projector's window is stretched to the display and moved up by its menu bar's height, which hides the menu bar; the height is the window's opening height less the movie's (GAME_HEIGHT). Its full-screen mode isn't used, since some games, such as Bloons, don't play right in it. Flashpoint Navigator's toolbars are hidden.