In pal's registry: the button shows it in pal, which asks before installing; the command does the same from a terminal. This page can't see what your pal has installed.


What it does
Plays Flash games in pal with Ruffle, the Flash Player emulator: the games of the Flash games collection, each one a package of its own that runs on this. Saves and scores follow you like any pal game's.
- Ruffle, the open source Flash Player emulator, in every Flash game's page; no plugin
- ActionScript 1, 2 and 3 games, scaled to fill the panel with their shape kept
- A game's saves are kept in pal and follow you to your other machines when you sign in
- Scores go to the game's leaderboards when it keeps one
- Games pause when the panel hides and save what they had
- Its palette is the Flash games as a showcase, like Games; until the collection is added it offers to, and asks for its password
Palettes 1
-
Flash games
flashviewThe Flash games as a showcase, like Games: Enter plays one, or installs it first. Until the Flash games collection is added, it offers to add it.
Settings
No settings. It works out of the box.
The README
Everything Flash does, key by key, from the extension's own README.md
Flash
Ruffle, the Flash Player emulator (ruffle.rs, MIT or
Apache-2.0), for the Flash games. Each game is a package of its own that
requires this one; pal serves this extension's files on the game's origin at
/__ext/flash/ (protocol 8), so the game's page loads the runtime and Ruffle
under its own CSP.
A game package
<game>/
pal.json "requires": ["flash"], "sync": { "saves": { "each": "latest" } },
"leaderboards" when it has a score, a view palette
index.ts the palette: a surface at surface/index.html
surface/index.html /__pal/surface.js, then ../__ext/flash/surface/runtime.ts
surface/game.json { "swf": "game.swf", "score": { "from": "so:<SharedObject>/<field>", "board": "best", "order": "desc" } }
surface/game.swf
test/flash-game/ is one, on Ruffle's own SharedObject test SWF.
swf may carry a query (hw_preloader.swf?file=game.swf), which the SWF
reads as its parameters. content ("content/") names the folder that keeps
the game's other files under the URLs they had on the web
(content/<host>/<path>): a request for http://<host>/<path> is answered
from there, so a game that loads its levels or sounds by their old address
finds them. Relative URLs resolve against the SWF's own folder.
renderer (canvas, webgl, wgpu-webgl) picks Ruffle's renderer for a
game that needs one.
score.from is so:<name>/<path>, a number in one of the game's
SharedObjects (TopScore, stats.best), or ei:<function>, a function the
game calls through ExternalInterface (a patched SWF). A better value than
the last goes to board. A boolean sound setting, when the game declares
one, mutes it. The view's mute action ("Sound on or off", cmd+m: the
game owns the bare letters) flips sound for that game and is remembered in
its storage as muted.
What the runtime does
- Plays the SWF filling the view with its shape kept, sponsor links refused.
- Stands an in-memory
localStoragein for the frame's (an opaque origin has none): Ruffle's SharedObjects land there and in the game's storage assaves, keyed relative to the extension's root so macOS, Windows and the web agree. Saves synced in from another machine restart the game on them. - On hide, flushes the SharedObjects (a
pagehide, which is when Ruffle writes them) and suspends; resumes on show. - Answers
ExternalInterface.callwithouteval, which the CSP refuses.
Ruffle
make ruffle vendors it into surface/ruffle/ from npm at the version
pinned in ruffle.sh, checked against its integrity. Both of its builds are
kept: the WebAssembly-extensions one (what WebKit on macOS loads) and the
plain one Ruffle falls back to where those are missing, which WebKitGTK on an
older Linux may be.