It's not a pretty program. I have a directory containing a collection of individual board elements. You then give a text file specifying for each square of the board which elements you want, giving orientation, and in order of layers from bottom to top. My program then takes these, and composes the images on top of each other, then glues the result together, using Perl's Image::Magick thingy.
Good things.
Each board is just some short lines of text, so a very small file.
Providing you know the names of the element image files, it takes only a few minutes to type up a board.
Since the elements are glued together automatically, there is no chance of misaligning tiles, as can happen when dragging elements about in some graphical program.
Bad things.
Unless told otherwise, the proram chooses various things randomly, such as which floor/water/oil tile to use, and in which orientation. This makes the background interesting, but does mean that you won't get the same board twice. (That's only a bad thing if you want to reproduce a floor exactly.)
It's also rather easy to make a typing mistake, and ask for a tile to be rotated clockwise rather than anticlockwise. So you have to check the resulting board carefully for such mistakes.
Anyway, each to their own. Here is an example of one of the smaller boards, "Chevron Thing".
The input file.
Title: [(CHEVRON)(THING)]
7x7
# row 1
Floor
Floor, Wall 180
Floor
Floor
Floor
Floor, Wall 180
Floor
# row 2
Floor, Wall 90
Floor, Portal_Red
Floor
Floor, Laser, Gun_W 180, Wall 180
Floor, Pusher_24_W 180, Wall 180
Floor
Floor, Wall 270
# row 3
Floor
Floor, Black, Pit_L 90, Pit_Nodule 270
Floor, Black, Pit_U 270
Floor, Laser
Floor, Crusher_135
Floor, Blue_TL 180
Floor, Blue 270
# row 4
Floor
Floor, Black, Pit_U
Floor, Red_TR 90
Floor, Red 90, Laser, Wall
Floor, Gear_AC
Floor, Gear_CW
Floor, Wall_L 90
# row 5
Floor, Red 90
Floor, Red 90
Floor, Red_TL
Floor, Black, Pit_U 180
Floor
Floor
Floor, Portal_Red
# row 6
Floor, Wall 90
Floor, Wall 180
Floor, Black, Pit_U 90
Floor, Black, Pit_L 270, Pit_Nodule 90
Floor, Pusher_34_W 270, Wall 270
Floor, Laser 90, Gun 90
Floor, Laser 90, Wall 270
# row 7
Floor, Pit
Floor, Double_Spanner, Wall
Floor, Red_TL 180
Floor, Red 270
Floor, Red_TL 270
Floor, Wall_L 270
In the previous version of the program, the output was a long
convert command, which still took only a few seconds to
assemble everything. Even though it doesn't do this any more, just
for fun, here is the output it gave for the board above.
convert
( ( Floor2.png -rotate 270 )
-depth 8 ( ( Floor1.png -rotate 90 )
( Wall.png -rotate 180 )
-composite )
( Floor2.png -rotate 90 )
( Floor1.png -rotate 270 )
( Floor2.png -rotate 90 )
( ( Floor2.png )
( Wall.png -rotate 180 )
-composite )
( Floor2.png -rotate 270 )
+append )
( ( ( Floor2.png -rotate 180 )
( Wall.png -rotate 90 )
-composite )
( ( Floor2.png -rotate 180 )
( Portal_Red.png )
-composite )
( Floor1.png -rotate 180 )
( ( Floor1.png -rotate 90 )
( ( Blank.png -geometry +0-0 Laser.png -composite )
)
-composite ( ( Blank.png -geometry +0-21 Gun.png -composite )
-rotate 180 )
-composite ( Wall.png -rotate 180 )
-composite )
( ( Floor2.png )
( ( Blank.png -geometry +0-21 ( Pusher_Blank.png Pusher_2.png -composite Pusher_4.png -composite )
-composite )
-rotate 180 )
-composite ( Wall.png -rotate 180 )
-composite )
( Floor3.png -rotate 90 )
( ( Floor2.png -rotate 180 )
( Wall.png -rotate 270 )
-composite )
+append )
( ( Floor1.png -rotate 270 )
( ( Floor2.png -rotate 180 )
( Black.png )
-composite ( Pit_L.png -rotate 90 )
-composite ( Pit_Nodule.png -rotate 270 )
-composite )
( ( Floor2.png -rotate 180 )
( Black.png )
-composite ( Pit_U.png -rotate 270 )
-composite )
( ( Floor2.png )
( ( Blank.png -geometry +0-0 Laser.png -composite )
)
-composite )
( ( Floor1.png -rotate 180 )
( ( Crusher_Blank.png -geometry +66+49.5 Crusher_1.png -composite -geometry +49.5+79.5 Crusher_3.png -composite -geometry +84+79.5 Crusher_5.png -composite )
)
-composite )
( ( Floor1.png )
( Blue_TL.png -rotate 180 )
-composite )
( ( Floor2.png -rotate 270 )
( Blue.png -rotate 270 )
-composite )
+append )
( ( Floor2.png -rotate 90 )
( ( Floor3.png -rotate 180 )
( Black.png )
-composite ( Pit_U.png )
-composite )
( ( Floor2.png )
( Red_TR.png -rotate 90 )
-composite )
( ( Floor1.png -rotate 270 )
( Red.png -rotate 90 )
-composite ( ( Blank.png -geometry +0-0 Laser.png -composite )
)
-composite ( Wall.png )
-composite )
( ( Floor2.png )
( Gear_AC.png )
-composite )
( ( Floor3.png )
( Gear_CW.png )
-composite )
( ( Floor3.png -rotate 270 )
( Wall_L.png -rotate 90 )
-composite )
+append )
( ( ( Floor1.png -rotate 90 )
( Red.png -rotate 90 )
-composite )
( ( Floor3.png -rotate 90 )
( Red.png -rotate 90 )
-composite )
( ( Floor2.png )
( Red_TL.png )
-composite )
( ( Floor2.png )
( Black.png )
-composite ( Pit_U.png -rotate 180 )
-composite )
( Floor2.png -rotate 180 )
( Floor3.png -rotate 270 )
( ( Floor3.png )
( Portal_Red.png )
-composite )
+append )
( ( ( Floor2.png -rotate 180 )
( Wall.png -rotate 90 )
-composite )
( ( Floor3.png -rotate 270 )
( Wall.png -rotate 180 )
-composite )
( ( Floor2.png )
( Black.png )
-composite ( Pit_U.png -rotate 90 )
-composite )
( ( Floor1.png )
( Black.png )
-composite ( Pit_L.png -rotate 270 )
-composite ( Pit_Nodule.png -rotate 90 )
-composite )
( ( Floor3.png -rotate 180 )
( ( Blank.png -geometry +0-21 ( Pusher_Blank.png Pusher_3.png -composite Pusher_4.png -composite )
-composite )
-rotate 270 )
-composite ( Wall.png -rotate 270 )
-composite )
( ( Floor3.png -rotate 90 )
( ( Blank.png -geometry +0-0 Laser.png -composite )
-rotate 90 )
-composite ( ( Blank.png -geometry +0-0 Gun.png -composite )
-rotate 90 )
-composite )
( ( Floor2.png -rotate 180 )
( ( Blank.png -geometry +0-0 Laser.png -composite )
-rotate 90 )
-composite ( Wall.png -rotate 270 )
-composite )
+append )
( ( ( Floor1.png )
( Pit.png -rotate 270 )
-composite )
( ( Floor2.png )
( Double_Spanner.png )
-composite ( Wall.png )
-composite )
( ( Floor3.png -rotate 180 )
( Red_TL.png -rotate 180 )
-composite )
( ( Floor1.png -rotate 270 )
( Red.png -rotate 270 )
-composite )
( ( Floor1.png -rotate 270 )
( Red_TL.png -rotate 270 )
-composite )
( ( Floor2.png )
( Wall_L.png -rotate 270 )
-composite )
( ( Floor2.png -rotate 180 )
( Title.png )
-composite )
+append )
-append