So, here's some background. Recently I made a dungeon-generating script that worked pretty well. It infinitely generates a dungeon with pieces made from text files, and then it tiles them. The only problem is that last part -- the tiling script was way too slow. I called for some help on the Game Maker forum but to little success. I gave up on it for a while, but now I'm going to make one last stab at it.
I'm looking for some Game Maker Sage to offer insight into how I could optimize the script 'addtile' (it is definitely the source of the slowness). I'm not much one for optimization so I'm sure there's some big cuts that can be made here or there.
The file: (gm8, 20.6kb)
https://www.dropbox.com/s/t3vdpl3uxblomz9/Generate.zipUse the arrow keys to scroll through the map. After a certain distance, a new segment will be generated.
The script in question:
//adds tile to a room
g=0;
var temp,xa,ya;
xa=a.x; ya=a.y;
//udlr
temp[0]=position_meeting(xa,ya-16,o_blk)<<3|position_meeting(xa,ya+16,o_blk)<<2|position_meeting(xa-16,ya,o_blk)<<1|position_meeting(xa+16,ya,o_blk)
//topleft clockwise
if temp[0]=15 temp[1]=position_meeting(xa-16,ya-16,o_blk)<<3|position_meeting(xa+16,ya-16,o_blk)<<2|position_meeting(xa+16,ya+16,o_blk)<<1|position_meeting(xa-16,ya+16,o_blk)
switch(temp[0])
{
case 15:
//all+inner
if temp[1]!=15 {
if !(temp[1] & 2) {a.tiles[g]=tile_add(b_tiles_rock,80,0,16,16,xa,ya,10000);} else
if !(temp[1] & 1) {a.tiles[g]=tile_add(b_tiles_rock,96,0,16,16,xa,ya,10000);} else
if !(temp[1] & 8) {a.tiles[g]=tile_add(b_tiles_rock,96,16,16,16,xa,ya,10000);} else
if !(temp[1] & 4) {a.tiles[g]=tile_add(b_tiles_rock,80,16,16,16,xa,ya,10000);}} else
{a.tiles[g]=tile_add(b_tiles_rock,32,32,16,16,xa,ya,10000);} break;
//three (floors)
case 14: {/*r*/a.tiles[g]=tile_add(b_tiles_rock,48,32,32,16,xa,ya,10000);} break;
case 13: {/*l*/a.tiles[g]=tile_add(b_tiles_rock,0,32,32,16,xa-16,ya,10000);} break;
case 11: {/*d*/a.tiles[g]=tile_add(b_tiles_rock,32,48,16,32,xa,ya,10000);} break;
case 7: {/*u*/a.tiles[g]=tile_add(b_tiles_rock,32,0,16,32,xa,ya-16,10000);} break;
//two (corners & bars)
case 10: {/*r-d*/a.tiles[g]=tile_add(b_tiles_rock,48,48,32,32,xa,ya,10000);} break;
case 6: {/*r-u*/a.tiles[g]=tile_add(b_tiles_rock,48,0,32,32,xa,ya-16,10000);} break;
case 5: {/*l-u*/a.tiles[g]=tile_add(b_tiles_rock,0,0,32,32,xa-16,ya-16,10000);} break;
case 9: {/*l-d*/a.tiles[g]=tile_add(b_tiles_rock,0,48,32,32,xa-16,ya,10000);} break;
case 3: {/*u-d*/a.tiles[g]=tile_add(b_tiles_rock,80,32,16,16,xa,ya,10000); g+=1; a.tiles[g]=tile_add(b_tiles_rock,32,8,16,8,xa,ya-8,10000); g+=1 a.tiles[g]=tile_add(b_tiles_rock,32,64,16,8,xa,ya+16,10000);}; break;
case 12: {/*l-r*/a.tiles[g]=tile_add(b_tiles_rock,96,32,16,16,xa,ya,10000); g+=1 a.tiles[g]=tile_add(b_tiles_rock,8,32,8,16,xa-8,ya,10000); g+=1; a.tiles[g]=tile_add(b_tiles_rock,64,32,8,16,xa+16,ya,10000);} break;
//one (ends)
case 1: {/*r*/a.tiles[g]=tile_add(b_tiles_rock,112,64,16,16,xa,ya,10000); g+=1; a.tiles[g]=tile_add(b_tiles_rock,32,8,16,8,xa,ya-8,10000); g+=1; a.tiles[g]=tile_add(b_tiles_rock,32,64,16,8,xa,ya+16,10000); g+=1; a.tiles[g]=tile_add(b_tiles_rock,8,16,8,16,xa-8,ya,10000);}; break;
case 2: {/*l*/a.tiles[g]=tile_add(b_tiles_rock,112,48,16,16,xa,ya,10000); g+=1; a.tiles[g]=tile_add(b_tiles_rock,32,8,16,8,xa,ya-8,10000); g+=1; a.tiles[g]=tile_add(b_tiles_rock,32,64,16,8,xa,ya+16,10000); g+=1; a.tiles[g]=tile_add(b_tiles_rock,64,16,8,16,xa+16,ya,10000);}; break;
case 4: {/*d*/a.tiles[g]=tile_add(b_tiles_rock,112,32,16,16,xa,ya,10000); g+=1; a.tiles[g]=tile_add(b_tiles_rock,32,8,16,8,xa,ya-8,10000); g+=1; a.tiles[g]=tile_add(b_tiles_rock,8,16,8,16,xa-8,ya,10000); g+=1; a.tiles[g]=tile_add(b_tiles_rock,64,16,8,16,xa+16,ya,10000);}; break;
case 8: {/*u*/a.tiles[g]=tile_add(b_tiles_rock,112,16,16,16,xa,ya,10000); g+=1; a.tiles[g]=tile_add(b_tiles_rock,32,64,16,8,xa,ya+16,10000); g+=1; a.tiles[g]=tile_add(b_tiles_rock,8,48,8,16,xa-8,ya,10000); g+=1; a.tiles[g]=tile_add(b_tiles_rock,64,48,8,16,xa+16,ya,10000);} break;
//none
case 0:
a.tiles[g]=tile_add(b_tiles_rock,112,0,16,16,xa,ya,10000);
break;
};
a.maxtiles=g+1;
Just for a reference point, on my computer, it takes 14-20 seconds to get out of the load dialog, and the script is run ~8000 times per generation. I would like to cut the time down A LOT, and I'm sure there's a way lying out there somewhere.