Sunday 16 November 2014

How to draw hexagon maps

I've been having a lot of fun playing Warlock - Master of the Arcane. The game is absolutely fantastic and very underrated. It's also about a billion times more interesting and addictive than Civilization 5 (unless a fantasy setting really isn't your thing).

Playing Warlock though gave me a desire to make my own 3D Hexagon-based game. I decided to start out by making a map editor to draw the hexagon maps, and its development has forced me learn a lot of new things about hexagons and how to draw them.

1. Drawing Hexagons

There's many great articles out there on the internet about hexagons. The two I found most helpful are here and here. Although these pointed me in the right direction at times, I eventually had to solve it mostly on my own by treating the hexagons like overlapping squares.

This technique has the advantage of keeping the simple coordinate system of a square map, which I find highly desirable. This also means that hexagon map coordinates look like normal square map coordinates when saved.

I'll begin by showing the basic concept before moving on to the maths behind this. Look at this simple square map here.

Now if we were to convert the squares directly into hexagons, it'd look something like this:

Keeping in mind that our hexagons are positioned like squares, the squares would look like this:


Unfortunately, the hexagons are positioned like they're squares. This isn't how a hexagon map should look like, but it's easily fixed. If we shift the bottom row slightly to the right, and then shift the bottom row slightly upwards then the hexagons line up nicely.

Now let's shift that bottom row to the right, and then upwards. The result will be something like this:


You've probably noticed that the overlapping squares form some interesting right angled triangles. Look closer and you'll notice that the opposite side of the triangle is exactly the length of the top left line of the hexagon, and that the bottom right corner of the triangle (where the 90 degree angle is) is also dead in the center between the two squares above it.

These pictures have hopefully shown you exactly how much the bottom row needs to be shifted in order to snap into place with the row above it. To summarise:
  1. Shift the bottom row to the right by exactly 50% of the width of a square.
  2. Shift the bottom row upwards by the length of the triangle's opposite side (you can figure this out by constructing a right angled triangle whose opposite side is the length of a side of your hexagon).
One final thing to mention is that every second row should be shifted like this, so you can test if the X coordinate of the tile is odd, and if it is, then shift the tile.

2. Saving a hexagon map

As mentioned above, saving a map like this is very easy. Simply save it as you would any square tiled map.


3. Result

I'm fairly certain that's all there is to mention regarding hexagon maps. To perform calculations such as figuring out if a user is clicking on a hexagon, you can again use the boxes to determine which tile is being clicked.

Here's a screenshot from my 3D map editor (which is nearly finished). It positions 3D hexagons like I've described in this post.




Sunday 27 April 2014

Event Queue (brainstorming)

This will probably be my last post for a few weeks. The week after next the school component of my German internship continues. I've been living in Germany now for about 13 months now, and while I can speak and understand enough German to get by it's still quite a challenge for me. Learning content intended for native German speakers in a German school when I'm someone who's just been learning German for about a year is taxing. Although this is certainly a great way to get better at speaking a foreign language, it unfortunately also means that I have too little time and energy to progress much with my gaming projects.

Anyway, back to the topic at hand: the Event Queue. Early on in my gaming efforts I noticed this need for some kind of queue. Especially when thinking about AI and keeping all the actions that the player and AI make in sync. Up until now I'd been messily getting by without this system but my Wanderer game has grown to the extent that I really do need to implement a queue system. The need for it is so paramount that it will be the next thing I do.

Now what this queue would do is allow me to do is queue up a bunch of actions to happen per game loop cycle. This means that instead of pressing the left arrow key and having the key handler call a method that moves the character west for me, the key event handler simply adds a movement order to the event queue. The event queue has units subscribed to it, and the event queue finds the right unit and informs it that it has been instructed to move. The main advantage of this for me now is that I then don't have to consider time when moving many different objects and characters. They will all move at the same rate because the event queue will ensure that they move at the same rate by only updating them once per game cycle. It also means that I can pause the game by issuing a hold on this queue for a specified time period or indefinitely.

There are more benefits to using queuing system but I've yet to realise and consider those. If you wish to read further I recommend this article. It explains the queue system but also much more. I would also suggest looking at an observer pattern. My understanding of a queue in a game is that it's an observer pattern that updates with every cycle of the game's loop.

After I've developed a prototype I'll write about it here to let you know if it was successful and I'll discuss more about it.

Friday 25 April 2014

The Wanderer - 2D Open World (prototype)

Three days ago I made a post about my plans on how to convert my 2D Wanderer game into an open world Wanderer. I'm writing here now to report that my plans have been successful, although there's still a few bugs left to iron out and I also need to optimise my functions so that there's less of a framerate drop when loading chunks.

I'm not convinced this is the best way to do it, but it's a first attempt and at least it works.

Anyway, here's how I did it. Of a much bigger world I establish a viewpoint into this world that's 1760x1760 pixels large. This is then divided into 9 sections arranged into a 3x3 grid:

123
456
789

The player is on chunk 5. If he moves onto one of the other chunks, then the chunks need to be rearranged. For example, if he's standing on 5 and moves to 6 then the following needs to happen:

Chunks 2 5 8 need to be moved back to chunks 1 4 7.
Chunks 3 6 9 need to be moved back to chunks 2 5 8.
Chunks 3 6 9 then need to be reloaded.

This creates an effect where if the player moves off chunk 5 then the world is rearranged so that he's again on chunk 5. Just like in this picture:


Here's some screenshots of my Wanderer in action. In this picture, he's just spawned at tile 64,64.


Now I turn the grid on, and the tile coordinates on, and walk east until I reach chunk 6 (which forces a shuffling and loading of chunks):


Then I walk against east, until a new chunk is loaded.


Here's another shot at a different location with the chunks coloured.


Anyway, it's an ok first attempt at getting an open world to work, but I've got problems with framerate and glitches to overcome before I label it as a success.

Tuesday 22 April 2014

The Wanderer - 2D Open world (Brainstorming)

This week I put together a little game called "The Wanderer". It loads a map created with my map editor and you're given control over a beetle that can walk around on the map. At the moment he's confined to his little map, but what I want to do is expand this to be an open world wanderer. This is my article about my solution to this open world problem.

The open world idea presents new challenges for me, but I have a plan about how I can do it. I generated a rather giant map (65536 tiles). It's really only feasible to have about 4096 tiles loaded at one time, which equates to an image of 2048x2048 with a size 32 tile. Anything more and loading times begin to become longer, and an image size of 2048x2048 is larger than what can fit on an average monitor - providing ample space.

My challenge is that of the 65536 tiles in this giant map, I can only ever have 4096 tiles loaded at a time. As the player moves, tiles need to be dynamically loaded and unloaded to maintain this small drawn window of the large world. I'm going to refer to these 4096 tiles as a chunk.

To figure out which tiles need to load/unload, I have to first take the tile that the player is standing on, and then calculate all the tiles around the player that fall within perimeter, determined by this chunksize.

Solution

My solution is simple, but untested. I will implement it and then report whether it works or not, but in theory, it should work.

The solution is that we know the tile that the player is standing on, and we know the size of the chunk. Therefore, the top left and bottom right tiles in the chunk can be predicted like this:

The amount of tiles behind and before the player's tile: Difference = (chunksize - 1) / 2
Therefore:
Top left tile in chunk = PlayerTile - Difference
Bottom right tile in chunk = PlayerTile + Difference

With these values I can determine which tiles to load into the new chunk whenever a player moves to a new tile. I have a visual representation of this below (sorry about the MSPaint.exe style quality). In this example, the chunk size is 25. X represents the player's tile and the big red box represents the chunk.



In this next image, the player walks one tile to the right. You can see drawn the tiles that need to be unloaded, and the tiles that need to be loaded.


Finally, based upon the player's tile and the chunksize, I learn can predict the indexes of the tiles to be loaded.



This is my open world strategy. It should work. If you have a better idea, please let me know in the comments.

Saturday 22 March 2014

How should a game work? (Brainstorming)

There's not really a whole lot of stuff out there (if there is, I can't find it) about how to put together a game. Unfortunately this post isn't so informative. It's a brainstorming post where I try to plan how I should go about designing something. That means that you shouldn't expect to find too many pearls of wisdom in this post. This is me trying to figure something out, not me offering a brilliant solution.

At the heart of it the game is just an endless loop that says:

1. Handle user input
2. Process AI
3. Update game values
4. Draw graphics

The loops vary and can be more or less sophisticated depending on how you decide to make it. I'm not going to talk about this loop beyond what I've said already because someone else a lot more knowledgeable about the topic has already made a great write-up about it. I already have my own crude game loop figured out. At the moment I'm more concerned about how best to organise what happens inside point  #4. I'll give the other steps a brief mention, however.

#2 AI
The AI is an entirely different problem that I'll cover in the future. At the moment I have simpler things to consider. If you take all the complexities aside and think about what the AI step should actually do, it's just a whole heap of calculations to determine the positions of units and what they're doing.

#3 Update game values
This is also something I've decided to leave for the future because I haven't thought about it enough in detail yet. Basically this is just the part where we determine if units are still doing something. This step might even be merged into the AI step because they'er related. An example of this is soldiers shooting a building. If the soldiers are still in range to shoot at the building then the building needs to be losing health, for example.

#4 Draw graphics
Anyone can draw some graphics. The difficulty comes with figuring out what to draw. Some kind of system is needed that keeps track of all the sprites in the game and draws them when needed. This system needs to:

a) Unit & Building sprites list
The best way I can think of to draw all the sprites is to add them to a big list of sprites to draw. If a player makes a new soldier, this soldier sprite is appended to the list and subsequently drawn. If this soldier dies, then he needs to turn into a corpse sprite for a while before disappearing entirely (or I could leave him there as a permanent stain upon the battlefield, which is also cool). In any case, the very first thing #3 should do is draw everything in this list and figure out a good way to add & remove sprites from this list. This list shouldn't be a simple array, but something more intelligent like a vector/dictionary.

There should also be another list that will be drawn after the list I just described, and this is the effects list. So explosions, fire, smoke, rain and whatever else should be drawn here.

b) Draw from the perspective of the player
In an RTS game this means that the player can only see his own units, and also see whatever is in the light of sight of the player's units. I think the easiest approach to this is to go for the fog of war type of thing where everything is drawn and then a layer of fog goes over the top, shrouding everything that shouldn't be visible from sight. This gives me then the simplicity of being able to draw everything onto the map, then selectively reveal parts of the map to the player instead of selectively drawing only based upon what a player should be able to see.

There's two styles of fog. The first is to have a completely black map which you have to explore thoroughly or else you see nothing. The second is to have a grayed out view of the entire map, but you can still see features of the map - just none of the units or buildings. The former was much more common in older games like Warcraft 2, Starcraft, Age of Empires and C&C: Tiberian Sun. The latter is basically the 'status quo' of all modern RTS games and features in basically everything. I haven't seen the old style fog of war in years.

The question is, which should I use? It'd make more sense to go with the latter in some ways because of the modern setting of the game. It seems quite silly that a space-fighting force couldn't do a simple radar scan of the map to determine its terrain features before landing. Although not at all related to the fog of war, one game had a very cool feature, in my opinion, that is deserving of a special mention. In C&C: Tiberian Sun the minimap was actually disabled until you built a radar structure. This means that you could only have a minimap if your radar structure was functioning. I might go with this idea and put it in my game because it actually makes a lot of sense and is quite a cool idea.

Concluding #4
That should be enough planning for me to get started on the next part of my little game project: The sprite list and the fog of war.

Sunday 16 March 2014

Tile "layers" for the Mapeditor

I'd been wondering about a problem for a while now, and didn't quite know how to solve it. Luckily Alycthul gave me an idea: layers.

What I've now done is modified the map format to allow for a tile to have an 'occupant'. An occupant is a tile that sits on top of another tile - forming a type of layer. For the sake of comparison here's a saved tile from both the old and the new formats:

Old
  x,y=id;
  0,0=1;

New
  x,y=id,occupant_id:tile_space_occupied;
  0,0=1,1301:1;

As you will know if you read my previous map editor posts the 0,0 represents a tile's coordinate and the 1 is the tile's ID. In the new format this is still here, but there's now a comma and then an additional value (1301 here). This is the occupant. The third value is the occupying space. I'm not entirely sure how to implement this yet, but it basically means how many tiles the occupant stretches over (in the case of a building or larger in-game unit). Currently this doesn't work and so all occupant sizes are treated as 1.

Tile occupants will typically be buildings, units or resources. This allows a unit or building to be placed as an occupant onto any sort of tile. Here's a screenshot of this in action:


As you can see here the crystals and train tracks are occupants of the other tiles. If you have any suggestions or questions feel free to leave a comment.

Saturday 15 March 2014

Programming Gravity

One of these days I'd really like to make a universe simulator. The kind of thing where you could create a whole heap of planets and stars and watch them collide and orbit each other. A couple of weeks ago I thought I'd have a crack at programming some gravity. I did a little of my own research and then I contacted a friend of mine who studied physics and we put together some formulas.



The experiment went well. I made a simple GUI application with two buttons and applied the laws of the universe to these buttons. They began to gravitate towards each other. I felt very empowered, because even though all I'd done is made a couple of buttons gravitate towards towards each other, I'd also created a universe in my computer. I'm going to share a bare-bones example here which details only the maths behind it all.

There's several things to consider when doing this. First of all, you need a position structure. This should include either X and Y or X, Y and Z:


typedef struct {
  double x;
  double y;
  double z;
} position_t;

This structure represents a position in 2d or 3d space. Then you need a function to calculate the distance between two points. Depending on whether you want your universe to be 2d or 3d, you'll need the appropriate function. I made both anyway, even though my universe was 2d:

double distance2d(position_t *a, position_t *b)
{
  
  return sqrt( pow((b->x  - a->x), 2) + pow((b->y  - a->y), 2) );
  
}

double distance3d(position_t *a, position_t *b)
{
  
  double xd, yd, zd;
  xd = b->x - a->x;
  yd = b->y - a->y;
  zd = b->z - a->z;
  
  return sqrt( (xd*xd) + (yd*yd) + (zd*zd) );
  
}

Square roots are accurate but slow. If you wanted to calculate the distance faster but less accurately, there are other techniques around. Speed wasn't an issue for my experiment.

Next you need a class or structure to represent an object in space. This structure should contain the mass of the object, its position, its acceleration and its velocity. All of these variables are required to calculate the gravitational pull.

typedef struct {
  position_t position;
  double mass, velocity, acceleration;
} object_t;

With two of these objects created and distanced apart you can then make them gravitate toward each other in the next step. My example here is simple and only takes into account the X axis.

int main()
{
  
  position_t a = { 0, 0, 0 };
  position_t b = { 10, 10, 10 };
  
  // establish our two bodies
  object_t bodya = { a, 999999999, 0, 0 };
  object_t bodyb = { a, 444444444, 0, 0 };
  
  // press enter to go forwards, or q to quit
  while(getch() != 'q')
  {
    
    // calculate the distance between the objects
    double d = distance2d(&a, &b);
    
    // calculate the force
    double f = (6.67 * pow((1*10), -11)) * (bodya.mass * bodyb.mass)/pow(d, 2);
    
    // calculate the acceleration
    bodya.acceleration = f/bodya.mass;
    bodyb.acceleration = f/bodyb.mass;
    
    // calculate the velocity
    bodya.velocity += bodya.acceleration*1;
    bodyb.velocity += bodyb.acceleration*1;
    
    // calculate the position
    bodya.position.x += bodya.velocity;
    bodyb.position.x += bodyb.velocity;
    
    printf("Body A:\n\tPosition: x(%lf), y(%lf)\n\tVelocity: %f\nBody B:\n\tPosition: x(%lf), y(%lf)\n\tVelocity: %f\n",
      bodya.position.x, bodya.position.y, bodya.velocity,
      bodyb.position.x, bodyb.position.y, bodyb.velocity);
    
  }
  
  return 0;
  
}

I'm not a physicist, so maybe there are some errors in my calculations. But I'm quite certain that this is correct. It'd certainly seem so based off the numbers.

Sunday 9 March 2014

Minimaps

This weekend was like any other. I spent it doing some programming. Along with fixing a plethora of little bugs in my map editor I decided to create a minimap for it. As you can see here in the picture below, we have a minimap (and a very nice Martian landscape):


To get a minimap to work you have to translate the mini coordinates into big coordinates. That way you can scroll to where the user clicks. The method I used is this:

real_map_coord = mini_map_coord * ( real_map_size / mini_map_size)

Works perfectly. I do this twice; once for X and once for Y.



Saturday 1 March 2014

Map Editor & Thoughts on Xojo

Hobby game programming is difficult because it requires a lot of energy and time but also because it requires the right amount of motivation and the right mind-set. There's always a multitude of technical complications to overcome and you have to overcome these mostly on your own. This isn't helped by the fact that you're also learning along the way - mostly at the end of the day after you've already been burnt out by work. Progress is slow. It's also not uncommon to be halfway through making something and then you feel like making something else. Fortunately with all of your efforts you can always walk away from an unfinished project and be able to say that you've learned something from it.

My life has been turned upside down in the past two years and after a really bad patch it's finally come back together again. Due to the circumstances I was forced to take a break from regular programming and all my creative desires had to be suspended for almost a year. Fortunately, I've come back to programming with renewed vigour. After moving from Australia to Germany to live with my girlfriend I found a new job which introduced me to a new language: Xojo.

Xojo is a surprisingly powerful tool but also a relatively unknown one. At first my expectations for it weren't very high. I'd used VB before and was never very enthusiastic about VB, but Xojo surprised me. While programming at work with it everyday I started to like it a lot. With Xojo it is extremely easy to develop a good looking, stable and quite powerful program in a very small amount of time.

After settling into my new home my creativity crawled  its way slowly back to me. Naturally, I was keen to test Xojo's performance in my favourite area: games development. So I went ahead and created a functional 2D Map Editor for my C++ games.

The development process lasted three weeks, working only in afternoons and on weekends. This is a testament to Xojo's ease of use and potential for rapid development. The end result is very impressive for the amount of time put in and for the amount of problems I encountered during development (none). Due to Xojo's cross platform nature, this will also compile and run with no problems and no modifications for Windows, Mac OSX and Linux.

You may be wondering why I decided to make a map editor instead of a game in Xojo. While it's certainly possible to create a game in Xojo it's not necessarily the best choice for a game developer in its current state... especially for 3D. Here's why:

1. No .net for Windows

On Windows Xojo still uses the Win32 API. Flickering can be a problem. Although there are ways to help fix this, you're still working with old technology. Even for people developing normal programs in Xojo, without a primary focus on graphics, they have encountered difficulties. If you wanted to make a very slick, modern-looking game in Xojo you might have a hard time of it.

The good news is that the Xojo team have just finished upgrading the Mac side of Xojo from Carbon to Cocoa - and Windows is planned for the future.

2. Raw OpenGL / Less libaries

As a less known and used language Xojo has less people to write libraries for it. Considering its beginner orientation and toy-like feel, perhaps it also doesn't do so well at attracting the kind of hardcore users who would create these types of things for it. Which is a shame, because it's really not a tool exclusively for beginners. 3D is possible in Xojo but requires the use of raw OpenGL. There aren't helpful libraries like Irrlicht, Ogre3D, or even Glut, to make it easier for you.

Honestly, it's easier to go and get yourself Irrlicht for 3D than trying to do it with Xojo at the moment. However a good man named Alwyn Bester is working on some kind of 3D library for Xojo to address this issue.

With that said if you're interested in making a simple 2D, crossplatform game with barely any hassle then you can't go wrong with Xojo. It lifts all the complexity off the programmer and lets him/her get straight to the fun parts. Its made a brilliant compromise between power, performance, ease of use and development speed. In fact, for a lightweight programming tool, it doesn't really get much better than Xojo.

Programming languages are tools in the belt of a programmer, and Xojo's earned a place on my belt. While I will continue to use C and C++ for the bulk of my game design efforts, all the tools and utilities I create to support my games will be in Xojo. I'm extremely impressed with how easily I've been able to develop this map editor. If I'd have done it in C++ it would still only be 25% complete by now.

The Map Editor

Anyway, I'll tell you and show you a little bit more about the map editor I've made.

My map editor allows you to create, save and load 2D maps. It creates a text file which saves the location of the tiles and their corresponding TileID. For demonstration purposes I've created this map called Tranquil Forest and have uploaded its map file here so you can look at it:


 Writing in plain text at the top of the file is also ok. Here you can write whatever more you want to say however it
will not be loaded into the game.
Please be mindful of the format. The game will only read lines that end in a semi colon (;) so don't use them in
your comments.


Game=Alpha;
GameVersion=1.0.0;
MapName=TranquilForest;
MapDescription=A nice forest with a road going through it.;
MapVersion=1.0.0;
Author=Joshua Woods;
AuthorInfo=someone@gmail.com;
License=PublicDomain;
Resolution=2048x2048;
TileSize=32;
0,0=5;
0,1=5;
0,2=1;
0,3=1;
0,4=2;
0,5=1;
0,6=1;
0,7=5;
0,8=5;
0,9=5;
0,10=1;
0,11=1;
0,12=1;
0,13=1;
0,14=1;
0,15=1;
0,16=1;
0,17=1;
0,18=1;
0,19=1;
0,20=1;
0,21=1;
0,22=1;
0,23=1;
0,24=1;
0,25=1;
0,26=1;
0,27=1;
0,28=1;
0,29=1;
0,30=1;
0,31=1;
0,32=1;
0,33=1;
0,34=1;
0,35=1;
0,36=1;
0,37=1;
0,38=1;
0,39=1;
0,40=1;
0,41=1;
0,42=1;
0,43=1;
0,44=3;
0,45=4;
0,46=4;
0,47=4;
0,48=4;
0,49=4;
0,50=4;
0,51=4;
0,52=4;
0,53=4;
0,54=4;
0,55=4;
0,56=4;
0,57=4;
0,58=4;
0,59=4;
0,60=4;
0,61=4;
0,62=4;
0,63=4;
1,0=5;
1,1=5;
1,2=1;
1,3=1;
1,4=2;
1,5=1;
1,6=1;
1,7=5;
1,8=5;
1,9=5;
1,10=1;
1,11=1;
1,12=1;
1,13=1;
1,14=1;
1,15=1;
1,16=1;
1,17=1;
1,18=1;
1,19=1;
1,20=1;
1,21=1;
1,22=1;
1,23=5;
1,24=5;
1,25=5;
1,26=1;
1,27=5;
1,28=5;
1,29=5;
1,30=1;
1,31=1;
1,32=1;
1,33=1;
1,34=1;
1,35=1;
1,36=1;
1,37=1;
1,38=1;
1,39=1;
1,40=1;
1,41=1;
1,42=1;
1,43=1;
1,44=3;
1,45=4;
1,46=4;
1,47=4;
1,48=4;
1,49=4;
1,50=4;
1,51=4;
1,52=4;
1,53=4;
1,54=4;
1,55=4;
1,56=4;
1,57=4;
1,58=4;
1,59=4;
1,60=4;
1,61=4;
1,62=4;
1,63=4;
2,0=5;
2,1=5;
2,2=1;
2,3=1;
2,4=2;
2,5=1;
2,6=1;
2,7=5;
2,8=5;
2,9=5;
2,10=1;
2,11=1;
2,12=1;
2,13=1;
2,14=3;
2,15=1;
2,16=1;
2,17=1;
2,18=1;
2,19=1;
2,20=1;
2,21=1;
2,22=5;
2,23=5;
2,24=5;
2,25=5;
2,26=5;
2,27=5;
2,28=5;
2,29=5;
2,30=1;
2,31=1;
2,32=1;
2,33=1;
2,34=1;
2,35=1;
2,36=1;
2,37=1;
2,38=1;
2,39=1;
2,40=1;
2,41=1;
2,42=1;
2,43=1;
2,44=3;
2,45=4;
2,46=4;
2,47=4;
2,48=4;
2,49=4;
2,50=4;
2,51=4;
2,52=4;
2,53=4;
2,54=4;
2,55=4;
2,56=4;
2,57=4;
2,58=4;
2,59=4;
2,60=4;
2,61=4;
2,62=4;
2,63=4;
3,0=5;
3,1=5;
3,2=1;
3,3=1;
3,4=2;
3,5=1;
3,6=1;
3,7=5;
3,8=5;
3,9=5;
3,10=1;
3,11=1;
3,12=3;
3,13=3;
3,14=3;
3,15=3;
3,16=3;
3,17=3;
3,18=1;
3,19=1;
3,20=1;
3,21=1;
3,22=1;
3,23=5;
3,24=5;
3,25=5;
3,26=5;
3,27=5;
3,28=5;
3,29=5;
3,30=5;
3,31=5;
3,32=5;
3,33=1;
3,34=1;
3,35=1;
3,36=1;
3,37=1;
3,38=1;
3,39=1;
3,40=1;
3,41=1;
3,42=1;
3,43=1;
3,44=3;
3,45=4;
3,46=4;
3,47=4;
3,48=4;
3,49=4;
3,50=4;
3,51=4;
3,52=4;
3,53=4;
3,54=4;
3,55=4;
3,56=4;
3,57=4;
3,58=4;
3,59=4;
3,60=4;
3,61=4;
3,62=4;
3,63=4;
4,0=5;
4,1=5;
4,2=5;
4,3=1;
4,4=2;
4,5=2;
4,6=1;
4,7=1;
4,8=5;
4,9=5;
4,10=1;
4,11=1;
4,12=3;
4,13=4;
4,14=4;
4,15=4;
4,16=4;
4,17=3;
4,18=3;
4,19=1;
4,20=1;
4,21=1;
4,22=1;
4,23=1;
4,24=5;
4,25=5;
4,26=5;
4,27=5;
4,28=5;
4,29=5;
4,30=5;
4,31=5;
4,32=5;
4,33=1;
4,34=1;
4,35=1;
4,36=1;
4,37=1;
4,38=1;
4,39=1;
4,40=1;
4,41=1;
4,42=1;
4,43=1;
4,44=3;
4,45=4;
4,46=4;
4,47=4;
4,48=4;
4,49=4;
4,50=4;
4,51=4;
4,52=4;
4,53=4;
4,54=4;
4,55=4;
4,56=4;
4,57=4;
4,58=4;
4,59=4;
4,60=4;
4,61=4;
4,62=4;
4,63=4;
5,0=5;
5,1=5;
5,2=5;
5,3=1;
5,4=1;
5,5=2;
5,6=1;
5,7=1;
5,8=5;
5,9=5;
5,10=1;
5,11=1;
5,12=3;
5,13=4;
5,14=4;
5,15=4;
5,16=4;
5,17=4;
5,18=3;
5,19=3;
5,20=1;
5,21=1;
5,22=1;
5,23=1;
5,24=5;
5,25=5;
5,26=5;
5,27=5;
5,28=5;
5,29=5;
5,30=5;
5,31=5;
5,32=1;
5,33=5;
5,34=1;
5,35=1;
5,36=1;
5,37=1;
5,38=1;
5,39=1;
5,40=1;
5,41=1;
5,42=1;
5,43=1;
5,44=3;
5,45=4;
5,46=4;
5,47=4;
5,48=4;
5,49=4;
5,50=4;
5,51=4;
5,52=4;
5,53=4;
5,54=4;
5,55=4;
5,56=4;
5,57=4;
5,58=4;
5,59=4;
5,60=4;
5,61=4;
5,62=4;
5,63=4;
6,0=5;
6,1=5;
6,2=5;
6,3=1;
6,4=1;
6,5=2;
6,6=2;
6,7=1;
6,8=5;
6,9=5;
6,10=1;
6,11=3;
6,12=3;
6,13=4;
6,14=4;
6,15=4;
6,16=4;
6,17=4;
6,18=4;
6,19=3;
6,20=3;
6,21=1;
6,22=1;
6,23=1;
6,24=5;
6,25=5;
6,26=5;
6,27=1;
6,28=5;
6,29=5;
6,30=5;
6,31=5;
6,32=5;
6,33=5;
6,34=5;
6,35=1;
6,36=1;
6,37=1;
6,38=1;
6,39=1;
6,40=1;
6,41=1;
6,42=1;
6,43=1;
6,44=3;
6,45=3;
6,46=4;
6,47=4;
6,48=4;
6,49=4;
6,50=4;
6,51=4;
6,52=4;
6,53=4;
6,54=4;
6,55=4;
6,56=4;
6,57=4;
6,58=4;
6,59=4;
6,60=4;
6,61=4;
6,62=4;
6,63=4;
7,0=5;
7,1=5;
7,2=5;
7,3=1;
7,4=1;
7,5=1;
7,6=2;
7,7=1;
7,8=5;
7,9=5;
7,10=1;
7,11=3;
7,12=4;
7,13=4;
7,14=4;
7,15=4;
7,16=4;
7,17=4;
7,18=4;
7,19=4;
7,20=3;
7,21=1;
7,22=1;
7,23=1;
7,24=1;
7,25=5;
7,26=5;
7,27=5;
7,28=5;
7,29=5;
7,30=5;
7,31=5;
7,32=5;
7,33=5;
7,34=5;
7,35=1;
7,36=1;
7,37=1;
7,38=1;
7,39=1;
7,40=1;
7,41=1;
7,42=1;
7,43=1;
7,44=1;
7,45=3;
7,46=4;
7,47=4;
7,48=4;
7,49=4;
7,50=4;
7,51=4;
7,52=4;
7,53=4;
7,54=4;
7,55=4;
7,56=4;
7,57=4;
7,58=4;
7,59=4;
7,60=4;
7,61=4;
7,62=4;
7,63=4;
8,0=5;
8,1=5;
8,2=5;
8,3=5;
8,4=1;
8,5=1;
8,6=2;
8,7=1;
8,8=5;
8,9=5;
8,10=1;
8,11=3;
8,12=4;
8,13=4;
8,14=4;
8,15=4;
8,16=4;
8,17=4;
8,18=4;
8,19=4;
8,20=3;
8,21=1;
8,22=1;
8,23=1;
8,24=1;
8,25=5;
8,26=5;
8,27=5;
8,28=5;
8,29=5;
8,30=5;
8,31=5;
8,32=5;
8,33=5;
8,34=5;
8,35=1;
8,36=1;
8,37=1;
8,38=1;
8,39=1;
8,40=1;
8,41=1;
8,42=1;
8,43=1;
8,44=1;
8,45=3;
8,46=3;
8,47=4;
8,48=4;
8,49=4;
8,50=4;
8,51=4;
8,52=4;
8,53=4;
8,54=4;
8,55=4;
8,56=4;
8,57=4;
8,58=4;
8,59=4;
8,60=4;
8,61=4;
8,62=4;
8,63=4;
9,0=5;
9,1=5;
9,2=5;
9,3=5;
9,4=1;
9,5=1;
9,6=2;
9,7=1;
9,8=5;
9,9=5;
9,10=1;
9,11=3;
9,12=3;
9,13=4;
9,14=4;
9,15=4;
9,16=4;
9,17=4;
9,18=4;
9,19=4;
9,20=3;
9,21=1;
9,22=1;
9,23=1;
9,24=5;
9,25=5;
9,26=5;
9,27=5;
9,28=5;
9,29=5;
9,30=5;
9,31=5;
9,32=5;
9,33=5;
9,34=1;
9,35=1;
9,36=1;
9,37=1;
9,38=1;
9,39=1;
9,40=1;
9,41=1;
9,42=1;
9,43=1;
9,44=1;
9,45=3;
9,46=4;
9,47=4;
9,48=4;
9,49=4;
9,50=4;
9,51=4;
9,52=4;
9,53=4;
9,54=4;
9,55=4;
9,56=4;
9,57=4;
9,58=4;
9,59=4;
9,60=4;
9,61=4;
9,62=4;
9,63=4;
10,0=5;
10,1=5;
10,2=5;
10,3=5;
10,4=1;
10,5=2;
10,6=2;
10,7=1;
10,8=5;
10,9=5;
10,10=1;
10,11=1;
10,12=3;
10,13=3;
10,14=4;
10,15=4;
10,16=4;
10,17=4;
10,18=4;
10,19=4;
10,20=3;
10,21=1;
10,22=1;
10,23=1;
10,24=1;
10,25=5;
10,26=5;
10,27=5;
10,28=5;
10,29=5;
10,30=5;
10,31=5;
10,32=5;
10,33=5;
10,34=5;
10,35=1;
10,36=1;
10,37=1;
10,38=1;
10,39=1;
10,40=1;
10,41=1;
10,42=1;
10,43=1;
10,44=1;
10,45=3;
10,46=4;
10,47=4;
10,48=4;
10,49=4;
10,50=4;
10,51=4;
10,52=4;
10,53=4;
10,54=4;
10,55=4;
10,56=4;
10,57=4;
10,58=4;
10,59=4;
10,60=4;
10,61=4;
10,62=4;
10,63=4;
11,0=5;
11,1=5;
11,2=5;
11,3=5;
11,4=1;
11,5=2;
11,6=1;
11,7=1;
11,8=5;
11,9=5;
11,10=1;
11,11=1;
11,12=1;
11,13=3;
11,14=3;
11,15=3;
11,16=4;
11,17=4;
11,18=3;
11,19=3;
11,20=3;
11,21=1;
11,22=1;
11,23=1;
11,24=1;
11,25=5;
11,26=5;
11,27=5;
11,28=5;
11,29=5;
11,30=5;
11,31=5;
11,32=5;
11,33=5;
11,34=5;
11,35=1;
11,36=1;
11,37=1;
11,38=1;
11,39=1;
11,40=1;
11,41=1;
11,42=1;
11,43=1;
11,44=3;
11,45=3;
11,46=4;
11,47=4;
11,48=4;
11,49=4;
11,50=4;
11,51=4;
11,52=4;
11,53=4;
11,54=4;
11,55=4;
11,56=4;
11,57=4;
11,58=4;
11,59=4;
11,60=4;
11,61=4;
11,62=4;
11,63=4;
12,0=5;
12,1=5;
12,2=5;
12,3=5;
12,4=1;
12,5=2;
12,6=1;
12,7=1;
12,8=1;
12,9=1;
12,10=1;
12,11=1;
12,12=1;
12,13=1;
12,14=1;
12,15=3;
12,16=3;
12,17=3;
12,18=3;
12,19=1;
12,20=1;
12,21=1;
12,22=1;
12,23=1;
12,24=1;
12,25=5;
12,26=5;
12,27=5;
12,28=5;
12,29=5;
12,30=5;
12,31=5;
12,32=5;
12,33=5;
12,34=5;
12,35=1;
12,36=1;
12,37=1;
12,38=1;
12,39=1;
12,40=1;
12,41=1;
12,42=1;
12,43=3;
12,44=3;
12,45=4;
12,46=4;
12,47=4;
12,48=4;
12,49=4;
12,50=4;
12,51=4;
12,52=4;
12,53=4;
12,54=4;
12,55=4;
12,56=4;
12,57=4;
12,58=4;
12,59=4;
12,60=4;
12,61=4;
12,62=4;
12,63=4;
13,0=5;
13,1=5;
13,2=5;
13,3=5;
13,4=1;
13,5=2;
13,6=2;
13,7=2;
13,8=2;
13,9=2;
13,10=1;
13,11=5;
13,12=5;
13,13=5;
13,14=1;
13,15=1;
13,16=1;
13,17=1;
13,18=1;
13,19=1;
13,20=1;
13,21=1;
13,22=1;
13,23=1;
13,24=1;
13,25=5;
13,26=5;
13,27=5;
13,28=5;
13,29=5;
13,30=5;
13,31=5;
13,32=5;
13,33=5;
13,34=5;
13,35=1;
13,36=1;
13,37=1;
13,38=1;
13,39=1;
13,40=1;
13,41=1;
13,42=3;
13,43=3;
13,44=4;
13,45=4;
13,46=4;
13,47=4;
13,48=4;
13,49=4;
13,50=4;
13,51=4;
13,52=4;
13,53=4;
13,54=4;
13,55=4;
13,56=4;
13,57=4;
13,58=4;
13,59=4;
13,60=4;
13,61=4;
13,62=4;
13,63=4;
14,0=5;
14,1=5;
14,2=5;
14,3=1;
14,4=1;
14,5=1;
14,6=1;
14,7=1;
14,8=1;
14,9=2;
14,10=1;
14,11=5;
14,12=5;
14,13=5;
14,14=5;
14,15=5;
14,16=5;
14,17=5;
14,18=5;
14,19=5;
14,20=5;
14,21=5;
14,22=1;
14,23=1;
14,24=1;
14,25=1;
14,26=1;
14,27=1;
14,28=5;
14,29=5;
14,30=5;
14,31=5;
14,32=5;
14,33=5;
14,34=5;
14,35=1;
14,36=1;
14,37=1;
14,38=1;
14,39=1;
14,40=1;
14,41=1;
14,42=3;
14,43=4;
14,44=4;
14,45=4;
14,46=4;
14,47=4;
14,48=4;
14,49=4;
14,50=4;
14,51=4;
14,52=4;
14,53=4;
14,54=4;
14,55=4;
14,56=4;
14,57=4;
14,58=4;
14,59=4;
14,60=4;
14,61=4;
14,62=4;
14,63=4;
15,0=5;
15,1=5;
15,2=5;
15,3=5;
15,4=5;
15,5=5;
15,6=5;
15,7=5;
15,8=1;
15,9=2;
15,10=1;
15,11=5;
15,12=5;
15,13=5;
15,14=5;
15,15=5;
15,16=5;
15,17=5;
15,18=5;
15,19=5;
15,20=5;
15,21=5;
15,22=1;
15,23=1;
15,24=1;
15,25=1;
15,26=1;
15,27=1;
15,28=1;
15,29=1;
15,30=1;
15,31=1;
15,32=1;
15,33=1;
15,34=5;
15,35=1;
15,36=1;
15,37=1;
15,38=1;
15,39=1;
15,40=3;
15,41=3;
15,42=3;
15,43=4;
15,44=4;
15,45=4;
15,46=4;
15,47=4;
15,48=4;
15,49=4;
15,50=4;
15,51=4;
15,52=4;
15,53=4;
15,54=4;
15,55=3;
15,56=3;
15,57=3;
15,58=3;
15,59=3;
15,60=3;
15,61=3;
15,62=3;
15,63=3;
16,0=5;
16,1=5;
16,2=5;
16,3=5;
16,4=5;
16,5=1;
16,6=1;
16,7=1;
16,8=1;
16,9=2;
16,10=1;
16,11=1;
16,12=1;
16,13=1;
16,14=1;
16,15=1;
16,16=1;
16,17=1;
16,18=1;
16,19=1;
16,20=1;
16,21=1;
16,22=1;
16,23=1;
16,24=1;
16,25=1;
16,26=1;
16,27=1;
16,28=1;
16,29=1;
16,30=1;
16,31=1;
16,32=1;
16,33=1;
16,34=1;
16,35=1;
16,36=1;
16,37=1;
16,38=1;
16,39=1;
16,40=3;
16,41=4;
16,42=4;
16,43=4;
16,44=4;
16,45=4;
16,46=4;
16,47=4;
16,48=4;
16,49=4;
16,50=4;
16,51=4;
16,52=4;
16,53=4;
16,54=3;
16,55=3;
16,56=1;
16,57=1;
16,58=1;
16,59=1;
16,60=1;
16,61=1;
16,62=1;
16,63=1;
17,0=5;
17,1=5;
17,2=5;
17,3=5;
17,4=5;
17,5=5;
17,6=1;
17,7=1;
17,8=1;
17,9=2;
17,10=1;
17,11=1;
17,12=1;
17,13=1;
17,14=1;
17,15=1;
17,16=1;
17,17=1;
17,18=1;
17,19=1;
17,20=1;
17,21=1;
17,22=1;
17,23=1;
17,24=5;
17,25=5;
17,26=5;
17,27=5;
17,28=1;
17,29=1;
17,30=1;
17,31=1;
17,32=1;
17,33=1;
17,34=1;
17,35=1;
17,36=1;
17,37=1;
17,38=1;
17,39=3;
17,40=3;
17,41=4;
17,42=4;
17,43=4;
17,44=4;
17,45=4;
17,46=4;
17,47=4;
17,48=4;
17,49=4;
17,50=4;
17,51=4;
17,52=4;
17,53=4;
17,54=3;
17,55=1;
17,56=1;
17,57=1;
17,58=1;
17,59=1;
17,60=1;
17,61=1;
17,62=1;
17,63=1;
18,0=5;
18,1=5;
18,2=5;
18,3=5;
18,4=5;
18,5=5;
18,6=1;
18,7=1;
18,8=1;
18,9=2;
18,10=1;
18,11=1;
18,12=1;
18,13=1;
18,14=1;
18,15=1;
18,16=1;
18,17=1;
18,18=1;
18,19=1;
18,20=1;
18,21=1;
18,22=1;
18,23=5;
18,24=5;
18,25=5;
18,26=5;
18,27=5;
18,28=5;
18,29=5;
18,30=5;
18,31=5;
18,32=1;
18,33=1;
18,34=1;
18,35=1;
18,36=1;
18,37=1;
18,38=3;
18,39=3;
18,40=4;
18,41=4;
18,42=4;
18,43=4;
18,44=4;
18,45=4;
18,46=4;
18,47=4;
18,48=4;
18,49=4;
18,50=4;
18,51=4;
18,52=4;
18,53=3;
18,54=3;
18,55=1;
18,56=1;
18,57=1;
18,58=1;
18,59=1;
18,60=1;
18,61=1;
18,62=1;
18,63=1;
19,0=5;
19,1=1;
19,2=5;
19,3=5;
19,4=5;
19,5=5;
19,6=1;
19,7=1;
19,8=1;
19,9=2;
19,10=2;
19,11=1;
19,12=1;
19,13=1;
19,14=1;
19,15=1;
19,16=1;
19,17=1;
19,18=1;
19,19=1;
19,20=1;
19,21=1;
19,22=1;
19,23=5;
19,24=5;
19,25=5;
19,26=5;
19,27=5;
19,28=5;
19,29=5;
19,30=5;
19,31=5;
19,32=5;
19,33=1;
19,34=1;
19,35=1;
19,36=1;
19,37=1;
19,38=3;
19,39=4;
19,40=4;
19,41=4;
19,42=4;
19,43=4;
19,44=4;
19,45=4;
19,46=4;
19,47=4;
19,48=4;
19,49=4;
19,50=4;
19,51=3;
19,52=3;
19,53=3;
19,54=1;
19,55=1;
19,56=1;
19,57=1;
19,58=1;
19,59=1;
19,60=1;
19,61=1;
19,62=1;
19,63=1;
20,0=1;
20,1=5;
20,2=1;
20,3=5;
20,4=5;
20,5=5;
20,6=5;
20,7=1;
20,8=1;
20,9=1;
20,10=2;
20,11=2;
20,12=1;
20,13=1;
20,14=1;
20,15=1;
20,16=1;
20,17=1;
20,18=1;
20,19=1;
20,20=1;
20,21=1;
20,22=1;
20,23=5;
20,24=5;
20,25=5;
20,26=5;
20,27=5;
20,28=5;
20,29=5;
20,30=5;
20,31=5;
20,32=5;
20,33=1;
20,34=1;
20,35=1;
20,36=1;
20,37=1;
20,38=3;
20,39=4;
20,40=4;
20,41=4;
20,42=4;
20,43=4;
20,44=4;
20,45=4;
20,46=4;
20,47=4;
20,48=4;
20,49=4;
20,50=3;
20,51=3;
20,52=1;
20,53=1;
20,54=1;
20,55=1;
20,56=1;
20,57=1;
20,58=1;
20,59=1;
20,60=1;
20,61=1;
20,62=1;
20,63=1;
21,0=1;
21,1=5;
21,2=5;
21,3=5;
21,4=5;
21,5=5;
21,6=1;
21,7=1;
21,8=1;
21,9=1;
21,10=2;
21,11=2;
21,12=1;
21,13=1;
21,14=1;
21,15=1;
21,16=1;
21,17=1;
21,18=1;
21,19=1;
21,20=1;
21,21=1;
21,22=5;
21,23=5;
21,24=5;
21,25=5;
21,26=5;
21,27=5;
21,28=5;
21,29=5;
21,30=5;
21,31=5;
21,32=5;
21,33=5;
21,34=5;
21,35=1;
21,36=1;
21,37=1;
21,38=3;
21,39=4;
21,40=4;
21,41=4;
21,42=4;
21,43=4;
21,44=4;
21,45=4;
21,46=4;
21,47=4;
21,48=4;
21,49=3;
21,50=3;
21,51=1;
21,52=1;
21,53=1;
21,54=1;
21,55=1;
21,56=1;
21,57=1;
21,58=1;
21,59=1;
21,60=1;
21,61=1;
21,62=1;
21,63=1;
22,0=1;
22,1=5;
22,2=5;
22,3=5;
22,4=5;
22,5=5;
22,6=5;
22,7=5;
22,8=1;
22,9=1;
22,10=1;
22,11=2;
22,12=2;
22,13=2;
22,14=1;
22,15=1;
22,16=1;
22,17=1;
22,18=1;
22,19=1;
22,20=1;
22,21=1;
22,22=1;
22,23=5;
22,24=5;
22,25=5;
22,26=5;
22,27=5;
22,28=5;
22,29=5;
22,30=5;
22,31=5;
22,32=5;
22,33=5;
22,34=5;
22,35=1;
22,36=1;
22,37=1;
22,38=3;
22,39=4;
22,40=4;
22,41=4;
22,42=4;
22,43=4;
22,44=4;
22,45=4;
22,46=4;
22,47=4;
22,48=3;
22,49=3;
22,50=1;
22,51=1;
22,52=1;
22,53=1;
22,54=1;
22,55=1;
22,56=1;
22,57=1;
22,58=1;
22,59=1;
22,60=1;
22,61=1;
22,62=1;
22,63=1;
23,0=5;
23,1=5;
23,2=5;
23,3=5;
23,4=5;
23,5=5;
23,6=5;
23,7=5;
23,8=1;
23,9=1;
23,10=1;
23,11=1;
23,12=1;
23,13=2;
23,14=2;
23,15=1;
23,16=1;
23,17=1;
23,18=1;
23,19=1;
23,20=1;
23,21=1;
23,22=1;
23,23=5;
23,24=5;
23,25=5;
23,26=5;
23,27=5;
23,28=5;
23,29=5;
23,30=5;
23,31=5;
23,32=5;
23,33=5;
23,34=5;
23,35=1;
23,36=1;
23,37=1;
23,38=3;
23,39=3;
23,40=3;
23,41=4;
23,42=4;
23,43=4;
23,44=4;
23,45=4;
23,46=3;
23,47=3;
23,48=3;
23,49=1;
23,50=1;
23,51=1;
23,52=1;
23,53=1;
23,54=1;
23,55=1;
23,56=5;
23,57=5;
23,58=5;
23,59=5;
23,60=1;
23,61=1;
23,62=1;
23,63=1;
24,0=5;
24,1=5;
24,2=5;
24,3=5;
24,4=5;
24,5=5;
24,6=5;
24,7=5;
24,8=5;
24,9=5;
24,10=1;
24,11=1;
24,12=1;
24,13=1;
24,14=2;
24,15=2;
24,16=2;
24,17=2;
24,18=2;
24,19=2;
24,20=1;
24,21=1;
24,22=1;
24,23=1;
24,24=5;
24,25=5;
24,26=5;
24,27=5;
24,28=5;
24,29=5;
24,30=5;
24,31=5;
24,32=5;
24,33=5;
24,34=5;
24,35=1;
24,36=1;
24,37=1;
24,38=1;
24,39=1;
24,40=3;
24,41=3;
24,42=3;
24,43=3;
24,44=3;
24,45=3;
24,46=3;
24,47=1;
24,48=1;
24,49=1;
24,50=1;
24,51=1;
24,52=1;
24,53=1;
24,54=5;
24,55=5;
24,56=1;
24,57=5;
24,58=5;
24,59=5;
24,60=5;
24,61=5;
24,62=5;
24,63=1;
25,0=1;
25,1=5;
25,2=5;
25,3=5;
25,4=5;
25,5=5;
25,6=5;
25,7=5;
25,8=5;
25,9=5;
25,10=5;
25,11=1;
25,12=1;
25,13=1;
25,14=1;
25,15=1;
25,16=1;
25,17=1;
25,18=1;
25,19=2;
25,20=1;
25,21=1;
25,22=1;
25,23=1;
25,24=1;
25,25=1;
25,26=1;
25,27=1;
25,28=5;
25,29=5;
25,30=5;
25,31=5;
25,32=5;
25,33=5;
25,34=1;
25,35=1;
25,36=1;
25,37=1;
25,38=1;
25,39=1;
25,40=1;
25,41=1;
25,42=1;
25,43=1;
25,44=1;
25,45=1;
25,46=1;
25,47=1;
25,48=1;
25,49=1;
25,50=1;
25,51=1;
25,52=1;
25,53=5;
25,54=5;
25,55=5;
25,56=5;
25,57=5;
25,58=5;
25,59=5;
25,60=5;
25,61=5;
25,62=5;
25,63=1;
26,0=5;
26,1=5;
26,2=5;
26,3=5;
26,4=5;
26,5=5;
26,6=5;
26,7=5;
26,8=5;
26,9=5;
26,10=5;
26,11=5;
26,12=5;
26,13=1;
26,14=1;
26,15=1;
26,16=1;
26,17=1;
26,18=1;
26,19=2;
26,20=2;
26,21=1;
26,22=1;
26,23=1;
26,24=1;
26,25=1;
26,26=1;
26,27=1;
26,28=1;
26,29=1;
26,30=1;
26,31=1;
26,32=1;
26,33=5;
26,34=1;
26,35=1;
26,36=1;
26,37=1;
26,38=1;
26,39=1;
26,40=1;
26,41=1;
26,42=1;
26,43=5;
26,44=5;
26,45=5;
26,46=5;
26,47=5;
26,48=1;
26,49=1;
26,50=1;
26,51=1;
26,52=5;
26,53=5;
26,54=5;
26,55=5;
26,56=1;
26,57=5;
26,58=1;
26,59=5;
26,60=5;
26,61=5;
26,62=5;
26,63=1;
27,0=1;
27,1=5;
27,2=5;
27,3=5;
27,4=5;
27,5=5;
27,6=5;
27,7=5;
27,8=5;
27,9=5;
27,10=5;
27,11=5;
27,12=5;
27,13=5;
27,14=1;
27,15=1;
27,16=1;
27,17=1;
27,18=1;
27,19=1;
27,20=2;
27,21=2;
27,22=1;
27,23=1;
27,24=1;
27,25=1;
27,26=1;
27,27=1;
27,28=1;
27,29=1;
27,30=1;
27,31=1;
27,32=1;
27,33=1;
27,34=1;
27,35=1;
27,36=1;
27,37=1;
27,38=1;
27,39=1;
27,40=1;
27,41=1;
27,42=5;
27,43=5;
27,44=5;
27,45=5;
27,46=5;
27,47=5;
27,48=1;
27,49=1;
27,50=1;
27,51=5;
27,52=5;
27,53=5;
27,54=5;
27,55=1;
27,56=5;
27,57=5;
27,58=5;
27,59=5;
27,60=5;
27,61=1;
27,62=5;
27,63=1;
28,0=1;
28,1=5;
28,2=5;
28,3=1;
28,4=5;
28,5=5;
28,6=1;
28,7=1;
28,8=5;
28,9=5;
28,10=5;
28,11=5;
28,12=5;
28,13=1;
28,14=1;
28,15=1;
28,16=1;
28,17=1;
28,18=1;
28,19=1;
28,20=1;
28,21=2;
28,22=2;
28,23=1;
28,24=1;
28,25=1;
28,26=1;
28,27=1;
28,28=1;
28,29=1;
28,30=1;
28,31=1;
28,32=1;
28,33=1;
28,34=1;
28,35=1;
28,36=1;
28,37=1;
28,38=1;
28,39=5;
28,40=5;
28,41=5;
28,42=1;
28,43=5;
28,44=5;
28,45=5;
28,46=5;
28,47=5;
28,48=1;
28,49=1;
28,50=1;
28,51=5;
28,52=5;
28,53=5;
28,54=5;
28,55=5;
28,56=5;
28,57=5;
28,58=5;
28,59=5;
28,60=1;
28,61=5;
28,62=5;
28,63=1;
29,0=1;
29,1=5;
29,2=1;
29,3=1;
29,4=1;
29,5=1;
29,6=1;
29,7=1;
29,8=1;
29,9=1;
29,10=1;
29,11=1;
29,12=1;
29,13=1;
29,14=1;
29,15=1;
29,16=1;
29,17=1;
29,18=1;
29,19=1;
29,20=1;
29,21=1;
29,22=2;
29,23=1;
29,24=1;
29,25=1;
29,26=1;
29,27=1;
29,28=1;
29,29=1;
29,30=1;
29,31=1;
29,32=1;
29,33=1;
29,34=1;
29,35=1;
29,36=1;
29,37=1;
29,38=5;
29,39=5;
29,40=1;
29,41=5;
29,42=5;
29,43=5;
29,44=5;
29,45=5;
29,46=5;
29,47=1;
29,48=1;
29,49=1;
29,50=1;
29,51=1;
29,52=1;
29,53=5;
29,54=1;
29,55=5;
29,56=5;
29,57=5;
29,58=5;
29,59=5;
29,60=5;
29,61=5;
29,62=1;
29,63=1;
30,0=1;
30,1=1;
30,2=1;
30,3=1;
30,4=1;
30,5=1;
30,6=1;
30,7=1;
30,8=1;
30,9=1;
30,10=1;
30,11=1;
30,12=1;
30,13=1;
30,14=1;
30,15=1;
30,16=1;
30,17=1;
30,18=1;
30,19=1;
30,20=1;
30,21=1;
30,22=2;
30,23=2;
30,24=1;
30,25=1;
30,26=1;
30,27=1;
30,28=1;
30,29=1;
30,30=1;
30,31=1;
30,32=1;
30,33=1;
30,34=1;
30,35=5;
30,36=5;
30,37=5;
30,38=5;
30,39=5;
30,40=5;
30,41=5;
30,42=5;
30,43=5;
30,44=5;
30,45=5;
30,46=5;
30,47=1;
30,48=1;
30,49=1;
30,50=1;
30,51=1;
30,52=1;
30,53=1;
30,54=1;
30,55=5;
30,56=1;
30,57=1;
30,58=1;
30,59=1;
30,60=1;
30,61=1;
30,62=1;
30,63=1;
31,0=1;
31,1=1;
31,2=1;
31,3=1;
31,4=1;
31,5=1;
31,6=3;
31,7=3;
31,8=3;
31,9=3;
31,10=3;
31,11=3;
31,12=3;
31,13=3;
31,14=3;
31,15=3;
31,16=1;
31,17=1;
31,18=1;
31,19=1;
31,20=1;
31,21=1;
31,22=1;
31,23=2;
31,24=2;
31,25=1;
31,26=1;
31,27=1;
31,28=1;
31,29=1;
31,30=1;
31,31=1;
31,32=1;
31,33=1;
31,34=1;
31,35=5;
31,36=1;
31,37=1;
31,38=5;
31,39=5;
31,40=5;
31,41=5;
31,42=1;
31,43=5;
31,44=5;
31,45=1;
31,46=1;
31,47=1;
31,48=1;
31,49=1;
31,50=1;
31,51=1;
31,52=1;
31,53=1;
31,54=1;
31,55=1;
31,56=1;
31,57=1;
31,58=1;
31,59=1;
31,60=1;
31,61=1;
31,62=1;
31,63=1;
32,0=1;
32,1=1;
32,2=1;
32,3=1;
32,4=3;
32,5=3;
32,6=3;
32,7=4;
32,8=4;
32,9=4;
32,10=4;
32,11=4;
32,12=4;
32,13=4;
32,14=4;
32,15=3;
32,16=3;
32,17=3;
32,18=1;
32,19=1;
32,20=1;
32,21=1;
32,22=1;
32,23=1;
32,24=2;
32,25=2;
32,26=1;
32,27=1;
32,28=1;
32,29=1;
32,30=1;
32,31=1;
32,32=1;
32,33=1;
32,34=1;
32,35=5;
32,36=5;
32,37=5;
32,38=1;
32,39=5;
32,40=5;
32,41=5;
32,42=5;
32,43=1;
32,44=1;
32,45=1;
32,46=1;
32,47=1;
32,48=1;
32,49=1;
32,50=1;
32,51=1;
32,52=2;
32,53=2;
32,54=2;
32,55=2;
32,56=2;
32,57=2;
32,58=2;
32,59=2;
32,60=2;
32,61=2;
32,62=2;
32,63=2;
33,0=1;
33,1=1;
33,2=1;
33,3=3;
33,4=3;
33,5=4;
33,6=4;
33,7=4;
33,8=4;
33,9=4;
33,10=4;
33,11=4;
33,12=4;
33,13=4;
33,14=4;
33,15=4;
33,16=4;
33,17=3;
33,18=1;
33,19=1;
33,20=1;
33,21=5;
33,22=1;
33,23=1;
33,24=1;
33,25=2;
33,26=2;
33,27=1;
33,28=1;
33,29=1;
33,30=1;
33,31=1;
33,32=1;
33,33=1;
33,34=1;
33,35=1;
33,36=1;
33,37=1;
33,38=5;
33,39=1;
33,40=1;
33,41=1;
33,42=1;
33,43=1;
33,44=1;
33,45=1;
33,46=1;
33,47=1;
33,48=2;
33,49=2;
33,50=2;
33,51=2;
33,52=2;
33,53=1;
33,54=1;
33,55=1;
33,56=1;
33,57=1;
33,58=1;
33,59=1;
33,60=1;
33,61=1;
33,62=1;
33,63=1;
34,0=1;
34,1=1;
34,2=3;
34,3=3;
34,4=4;
34,5=4;
34,6=4;
34,7=4;
34,8=4;
34,9=4;
34,10=4;
34,11=4;
34,12=4;
34,13=4;
34,14=4;
34,15=4;
34,16=4;
34,17=3;
34,18=1;
34,19=1;
34,20=1;
34,21=5;
34,22=5;
34,23=1;
34,24=1;
34,25=1;
34,26=2;
34,27=2;
34,28=2;
34,29=1;
34,30=1;
34,31=1;
34,32=1;
34,33=1;
34,34=1;
34,35=1;
34,36=1;
34,37=1;
34,38=1;
34,39=1;
34,40=1;
34,41=1;
34,42=1;
34,43=1;
34,44=2;
34,45=2;
34,46=2;
34,47=2;
34,48=2;
34,49=1;
34,50=1;
34,51=1;
34,52=1;
34,53=1;
34,54=1;
34,55=1;
34,56=1;
34,57=1;
34,58=1;
34,59=1;
34,60=1;
34,61=1;
34,62=1;
34,63=1;
35,0=1;
35,1=1;
35,2=3;
35,3=4;
35,4=4;
35,5=4;
35,6=4;
35,7=4;
35,8=4;
35,9=4;
35,10=4;
35,11=4;
35,12=4;
35,13=4;
35,14=4;
35,15=4;
35,16=4;
35,17=3;
35,18=3;
35,19=1;
35,20=1;
35,21=5;
35,22=5;
35,23=5;
35,24=1;
35,25=1;
35,26=1;
35,27=1;
35,28=2;
35,29=2;
35,30=2;
35,31=2;
35,32=2;
35,33=2;
35,34=1;
35,35=1;
35,36=1;
35,37=1;
35,38=1;
35,39=2;
35,40=2;
35,41=2;
35,42=2;
35,43=2;
35,44=2;
35,45=1;
35,46=1;
35,47=1;
35,48=1;
35,49=1;
35,50=1;
35,51=1;
35,52=1;
35,53=1;
35,54=5;
35,55=5;
35,56=5;
35,57=1;
35,58=1;
35,59=1;
35,60=1;
35,61=1;
35,62=1;
35,63=1;
36,0=1;
36,1=3;
36,2=3;
36,3=4;
36,4=4;
36,5=4;
36,6=4;
36,7=4;
36,8=4;
36,9=4;
36,10=4;
36,11=4;
36,12=4;
36,13=4;
36,14=4;
36,15=4;
36,16=4;
36,17=4;
36,18=3;
36,19=1;
36,20=5;
36,21=5;
36,22=5;
36,23=5;
36,24=1;
36,25=1;
36,26=1;
36,27=1;
36,28=1;
36,29=1;
36,30=1;
36,31=1;
36,32=1;
36,33=2;
36,34=2;
36,35=2;
36,36=2;
36,37=2;
36,38=2;
36,39=2;
36,40=1;
36,41=1;
36,42=1;
36,43=1;
36,44=1;
36,45=1;
36,46=1;
36,47=1;
36,48=1;
36,49=1;
36,50=1;
36,51=1;
36,52=1;
36,53=5;
36,54=5;
36,55=5;
36,56=5;
36,57=1;
36,58=1;
36,59=1;
36,60=1;
36,61=1;
36,62=1;
36,63=5;
37,0=1;
37,1=3;
37,2=3;
37,3=4;
37,4=4;
37,5=4;
37,6=4;
37,7=4;
37,8=4;
37,9=4;
37,10=4;
37,11=4;
37,12=4;
37,13=4;
37,14=4;
37,15=4;
37,16=4;
37,17=4;
37,18=3;
37,19=1;
37,20=5;
37,21=5;
37,22=5;
37,23=5;
37,24=1;
37,25=1;
37,26=1;
37,27=1;
37,28=1;
37,29=1;
37,30=1;
37,31=1;
37,32=1;
37,33=1;
37,34=1;
37,35=1;
37,36=2;
37,37=2;
37,38=1;
37,39=1;
37,40=1;
37,41=1;
37,42=1;
37,43=1;
37,44=1;
37,45=1;
37,46=1;
37,47=1;
37,48=1;
37,49=1;
37,50=1;
37,51=5;
37,52=5;
37,53=5;
37,54=5;
37,55=5;
37,56=5;
37,57=1;
37,58=1;
37,59=1;
37,60=1;
37,61=1;
37,62=5;
37,63=5;
38,0=1;
38,1=3;
38,2=3;
38,3=4;
38,4=4;
38,5=4;
38,6=4;
38,7=4;
38,8=4;
38,9=4;
38,10=4;
38,11=4;
38,12=4;
38,13=4;
38,14=4;
38,15=4;
38,16=4;
38,17=4;
38,18=3;
38,19=1;
38,20=5;
38,21=5;
38,22=1;
38,23=1;
38,24=1;
38,25=3;
38,26=3;
38,27=3;
38,28=3;
38,29=1;
38,30=1;
38,31=1;
38,32=1;
38,33=1;
38,34=1;
38,35=1;
38,36=1;
38,37=2;
38,38=1;
38,39=1;
38,40=1;
38,41=1;
38,42=1;
38,43=5;
38,44=5;
38,45=5;
38,46=5;
38,47=5;
38,48=5;
38,49=5;
38,50=5;
38,51=5;
38,52=5;
38,53=5;
38,54=5;
38,55=5;
38,56=5;
38,57=5;
38,58=1;
38,59=1;
38,60=1;
38,61=1;
38,62=5;
38,63=5;
39,0=1;
39,1=1;
39,2=3;
39,3=4;
39,4=4;
39,5=4;
39,6=4;
39,7=4;
39,8=4;
39,9=4;
39,10=4;
39,11=4;
39,12=4;
39,13=4;
39,14=4;
39,15=4;
39,16=4;
39,17=4;
39,18=3;
39,19=1;
39,20=1;
39,21=1;
39,22=1;
39,23=3;
39,24=3;
39,25=3;
39,26=4;
39,27=4;
39,28=3;
39,29=1;
39,30=1;
39,31=5;
39,32=5;
39,33=5;
39,34=1;
39,35=1;
39,36=1;
39,37=2;
39,38=2;
39,39=1;
39,40=1;
39,41=1;
39,42=5;
39,43=5;
39,44=5;
39,45=5;
39,46=5;
39,47=5;
39,48=5;
39,49=5;
39,50=5;
39,51=5;
39,52=5;
39,53=5;
39,54=5;
39,55=5;
39,56=1;
39,57=1;
39,58=1;
39,59=1;
39,60=1;
39,61=5;
39,62=5;
39,63=5;
40,0=1;
40,1=1;
40,2=3;
40,3=4;
40,4=4;
40,5=4;
40,6=4;
40,7=4;
40,8=4;
40,9=4;
40,10=4;
40,11=4;
40,12=4;
40,13=4;
40,14=4;
40,15=3;
40,16=3;
40,17=3;
40,18=3;
40,19=1;
40,20=1;
40,21=1;
40,22=3;
40,23=3;
40,24=4;
40,25=4;
40,26=4;
40,27=3;
40,28=3;
40,29=1;
40,30=1;
40,31=5;
40,32=5;
40,33=5;
40,34=5;
40,35=5;
40,36=1;
40,37=1;
40,38=2;
40,39=1;
40,40=1;
40,41=1;
40,42=5;
40,43=5;
40,44=5;
40,45=5;
40,46=5;
40,47=5;
40,48=5;
40,49=5;
40,50=5;
40,51=5;
40,52=5;
40,53=5;
40,54=5;
40,55=1;
40,56=1;
40,57=1;
40,58=1;
40,59=1;
40,60=5;
40,61=5;
40,62=5;
40,63=5;
41,0=1;
41,1=1;
41,2=3;
41,3=3;
41,4=4;
41,5=4;
41,6=4;
41,7=4;
41,8=4;
41,9=4;
41,10=4;
41,11=4;
41,12=4;
41,13=4;
41,14=4;
41,15=3;
41,16=1;
41,17=1;
41,18=1;
41,19=1;
41,20=1;
41,21=3;
41,22=3;
41,23=4;
41,24=4;
41,25=3;
41,26=3;
41,27=3;
41,28=1;
41,29=1;
41,30=5;
41,31=5;
41,32=5;
41,33=5;
41,34=5;
41,35=5;
41,36=1;
41,37=1;
41,38=2;
41,39=1;
41,40=1;
41,41=1;
41,42=1;
41,43=5;
41,44=5;
41,45=5;
41,46=5;
41,47=5;
41,48=5;
41,49=5;
41,50=5;
41,51=5;
41,52=5;
41,53=5;
41,54=1;
41,55=1;
41,56=1;
41,57=1;
41,58=1;
41,59=5;
41,60=5;
41,61=5;
41,62=5;
41,63=5;
42,0=5;
42,1=1;
42,2=1;
42,3=3;
42,4=4;
42,5=4;
42,6=4;
42,7=4;
42,8=4;
42,9=4;
42,10=4;
42,11=4;
42,12=4;
42,13=4;
42,14=4;
42,15=3;
42,16=1;
42,17=5;
42,18=5;
42,19=5;
42,20=1;
42,21=3;
42,22=4;
42,23=4;
42,24=3;
42,25=3;
42,26=1;
42,27=1;
42,28=1;
42,29=1;
42,30=5;
42,31=1;
42,32=1;
42,33=1;
42,34=1;
42,35=1;
42,36=1;
42,37=1;
42,38=2;
42,39=2;
42,40=1;
42,41=1;
42,42=1;
42,43=5;
42,44=5;
42,45=5;
42,46=5;
42,47=5;
42,48=5;
42,49=5;
42,50=5;
42,51=5;
42,52=5;
42,53=5;
42,54=1;
42,55=1;
42,56=1;
42,57=1;
42,58=1;
42,59=5;
42,60=5;
42,61=5;
42,62=5;
42,63=5;
43,0=5;
43,1=5;
43,2=1;
43,3=3;
43,4=3;
43,5=4;
43,6=4;
43,7=4;
43,8=4;
43,9=4;
43,10=4;
43,11=3;
43,12=3;
43,13=4;
43,14=4;
43,15=3;
43,16=1;
43,17=5;
43,18=5;
43,19=1;
43,20=1;
43,21=3;
43,22=4;
43,23=3;
43,24=3;
43,25=1;
43,26=1;
43,27=1;
43,28=1;
43,29=1;
43,30=1;
43,31=1;
43,32=1;
43,33=1;
43,34=1;
43,35=1;
43,36=1;
43,37=1;
43,38=1;
43,39=2;
43,40=2;
43,41=1;
43,42=1;
43,43=1;
43,44=5;
43,45=5;
43,46=5;
43,47=5;
43,48=5;
43,49=5;
43,50=5;
43,51=5;
43,52=5;
43,53=5;
43,54=1;
43,55=1;
43,56=1;
43,57=1;
43,58=1;
43,59=5;
43,60=5;
43,61=5;
43,62=5;
43,63=5;
44,0=1;
44,1=5;
44,2=1;
44,3=1;
44,4=3;
44,5=3;
44,6=4;
44,7=3;
44,8=3;
44,9=3;
44,10=3;
44,11=3;
44,12=3;
44,13=3;
44,14=4;
44,15=3;
44,16=3;
44,17=1;
44,18=1;
44,19=1;
44,20=3;
44,21=3;
44,22=4;
44,23=3;
44,24=3;
44,25=1;
44,26=1;
44,27=1;
44,28=1;
44,29=1;
44,30=3;
44,31=3;
44,32=3;
44,33=3;
44,34=3;
44,35=1;
44,36=1;
44,37=1;
44,38=1;
44,39=1;
44,40=2;
44,41=1;
44,42=1;
44,43=1;
44,44=5;
44,45=5;
44,46=5;
44,47=5;
44,48=5;
44,49=5;
44,50=5;
44,51=5;
44,52=5;
44,53=5;
44,54=1;
44,55=1;
44,56=1;
44,57=1;
44,58=1;
44,59=5;
44,60=5;
44,61=5;
44,62=5;
44,63=5;
45,0=1;
45,1=5;
45,2=1;
45,3=1;
45,4=3;
45,5=3;
45,6=3;
45,7=3;
45,8=1;
45,9=1;
45,10=1;
45,11=1;
45,12=1;
45,13=3;
45,14=4;
45,15=4;
45,16=3;
45,17=3;
45,18=3;
45,19=3;
45,20=3;
45,21=4;
45,22=4;
45,23=4;
45,24=3;
45,25=3;
45,26=3;
45,27=3;
45,28=3;
45,29=3;
45,30=3;
45,31=4;
45,32=4;
45,33=4;
45,34=3;
45,35=1;
45,36=1;
45,37=1;
45,38=1;
45,39=1;
45,40=2;
45,41=1;
45,42=1;
45,43=5;
45,44=5;
45,45=5;
45,46=5;
45,47=5;
45,48=5;
45,49=5;
45,50=5;
45,51=5;
45,52=1;
45,53=1;
45,54=1;
45,55=1;
45,56=1;
45,57=1;
45,58=5;
45,59=5;
45,60=5;
45,61=5;
45,62=5;
45,63=5;
46,0=1;
46,1=1;
46,2=1;
46,3=1;
46,4=1;
46,5=1;
46,6=1;
46,7=1;
46,8=1;
46,9=1;
46,10=5;
46,11=5;
46,12=1;
46,13=3;
46,14=3;
46,15=4;
46,16=4;
46,17=3;
46,18=3;
46,19=4;
46,20=4;
46,21=4;
46,22=3;
46,23=4;
46,24=4;
46,25=4;
46,26=4;
46,27=4;
46,28=4;
46,29=4;
46,30=4;
46,31=4;
46,32=3;
46,33=3;
46,34=3;
46,35=1;
46,36=1;
46,37=1;
46,38=1;
46,39=1;
46,40=2;
46,41=1;
46,42=1;
46,43=5;
46,44=5;
46,45=5;
46,46=5;
46,47=5;
46,48=5;
46,49=5;
46,50=1;
46,51=5;
46,52=1;
46,53=1;
46,54=1;
46,55=1;
46,56=1;
46,57=1;
46,58=5;
46,59=5;
46,60=5;
46,61=5;
46,62=5;
46,63=5;
47,0=1;
47,1=5;
47,2=1;
47,3=1;
47,4=5;
47,5=5;
47,6=1;
47,7=5;
47,8=5;
47,9=5;
47,10=5;
47,11=5;
47,12=1;
47,13=1;
47,14=3;
47,15=3;
47,16=4;
47,17=4;
47,18=4;
47,19=4;
47,20=3;
47,21=3;
47,22=3;
47,23=3;
47,24=3;
47,25=3;
47,26=3;
47,27=3;
47,28=3;
47,29=3;
47,30=3;
47,31=3;
47,32=3;
47,33=1;
47,34=1;
47,35=1;
47,36=1;
47,37=1;
47,38=1;
47,39=1;
47,40=2;
47,41=1;
47,42=1;
47,43=1;
47,44=1;
47,45=5;
47,46=5;
47,47=5;
47,48=1;
47,49=1;
47,50=1;
47,51=5;
47,52=1;
47,53=1;
47,54=1;
47,55=1;
47,56=1;
47,57=1;
47,58=5;
47,59=5;
47,60=5;
47,61=5;
47,62=5;
47,63=5;
48,0=1;
48,1=5;
48,2=5;
48,3=5;
48,4=5;
48,5=5;
48,6=5;
48,7=5;
48,8=5;
48,9=5;
48,10=5;
48,11=5;
48,12=5;
48,13=1;
48,14=3;
48,15=3;
48,16=3;
48,17=4;
48,18=4;
48,19=3;
48,20=3;
48,21=1;
48,22=1;
48,23=1;
48,24=1;
48,25=1;
48,26=1;
48,27=1;
48,28=1;
48,29=1;
48,30=1;
48,31=1;
48,32=1;
48,33=1;
48,34=1;
48,35=1;
48,36=1;
48,37=1;
48,38=1;
48,39=1;
48,40=2;
48,41=1;
48,42=1;
48,43=1;
48,44=1;
48,45=1;
48,46=5;
48,47=1;
48,48=1;
48,49=1;
48,50=1;
48,51=1;
48,52=1;
48,53=1;
48,54=1;
48,55=1;
48,56=1;
48,57=1;
48,58=1;
48,59=5;
48,60=5;
48,61=5;
48,62=5;
48,63=5;
49,0=1;
49,1=1;
49,2=1;
49,3=5;
49,4=5;
49,5=5;
49,6=1;
49,7=1;
49,8=1;
49,9=1;
49,10=5;
49,11=5;
49,12=5;
49,13=1;
49,14=3;
49,15=3;
49,16=4;
49,17=4;
49,18=3;
49,19=3;
49,20=1;
49,21=1;
49,22=5;
49,23=5;
49,24=5;
49,25=5;
49,26=5;
49,27=5;
49,28=5;
49,29=5;
49,30=5;
49,31=5;
49,32=1;
49,33=1;
49,34=1;
49,35=1;
49,36=1;
49,37=1;
49,38=1;
49,39=1;
49,40=2;
49,41=1;
49,42=1;
49,43=1;
49,44=1;
49,45=1;
49,46=1;
49,47=1;
49,48=1;
49,49=1;
49,50=1;
49,51=1;
49,52=1;
49,53=1;
49,54=1;
49,55=1;
49,56=1;
49,57=1;
49,58=5;
49,59=5;
49,60=5;
49,61=5;
49,62=5;
49,63=5;
50,0=1;
50,1=1;
50,2=1;
50,3=1;
50,4=1;
50,5=1;
50,6=1;
50,7=1;
50,8=1;
50,9=1;
50,10=1;
50,11=1;
50,12=1;
50,13=3;
50,14=3;
50,15=4;
50,16=4;
50,17=3;
50,18=3;
50,19=1;
50,20=1;
50,21=5;
50,22=5;
50,23=5;
50,24=5;
50,25=5;
50,26=5;
50,27=5;
50,28=5;
50,29=5;
50,30=5;
50,31=5;
50,32=1;
50,33=1;
50,34=1;
50,35=1;
50,36=1;
50,37=1;
50,38=1;
50,39=1;
50,40=2;
50,41=1;
50,42=1;
50,43=1;
50,44=1;
50,45=1;
50,46=1;
50,47=1;
50,48=1;
50,49=1;
50,50=1;
50,51=1;
50,52=1;
50,53=1;
50,54=1;
50,55=1;
50,56=1;
50,57=1;
50,58=1;
50,59=1;
50,60=1;
50,61=5;
50,62=5;
50,63=5;
51,0=1;
51,1=1;
51,2=1;
51,3=3;
51,4=3;
51,5=3;
51,6=3;
51,7=3;
51,8=3;
51,9=3;
51,10=1;
51,11=1;
51,12=3;
51,13=3;
51,14=4;
51,15=4;
51,16=3;
51,17=3;
51,18=1;
51,19=1;
51,20=5;
51,21=5;
51,22=5;
51,23=5;
51,24=5;
51,25=5;
51,26=5;
51,27=5;
51,28=5;
51,29=5;
51,30=5;
51,31=5;
51,32=5;
51,33=5;
51,34=5;
51,35=5;
51,36=1;
51,37=1;
51,38=1;
51,39=1;
51,40=2;
51,41=1;
51,42=1;
51,43=1;
51,44=1;
51,45=1;
51,46=1;
51,47=5;
51,48=5;
51,49=5;
51,50=5;
51,51=5;
51,52=5;
51,53=5;
51,54=1;
51,55=1;
51,56=1;
51,57=1;
51,58=1;
51,59=1;
51,60=1;
51,61=1;
51,62=5;
51,63=5;
52,0=3;
52,1=3;
52,2=3;
52,3=3;
52,4=4;
52,5=4;
52,6=4;
52,7=4;
52,8=4;
52,9=3;
52,10=3;
52,11=3;
52,12=3;
52,13=4;
52,14=4;
52,15=3;
52,16=3;
52,17=1;
52,18=1;
52,19=1;
52,20=5;
52,21=5;
52,22=5;
52,23=5;
52,24=5;
52,25=5;
52,26=5;
52,27=5;
52,28=5;
52,29=5;
52,30=5;
52,31=5;
52,32=5;
52,33=1;
52,34=5;
52,35=5;
52,36=1;
52,37=1;
52,38=1;
52,39=1;
52,40=2;
52,41=1;
52,42=1;
52,43=1;
52,44=1;
52,45=1;
52,46=1;
52,47=1;
52,48=5;
52,49=5;
52,50=5;
52,51=5;
52,52=5;
52,53=5;
52,54=5;
52,55=1;
52,56=1;
52,57=1;
52,58=1;
52,59=1;
52,60=1;
52,61=1;
52,62=1;
52,63=1;
53,0=4;
53,1=4;
53,2=4;
53,3=4;
53,4=4;
53,5=4;
53,6=4;
53,7=4;
53,8=4;
53,9=4;
53,10=4;
53,11=4;
53,12=4;
53,13=4;
53,14=3;
53,15=3;
53,16=1;
53,17=1;
53,18=5;
53,19=5;
53,20=5;
53,21=5;
53,22=5;
53,23=5;
53,24=5;
53,25=5;
53,26=5;
53,27=5;
53,28=5;
53,29=5;
53,30=5;
53,31=1;
53,32=5;
53,33=5;
53,34=5;
53,35=1;
53,36=5;
53,37=1;
53,38=1;
53,39=1;
53,40=2;
53,41=1;
53,42=1;
53,43=1;
53,44=1;
53,45=1;
53,46=1;
53,47=1;
53,48=5;
53,49=5;
53,50=5;
53,51=5;
53,52=5;
53,53=5;
53,54=5;
53,55=5;
53,56=5;
53,57=5;
53,58=1;
53,59=1;
53,60=1;
53,61=1;
53,62=1;
53,63=1;
54,0=4;
54,1=4;
54,2=4;
54,3=4;
54,4=4;
54,5=4;
54,6=4;
54,7=4;
54,8=4;
54,9=4;
54,10=4;
54,11=4;
54,12=4;
54,13=4;
54,14=3;
54,15=1;
54,16=1;
54,17=1;
54,18=5;
54,19=5;
54,20=5;
54,21=5;
54,22=5;
54,23=5;
54,24=5;
54,25=5;
54,26=5;
54,27=5;
54,28=1;
54,29=5;
54,30=5;
54,31=5;
54,32=5;
54,33=5;
54,34=5;
54,35=1;
54,36=5;
54,37=1;
54,38=1;
54,39=1;
54,40=2;
54,41=2;
54,42=1;
54,43=1;
54,44=1;
54,45=1;
54,46=1;
54,47=1;
54,48=5;
54,49=5;
54,50=5;
54,51=5;
54,52=5;
54,53=5;
54,54=5;
54,55=5;
54,56=5;
54,57=5;
54,58=5;
54,59=1;
54,60=1;
54,61=1;
54,62=1;
54,63=1;
55,0=4;
55,1=4;
55,2=4;
55,3=4;
55,4=4;
55,5=4;
55,6=4;
55,7=4;
55,8=4;
55,9=4;
55,10=4;
55,11=4;
55,12=4;
55,13=4;
55,14=3;
55,15=3;
55,16=1;
55,17=1;
55,18=5;
55,19=5;
55,20=5;
55,21=5;
55,22=5;
55,23=5;
55,24=5;
55,25=5;
55,26=5;
55,27=5;
55,28=5;
55,29=1;
55,30=5;
55,31=1;
55,32=5;
55,33=5;
55,34=5;
55,35=5;
55,36=1;
55,37=1;
55,38=1;
55,39=1;
55,40=1;
55,41=2;
55,42=2;
55,43=1;
55,44=1;
55,45=1;
55,46=1;
55,47=1;
55,48=1;
55,49=5;
55,50=5;
55,51=5;
55,52=5;
55,53=5;
55,54=5;
55,55=5;
55,56=5;
55,57=5;
55,58=5;
55,59=5;
55,60=1;
55,61=1;
55,62=1;
55,63=1;
56,0=4;
56,1=4;
56,2=3;
56,3=3;
56,4=3;
56,5=3;
56,6=3;
56,7=4;
56,8=4;
56,9=4;
56,10=4;
56,11=4;
56,12=4;
56,13=4;
56,14=4;
56,15=3;
56,16=3;
56,17=1;
56,18=1;
56,19=1;
56,20=5;
56,21=5;
56,22=5;
56,23=5;
56,24=5;
56,25=5;
56,26=1;
56,27=5;
56,28=5;
56,29=5;
56,30=5;
56,31=5;
56,32=5;
56,33=1;
56,34=5;
56,35=5;
56,36=5;
56,37=1;
56,38=1;
56,39=1;
56,40=1;
56,41=1;
56,42=2;
56,43=2;
56,44=1;
56,45=1;
56,46=1;
56,47=1;
56,48=1;
56,49=5;
56,50=5;
56,51=5;
56,52=5;
56,53=5;
56,54=5;
56,55=5;
56,56=5;
56,57=5;
56,58=5;
56,59=5;
56,60=1;
56,61=1;
56,62=1;
56,63=1;
57,0=3;
57,1=3;
57,2=3;
57,3=1;
57,4=1;
57,5=1;
57,6=3;
57,7=3;
57,8=3;
57,9=3;
57,10=4;
57,11=4;
57,12=4;
57,13=4;
57,14=4;
57,15=4;
57,16=3;
57,17=3;
57,18=1;
57,19=1;
57,20=5;
57,21=5;
57,22=1;
57,23=5;
57,24=5;
57,25=1;
57,26=5;
57,27=5;
57,28=5;
57,29=5;
57,30=1;
57,31=5;
57,32=5;
57,33=5;
57,34=1;
57,35=5;
57,36=5;
57,37=5;
57,38=1;
57,39=1;
57,40=1;
57,41=1;
57,42=1;
57,43=2;
57,44=1;
57,45=1;
57,46=1;
57,47=1;
57,48=1;
57,49=1;
57,50=5;
57,51=5;
57,52=5;
57,53=5;
57,54=5;
57,55=5;
57,56=5;
57,57=5;
57,58=5;
57,59=5;
57,60=5;
57,61=1;
57,62=1;
57,63=1;
58,0=1;
58,1=1;
58,2=1;
58,3=1;
58,4=1;
58,5=1;
58,6=1;
58,7=1;
58,8=1;
58,9=3;
58,10=3;
58,11=3;
58,12=4;
58,13=4;
58,14=4;
58,15=4;
58,16=4;
58,17=3;
58,18=1;
58,19=1;
58,20=1;
58,21=5;
58,22=5;
58,23=5;
58,24=5;
58,25=5;
58,26=5;
58,27=1;
58,28=5;
58,29=1;
58,30=5;
58,31=5;
58,32=5;
58,33=1;
58,34=1;
58,35=1;
58,36=5;
58,37=5;
58,38=1;
58,39=1;
58,40=1;
58,41=1;
58,42=1;
58,43=2;
58,44=1;
58,45=1;
58,46=1;
58,47=1;
58,48=1;
58,49=1;
58,50=1;
58,51=5;
58,52=5;
58,53=5;
58,54=5;
58,55=5;
58,56=5;
58,57=5;
58,58=5;
58,59=5;
58,60=5;
58,61=5;
58,62=1;
58,63=1;
59,0=1;
59,1=1;
59,2=5;
59,3=5;
59,4=5;
59,5=5;
59,6=5;
59,7=1;
59,8=1;
59,9=1;
59,10=1;
59,11=3;
59,12=3;
59,13=3;
59,14=4;
59,15=4;
59,16=4;
59,17=3;
59,18=3;
59,19=1;
59,20=1;
59,21=1;
59,22=1;
59,23=1;
59,24=1;
59,25=1;
59,26=1;
59,27=1;
59,28=5;
59,29=5;
59,30=5;
59,31=1;
59,32=5;
59,33=5;
59,34=5;
59,35=1;
59,36=5;
59,37=5;
59,38=1;
59,39=1;
59,40=1;
59,41=1;
59,42=1;
59,43=2;
59,44=1;
59,45=1;
59,46=1;
59,47=1;
59,48=1;
59,49=1;
59,50=1;
59,51=1;
59,52=1;
59,53=5;
59,54=5;
59,55=5;
59,56=5;
59,57=5;
59,58=5;
59,59=5;
59,60=5;
59,61=5;
59,62=1;
59,63=1;
60,0=1;
60,1=1;
60,2=5;
60,3=5;
60,4=5;
60,5=5;
60,6=5;
60,7=5;
60,8=5;
60,9=5;
60,10=1;
60,11=1;
60,12=1;
60,13=3;
60,14=3;
60,15=4;
60,16=4;
60,17=4;
60,18=3;
60,19=3;
60,20=1;
60,21=1;
60,22=1;
60,23=5;
60,24=5;
60,25=5;
60,26=5;
60,27=5;
60,28=5;
60,29=1;
60,30=5;
60,31=5;
60,32=5;
60,33=5;
60,34=5;
60,35=5;
60,36=1;
60,37=5;
60,38=1;
60,39=1;
60,40=1;
60,41=1;
60,42=1;
60,43=2;
60,44=1;
60,45=1;
60,46=1;
60,47=1;
60,48=1;
60,49=1;
60,50=1;
60,51=1;
60,52=1;
60,53=1;
60,54=1;
60,55=5;
60,56=5;
60,57=5;
60,58=5;
60,59=5;
60,60=5;
60,61=5;
60,62=1;
60,63=1;
61,0=1;
61,1=5;
61,2=5;
61,3=5;
61,4=5;
61,5=5;
61,6=5;
61,7=5;
61,8=5;
61,9=5;
61,10=5;
61,11=5;
61,12=1;
61,13=1;
61,14=3;
61,15=3;
61,16=4;
61,17=4;
61,18=4;
61,19=3;
61,20=3;
61,21=1;
61,22=1;
61,23=1;
61,24=5;
61,25=5;
61,26=1;
61,27=5;
61,28=5;
61,29=5;
61,30=1;
61,31=1;
61,32=5;
61,33=5;
61,34=1;
61,35=1;
61,36=1;
61,37=5;
61,38=1;
61,39=1;
61,40=1;
61,41=1;
61,42=1;
61,43=2;
61,44=1;
61,45=1;
61,46=1;
61,47=1;
61,48=1;
61,49=1;
61,50=1;
61,51=1;
61,52=1;
61,53=1;
61,54=1;
61,55=1;
61,56=1;
61,57=1;
61,58=1;
61,59=5;
61,60=5;
61,61=5;
61,62=1;
61,63=1;
62,0=1;
62,1=5;
62,2=5;
62,3=5;
62,4=5;
62,5=5;
62,6=5;
62,7=5;
62,8=5;
62,9=5;
62,10=5;
62,11=5;
62,12=1;
62,13=1;
62,14=1;
62,15=3;
62,16=4;
62,17=4;
62,18=4;
62,19=4;
62,20=3;
62,21=1;
62,22=1;
62,23=1;
62,24=1;
62,25=1;
62,26=1;
62,27=1;
62,28=5;
62,29=5;
62,30=1;
62,31=5;
62,32=1;
62,33=1;
62,34=1;
62,35=1;
62,36=1;
62,37=1;
62,38=1;
62,39=1;
62,40=1;
62,41=1;
62,42=1;
62,43=2;
62,44=2;
62,45=1;
62,46=1;
62,47=1;
62,48=1;
62,49=1;
62,50=1;
62,51=1;
62,52=1;
62,53=1;
62,54=1;
62,55=1;
62,56=1;
62,57=1;
62,58=1;
62,59=1;
62,60=1;
62,61=1;
62,62=1;
62,63=1;
63,0=1;
63,1=1;
63,2=1;
63,3=1;
63,4=1;
63,5=1;
63,6=1;
63,7=5;
63,8=5;
63,9=5;
63,10=5;
63,11=1;
63,12=1;
63,13=1;
63,14=1;
63,15=3;
63,16=3;
63,17=4;
63,18=4;
63,19=4;
63,20=3;
63,21=1;
63,22=1;
63,23=1;
63,24=1;
63,25=1;
63,26=1;
63,27=1;
63,28=1;
63,29=1;
63,30=1;
63,31=1;
63,32=1;
63,33=1;
63,34=1;
63,35=1;
63,36=1;
63,37=1;
63,38=1;
63,39=1;
63,40=1;
63,41=1;
63,42=1;
63,43=1;
63,44=2;
63,45=1;
63,46=1;
63,47=1;
63,48=1;
63,49=1;
63,50=1;
63,51=1;
63,52=1;
63,53=1;
63,54=1;
63,55=1;
63,56=1;
63,57=1;
63,58=1;
63,59=1;
63,60=1;
63,61=1;
63,62=1;
63,63=1;

I've also included here a picture of the complete map picture:


So how this works is I have a custom-made tileset and I give each tile a value. 1 is grass, 4 is water, and so on. Then these tile values (TileIDs or TileTypes) are saved along with their simplified tile position. To get the real x and y coordinates for the tiles you need to multiply the coordinates with the size of each individual tile. All the information necessary to convert map data into a real picture is provided in the map file.

Here's a picture of the map editor in action:

A red grid is drawn over the map but it is overwritten when you draw on it. Map sizes are specified by you. So a map can be as small as 128x128 pixels (or smaller) or as large as 2048x2048 pixels (or larger). Tilesizes are also specified by you. So you can have big fat tiles of 64 pixels (8x8) or something smaller like 16 (4x4). Personally I like a size of 32. That's what's also depicted above.

But the customisation would be a bit ordinary if you were stuck using the same tile art. Fortunately, you aren't. You're able to write your own tileset with which you can specify the ID for a tile, its name and its image file. A tileset file looks like this:

 template: name,id,filename

grass,1,grass.png;
dirt,2,dirt.png;
sand,3,sand.png;
water,4,water.png;
tree,5,tree.png;

Theoretically you can create as many tile types as you want. The image sizes don't matter; the editor attempts to scale them to the tile size specified for your map. Once your tileset file is complete it can be loaded into the editor. Below are a few screenshots of different tilesets I've created myself.


The artwork was made by nicubuno over at opengameart.org - a fantastic resource for hobby game developers. The art I chose to use from him is licensed under Public Domain. However the grass and water tiles were made by me. I also made a mars tileset for myself:

This is because my next big project is to create a Sci-Fi RTS game with a setting on Mars.

So there's the editor. It's extremely flexible because I made it with many different types of games in mind. I want to make an RTS with this and also an RPG at some point. I might change it at some point to allow for isometric maps, but this isn't a priority for me at the moment.