Flash Player moves its window back to the top of the screen once the
movie has loaded, bringing the menu bar back. The streamer now checks
the window twice a second and puts it back, logging the first few
times.
GTK draws the projector's menu bar in its window, not in a child window,
so the previous lookup found nothing and, under set -e and pipefail,
silently ended the block that moves the window. The movie is the
window's largest child, and its offset is the menu bar's height (56px
on flashbox). The block no longer stops on errors, logs what it measured
and where the window ended up, and GAME_WIDTH/GAME_HEIGHT, unused now,
are dropped.
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.
The session manager logs each session's creation, readiness time and
removal with its reason. A streamer that exits during startup now fails
the start at once instead of after 60 seconds, and the log carries its
exit code and last output; containers are no longer auto-removed, so
that output survives until teardown. A failed start reaches the app as
a 502.
The README opens with storage, CPU and HTTPS requirements, including the
per-player cost of streaming, and explains Flashpoint's legal standing.
Setup now uses the torrent and Infinity archive from Flashpoint's site,
and the streaming docs reflect the app proxying /stream/.
A new README for the combined project with setup from the Flashpoint
Ultimate torrent. New feature docs for streaming, proxy sign-in and
game saves; deployment, upgrade and streaming READMEs updated for the
single compose file; the project renamed throughout.
The app, session manager and streamer are built from source by a single
docker-compose.yml. Streaming is the opt-in "streaming" profile, enabled
by setting STREAMING_API_TOKEN. Replaces the separate production, dev and
streaming compose files.
Scaling the display up relied on full screen scaling the movie, but games
that set StageScaleMode.NO_SCALE stay at their native size in full screen,
leaving a small game against black. At the exact stage size, full screen
fits every scale mode and the browser scales the stream.
A game is streamable when its platform is allowed (STREAM_PLATFORMS,
default Java, Shockwave and Flash) and its launcher resolves under the same
rules fp-command applies. The display is sized from what it launches:
Director movies including Afterburner .dcr and pre-7 VWCF configs, SWF
headers scaled up to fit 1280x960, a page's largest embed, or a projector's
stage. Dimensions are rounded up to even for H.264.
fp-command applies the launcher's rules to any application path: execs.json
mappings, .bat to .sh, and .exe under Wine, resolving paths case-insensitively
and splitting launch commands as the launcher's shell command would. Windows
programs run from a writable per-session mirror of the install, with Director
Prefs and Flash saves linked into the synced saves. OldCPUSimulator, which
hangs under Wine, becomes cpulimit; Flash projectors go full screen; and
Flashpoint Navigator's toolbars are hidden. This replaces the LocalGames case.
fp-launch runs a LocalGames .exe with Flashpoint's bundled Wine from a
writable copy, linking its Prefs directory, where Director projectors save,
into the synced saves directory. Players without a save start from the Prefs
the game ships with. The image adds the X, font and PulseAudio libraries the
bundled Wine loads.
Creates a streamer container per player on flashpoint-web's request, sized
to the game's applet, proxies its Selkies stream under /stream/<id>/, and
removes it when the player disconnects. Saves under /config/saves are
seeded from the browser at start and pushed back over server-sent events.
The JSObject stand-in kept cookies in memory, so saves were lost when the
game restarted. Write them to a file the session manager can sync, with the
policy granting only the agent jar access to that directory.
A Java agent removes them when the viewer window opens, so the stream
shows only the applet. JSObject moves into the agent jar, which puts it on
the class path applets load from.
appletviewer has no netscape.javascript.JSObject, so applets that touch
JavaScript fail to load, and Java 8 denies applets the URLPermission they
need to fetch through an HTTP proxy. Add a JSObject stand-in with a working
document.cookie and a policy granting HTTP URL access.
Runs a Flashpoint game natively in a container and streams it to the
browser. fp-launch follows the Linux launcher's sequence: start the game
server, mount the game's zip, and run startJava.sh through the proxy.