diff -r 23cc8581c0da -r b57ad8939f32 LuaDrawing.wiki --- a/LuaDrawing.wiki Thu May 03 00:44:13 2018 +0100 +++ b/LuaDrawing.wiki Thu May 03 01:12:58 2018 +0100 @@ -1,83 +1,25 @@ -#summary Drawing maps with Lua. +#summary Some examples for drawing maps with Lua -= Drawing maps with Lua (OUTDATED) = += Drawing maps with Lua = == Overview == -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 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. +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. + +== Preconditions == +First of all, you must make sure that the global variable `MapGen` is set to `mgDrawn`. This is done in `onGameInit`. -== Details == -First, a couple of convenience functions for drawing to the map. - -PointsBuffer = '' -- A string to accumulate points in -function AddPoint(x, y, width, erase) - PointsBuffer = PointsBuffer .. string.char(band(x,0xff00) / 256 , band(x,0xff) , band(y,0xff00) / 256 , band(y,0xff)) - if width then - width = bor(width,0x80) - if erase then - width = bor(width,0x40) - end - PointsBuffer = PointsBuffer .. string.char(width) - 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 - -`AddPoint` takes an x and y location for the point, a width (indicates the start of a new line) and `erase` (whether the line is erasing from the map). The width calculation is described in [DrawnMapFormat]. +To draw maps, you only need 2 functions: `AddPoint` and `FlushPoints`. See LuaAPI for the explanation. -`FlushPoints` writes out any values from `PointsBuffer` that have not already been sent to the engine. -It would be called at the end of a drawing session. +You also should not forget to make use of `onPreviewInit` so the map preview is displayed correctly. -A simple example below. - +== Cave == +This generates a simple cave map: function onGameInit() - MapGen = 2 + MapGen = mgDrawn TemplateFilter = 0 - AddPoint(100,100,10) - AddPoint(2000,2000) - AddPoint(2000,100,10) - AddPoint(100,2000) - AddPoint(1000,1000,63,true) - AddPoint(1000,1000,20) - - 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 - -The first set of `AddPoint`s 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 `AddPoint`s. - -screenshot here - -Another brief example: - for i = 200,2000,600 do AddPoint(1,i,63) AddPoint(4000,i) @@ -86,7 +28,61 @@ 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. -screenshot here \ No newline at end of file +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. The reason why `onPreviewInit` is provided is because it allows you to avoid unneccessary overhead in more complex Lua scripts. + +Screenshot here! + +== 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. + +Screenshot here! + +== More examples == +Check out the code for these built-in styles: + + * [https://hg.hedgewars.org/hedgewars/raw-file/tip/share/hedgewars/Data/Scripts/Multiplayer/DiagonalMaze.lua DiagonalMaze] + * [https://hg.hedgewars.org/hedgewars/raw-file/tip/share/hedgewars/Data/Scripts/Multiplayer/ShoppaMap.lua ShoppaMap] + * [https://hg.hedgewars.org/hedgewars/raw-file/tip/share/hedgewars/Data/Scripts/Multiplayer/Tunnels.lua Tunnels] \ No newline at end of file