La línea de tiempo en una aventura está definida por los estados de sus objetos. El problema que planteas es precisamente el que yo intentaba solucionar, el poder hacer seguimiento de todos los estados del juego para poder 'visualizar' el flujo del juego. Podemos darle un par de vueltas y definir algo si tienes tiempo. Los diagramas van en xml asi que luego pueden convertirse al código del lenguaje que se necesite.
En cuanto a como organizar el código, me he encontrado con dos formas de hacerlo:
1. Cada objeto lleva control de su estado. Esto requiere muchas veces meter rutinas que se ejecuten cada turno, mirar el estado de otros objetos, sus variables, etc. Es la forma más intuitiva pero en el momento en que el juego crece se vuelve inmanejable pues pierdes la visión global muy rápido. Hay que navegar de un lado a otro del código para saber en un momento dado el estado en que se encuentra todo.
2. Llevar una máquina de estados dedicada. Un objeto lleva el control de los estados, sólo se necesita ejecutar cada turno su rutina. Los objetos con múltiples estados(normalmente PNJ) llevan tres variables: estado, estado_anterior y contador (para los estados con duración definida). El código de la máquina lo agrupas por etapas en el juego (por capítulos por ejemplo), de modo que resulta muy fácil ver que implica un estado actual sobre los objetos del juego.
Un trozo de código Informita a modo de ejemplo:
Código:
Object state_machine "estados"
with capitulo 0,
with estado_juego 0,
with subestado_juego 0,
with esta_en[; rtrue; ], ! La omnipresente máquina de estados...
cada_turno[o;
! Controla el estado del juego en cada turno...
switch(self.capitulo)
{
0: !
! ---------------------------------------------------------------------
! PROLOGO ---
! ---------------------------------------------------------------------
if (pnj.estado==0 && pnj in localizacion && localidadde(pnj)==l_patio_exterior)
{
print "...";
pnj.estado=1; ! Ahora ya le hemos saludado..
}
1:
! Estados del Capítulo 1
}
],
has femenino escenario;
Aparte llevo una lista de estados para cada pnj, de modo que en todo momento conozco la implicación del estado en el mundo. Es muy importante tomar esta lista al pie de la letra y ceñirse a ella, sin añadir, renombrar o borrar estados en distintos puntos del código. Normalmente la máquina de estados de cada personaje se lleva bien, pero si es muy complicada la paso a papel para tener las ideas más claras. El diagrama en papel es muy similar a lo que he puesto en el primer post, la idea es que cada estado es un 'globo' y el paso entre estados se da al cumplirse una condición.
Código:
Lista de estados
================================
cielo_mansion
0: Detenido.
1: Ciclo del cielo nocturno.
Klaus
0: Inicial
1: Se ha encontrado con Blaus
2: Cuando sigue el jugador.
3: En modo pánico...
Blaus
0: Inicial
1: Se ha encontrado con Klaus
2: sigue al jugador.
3: En modo pánico...
El segundo método me ha dado un resultado excelente en el juego que estamos a punto de publicar y aunque es mejorable lo recomiendo como forma de organizar una aventura con un número elevado de estados interrelacionados.
Un saludo