redblobgames / mapgen4

Mapgen4 procedural wilderness map generator
https://www.redblobgames.com/maps/mapgen4/
Apache License 2.0
644 stars 93 forks source link
map-generation mapgen4 procedural-generation redblobgames terrain-generation

+title: Mapgen4

+date: <2018-12-24>

[[http://unmaintained.tech/][http://unmaintained.tech/badge.svg]]

[[https://www.redblobgames.com/maps/mapgen4/][Mapgen4]] is a procedural wilderness map generator I wrote during 2017 and 2018, and updated in 2023. It's written in JavaScript/TypeScript and designed to:

[[https://www.redblobgames.com/maps/mapgen4/blog/screenshot15-small.jpg]]

With =npm= or =pnpm=:

+begin_src sh

npm install -g esbuild npm install ./build.sh

+end_src

Run ~python3 -m http.server 8000~, then visit http://localhost:8000/embed.html in your browser.

I have a [[http://simblob.blogspot.com/search/label/mapgen4][series of blog posts]] about how I made these maps:

It's a continuation of ideas I developed for [[https://github.com/amitp/mapgen2/][mapgen2]] back in 2010, but at a much larger scale. The underlying code can support 1 million+ Voronoi cells (change =spacing= in config.js to 0.7), including [[https://www.redblobgames.com/maps/mapgen4/blog/3565944-triangles-600kregions.png][a very detailed river network]], but the rendering code and other parameters are designed to look prettiest around 25k cells.

There's plenty more that could be done to make it even faster and prettier. There are plenty of features that could be added, such as [[https://www.redblobgames.com/x/1723-procedural-river-growing/#draw][drawing your own rivers]], [[https://www.redblobgames.com/x/1843-planet-generation/][sphere output]], [[https://www.redblobgames.com/x/1736-resource-placement/][natural resources]], towns, forests, names, roads, and nations, but I'm leaving those for a future project.

The entry point is [[mapgen4.ts]]. The main data structures are in the [[dual-mesh/]] folder. The map generation algorithms are in [[map.ts]]. The input painting is in [[painting.ts]]. The output rendering is in [[render.ts]]. Calculations are in [[worker.ts]]. Calculations shared between the worker and renderer are in [[geometry.ts]].

Although the code is TypeScript, I'm using =esbuild= for building, which does /not/ check the types. Instead, I have type checking in the IDE only.

Mapgen4 and helper libraries I wrote (dual-mesh, prng) are licensed under Apache v2. You can use this code in your own project, including commercial projects.

The map generator uses these libraries:

The rendering code uses these libraries:

The build step uses [[https://esbuild.github.io/][esbuild]] from Evan Wallace, licensed under the MIT license