"ANOTHER

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

WallAndFloors

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>

TestLevel

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:

Spreadsheet

A thing a beauty! And here’s the map rendered in engine (flipped around this time, also no lighting)

Level2Full

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.

Tags: , , , , , ,


4 Responses to “Transformagician Level Generation and Design”

  1. Pickens Inc. says:

    Aaaaaaah, I have a huge soft spot for random dungeon generation, because I have vague ideas as to how they work, and that’s it, and a little bit of knowledge can be very dangerous :)

    This is one of my favourite posts.
    I still haven’t a clue as to how the xml file is generated, but it looks fantastic, and the conditionally formatted spreadsheet was ingenious.

    • HuvaaKoodia says:

      I’m glad you liked the post.

      The XML file is basically written by hand (as data files usually are), and the map data is then copy and pasted into it manually from the CSV file. As I mentioned in the end this whole step is unnecessary and the data could be read directly from the CSV file (which is really easy to do in code as the CSV format is dead simple).

      • Pickens Inc. says:

        That’s really interesting. Thank you. Everything’s amazing when you’re taught PASCAL for one year and VB6 the next, haha.

        Come summer I can finally learn Unity and continue learning C#.

  2. rjhelms says:

    The conditional formatting for the spreadsheet is a great idea. In most of my LD games I make up my levels as CSV files, but I often get bogged down by trying to visualize things in LibreOffice. Some colour-coding would go a long way, I’m sure.

Leave a Reply

You must be logged in to post a comment.

[cache: storing page]