Implementación de línea de historia en un juego

Digamos que tengo el motor general funcionando y lo único que falta es una historia.

Tomemos los juegos de Pokemon como ejemplo: ¿Cómo implementaría la navigation si no quiero verificar si la siguiente ficha es una ficha de agua en cada paso que tomo? (Supongo que esto sería horrible en cuanto a performance) Los guardias me dejarán pasar una vez que les haya entregado algo de jugo. ¿Cómo se haría esto?

El segundo debería ser capaz de implementarlo con una máquina de estado. ¿Estoy en lo cierto al entender que una máquina de estado es una enumeración (java) con mis diferentes estados?

La otra cosa por la que estoy un poco confundido es Eventos. Por ejemplo, ¿cómo implementaría eso? Si paso sobre un cierto mosaico mi personaje muere, nuevamente sin verificar esto para CADA loseta sobre la que paso. Creo que el mosaico debería llamar a algún tipo de Evento que luego mata a mi personaje. ¿Cómo debería escribir mi "EventHandler"?

  1. Comprobar que la siguiente baldosa sea agua no afectará su performance de ninguna manera. Requiere muy poco poder de cómputo. Los juegos modernos operan con cantidades mil veces mayores de datos a 60 veces por segundo, y su comprobación ocasional de la siguiente ficha no es nada.

  2. Puede implementar la máquina de estado de diferentes maneras. Por ejemplo, tener una variable "isFirstPlayerTurn = 1" o tenerlo en 0 es una máquina de estado. Puede usar algunas o docenas de variables para describir cierto estado.

  3. Puedes usar un jugador (sprite, object, lo que sea que tengas) para manejar esta lógica, solo revisa qué ficha estás parado de vez en cuando (una vez un fotogtwig) y si es lava, por ejemplo, realiza una function que mata al jugador y restablece el juego.