A marble game that generates its own levels
lost-your-marbles is a physics sandbox that turned into a game: you push a
marble through procedurally generated levels on a sixty-second timer, in Rust
on Bevy 0.14 with Rapier for the physics.
The pipeline is the interesting part, and it’s the reason the
greedy mesher has a home — that
article’s code isn’t a separate toy, it’s src/greedy_mesher.rs in this repo.
Levels start as tile grids from levelgen/, become voxel grids, get merged
into optimised triangle meshes, and only then become physics colliders. Tiles
are Floor, Wall, Slope, StartArea, EndArea, Obstacle, and there’s a whole
levelgen/graph/ pipeline — generator, refinement, validator — plus wave
function collapse in prefab/wfc.rs for assembling track pieces.
The part I didn’t expect: the game runs an HTTP server on 8080 and a WebSocket
on 8081, streaming marble state at 60 FPS and taking commands as JSON. Which
exists because there’s a Python AI player that plays it — ai_player_vision.py
connects over the socket, gets a deliberately limited vision radius, keeps a
memory of visited tiles, and drives the marble by posting world-axis forces.
The game made itself remotely controllable so something else could learn to
play it.
There are also enemy marbles with a four-state mind — wandering, chasing,
searching, stunned — that lose track of you behind walls, because line-of-sight
checks run against the tile grid and x_ray_vision defaults to false.
Reading the log, camera work dominates: eighteen of the eighty-five commits
touch it, and there’s camera.rs, camera_zones.rs, levelgen/camera_analysis.rs
and a docs/camera-modes.md. Zone-based tracking, slope-aware distance
clamping, an intro pan that follows the solution path along a spline. Which
makes sense for a rolling marble in generated terrain — the level is only
solvable if you can see it — but I don’t think I’d have guessed the camera
would be the biggest single line item.
Eighty-five commits between September 2025 and the 1st of April, when a game-controller support commit landed and it went quiet.
Related: the-meadow-grew-a-map — the other Rust-and-Bevy world here.
linked from
- Everything on GitHub, roughlyA one-line-each map of what's in github.com/sogh, so I stop having to remember. Only repos with real work in them (a dozen-plus commits, giv…
- A marble game still wearing its debug coloursimport hud from './hud.png'; import intro from './intro-pan.png'; import levels from './four-levels.png'; import reveal from './reveal.png';…