Text Map -> Tile Map

Share your scripts and packages with other Mudlet users.
Post Reply
User avatar
Akaya
Posts: 414
Joined: Thu Apr 19, 2012 1:36 am

Text Map -> Tile Map

Post by Akaya »

Image
I haven't had much online time as of late so I've been doing some scripting offline. My latest idea was taking a map drawn in text and converting it into a graphical tile-based map as seen in Dungeon Crawl (a dungeon crawler I'm very addicted to atm).
Here's a video of the progress (It's a bit choppy, but just to show what it looks like):
http://youtu.be/GpOtRj2w37w

Each map is stored in a table like so:
Code: [show] | [select all] lua
map.layout = {
"XXXX",
"X..X",
"X..X",
"XXXX",
}
where X represents a wall and . the floor. So the above would make a 4x4 room with 2x2 of it walkable space.
Maps can be as large as you want and the UI will cut it to size to display your current position. The idea is that you can map small areas (I mapped Maims Maze from Achaea in my example video) or large areas (the wilderness map of Achaea in the image above).

Here's the table used to generate Maim's Maze:
Code: [show] | [select all] lua
map.layout = {
"BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB",
"BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB",
"BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB",
"BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB",
"BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB",
"BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB",
"BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB",
"BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB",
"BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB",
"BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB",
"BBBBBBBBBBBBBBBBBBXXXXXBBBBBBBBBBBBBBBBBBBXXXXXBBBBBBBBBBBBBBBBBBBBBBBBBB",
"BBBBBBBBBBBBBBBBBBX...XBBBBBBBBBBBBBBBBBBBX...XBBBBBBBBBBBBBBBBBBBBBBBBBB",
"BBBBBBBBBBBBBBBBBBX...XBBBBBBBBBBBBBBBBBBBX...XBBBBBBBBBBBBBBBBBBBBBBBBBB",
"BBBBBBBBBBBBBBBBBBX...XBBBBBBBBBBBBBBBBBBBX...XBBBBBBBBBBBBBBBBBBBBBBBBBB",
"BBBBBBBBBBXXXXXXXXXX.XXBBBBBBBBBBBBBBBBBBBXX.XXXXXXXXXXBBBBBBBBBBBBBBBBBB",
"BBBBBBBBBBX...X...X...XBBBBBBBBBBBBBBBBBBBX...X...X...XBBBBBBBBBBBBBBBBBB",
"BBBBBBBBBBX...........XBBBBBBBBBBBBBBBBBBBX...........XBBBBBBBBBBBBBBBBBB",
"BBBBBBBBBBX...X...X...XBBBBBBBBBBBBBBBBBBBX...X...X...XBBBBBBBBBBBBBBBBBB",
"BBBBBBBBBBXX.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.XXBBBBBBBBBBBBBBBBBB",
"BBBBBBBBBBX...X...X...X...X...X...X...X...X...X...X...XBBBBBBBBBBBBBBBBBB",
"BBBBBBBBBBX.......X...............X...................XBBBBBBBBBBBBBBBBBB",
"BBBBBBBBBBX...X...X...X...X...X...X...X...X...X...X...XBBBBBBBBBBBBBBBBBB",
"BBBBBBBBBBXXXXXX.XXX.XXXXXXX.XXX.XXX.XXXXXXXXXXXXXXX.XXBBBBBBBBBBBBBBBBBB",
"BBBBBBBBBBBBBBX...X...X...X...X...X...X...X...X...X...XBBBBBBBBBBBBBBBBBB",
"BBBBBBBBBBBBBBX...X...X.......X.......X...........X...XBBBBBBBBBBBBBBBBBB",
"BBBBBBBBBBBBBBX...X...X...X...X...X...X...X...X...X...XBBBBBBBBBBBBBBBBBB",
"BBBBBBBBBBBBBBXX.XXX.XXX.XXXXXXXXXXXXXXXXXXX.XXX.XXX.XXBBBBBBBBBBBBBBBBBB",
"BBBBBBBBBBBBBBX...X...X...X...X...X...X...X...X...X...XBBBBBBBBBBBBBBBBBB",
"BBBBBBBBBBBBBBX.......X...................X...X...X...XBBBBBBBBBBBBBBBBBB",
"BBBBBBBBBBBBBBX...X...X...X...X...X...X...X...X...X...XBBBBBBBBBBBBBBBBBB",
"BBBBBBBBBBBBBBXXXXXX.XXXXXXXXXXX.XXXXXXX.XXX.XXXXXXX.XXBBBBBBBBBBBBBBBBBB",
"BBBBBBBBBBBBBBX...X...X...X...X...X...X...X...X...X...XBBBBBBBBBBBBBBBBBB",
"BBBBBBBBBBBBBBX...............X...X...................XBBBBBBBBBBBBBBBBBB",
"BBBBBBBBBBBBBBX...X...X...X...X...X...X...X...X...X...XBBBBBBBBBBBBBBBBBB",
"BBBBBBBBBBBBBBXX.XXXXXXXXXXX.XXXXXXX.XXXXXXXXXXXXXXX.XXBBBBBBBBBBBBBBBBBB",
"BBBBBBBBBBBBBBX...X...X...X...X...X...X...X...X...X...XBBBBBBBBBBBBBBBBBB",
"BBBBBBBBBBBBBBX...........X.......X...............X...XBBBBBBBBBBBBBBBBBB",
"BBBBBBBBBBBBBBX...X...X...X...X...X...X...X...X...X...XBBBBBBBBBBBBBBBBBB",
"BBBBBBBBBBBBBBXX.XXXXXXX.XXXXXXX.XXXXXXX.XXXXXXX.XXX.XXBBBBBBBBBBBBBBBBBB",
"BBBBBBBBBBBBBBX...X...X...X...X...X...X...X...X...X...XBBBBBBBBBBBBBBBBBB",
"BBBBBBBBBBBBBBX.......X...X.......X.......X.......X...XBBBBBBBBBBBBBBBBBB",
"BBBBBBBBBBBBBBX...X...X...X...X...X...X...X...X...X...XBBBBBBBBBBBBBBBBBB",
"BBBBBBBBBBBBBBXX.XXXXXXX.XXX.XXXXXXX.XXX.XXX.XXXXXXX.XXBBBXXXXXBBBBBBBBBB",
"BBBBBBBBBBBBBBX...X...X...X...X...X...X...X...X...X...XBBBX...XBBBBBBBBBB",
"BBBBBBBBBBBBBBX...X.......X...........X...X...X.......XBBBX...XBBBBBBBBBB",
"BBBBBBBBBBBBBBX...X...X...X...X...X...X...X...X...X...XBBBX...XBBBBBBBBBB",
"BBBBBBBBBBXXXXXX.XXX.XXXXXXXXXXXXXXXXXXX.XXX.XXX.XXXXXXXXXXX.XXBBBBBBBBBB",
"BBBBBBBBBBX...X...X...XBBBBBBBBBBBBBBBX...X...X...X...X...X...XBBBBBBBBBB",
"BBBBBBBBBBX.......X...XBBBBBBBBBBBBBBBX...X...X.......X.......XBBBBBBBBBB",
"BBBBBBBBBBX...X...X...XBBBBBBBBBBBBBBBX...X...X...X...X...X...XBBBBBBBBBB",
"BBBBBBBBBBXXXXXXXXXX.XXXXXXXXXXXXXXBBBXXXXXXXXXXXXXX.XXX.XXXXXXBBBBBBBBBB",
"BBBBBBBBBBBBBBX...X...X...X...X...XBBBBBBBBBBBX...X...X...XBBBBBBBBBBBBBB",
"BBBBBBBBBBBBBBX.......X.........f.XBBBBBBBBBBBX.......X...XBBBBBBBBBBBBBB",
"BBBBBBBBBBBBBBX...X...X...X...X...XBBBBBBBBBBBX...X...X...XBBBBBBBBBBBBBB",
"BBBBBBBBBBBBBBXX.XXXXXXX.XXXXXXXXXXXXXXXXXXXXXXX.XXXXXXX.XXBBBBBBBBBBBBBB",
"BBBBBBBBBBBBBBX...X...X...X...X...X...X...X...XX.XXBBBX...XBBBBBBBBBBBBBB",
"BBBBBBBBBBBBBBX.....V.X...X...................XX.XXBBBX...XBBBBBBBBBBBBBB",
"BBBBBBBBBBBBBBX...X...X...X...X...X...X...X...XX.XXBBBX...XBBBBBBBBBBBBBB",
"BBBBBBBBBBBBBBXXXXXXXXXX.XXXXXXXXXXX.XXX.XXXXXXX.XXXXXXX.XXBBBBBBBBBBBBBB",
"BBBBBBBBBBBBBBBBBBBBBBX...X...X...X...X...X...X...X...X...XBBBBBBBBBBBBBB",
"BBBBBBBBBBBBBBBBBBBBBBX...............X...................XBBBBBBBBBBBBBB",
"BBBBBBBBBBBBBBBBBBBBBBX...X...X...X...X...X...X...X...X...XBBBBBBBBBBBBBB",
"BBBBBBBBBBBBBBBBBBBBBBXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXBBBBBBBBBBBBBB",
"BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB",
"BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB",
"BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB",
"BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB",
"BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB",
"BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB",
"BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB",
"BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB",
"BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB",
"BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB",
}
B is black space, X is a wall, . is a floor, V is a stairway and I threw a magma pit at the end of the maze (f) just because :P)
Hooking the map to in-game maps is as simple as storing each line of text from the map to the map.layout table and making sure you update map.terrain to represent the characters you're using (ex: M = "mountain")

I'm not sure if the tiles I'm using are open source (I think they are but just to be safe) so you'll want to get/create some of your own 20x20 pixel .png work great.
Tile Map GUI.xml
(642.58 KiB) Downloaded 597 times

User avatar
Vadi
Posts: 5042
Joined: Sat Mar 14, 2009 3:13 pm

Re: Text Map -> Tile Map

Post by Vadi »

Neat - I couldn't quite get it working off the bat though. Looking forward a more completed version with a demo!

User avatar
chris
Posts: 493
Joined: Fri Jun 17, 2011 5:39 am

Re: Text Map -> Tile Map

Post by chris »

That's awesome. One day I'm going to make this auto-terrain my general map.

User avatar
Akaya
Posts: 414
Joined: Thu Apr 19, 2012 1:36 am

Re: Text Map -> Tile Map

Post by Akaya »

Vadi wrote:Neat - I couldn't quite get it working off the bat though. Looking forward a more completed version with a demo!
yeah. I was pretty excited i got it working and posted my findings. But heres a bit more depth on how it works:
1. A grid is created using labels.
2. A table is created that stores our maps layout like i described before.
3. Another table is created that stores all the characters we used in our maps layout and the tiles they represent. AKA: the terrain. Such a table might look like:
Code: [show] | [select all] lua
map.terrain = {
  X = "wall",
  ["."] = "floor",
}
4. Once these tables have been constructed we can call a function to draw a section of the map on our grid. Heres one such possible function:
tmap.draw(x,y,rows,cols,layout,terrain)
x: where the section begins on the x-axis of our map layout.
y: ...
rows: the width of the map section
cols: …
layout: the table we created for the map layout
terrain: the table we created for terrain.

Just a general idea. Ill spend more time simplifying this script so its a bit easier to understand along with some good documentation on how to use it. Apologies :(

User avatar
Akaya
Posts: 414
Joined: Thu Apr 19, 2012 1:36 am

Re: Text Map -> Tile Map

Post by Akaya »

Found this article very interesting. This could be applied to the idea above to produce a better quality map with minimal images. http://www.saltgames.com/2010/a-bitwise ... -tilemaps/ The idea is that each tile is assigned a value based on its adjacent tiles and each value represents a different image. Clever!

You can significantly cut down on the amount of images you need by utilizing this method as well: http://www.gamedev.net/page/resources/_ ... errai-r934 The idea is that you can make the tile's background transparent and have each terrain hold a specific layer priority so that certain terrains are always placed above/below certain others.

I believe that cuts down the amount of tiles per terrain from a whopping 256 to just 32. Very managable if you create a template. But don't worry. Found that too: http://www.eclipseorigins.com/community ... photoshop/ Just a simple (and very useful) tutorial on how to create your own tileset.

User avatar
Akaya
Posts: 414
Joined: Thu Apr 19, 2012 1:36 am

Re: Text Map -> Tile Map

Post by Akaya »

Applied this idea to a small 5x5 grid. http://youtu.be/z89j6QwhLjo The numbers on each label are the binary codes generated from the above idea.

By clicking on a label you can toggle whether the terrain has dirt or not. Add another 5x5 grid for each layer. Place the terrain with the least amount of presedence on bottom (possibly water?) and highest on top (mountains? city streets?) and you'll have a very nice looking map with great transitions between tiles. If your MUD provides terrain info or a text-based map, this could be a great visualization. You could even build a custom map of your own as you explore your MUD.

Post Reply