A discrete height per cell: raised platforms, cliffs, pits.
A sidecar like Secrets and Doors, holding the Level it belongs to rather
than living inside it - the still-fundamentally-2D map gains a height value,
not a third axis. Every cell starts at 0, the ground everything else is
measured against; negative heights are pits, for whatever a game makes of them.
What reads it: FieldOfView.update takes heights to block sight asymmetrically
(a cliff hides what is behind it from below, but not from above), and
Pathfinder takes heights with a climb limit. What does not: TileMap draws
tiles where the grid says, and sprites stand where the game puts them - a
raised cell looks raised because the game offsets its occupants' sprites
upward by their height, which is presentation, not pathing, and lives game-side.
A discrete height per cell: raised platforms, cliffs, pits.
A sidecar like
SecretsandDoors, holding theLevelit belongs to rather than living inside it - the still-fundamentally-2D map gains a height value, not a third axis. Every cell starts at 0, the ground everything else is measured against; negative heights are pits, for whatever a game makes of them.What reads it:
FieldOfView.updatetakes heights to block sight asymmetrically (a cliff hides what is behind it from below, but not from above), andPathfindertakes heights with a climb limit. What does not:TileMapdraws tiles where the grid says, and sprites stand where the game puts them - a raised cell looks raised because the game offsets its occupants' sprites upward by their height, which is presentation, not pathing, and lives game-side.Example