Downstream: a diffuse pollution game

Play Downstream in your browser · Project page · Source on GitHub

Downstream is a third-person game about diffuse pollution. Each catchment is generated from a seed, with ridges, valleys, a river network, fields, woods, a village and a fishery downstream. It is losing soil to its river. The player walks the landscape and repairs it by planting riparian trees, digging offline ponds and building leaky wooden dams.

The risk map the player works from is SCIMAP, running live in the browser on the generated terrain and re-solving every time something is built. Bright ground on the map is both erodible and hydrologically connected to a watercourse, which is where fine sediment comes from. The source risk, connectivity, erosion and in-channel risk layers can all be viewed in the game.

The SCIMAP source-risk layer over the catchment

Each tool acts on a different part of the model. Planting changes the land-cover weighting of the source term. Ponds and leaky dams break the connection between a source area and the channel, which caps the Network Index for everything upslope. The siting rules follow practice: leaky dams go in low-order headwater reaches and ponds go in hollows off the channel, and the game explains why a site is refused. The land-cover weights are used as they are, even where they are counter-intuitive. For example, planting trees on rough grazing slightly increases modelled erosion, and the game allows it and says so.

Lining up a leaky dam on a headwater stream

The player’s work can be tested against a 1-in-30 design storm, routed through the catchment by a lag-and-route flood model. The resulting hydrograph compares the flood peak with the interventions against the same storm without them. Smaller storms, sampled from the same Gumbel distribution, also arrive on their own.

The flood hydrograph after a design storm

Generation is exactly reproducible, so a saved game is only a seed plus a list of interventions: a few hundred bytes, small enough to share as a link. For teaching, ?seed= gives a whole class the same landscape to work on. The model code follows the reference SCIMAP implementation, with three deliberate departures that are documented in the design notes.