What about using a counter for the number of animations
var animations = 0;
for (var y = 0; y < grid.length; y++) {
for (var x = 0; x < grid[y].length; x++) {
//if its not an empty space
if (grid[y][x].type != 0) {
animations++;
$('#ent'+grid[y][x].entNum).animate({
left: (x*16*zoom)+'px',
top: ((1+(+y))*16*zoom)+'px'
},{duration: 100,queue:false,complete:function(){ //end of animation
//doesn't really work here
animations--;
}});
}
}
}
Every time an animations starts, the counter is incremented and in the callback of each animation, the counter is decremented. This way as soon as the first animation started, you can monitor the value of the counter and when it reaches 0 again, you know the last animation is finished.