So, I took a little time today to code in a check that makes sure characters cannot move directly between tiles of drastically different elevations (unless they are flying). Thus, this fellow on top of the tower not being able to move straight onto the grass:
I took some time over the past couple of days to play through Fire Emblem: The Sacred Stones. I did this mostly because I really enjoy the game, but it also yielded some design ideas, particularly having to do with the challenge of handling different elevations in a straight-on projected viewpoint.
As with all 2D engines, this one represents higher (greater z-axis value) tiles as being higher (in terms of y position) up on the screen. This leads to some strange distortions. Notice, in the screenshot above, how elevated areas are separated from areas below them (on the y axis) by sections of wall tile. Not so the areas to the left or right, however; and as for the spaces that should be immediately above them on the y-axis, they are frequently obscured from view altogether.
Trying to account for the difference between y and z axis positions in a 2D projected view like this is no joke. Just look
at how hard it becomes to judge distances properly in a game like Alundra! I'm not concerned with jumping puzzles here, obviously, but targeting enemies for attack who are on a different level of elevation becomes problematic.
In theory, a ranged attack from an elevated surface onto a lower surface should land one or more tiles lower (y-axis) to account for the height difference. Here, for instance, suppose a character is on the "X" and he has an attack that hits 2 spaces away. The targeting reticles would be displaced like so:
This works in theory, but quickly causes issues in practice because of the distortions I mentioned above: visible wall tiles separating higher elevation tiles from tiles below them on the y-axis, but not so for those above them, or to the left or right. Characters standing above a high elevation tower, like the one in the first screenshot, would be essentially immune from ranged attack.
Also problematic: how do I represent horizontal movement from lower elevation tiles onto higher elevation tiles? This is an especially thorny issue for flying characters, who can move freely regardless of elevation. What if a flying character moves from a space with an elevation of 1 onto a space with an elevation of 6? Do I have a shadow sprite separate from the character, then show the flying character ascending as the shadow moves straight horizontally? And dear God, won't all this be confusing for players? There has to be an nice, elegant way of handling this, right?
Which brings me back to Fire Emblem: The Sacred Stones. The way they handled the effects of elevation on moving and attacking was kind of brilliant: they said "screw it, we're just going to allow people to move and attack across different elevations as if there were no z-axis difference." Behold:
Even though it makes no sense from a geometric perspective, I find that it feels natural and fun while I'm playing. Therefore, I'll be following their example