Uso eventos comunes para cargar las variables y vaciar las varibles de los espacios del tablero. Así, para hacer cosas como Invocar un Monstruo, lo que hago es que al hacer la acción compruebe que espacio en el tablero está vacio para ponerla allí. Todo mediante usando la lógica de control de varibles, incluyendo condicionales, del mismo maker. Los eventos del “Mapa espejo” son para almacenar las variables de las cartas en juego durante el duelo (luego cuando acaba otro evento las limpia para volverlas usarlas en otro).
Sobre los efectos, como dije, en mi engine cada carta es un evento. Me di cuenta de que en términos simples lo que se hace en un juego de cartas es mover estas por el tablero según su situación (en el caso de Yu-Gi-Oh!, según si están en el Campo, en el Cementerio o en el Destierro), así que uso los comandos del mismo maker para mover los eventos y ponerlos en la zona que les corresponde. Igual, los mismos comandos del maker, y del plugin de variables locales, se pueden usar para los cálculos básicos que aumentan o disminuyen las stats,.
Para esto uso las mismas derivaciones condicionales del mismo maker. Ejemplo: efecto de “Muka Muka”: Gana 300 de ATK y DEF por cada carta en tu mano.
1.- Cuando lo invocas, una variable local determina las cartas en mano y hace el cálculo, además de guardar en una variable el número de cartas en mano.
2.- Cada vez que quites o agregues cartas a la mano, se hace que el evento de “Muka Muka” compruebe si el número de cartas en mano cambió mediante una derivación condicional, y hace los ajustes a las variables de ATK, DEF y de las cartas en mano según corresponda.
Aproveche que los efectos de Yu-Gi-Oh! funcionan de una forma simple: costo y efecto para hacerlos.
Otro ejemplo: “Tribute of the Doomed”: Descartas 1 carta de tu mano, y después seleccionas un monstruo en el Campo; lo destruyes.
Descartar es el coste, así que el evento funciona así:
1.- Activas el evento de la carta, este se pausa hasta que la Variable Descartar sea 1. En cuanto selecciones una carta de la mano con el cursor, el evento de dicha carta será movido a la zona del cementerio, y la Variable Descartar será igual a 1. Se cubrió el costo.
2.- El evento continúa, ahora con la variable Seleccionar. De nuevo, con el cursor seleccionas la zona de monstruo ocupada para indicar que quieres destruir la carta que está allí, lo que hace que la Variable Seleccionar sea 1 y el evento puede seguir.
3.- Evento se pausa de nuevo, está vez para comprobar si hay una carta que pueda responder. Para eso usa las variables de velocidad: si al menos una carta es velocidad de 2 o más se pausara hasta que se tome la decisión, por el jugador o el CPU, de si se va a activar esa carta o no en respuesta. Respuesta positiva, inicia cadena; negativa, resuelve el efecto.
4.- Si resuelve: activa una variable local en la carta que será destruida para indicarle a ese evento que debe ir al Cementerio; y tras eso, el mismo evento de “Tribute of the Doomed” se va al Cementerio. O, si inicia Cadena, el evento de la carta jugada en respuesta inicia el mismo proceso, hasta llegar al punto 3, en dónde de nuevo revisara si hay o no una posible respuesta.
Ahora, para que esto funcione uso una combinación de plugins:
Wait_Options: es el que uso para controlar el flujo de las cadenas, costos y efectos. Lo uso para pausar eventos paralelos hasta que se cumpla una condicional (en este caso las variables que controlan los costos y cartas seleccionadas). También lo uso para controlar el flujo de los turnos.
CustomPageConditions: permite establecer condiciones personalizadas para activar páginas de eventos, por tanto puedo usar las variables locales para determinar si una página en un evento está activa o no. El uso más extenso que le doy es para tener más de una carta en un sólo evento. Así, cada carta puede ser una página. La página 1 funciona como un índice, que carga las variables locales de ese evento según el ID de la carta que va a representar, y luego activa la página con el código de dicha carta.
SelfVariables: el plugin principal que me permite hacer todo.
EventSpawner: clona un evento desde otro mapa, sea de forma temporal o permanente. De esta forma, los eventos de todas las cartas están en un solo mapa, y así clono sólo las cartas que voy a usar en dicho duelo.
MoveRouteExtras: lo uso para mover las cartas en el tablero. Tiene una función de salto que se controla por coordenas X Y, por tanto, da mayor facilidad para mover los eventos que usar el comando por defecto del maker, el cual se basa en restar y sumar tiles para que el evento se mueva.
Por supuesto, esta forma de hacer el engine significa que entre más efectos haya, más difícil será que los eventos fluyan (vamos, que es más posible que haya errores al comprobar tal o cual variable y se trabe). Así que me he planteado usarlo para una versión más simplificada del TCG, por ejemplo algo tipo Forbidden Memories de PS1 o The Sacred Cards de GBA.