Skip to content

Releases: ZakyPew/epoch-equinox

v0.7.3

Choose a tag to compare

@github-actions github-actions released this 18 Sep 19:06
0959457

v0.7.3 — Atmosphere

The pass asked for in Discussions: fog that belongs to the place you are
standing, and mist on the ground.

Fog takes its colour from the environment

Outdoors the chase camera's distance fog was already the sky's own
horizon tone. Indoors it was a fixed dark grey, whatever the room —
which is most of the games. Now a room with no sky borrows its own
palette instead: the renderer averages the tiles on screen and sinks the
result toward dark, so a blue-stone dungeon hazes blue-black, a lava cave
hazes ember, a wooden house hazes warm. The dark backdrop behind the
world wears the same tint, so the haze and the void it dissolves into
finally agree.

Ground mist

A new Ground mist slider (default on, gently) lays a pale veil over
water and low ground in the distance — full over water and floor,
thinning with height, gone on anything bush-height or taller — in the
chase camera and in the tilted dioramas. It starts a step behind the
ground Link stands on, so his surroundings stay crisp; the far lake and
the meadow beyond it sit in it. Outdoors the mist is a shade toward the
sky's clouds; indoors it is the room's palette, lifted.

The knobs, findable

The fog sliders used to sit unlabelled at the bottom of the voxel menu.
The Esc menu now has an Atmosphere section — fog begins, fog
strength, ground mist — with a line saying where the colours come from.
Everything saves to voxel/tuning.ini as before.

A renderer test that needs no cartridge

tools/vox_synth.c builds three scenes by hand — a meadow with a lake
under a spring sky, a blue-stone crypt, a red-brick forge — and pushes
them through the real renderer in the chase camera and the 45° diorama.
It checks with numbers that mist lifts the lake and leaves Link's ground
untouched, and that the crypt's far fog is bluer than red while the
forge's is redder than blue. CI runs it on every push: the first
renderer check that does not need a ROM.

What's Changed

  • Atmosphere: fog takes the room's own colour, ground mist, and a renderer test with no cartridge (v0.7.3) by @ZakyPew in #96

Full Changelog: v0.7.2...v0.7.3

v0.7.2

Choose a tag to compare

@github-actions github-actions released this 04 Sep 20:50
32158bb

v0.7.2 — Continue the Legend, made tight

A hardening pass on the linked-game handoff before anything gets built
on top of it. Nine end-to-end scenarios now run against both real carts
— both directions, every file slot, a cart that has never been saved, a
slot that turns out to be occupied, and the takeover rules — and one of
them caught a bug v0.7.0 and v0.7.1 shipped with.

The bug

After the other cart accepts your secret it writes the linked file and
returns to the file select with the cursor on file 1 — not on the
file it just made. The old machine pressed A there. If file 1 was empty
that was fine; if it already held a game (you had played the other
cart before), your old game started, with the new linked file sitting
unopened in file 2 or 3. The test that passed at the time was fooled the
same way: the neighbouring file happened to be linked and named Link
too. The machine now reads the file cursor back from the cart and steps
it to the slot it linked into before pressing A, then pages through the
linked prologue until Link is standing in a room. The test now checks
the file that started carries the sender's Game ID and has no playtime —
something only the new file can satisfy.

The rest of the pass

  • A banner. The handoff's messages were never drawn. Now a strip in
    the top-right says what the machine is doing (waking the cart, opening
    file N, choosing SECRETS, typing, accepting, opening the linked file),
    then the verdict for a few seconds after it stops.
  • One shot. states/handoff.txt is consumed the moment it is read,
    not on success. A handoff that stopped halfway — you took over, a menu
    was not where it should be — no longer lies in wait and drives the
    cart again on some later launch.
  • Occupied slot. If the slot the launcher called free holds a game
    after all, the cart loads it instead of showing SECRETS. The machine
    now notices a room going live before it should and stops at once, with
    your own file on screen and normal speed restored.
  • Held keys. The Enter or A that confirmed the launcher's dialog can
    still be down when the game window opens. That no longer counts as a
    takeover; you have to let go once before a press means anything.
  • Frame-counted. The machine advances on the emulator's own frame
    counter rather than on polls, so the runner's frame slicing can never
    shift a timed press.

tools/handoff_test.c documents the scenarios (HANDOFF_TO,
HANDOFF_SLOT, HANDOFF_FRESH, HANDOFF_EXPECT) and a HANDOFF_TRACE
mode that prints the file-select state the machine keys on.

What's Changed

  • Continue the Legend, made tight: reselect the linked file, banner, one shot, guards (v0.7.2) by @ZakyPew in #95

Full Changelog: v0.7.1...v0.7.2

v0.7.1

Choose a tag to compare

@github-actions github-actions released this 31 Aug 02:57
c4ed8eb

v0.7.1 — The handoff skips the intro

One change, the one you feel: Continue the Legend now runs flat out.

v0.7.0's linked-game handoff drove the second cart's menus for you, but
it drove them at normal speed — splash screens, the title, the file
select, the symbol grid, all in real time. Nobody should watch that.

Now the moment the handoff arms, the emulator switches to max speed (the
same lever as the player's own turbo toggle) and stays there for the
whole drive: boot, file select, SECRETS, the twenty symbols, the
confirmations. Normal speed returns the instant the machine finishes —
your linked game starts standing in a room at 60 fps, exactly where
v0.7.0 left you, just seconds after launch instead of the better part of
a minute.

The cancel rule is unchanged and still instant: touch any button while
the machine drives and it stops, restores normal speed, and hands you
the controls.

Under the hood this is a new runtime patch (gbrt-turbo-api.patch)
exporting the platform layer's max-speed flag to the host, plus three
call sites in the handoff machine: on at arm, off at success, off at
failure or takeover. The end-to-end test still passes with the same
deterministic finish frame, so turbo compresses wall-clock time without
moving a single input.

What's Changed

  • The handoff runs flat out: turbo while the machine drives (v0.7.1) by @ZakyPew in #94

Full Changelog: v0.7.0...v0.7.1

v0.7.0

Choose a tag to compare

@github-actions github-actions released this 31 Aug 02:05
4fa70a2

Epoch & Equinox v0.7.0

Prebuilt player. No game data included — drop your own ROMs into
roms/ next to the binary and run it.

The two games are one quest now

The Oracles were designed as halves of a single legend: finish one,
carry a twenty-symbol secret to the other, and only the linked quest
reaches the true ending. That carry — pause, transcribe, swap, retype —
is the one seam this player still had.

Continue Legend, in the launcher menu. Pick it on the game you
finished, and the other game starts and does the rest itself: walks its
own file select, chooses SECRETS on a free file, types your transfer
secret by driving the game's cursor — the same typist the Esc menu
uses, no memory writes, the game wins every disagreement — accepts it,
and stops only when your linked game is standing in a room. From Ages'
first tree to Ganon, no paper involved.

Touch nothing while it types; pressing any button hands control back to
you and stops the machine, because hands beat automation. If the free
slots are full or the other ROM is missing, it says so instead of
guessing. Ring secrets still transfer the old way (Vasu's, in-game,
where the panel already types them for you).

Under it

states/handoff.txt is the whole interface between the launcher and
the in-game machine — a plain file naming the target, the free slot and
the symbols, consumed on success and left for retry on failure. The
machine itself keys only on state the carts keep honest (the secret
grid's own flags, wScrollMode), because the file-select scratch bytes
turned out to be reused as counters during the intro — the probe that
learned this ships in tools/handoff_test.c.

Verified

tools/handoff_test.c runs the entire journey headlessly against the
real carts: encode a game secret from the finished Ages save in
tests/saves, boot Seasons cold, let the machine drive, and ask the
cart itself for the verdict — wFileIsLinkedGame set, a room live, the
handoff consumed. Twice, reproducibly, in ~2,400 frames. (It needs your
ROMs, so it runs locally rather than in CI; the encoder and typist it
builds on keep their CI suites.)

Also since v0.6.3: nothing — this release is the seam.

What's Changed

  • Continue the Legend: the two games are one quest now — v0.7.0 by @ZakyPew in #93

Full Changelog: v0.6.3...v0.7.0

v0.6.3

Choose a tag to compare

@github-actions github-actions released this 27 Aug 06:50
9902492

Epoch & Equinox v0.6.3

Prebuilt player. No game data included — drop your own ROMs into
roms/ next to the binary and run it.

One fix, worth shipping fast: the chase camera's pixel-cube shading no
longer draws a dot grid across the ground.
The sub-texel edge bevel
that looks right in the tilted diorama modes aliases at the chase view's
ray-step granularity — on a large window it smeared into a visible
lattice. The perspective ground and riser faces now shade whole blocks
instead (a per-texel checker that cannot moiré) and let it fade before
the fog takes over. The tilt modes keep the true edge bevel; the Pixel
cubes
slider still governs everything.

Reported live within the hour of v0.6.2 — thanks for the screenshot.

What's Changed

  • Chase ground: shade whole blocks, not sub-texel edges — v0.6.3 by @ZakyPew in #92

Full Changelog: v0.6.2...v0.6.3

v0.6.2

Choose a tag to compare

@github-actions github-actions released this 27 Aug 06:34
2dfdecb

Epoch & Equinox v0.6.2

Prebuilt player. No game data included — drop your own ROMs into roms/
next to the binary and run it.

One theme this time: the diorama look, chasing the best voxel demakes.

Pixel cubes

Every source pixel now reads as a tiny block — its top-left edge lit, its
bottom-right shaded — on diorama ground, chase ground, cliff and wall
faces alike. Trees and tufts, which were already per-pixel geometry,
now carry orientation light (canopy tops brightest, north faces in
shade) plus a faint checker so adjacent blocks catch the light
differently. The cart's own colours still do all the drawing; the edges
only modulate them.

Tilt-shift focus

A diorama-photo depth of field: sharp in the band where Link stands,
melting toward the top and bottom of the frame. The HUD and dialog
composite after it and stay crisp.

A horizon worth looking at

Outdoors in chase view, where the ground runs out, a two-rank forest
silhouette now undulates under the sky in the fog's own palette — and
unexplored ground sinks into haze with distance instead of smearing its
border pixels to the horizon as streaks.

Yours to tune

All of it lives in the Esc menu's new Diorama finish section:
Pixel cubes and Tilt-shift blur sliders, saved to
voxel/tuning.ini with everything else. Zero either slider and that
pass is gone entirely.

Verified

All render/logic suites pass; the reproducible dungeon route
(tools/dungeon_shot.py, new since v0.6.1) re-verified its room with
the new look, and docs/dungeon-chase.png shows it — the tower floor
reads as laid stone blocks now.

What's Changed

  • One command into Veran's tower: the dungeon screenshot route by @ZakyPew in #88
  • Document the headless new-game route by @ZakyPew in #89
  • The pixel-cube finish: bevels, tilt-shift focus, and a treeline by @ZakyPew in #90
  • Trees and tufts read as built from blocks by @ZakyPew in #91

Full Changelog: v0.6.1...v0.6.2

v0.6.1

Choose a tag to compare

@github-actions github-actions released this 27 Aug 04:35
3ed9393

Epoch & Equinox v0.6.1

Prebuilt player. No game data included — drop your own ROMs into roms/
next to the binary and run it. Everything v0.6.0 shipped, plus a week of
polish on top of it.

Saves, managed

A Saves page in the launcher menu. Import a .sav from any emulator —
checked by content before it lands (a Seasons save on the Ages page is
refused by what it holds, not its filename), and it works even before your
first in-game save, since the file's name is derived from the ROM the same
way the player derives it. Export copies anywhere. And nothing on the page
can lose a file: anything that replaces the save — an import, a restore —
backs the old one up first into save-backups/, listed right there with
one-click Restore. Each slot shows its run at a glance: essences, hearts,
rings, deaths, playtime.

The item tracker wears the game's own icons

python3 tools/rip_item_icons.py boots your carts headlessly over your
save, walks the game's menus, equips every item in the bag and reads each
icon out of the HUD's own sprites — real palettes, transparent background.
The overlay tracker shows them greyed until the run collects each item,
and falls back to text for anything unripped. The icons are your
cartridge's art: they stay on your machine, gitignored, never shipped.

Dungeons render right

Live dungeon frames went under the renderer for the first time, and three
fixes came out: large scrolling rooms (Veran's tower is 15×11 cells with a
roaming camera) no longer sample their terrain rows off; the phantom
pillars on the horizon are gone (they were HUD indicator sprites the game
parks invisibly behind the bar, billboarded into the world); and HUD tiles
no longer receive terrain heights. Link was already textured indoors —
docs/dungeon-chase.png is a current capture.

Sculpt mode: undo

Backspace un-paints, newest first, per room — and it puts back exactly
what each paint replaced, including hand-authored values that 0 (reset
to collision) could never restore. The HUD shows how many undos the room
you are standing in holds.

Also

  • Contributor onboarding: CONTRIBUTING.md, issue templates, and
    docs/CONTRIBUTOR_STARTER_TASKS.md backing the help wanted issues —
    each with its files, its fast headless loop, and what done looks like.
  • The headless tooling can now reach real gameplay: park a save and
    script the file select (tools/vox_shot.c documents the route). This
    is what unlocked the dungeon fixes and the icon rip.
  • README front page has a What's inside table that actually covers the
    project; the roadmap answers the Discussions request for fog and
    shaders (short version: chase-cam fog already exists and is
    live-tunable — an environment-coloured atmosphere pass is on the list).

Verified

save_manager_test (30 checks) proves the backup trail byte-for-byte
against real endgame saves; voxedit_test grew to 42 with the undo
trail; the dungeon fixes pass all five render/logic suites; and the 52
overlay render checks pass with and without ripped icons present.

What's Changed

  • Saves in the launcher: import, export, and a backup trail by @ZakyPew in #75
  • Sculpt mode: Backspace undoes paints, per room by @ZakyPew in #76
  • Saves page: each slot shows the run at a glance by @ZakyPew in #77
  • Roadmap: catch up with what shipped by @ZakyPew in #78
  • Dungeons render right: large-room mapping and phantom pillar fixes by @ZakyPew in #79
  • Item tracker wears the game's own icons, ripped from the player's ROM by @ZakyPew in #80
  • Docs sweep: feature overview, icon-rip guide, starter tasks, fog on the roadmap by @ZakyPew in #85
  • Contributor onboarding (supersedes #81), and v0.6.1 by @ZakyPew in #86
  • Add contributor onboarding and voxel starter tasks by @ZakyPew in #81

Full Changelog: v0.6.0...v0.6.1

v0.6.0

Choose a tag to compare

@github-actions github-actions released this 23 Aug 00:49
2db53ee

Epoch & Equinox v0.6.0

Prebuilt player. No game data included — drop your own ROMs into roms/
next to the binary and run it. Windows users can run the launcher exe; on
Linux run epoch, or launcher/epoch_launcher.py for the UI (needs Python +
PySide6).

Two headliners: sculpt the voxel world from inside the game, and a full
speedrunning kit — auto-splits that drive LiveSplit, plus a run timer, split
list, item tracker and input display on the stream overlays.

Sculpt rooms from inside the game

The voxel terrain has always been overridable per room with a text file, and
the file has always reloaded live. What was missing was everything in front
of that: you had to alt-tab to a text editor and type letters into a grid.

Now press F4 in any voxel mode (or toggle Sculpt room heights in the
Esc menu). The cell in front of Link glows gold — that's the brush — and the
number keys paint it:

1 flat · 2 water · 3 low · 4 mid · 5 high · 0 back to collision

Every press rewrites the room's override file for you, atomically, and the
terrain reshapes immediately. The files are the same documented format they
always were: hand edits and in-game edits are interchangeable, and cells you
authored by hand survive in-game painting. VOXEL_EDIT=1 still writes
templates, and now also starts the player with sculpt mode armed.

The gold highlight is painted into the terrain texture itself, so it lands on
the real extruded geometry in every voxel mode rather than floating in screen
space.

Auto-splits, driving LiveSplit

The player watches the game's own memory and splits when you earn the thing —
nobody hits a button mid-run. A split file is an achievement pack
(splits/<cart>.txt, same six condition kinds, same addresses), one entry
per segment, in route order. Both games ship an essence route; copy the file
and cut what you skip.

It deliberately does not keep the time: LiveSplit does, with your PB and
history already in it. Start LiveSplit's TCP server, tick Send splits to
LiveSplit
on the launcher's Stream page, and the player pushes
startorsplit the frame a condition fires. Loopback only; never blocks the
emulator; LiveSplit not running is silent and retried, so starting it
mid-session just works.

Two run-ruiners are designed out and tested: the file-select screen (a save
block sits in WRAM just to draw the preview — browsing files must not fire a
route) and loading a save mid-route (what the file already has is marked as
behind you without firing; the next real split still fires). The shipped
routes are verified end-to-end against real finished saves in CI.

The overlays learned to speedrun

Four new blocks on the stream overlays, each off unless switched on from the
Stream page:

  • Run timer — the file's own clock, to hundredths. It pauses when the
    game does and survives an overlay reload mid-run.
  • Split list — the route with your current segment marked, times from
    the game's frame counter.
  • Item tracker — the run's items lit as you collect them, from the same
    treasure bits the splits watch. Upgradeables name their tier: the cell
    says Noble, not "sword 2".
  • Input display — the buttons being held, in the Game Boy's layout.

Turning any of them on puts the overlay in run mode: the "now building"
ticker and the achievement plaque step aside for the split list.

Also

  • The overlays now have a rendering test in CI: every layout is loaded in a
    real Chromium over file:// — the way OBS loads them — and 50+ checks
    cover panels filling in and hiding, hole transparency, icon fallbacks, and
    that no block ever overlaps another or hangs off the safe area. It caught
    two real layout bugs before they shipped.
  • vox_shot prints why the terrain gate declined a frame, and documents two
    probe findings: the attract demo never populates wRoomCollisions, and a
    rewind-state resume restores VRAM but not banked WRAM (rooms look right,
    the game inside is not running).

Verified

tools/voxedit_test.c closes the sculpting loop headlessly: paint a cell,
then ask the override loader — the code the renderer actually calls — what
the room looks like now. 29 checks, including that two paints inside the
same second both land (mtime granularity would otherwise eat the second
one), that hand-authored cells survive in-game painting, and that garbage
codes are refused. tools/splits_test.c (34 checks) and the overlay render
test run in CI beside the rest of the suite.

The sculpt HUD and the gold tint follow the same drawing paths as the
shipped HUDs and terrain textures, but have not yet been eyeballed in a live
session — the two headless probe routes both turned out to run without the
game's collision state, which is the finding documented above. First F4
press on a real session will show it; the file-writing core underneath is
fully tested either way.

What's Changed

  • CI: retry transient vcpkg downloads by @ZakyPew in #66
  • CI: seed EGL registry from codeload by @ZakyPew in #67
  • add macOS arm64 release package by @ZakyPew in #68
  • fix macOS GLES header path by @ZakyPew in #69
  • make linker flags portable to macOS by @ZakyPew in #70
  • build macOS launcher in a virtualenv by @ZakyPew in #71
  • stabilize macOS package validation by @ZakyPew in #72
  • In-game room sculpting, auto-splits + LiveSplit, overlay speedrun kit — v0.6.0 by @ZakyPew in #73
  • Windows release: link ws2_32, and make the macOS SIGPIPE claim true by @ZakyPew in #74

Full Changelog: v0.5.0...v0.6.0

v0.5.0

Choose a tag to compare

@github-actions github-actions released this 12 Aug 20:11
7193e1f

Epoch & Equinox v0.5.0

Prebuilt player. No game data included — drop your own ROMs into roms/
next to the binary and run it. Windows users can run the launcher exe; on
Linux run epoch, or launcher/epoch_launcher.py for the UI (needs Python +
PySide6).

This release is the largest voxel-mode fidelity pass so far. The chase camera
now treats the cartridge's tiles as pieces of a 3D world instead of replacing
recognizable objects with generic shapes.

Tile-authored trees and structures

  • Full trees are fixed world geometry: a lower trunk and an upper hard canopy
    built from the live 16x16 source cell. They are no longer camera-facing
    billboards or rounded generated foliage.
  • Connected canopy variants join without internal side walls, while exposed
    sides fold the matching edge of the original tile art.
  • Bushes and grass tufts become shallow masked reliefs, leaving real ground
    beneath them.
  • Impa's tree house is recognized as one compound facade and canopy instead of
    six unrelated raised cells.
  • Terrain, structures, vegetation, Link and NPCs share depth, fixing sprites
    that appeared on top of Link merely because their OAM pieces were sorted
    separately.

Correct cliffs and plateaus

  • Oracle collision values $01-$0F are decoded as four quadrant bits, so
    half walls and corners keep their real footprint.
  • Connected cliff masses choose one consistent low/mid/high class.
  • Enclosed walkable ground rises to the exact level of its cliff lip. Objects
    on a shelf inherit that base elevation instead of floating above flat land.
  • Chase view projects straight world-space cliff faces and textures them with
    complete native 8px bands from the raised tile, avoiding stretched lines
    and bent per-column edges.

Chase camera, controls and scenes

  • A fresh chase camera starts directly behind Link, trails his movement after
    manual orbit input settles, and keeps the right-stick camera direction
    unchanged.
  • Keyboard and controller movement are remapped to the visible camera basis,
    fixing reversed W/S and A/D controls at rotated angles.
  • The camera checks walls and cliff geometry before choosing its distance, so
    it stays on Link's side of nearby architecture.
  • Scripted scenes remain voxelled but use a stable fixed voxel camera when the
    game temporarily freezes or replaces Link's gameplay object.
  • Dialogue and status UI are composited in screen space above that voxel
    scene instead of exposing a second flat game frame.

Developer handoff

docs/VOXEL_CONTRIBUTING.md documents the renderer
pipeline, the savestate/screenshot workflow, source-pixel rules, test matrix,
and a first-task queue for additional contributors.

One known prop still needs that next pass: the chest in the Ages opening scene
is drawn as a two-tile OAM object rather than the normal BG chest metatile. It
keeps the correct live art in this release but does not yet have a dedicated
body-and-lid volume. The guide records the evidence and the safe implementation
path instead of shipping a room-specific guess.

Verified

The release is covered by focused tests for collision quadrants, connected
cliff height, plateau elevation, screen-relative chase controls, initial
camera heading, camera collision, scripted-scene camera selection, persistent
world objects, and cross-platform updater archives. The player and launcher
are also built and smoke-tested on Linux and Windows by the release workflow.

Upgrading

Replace the previous release folder or use Updates in the launcher. ROMs,
mods, covers, saves, states and voxel tuning files are preserved.

What's Changed

  • v0.5.0: tile-faithful voxel world and developer handoff by @ZakyPew in #65

Full Changelog: v0.4.4...v0.5.0

v0.4.4

Choose a tag to compare

@github-actions github-actions released this 12 Aug 04:20
257359b

Epoch & Equinox v0.4.4

Prebuilt player. No game data included — drop your own ROMs into roms/
next to the binary and run it. Windows users can run the launcher exe; on
Linux run epoch, or launcher/epoch_launcher.py for the UI (needs Python +
PySide6).

Three fixes from a real setup, two of them things earlier releases claimed to
have handled and did not.

The chase camera chases again

It followed Link's position but held whatever heading you left it at, so
walking south changed nothing about where you were looking from. That was the
shipped default since v0.4.1: the old auto-swing resumed the instant the stick
went still, which made every adjustment feel like a fight, so it went off
entirely — and took the chasing with it.

It trails him again now, with the thing that made the old one unpleasant fixed
rather than switched off:

  • touching the stick buys about half a second before the camera starts
    drifting back
  • the drift eases in over about a third of a second, so a corner taken at
    speed reads as the view swinging round rather than snapping
  • turning on the spot still never moves it — only actually walking does
  • Trail behind Link while walking in the display menu turns it off for
    anyone who wants the camera parked where they put it

Recentring is unchanged: click the right stick (or C) to swing behind him
now, hold it to keep it there.

The overlay panel goes away when you stop playing

It was supposed to come down twelve seconds after the player stopped writing.
It never did. The guard measured when a sample last arrived, and samples kept
arriving: the player leaves stream/live.js on disk when it exits, so
re-reading it succeeds forever and every poll refreshed the timer with the
same hour-old numbers. Only deleting the file took the panel down, which
nothing does.

The player sends a heartbeat now, and liveness is "the numbers moved" rather
than "the file was there". An older player that sends no heartbeat still works
— the overlay falls back to the rest of the payload changing, which it does
the whole time anyone is playing.

A wrongly-sized browser source says so

An overlay in a source of the wrong size does not scale, it gets cropped: put
a vertical layout in a 1920×1080 source and the mat stops mid-screen with the
stats panel sliced off, which reads as a broken overlay rather than a
misconfigured source. Each layout knows the canvas it was drawn for and now
prints the numbers to type across the top when they disagree.

Verified

The camera test drives the same entry point the game does — stick input goes
through voxel_chase_turn now rather than being read inside the render step —
and covers trailing him round a corner, the pause after the stick, the ease
being an ease and not a snap, and holding still with the drift off. The old
assertions in it were pinning the behaviour that turned out to be the bug.

The panel's staleness was checked in a browser across all three cases: a
current player, one with no heartbeat, and the file going away. The size
warning was checked in both orientations, in both source sizes, and scaled
down.

Upgrading

The camera and the heartbeat are in the player, so this one needs the new
binary — replacing stream/ alone will not do it.

What's Changed

  • Chase cam trails him again, overlay staleness, size guard, and v0.4.4 by @ZakyPew in #64

Full Changelog: v0.4.3...v0.4.4