LuaDrawing.wiki
author kyberneticist@gmail.com
Fri, 19 Oct 2012 21:10:21 +0000
changeset 256 0b93b3ec3ebf
parent 255 18e1a94e1591
child 257 3d03892b7545
permissions -rw-r--r--
Edited wiki page LuaDrawing through web user interface.

#summary Drawing maps with Lua.

= Drawing Maps With Lua =

Starting in 0.9.18 it is possible to reliably use drawn map mode to draw maps with scripts.
A simple example is given below.  Note that Drawn maps use an area of 4096x2048

= Details =

First, a couple of convenience functions for drawing to the map.
<code lang="lua">
PointsBuffer = ''  -- A string to accumulate points in
function AddPoint(x, y, size, erase)
    PointsBuffer = PointsBuffer .. string.char(band(x,0xff00) / 256 , band(x,0xff) , band(y,0xff00) / 256 , band(y,0xff))
    if size then
        size = bor(size,0x80)
        if erase then
            size = bor(size,0x40)
        end
        PointsBuffer = PointsBuffer .. string.char(size)
    else
        PointsBuffer = PointsBuffer .. string.char(0)
    end
    if #PointsBuffer > 245 then
        ParseCommand('draw '..PointsBuffer)
        PointsBuffer = ''
    end
end
function FlushPoints()
    if #PointsBuffer > 0 then
        ParseCommand('draw '..PointsBuffer)
        PointsBuffer = ''
    end
end
</code>
AddPoint takes an x and y location for the point, a size (required to start a line) and erase (whether the line is erasing from the map)
FlushPoints writes out any values from PointsBuffer that had not already been sent to the engine.  It would be called at the end of a drawing session.

A simple example below.

<code lang="lua">
function onGameInit()
    MapGen = 2
    TemplateFilter = 0

    AddPoint(100,100,10)
    AddPoint(2000,2000)
    AddPoint(2000,100,10)
    AddPoint(100,2000)
    AddPoint(1000,1000,63,true)

    for i = 63,2,-4 do
        AddPoint(2000,1000,i)
        AddPoint(2000,1000,i-2,true)
    end

    for i = 1,2000,50 do
        AddPoint(i+2000,2000,1)
        AddPoint(4000,2000-i)
    end

    AddPoint(2000,2000,1)
    AddPoint(4000,2000)
    AddPoint(4000,0,1)
    AddPoint(4000,2000)

    FlushPoints()
end
</code>
The first set of AddPoints draws a large X 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 AddPoints.