Back to homepage
Some examples for drawing maps with Lua
Updated Mon, 20 May 2019 21:10:16 +0100 by Wuzzy

Drawing maps with Lua


It is possible to reliably use drawn map mode to draw maps with Lua scripts. Simple examples are given below. Note that drawn maps use an area of 4096×2048. The examples below are static, but obviously this could be used for a random map variation—for example, simulating the Cave map by doing the fill below, then drawing random tunnels using circles that shift their course smoothly.


First of all, you must make sure that the global variable MapGen is set to mgDrawn . This is done in onGameInit .

To draw maps, you only need to call 2 functions: AddPoint and FlushPoints . See LuaAPI for the explanation.

You also should not forget to make use of onPreviewInit so the map preview is displayed correctly.


This generates a simple cave map: function onGameInit() MapGen = mgDrawn TemplateFilter = 0 -- Fill map with solid land for i = 200,2000,600 do AddPoint(1,i,63) AddPoint(4000,i) end -- Punch holes for i = 500,3500,1000 do AddPoint(i,1000,63,true) end FlushPoints() end onPreviewInit = onGameInit This one fills the map with solid land, and draws 4 circular erased points in it.

The final line onPreviewInit = onGameInit makes sure the map preview works properly. This is the simplest way to create the preview and is a perfectly reasonable approach in this case, because the code is very simple here.

Note: The reason why onPreviewInit is provided in the official Lua API is because it allows you to avoid unneccessary overhead in more complex Lua scripts.

Concentric circles and more

function onGameInit() MapGen = mgDrawn TemplateFilter = 0 -- Cross AddPoint(100,100,10) AddPoint(2000,2000) AddPoint(2000,100,10) AddPoint(100,2000) AddPoint(1000,1000,63,true) AddPoint(1000,1000,20) -- Concentric circles for i = 63,2,-4 do AddPoint(2000,1000,i) AddPoint(2000,1000,i-2,true) end -- Web of lines for i = 1,2000,50 do AddPoint(i+2000,2000,1) AddPoint(4000,2000-i) end -- Web of lines, framing AddPoint(2000,2000,1) AddPoint(4000,2000) AddPoint(4000,0,1) AddPoint(4000,2000) FlushPoints() end onPreviewInit = onGameInit The first set of AddPoint functions draws a large cross and erases the centre. The following loop draws a set of nested points, alternating erasure and fill, which results in a set of concentric circles. The 2nd loop draws a web of lines and frames it using some final AddPoint calls.

More examples

Check out the code for these built-in styles: