Skip to content

v2.6.0

Choose a tag to compare

@github-actions github-actions released this 23 Sep 08:28
· 124 commits to main since this release
8bbc1b9

Release v2.6.0

Build Details:


Changelog

Changes since v2.5.0

Version 2.6.0 lets you hand-push terrain past the normal 0% to 100% elevation range. Previously, raising sea level to shape nicely sized islands ate into how much room was left to draw mountains, since land elevation is always compressed into the space between sea level and 100%. Now the terrain brush, tectonic fault lines, and manual rivers can all push elevation beyond that range, so you can raise a taller peak or carve a deeper trench without needing to touch sea level at all. Procedurally generated terrain, the noise-driven hills and ridges the engine creates on its own, is not affected by this and still always generates within the normal range - only terrain you hand-edit afterwards can go further.

Note: A few existing maps may look slightly different after this update. Convergent tectonic faults and hotspot island chains drawn at a high strength setting, in a spot where the noise happened to be favourable, could previously compute a peak taller than 100% and have it silently flattened to exactly 100%. That peak now shows its true, slightly taller height instead. This only affects maps with fault lines at or near maximum strength, and the difference is small (and more realistic).

FEATURES

  • Unclamped edits: The terrain brush, tectonic fault lines, and manual rivers can now raise elevation above 100% or lower it below 0%, giving you room to hand-place a mountain taller than the current sea level's compression would otherwise allow, or a trench deeper than the ordinary seafloor, at any sea level. The on-canvas elevation readout shows the real value, so a hand-raised peak might read as, for example, 118%, and a hand-carved trench as -12%.
  • Ocean now shades relative to the deepest point actually on the map, so a hand-carved trench reads visibly darker than ordinary ocean instead of looking the same as any other moderately deep water.
  • Grid-cell exploration data: Exporting to a Scene now also writes a structured summary of every grid cell onto the Scene itself - its dominant biome, terrain, moisture and temperature, whether it has a river or borders the coast (and the name of any custom river you've drawn through it), and which of your regions, points of interest and routes touch it. This is aimed at other modules and game systems - for example, one that picks a random encounter when a token explores into a new cell - and has no effect on anything you see in Foundry yourself. No summary is exported for gridless maps.

IMPROVEMENTS

  • Reduced the verbosity of the console logs when generating or updating maps.

BUG FIXES

  • Dragging a Biome Rule Editor range handle, or picking an elevation zone preset, now stores the value rounded to the same two decimal places already shown on its chip. Previously the true stored value could differ from the display by a tiny fraction, so two ranges dragged to what looked like the same boundary (for example, both reading "0.55") could actually leave an imperceptibly thin, unintended gap between them that no rule covered. This only affects ranges set from this point on; a rule range saved before this update keeps its exact old value, so an existing gap of this kind needs that range re-dragged (even nudged and back) or reset via the elevation zone presets to close it.

UNDER THE HOOD

  • BrushEngine#stampTerrain no longer clamps elevation to [0, 1]; every terrain tool, and the slope tools' anchored target elevation, can now write and track values outside that range. Live painting and BrushLayerCache replay continue to share this exact code path, so both stay in lockstep automatically.
  • TectonicEngine's convergent, divergent, and hotspot-chain formulas now clamp their internal damping factor rather than their output. Previously, feeding one of these faults elevation already outside [0, 1] would make the damping factor negative and reverse the fault's direction entirely (a convergent fault would lower an already-tall peak); clamping the factor instead makes the fault simply stop adding further effect once terrain is already at or past the old boundary. Numerically identical to the previous formula for any elevation that was already within the old range.
  • HydrologyEngine#carveRiverCrossSection now writes the same unclamped value it compares against when deciding whether to carve, instead of comparing against the true value but writing a floor-clamped one. This closes a latent ordering bug: a river carved through hand-lowered terrain can now deepen it below the old floor, rather than the write being silently floored back to 0 and raising the terrain it was meant to deepen.
  • ProceduralOrchestrator.planRepaint now tracks the map's lowest elevation (cachedMinElevation) alongside its highest, in the same single scan, and forces a full canvas repaint if either one moves.
  • ProceduralEngine#paintOceanPixel shades ocean depth relative to the discovered lowest point instead of a fixed floor of 0, using the same pattern the land shader already used for its highest point. Identical output to before on every map with no negative elevation.
  • BiomeRuleEngine's existing open-boundary rule matching, where a custom biome rule resting on a literal 0 or 1 edge already matches any value beyond that edge, turns out to be exactly the mechanism elevation overflow needs, with no change required. Documented in place so it isn't tightened later by someone who doesn't realise what now depends on it.
  • New GridDataExporter computes the grid-cell export data once per Scene export, from the map's own generated buffers and the exact same ProceduralEngine.resolveBiomeLookup priority chain the live biome layer and on-canvas hover readout already use, so the exported biome can never disagree with what's rendered on the map. Terrain bands are defined by a lower elevation threshold only, open-ended at the top, matching this version's own move away from a clamped elevation ceiling.
  • New GridAggregator provides the point-in-polygon, majority-vote and segment-intersection primitives the per-cell aggregation is built from, independent of any particular grid shape - a future Voronoi-mesh content layer can reuse it for its own cell rasterisation.
  • New FILRODENSWMB.GRID_DATA config block holds the grid-cell export's band thresholds and schema version; new FILRODENSWMB.GRID_TYPES centralises Foundry's grid-type constants, now shared between SceneExporter and GridDataExporter instead of being defined twice.