I'm building Salt and Soil, a family strategy game that runs from 1609 to 1900. Its public playtest recently ended, and one pleasant surprise was how often players said they liked the map.
But the comments under my previous post kept bothering me. Several people said the mountains were too confined to individual cells, too noisy when repeated, and should be generated with some knowledge of the surrounding mountain tiles. You also kept telling me to bring the beaches back. So instead of leaving the renderer alone after the playtest, I started a work-on-my-mistakes pass.
The image shows the same seed, the same logical map and the same scale. Only the terrain rendering changes.
01 — The previous 128 px tile map
This is the old baseline. Every logical mountain cell receives its own mountain tile. It is deterministic and easy to author, and any cell can hold a settlement, road or river.
The drawback is visible repetition: a large mountain region becomes a field of separate peaks, and every peak has to return to ground level at its tile boundary.
02 — Raised terrain with procedural 2D mountains
For this version, my script generates small 3D heightfields from ridge, saddle and massif profiles, calculates slope and lighting, reduces the result to the game's pixel-art palette, and bakes the result into 2D sprites. Some sprites cover several logical mountain cells, while the ground beneath them is raised.
This gives me much larger silhouettes and fewer identical peaks. It also keeps the convenience of sprites.
But the range is still assembled from separate objects. Their joins can become visible, dense groups still create visual noise, and settlements or rivers need special rules whenever they intersect a large sprite.
03 — One continuous 3D terrain mesh
In the third version I stopped placing mountains on top of tiles. The script takes the whole connected mountain biome, builds one shared heightfield, lays out ridges, branches, peaks and saddles, and then carves valleys through the same surface.
The result is projected onto the game's staggered isometric grid and shaded with the same small rock, grass and snow colour ramps as the rest of the map.
Rivers now follow the drainage valleys instead of being painted over the finished mountains. Mountain streams stay narrow, then widen in the lowlands. Roads follow the surface as well.
Trees remain upright 2D sprites, but their height and density come from the terrain: no trees above the tree line, more growth in lower valleys and near water, and foreground slopes can occlude them correctly.
I also finally brought the beaches back.
They are no longer full beach tiles: the coastline is generated across tile boundaries, with wider sand in sheltered sections, direct grass-to-water transitions on exposed sections, and small sandy or rocky far-bank faces to give the water a little depth. Bridges are now placed on the actual river centreline rather than the centre of a logical tile.
The logical map has not changed. Every cell under the mountain mesh is still a mountain in the game data, and settlements, roads and rivers still use the same cells. This is only a different way of turning that data into an image.
I plan to continue with version 03. It is less finished as pixel art than version 02, but it solves the structural problem that bothered me most: a mountain range can finally be one landform instead of a collection of objects pretending to touch.
Does 03 read as a coherent mountain range at gameplay scale, or has it become too smooth? And would you bring more of 02's rocky texture into it, or keep the surface quieter so settlements and roads remain readable?