Skip to content

Releases: oscargala/openages

Release list

OpenAges v0.1.0

Choose a tag to compare

@oscargala oscargala released this 28 Oct 11:04

The first release of OpenAges, the client of Myst Online: Uru Live in a web browser: H-uru's Plasma engine compiled
to WebAssembly with Emscripten and drawn with WebGPU. It builds in two flavours from the same source: plClient
(CPython 3.12.9) for shards that serve H-uru's Python 3 game scripts, and plClient-py2 (CPython 2.3.3) for shards
that serve the original Python 2.3 scripts of MOULa.

The release is the source at the tag v0.1.0 (commit 778b8b166fb1eeb2097e70940b554bb685e93bff) and one file: the
source of every third-party component the clients link. The game's Ages, textures and sounds belong to Cyan Worlds and
are not part of it; a shard serves them.

Files

File Bytes SHA-256
openages-v0.1.0-third-party-sources.tar 645,191,680 98665dfd9da583b53c928165c80c3dda4876f740a08d0dea555d57770b6a5075

The archive holds the bundle that web/build/notices/source_bundle.py assemble makes from the pins in
web/build/sources.lock: the pinned downloads, CPython 2.3.3's tree with the proof of its pin, each vcpkg port's
download and port directory, and Emdawnwebgpu's archive, with MANIFEST.json, SHA256SUMS and
THIRD_PARTY_NOTICES.md. Its README.md says what is where. The build tools used unmodified (emsdk, Node.js, CMake,
Ninja, the vcpkg tool, the GNU autotools) are listed in MANIFEST.json and not included. To check it against the
pins, from a checkout of the tag:

tar -xf openages-v0.1.0-third-party-sources.tar
python3 web/build/notices/source_bundle.py check openages-v0.1.0-third-party-sources

The release's clients

The release's clients were built from this tag with RELEASE=1, so they record the commit and the tag: the login
dialog reads UruLive.1.918 - v0.1.0 - External.Release. Each build also writes <client>.release.json, which the
deployment tools turn into the deployment's source.json.

File Bytes SHA-256
plClient.js 281,255 c221e993fc6dea766a18f6302bbaa6cd8fc318c6f570cc7a2f3eb1ea5e58586d
plClient.wasm 19,441,439 fa7ab5e09e7bf1fe932aa6f78317eda8197844e150addb4e5e54797873e4c9c4
plClient-py2.js 277,845 44877ebdb71fe6c918c38e539b58e47ebee0457d567bedd859e6a72d6d93df93
plClient-py2.wasm 13,908,078 03308c9e478abcd03401523505994665e475f8cdcafec1f45a7b344dfc46b228

The same builds wrote a symbol map for each client, which a deployment does not serve: plClient.js.symbols
(1,999,771 bytes, 550b0e5bc2165b6aea74ca0e1b8db3f275f16b5fdd00256de90761b8265275dc) and
plClient-py2.js.symbols (1,946,706 bytes, 1185f7aa4f4f50e6d57dcc78e05620b38e1a6bb3ab69518af0ed0c2335551d5b).

Building them again

Docs/Web/Building.md has the prerequisites: Emscripten 6.0.12 through emsdk, the dependency prefix that
web/build/build-deps.sh builds, and vcpkg. With EMSDK, PLASMA_WASM_DEPS and VCPKG_ROOT set as it describes:

git clone --branch v0.1.0 https://github.com/oscargala/openages.git /tmp/openages-v0.1.0/src
cd /tmp/openages-v0.1.0/src
export RELEASE=1 PLASMA_WASM_CMAKE_ARGS=-DCMAKE_EXE_LINKER_FLAGS_RELEASE=--emit-symbol-map
PLASMA_WASM_BUILD=/tmp/openages-v0.1.0/build-py3 web/build/build-client.sh
PLASMA_WASM_PYTHON2_STAGE=/tmp/openages-v0.1.0/py2deps web/build/python2/build.sh build
PLASMA_PYTHON_ABI=2 PLASMA_WASM_PYTHON2=/tmp/openages-v0.1.0/py2deps/python2 \
    PLASMA_WASM_BUILD=/tmp/openages-v0.1.0/build-py2 web/build/build-client.sh

Rebuilt this way on the Mac that made the release, every file above came out byte for byte the same. A rebuild on
another machine has not been measured yet.

Why these paths. A release build with a symbol map gives the same bytes only when the checkout and the two build
directories are at the same paths. The paths reach the names that ThinLTO gives to the local functions it promotes,
which the symbol map keeps, and the order of a few functions that share a name. Built from the same tag with the
checkout in another folder, the JavaScript files were the same and the wasm files differed in 1,481 (plClient) and
1,334 (plClient-py2) bytes, all of them that order and those names. /tmp exists on macOS and Linux without root
and names no user. Use the paths exactly as written: on macOS /tmp is a link to /private/tmp, and the build has to
see /tmp. The dependency prefix can be anywhere, since the builds map its path to a fixed name, and which vcpkg
checkout the build reads does not reach the clients.

What was tested

Before the release, on this commit's source, in Chromium 156 on a Dirtsand test shard, with scripted mouse and
keyboard input:

  • login and the player list, Relto, the link to Eder Gira, a second login that finds the first session's state, the
    intro movies, the links into Ahnonay and Minkata, and the game's Quit;
  • the Python 2.3 client on a shard that serves MOULa's game code: login, Relto and the link to Eder Gira, with no
    Python tracebacks;
  • six fixed camera poses, compared pixel by pixel with the native client: each gave the same frame as before, and
    0.6 % to 31.5 % of the pixels differ from the native client's by more than 16 of 255;
  • a median of 60 frames per second in every phase, at least 58.9 in every one-second window inside an Age; the
    longest frame took 35 ms inside an Age and 0.63 s while a link loads;
  • 491 MiB of WebAssembly memory over three links, and a peak of about 2.3 GiB for the browser's processes (2.8 GiB in
    a private window).

On the release's own plClient above, the player page was played again, served by the origin server and as a static
kit: login, the player list, Relto and the game's Quit, exit code 0, 60 frames per second in Relto.

README.md, "Status", has every Age and what was measured.

Browsers

Chromium 156 is in every check and works. Firefox 157 and Safari 27 were tested once, in October 2026, and are not
in the regular checks; start-up, an online session in Relto and Eder Gira, sound and input worked in both. Windows,
Linux, phones and tablets have not been tested: everything was measured on one Apple-silicon Mac.

Known limits

  • The browser's frames are not yet identical to the native client's (above).
  • In Firefox a screenshot of the canvas sometimes comes back empty.
  • Mouse capture is unverified.
  • The Descent and the parts of the Ages that the test shards' state closed are untested.
  • The Python 3 client does not load Tomahna on a shard whose Cleft.py predates H-uru's fix.
  • The HD texture pack builder is not part of this release.

Licence

OpenAges is free software under the GNU General Public License, version 3 (LICENSE.txt), with the additional
permissions that H-uru Plasma carries (COPYING.txt). THIRD_PARTY_NOTICES.md names each third-party component and
its licence, and the file above carries their source. A deployment names its repository, its tag and the address of
this file in source.json (Docs/Web/Deploying.md, "Source code and licence files").

Before publication

The commits, files and messages that this repository adds to H-uru's history, and this tag, were scanned for private
paths, network addresses, credentials and game data with the project's own patterns, and the commits again with an
independent second implementation, and then with gitleaks 8.30.1. Neither of the project's scans found anything
private. gitleaks flagged six lines, each reviewed: two WebSocket handshakes that send RFC 6455's sample key, a
made-up test key (the bytes 0 to 63), and three comments that describe a formula or name source files. None is a
secret.

How it was written

The browser port was written with AI coding assistants, with the native C++ client as its specification, and
checked against measured results. See
How it was written in README.md.