Skip to content

Releases: stoatworks-labs/coinop

v1.0.0

Choose a tag to compare

@github-actions github-actions released this 11 Aug 21:09

What's Changed

  • Bump softprops/action-gh-release from 2 to 3 by @dependabot[bot] in #1
  • Bump actions/download-artifact from 4 to 8 by @dependabot[bot] in #2
  • Bump actions/upload-artifact from 4 to 7 by @dependabot[bot] in #3

New Contributors

Full Changelog: v0.3.0...v1.0.0

v0.3.0

Choose a tag to compare

@stoatworks-labs stoatworks-labs released this 06 Aug 22:12

A fourteenth game, and the cheapest one yet.

Flapper — one button against gravity, through the gaps in a wall that scrolls past. It joins the other thirteen in the same dropdown, in the same two bundles, and it cost no new cell type and no new parameter: the columns are Wall, which already meant "the thing you die on", and the flier is Head.

The press sets the vertical velocity rather than adding to it, so every flap is the same arc from wherever it was pressed. That is what makes it readable — you are timing one thing, not managing a throttle.

Termination had to be built in, again

Skill only works on a game you can misjudge, and this is not one: holding a single axis between two horizontal edges is an easier control problem than Stacker or Duel, and a competent flier at a fixed difficulty simply never dies. A layer that never changes is the thing the respawn delay exists to prevent.

So difficulty here is a ramp rather than a setting. Every column passed narrows the gap, speeds the scroll, pulls the columns closer and widens how far the next hole may sit from the last — until the hole is further away than the flier can travel between two columns. That is arithmetic on the ramp's own floors, and coinoptest does the arithmetic rather than trusting the comment above it.

Two faults that every check passed straight through

Both are worth naming, because neither was visible to a harness that asserts on state.

The first autopilot never passed a single column, on any seed, while satisfying every assertion in the file — dying in bounds having touched nothing is a legal way to play. It projected free fall forward and so settled a braking distance above the hole it was aiming at; aiming at row 12 it hovered at row 7 and clipped the top of every column. A damped position error fixed it, and Score() > 0 is now a check.

The playfield then scrolled in from the right over about two seconds, and because losing a life cleared the columns it did it again on every death — three black stretches a game. An empty playfield is a legal playfield, so nothing caught it until the opening seconds were rendered out and looked at. The field is now built full, with a runway ahead of the flier.

That is the third time in this repo a real fault has survived the whole suite and been found only by looking at the picture. AGENTS.md now says so plainly.

Verification

coinoptest 243 → 268 checks, coinopgl 31 → 33. The browser demo carries all fourteen, each held to the C++ byte for byte by demo/tools/check_sim.mjs — and Flapper is the first port that did not match on its first run. The cause was the one that file had warned about in the abstract: 0.12f + 0.10f * 0.5f is 0.169999998 as a float and 0.17 as a double. The other thirteen get away with doubles because they re-quantise to whole cells constantly; Flapper never puts its floats down.

Still not verified

It has never been loaded into Resolume. The FFGL parameter and clock plumbing is the part no harness here reaches — check it in your own rig before trusting it in a show.

Full Changelog: v0.2.0...v0.3.0

v0.2.0

Choose a tag to compare

@github-actions github-actions released this 06 Aug 20:30

Eight more games, taking the plugin from five to thirteen.

Stacker, Chase, Girders, Swarm, Trails, Reflex, Rafters and Duel join Snake, Bricks, Marchers, Rally and Drift. They are still one dropdown in two bundles — a source and an effect — and between them the eight cost one new cell type. No new parameter, no per-game shader branch, no second plugin ID.

  • Stacker — falling polyominoes. Ten mixed shapes across three sizes, and any contiguous run clears rather than a full row, which is the only rule that works on a playfield thirty cells wide.
  • Chase — a maze carved fresh at every level, with loops knocked through it, and four pursuers that each want somewhere different.
  • Girders — climb the floors while the hazards cascade back down them.
  • Swarm — a formation that attackers peel out of, dive from, and rejoin.
  • Trails — riders that never stop, leaving walls. A head-on kills both.
  • Reflex — a prompt, a closing window, and the right button or nothing.
  • Rafters — hit the floor from underneath to flip what is standing on it.
  • Duel — two fighters with wind-up, active and recovery frames, best of three.

On the names, and on the parts that are not the names

The mechanics of these games are the unprotectable part; their expression is not. Tetris Holding v. Xio Interactive (2012) held exactly that — the rules of a falling-block puzzle are an idea, and the defendant still lost, on the playfield's dimensions, the seven specific pieces, their colours, the ghost piece and the next-piece preview.

So none of these is named after what it descends from, and more to the point none of them copies the features a court has named: the playfield is whatever the Grid parameter says, colour comes from the palette by role rather than a per-object scheme, and Stacker has no ghost piece and no preview. source/games/Stacker.h works through that list item by item.

Verification

coinoptest 101 → 243 checks, coinopgl 15 → 31. Four of the new assertions failed on their first run and all four were real bugs. Three further faults survived every one of them and were only found by rendering the games and looking at them.

Three of the new games needed termination built in structurally, because Skill only works on a game you can misjudge: Stacker at full Skill cleared runs for six thousand ticks and never topped out, Reflex is a reaction test a machine simply wins, and two perfect Duel fighters keep their distance forever.

The browser demo now carries all thirteen, each held to the C++ byte for byte by demo/tools/check_sim.mjs.

Still not verified

It has never been loaded into Resolume. The FFGL parameter and clock plumbing is the part no harness here reaches — check it in your own rig before trusting it in a show.

Video: https://www.youtube.com/watch?v=29Ay4AHsk5o (the current cut — it opens with v0.3.0's game, then runs through the eight this release added)

Full Changelog: v0.1.0...v0.2.0

v0.1.0

Choose a tag to compare

@github-actions github-actions released this 04 Aug 22:04