I already touched upon the level generation in the Developer commentary video,
but that’s not enough info now is it! Here’s some more…
Tiles
One of the easiest ways to construct a virtual environment is to use tiles.
For me the decision to go with the technique was made even easier by already having an old tilemapping system laying around.
It was a bit rusty, but a few hours of mangling put it straight.
Sets
The tile graphics are as simple as possible. There’s a wall and there’s a floor.
I of course only implemented these assets as they were made by Ranquil. Pay special attention to the bump mapping!
Reading
The level is generated from an xml file. Here’s a little example:
<Ship type="TestMap"> , , , , , , , , , , . w . h . w . , , . . . . . . . , , . w . p . w . , , . w w w w w . , , . . . . . . . , , . . . e . . . , , . . . . . . . , , , , , , , , , , </Ship>
There are a few oddities right off the bat. The XML element is called a ship as that’s what the original project had, spaceships. The map is also flipped around as unity XYZ coordinates don’t quite match with the XY coordinates of the map file.
One nifty feature in the generator is spawning random rooms to specific positions on the map. The rooms themselves are defined in the same way as the maps.
<Room name="roomD" loot_a="0,1" enemy_a="2,6"> w w w w . w w w w w . . . . . . . w w . w . w . w . . w . . . . . . . w . . w . o . w . . w . . . . . . . w w . w . w . w . . w . . . . . . . w w w w w . w w w w </Room>
And rooms areas are outlined with the characters R (room start position) and r (room limits).
c c w c c c c c , , , , , c c c w c R r r r r r r , o c c c c r r r r r r r , c c w c c r r r r r r r , c c c w c r r r r r r r c c w c c c r r r r r r r c c c w c c r r r r r r r c c c c c c r r r r r r r c o c w c c r r r r r r r c c c c w c r r r r r r r c c c c c c c c c c c c c c , , , , , , c c c c c c c
(excerpt from a bigger map)
You can see the room randomization featured in the GIF.
Writing
Designing maps in black and white is kind of like programming in vanilla notepad, no syntax highlighting, no nothing. In other words clumsy and crude.
This issue can be resolved with conditional formatting in a spreadsheet (in this case Libre Office). Compare and contrast, the text file version:
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , W w w w w w w , , , , , , , , , , , , , , , , , , , , , w c c c c c , , , , , w p p . . . w , , , , , , , , , , , , , , , , , , , , , w c o c o c , , , , , w p p w w . . c c c c c c c c c c c c c c c c c c c c c c c c c c c , , , , , w . w R r r r r c c c c c c R r r r r r r r r c R r r r c w w , , c , , , , , w . w r r r r r c , w c , c r r r r r r r r r c r r r r c , , , , c , , , , , w . . r r r r r c , w c , c r r r r r r r r r c r r r r c , , , w c w , , , , w w . r r r r r c , w c , c r r r r r r r r r c r r r r c , , , w c w , c , , , , c r r r r r c c c c c c r r r r r r r r r c r r r r c , , , w c c c c , , , , c r r r r r c c , w c c r r r r r r r r r c r r r r c , , , w c w , c , , , , c r r r r r c o , w o c r r r r r r r r r c r r r r c , , , w c w , , , , , , c r r r r r c c , w c c r r r r r r r r r c r r r r c , , , , c , , , , w c c c c c c c c c c c c c c r r r r r r r r r c r r r r c , , , , c , , , , , c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c , , , , w c R r r r r r r r r r c c c c c R r r r r r r w c c R r r r r r c , , , , , , c r r r r r r r r r r c c c c c r r r r r r r w c c r r r r r r c , , , , , w c r r r r r r r r r r c c c c c r r r r r r r c c w r r r r r r c , , , , , , c r r r r r r r r r r c c c c c r r r r r r r c c w r r r r r r c , , , , , w c r r r r r r r r r r c c c c c r r r r r r r c c c r r r r r r c , , , , , , c r r c c c c c c c c c c c w c r r r r r r r c w c r r r r r r c , , , , , w c r r c w c w c w c w c c c w c c c c c c c c c w c r r r r r r c , , , , , , , r r c c c c c c c c c c c w c R r r r r r r c w c r r r r r r c , , , , , , , r r c w c w c w c w c c c c c r r r r r r r c c c r r r r r r c , , , , , , , r r c o c o c o c o c w c c c r r r r r r r w c c r r r r r r c w w , , , , , , , c c c c c c c c c c w c c r r r r r r r c c w r r r r r r c , w , , , , , w w c c c c c c c c c c c c c r r r r r r r w c c r r r r r r c , w , , , , , w w c w , , , , c c c w c c c c c c c c c c c c c c c c c c c c , w , , , , , w w c w w , , , c c o w o c c R r r r r r r r c , , c c , , , c , w , , , , , w w c w w w , , c w w o w w c r r r r r r r r c , , c c , , , c , w , , , , , , , c , w w w , c c o w o c c r r r r r r r r c w c c c c w w c w w w w w , , , , c , , w w c c c c w c c c r r r r r r r r c w c o c c , , c , w , , w , , , , c , , , c c c c c c c c c r r r r r r r r c c c w o c c c c , w , , w , , , , c , , , c c R r r r r c c r r r r r r r r c c c o w c c c c , w , , w , , , , c , , , c c r r r r r c c r r r r r r r r c w c c o c , , c , w , , w , , , , c c c c c c r r r r r c c r r r r r r r r c w c c c c w w o w w w w w , , , , c w w w w c r r r r r c c c c c c c c c c c , , c c , , , w , w , , , , , , , c c c c c c r r r r r c w c , w , , , w , c , , c c , , , , , w , , , , , , , , , c w c c r r r r r c o c , , w , w , , c c c c c c c c c , w , , , , , , , , , c w c c r r r r r c c c , , , w , , , c R r r r r r r c , w , , , , , , , , , c w c c r r r r r c w c , , w , w , , c r r r r r r r c , w , , , , , , , , , c w c c r r r r r c o c , w , , , w , c r r r r r r r c , w , , , , , , , , , c w c c c c c c c c c c c c c c c c c c r r r r r r r c , w , , , , , , , , , c c c c c c w c c c c c , , , , , c , c r r r r r r r c , w , , , , , , , , , , , , , c c c w c R r r r r r r , c w c r r r r r r r c c c c c , , , , , , , , , , w o c c c c r r r r r r r , c w c r r r r r r r c w w w c , , , , , , , , , , , c c w c c r r r r r r r , c , c r r r r r r r c c c c c , , , , , , , , , , , c c c w c r r r r r r r c c c c c c c c c c c c c c o w , , , , , , , , , , w c w c c c r r r r r r r c c c c c c c c c c c c c c c c , , , , , , , , , , , c c w c c r r r r r r r c w , , w c o c c w , c w w w c , , , , , , , , , , , c c c c c r r r r r r r c w , , w c c c c w , c c c c c , , , , , , , , , , w o c w c c r r r r r r r c c c c c c c o c w , , w c w , , , , , , , , , , , , c c c w c r r r r r r r c w , , w c c c c w , , w c w , , , , , , , , , , , , c c c c c c c c c c c c c w , , w c o c c w , , , c , , , , , , , , , , , , , , , , , , c c c c c c c c w , , w c c c c w , , , c , , , , , , , , , , , , , , , , , , c o c o c o c , , , , , c , , c , , w w c w w , , , , , , , , , , , , , , , , , w , w , w , , , , , , c , , c , , w c c c w , , , , , , , , , , , , , , , , , , , , , , , , , , , , c c c c c c c c h c , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , w c c c w , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , w w , w w ,
With the conditionally formatted spreadsheet:
A thing a beauty! And here’s the map rendered in engine (flipped around this time, also no lighting)
Yet again there are a few issues. You need to jump though some hoops to get from the ODS spreadsheet file to the XML file. First the file is converted to the comma separated values format (CSV) and then the data is manually copied to the XML. Yeah, that last bit especially is not so great.
It is trivial to read the CSV file directly from Unity (something I didn’t know about way back then), so that’s what I’m going to do in the next project.
Conclusions
Tiles are a simple and powerful way to represent a level. Reading letter based map files is easy to code and fluid to create (with conditional formatting at least). Reusing systems that you’ve made before is a great boon to productivity. Take advantage of previous work as often as possible.
And, of course, you can play Transformagician right here.