Fuente: Zona de Pruebas.
Dani Crespo sorprede de nuevo con otro de sus artículos didácticos sobre cómo programar un juego en MSX-BASIC, versionando en esta ocasión un clásico de la consola Magnavox Odyssey: Munchkin.
El artículo fue publicado en el foro de Zona de Pruebas pero dado su interés para la comunidad MSX me atrevo a reproducirlo aquí íntegramente a continuación:
EL JUEGO
Munchkin es el cartucho número 38 de la Magnavox Odyssey 2 / Philips Videopac G7000.
Diseñado y programado por Ed Averett, “Munchkin” está basada en el juego de Namco “Pac-Man”. En América del Norte fue llamado “KC Munchkin”, en referencia al entonces presidente de Philips Consumer Electronics Kenneth C. Menkin.
El juego es muy parecido a Pac-Man, pero tiene diferencias fundamentales:
- Los fantasmas son llamados Munchers, y hay tres en lugar de cuatro fantasmas. El personaje del jugador se llama Munchkin.
- Sólo hay 12 pastillas (llamado Munchies) en cada laberinto, que parpadean y cambian de color. Comienzan en cuatro grupos de tres, pero se mueven a través del laberinto de forma independiente.
- Algunos de los laberintos se vuelven invisibles cuando el jugador empieza a moverse.
- Tiene un modo programable, donde el jugador puede crear sus propios laberintos.
- Tiene un modo aleatorio, donde un nuevo mapa se genera en cada partida.
- La caja donde se regeneran los fantasmas comidos gira, por lo que los fantasmas pueden salir por cualquier lado. Además, el personaje del jugador es libre de entrar en la caja y, si enciende, puede consumir nuevos monstruos en el momento que se regeneran.
Control
Pulsa las teclas 1 a 3 para seleccionar el laberinto. Por defecto se juega en el laberinto 1, o el último elegido.
Pulsa disparo para empezar la partida, y utiliza el controlador para mover nuestro Munchkin.
Por gentileza de xgipe (gràcies Xavi) os podéis descargar el CAS para usarlo desde emulador.
Descargar el juego
(En ambos casos, cargar con CLOAD)
BLOQUES
Se ha dividido el listado en 12 bloques:
- Declaración de las matrices e inicializar las principales variables. Llamada a rutinas principales.
- Controlar nuestra Munchkin (protagonista).
- Movimiento de los Munchers (enemigos).
- Comer una pastilla.
- Perder la única vida. Fin partida.
- Munchkin se come un Muncher.
- Pantalla de Presentación.
- Rutinas varias.
- Imprimir la zona de juego. Paredes, pastillas y SPRITES.
- Seleccionar el modo de video, leer los SPRITES e inicializar variables.
- DATA con los gráficos del juego.
- DATA con los datos de los laberintos.
COMO FUNCIONA
Todo el programa ocupa 137 líneas.
A continuación indico el principio de las distintas partes del programa:
- 10 – Definimos las matrices del juego.
- 30 – Leemos los gráficos y variables, y activamos el CTRL+STOP para salir del juego y volver al BASIC.
- 50 – Vamos a mostrar la pantalla de presentación.
- 100 – Si el Munchkin se está moviendo salta a 160, sino revisamos si está sobre una pastilla.
- 105 – Controlamos si el Munchkin está entrando en el pasillo lateral y lo hacemos salir por el lado contrario.
- 110 – Consultamos el mando seleccionado y saltamos a la línea de la dirección seleccionada.
- 120 – Comprueba si nos podemos mover hacia la derecha, poniendo “D%=1”.
- 130 – Comprueba si nos podemos mover hacia abajo, poniendo “D%=2”.
- 140 – Comprueba si nos podemos mover hacia la izquierda, poniendo “D%=3”.
- 150 – Comprueba si nos podemos mover hacia arriba, poniendo “D%=4”.
- 160 – Cambiamos la posición del Munchkin según la dirección elegida. (D%). Controlamos su animación (A%) con (C%).
- 170 – Actualizamos la posición y animación del SPRITE del Munchkin.
- 200 – Controlamos si el Munchkin debe estar quieto (EW%), y si de debe mover en una dirección (EC%).
- 220 – Movemos al Muncher en la dirección seleccionada.
- 230 – Comprueba si puede mover al Muncher a la derecha. Guardamos la animación (EA%).
- 240 – Comprueba si puede mover al Muncher hacia abajo. Guardamos la animación (EA%).
- 250 – Comprueba si puede mover al Muncher a la izquierda. Guardamos la animación (EA%).
- 260 – Comprueba si puede mover al Muncher hacia arriba. Guardamos la animación (EA%).
- 270 – Cambiamos la posición del Muncher según su dirección actual.
- 280 – Controlamos si los Munchkin son vulnerables (Q%>0).
- 290 – Ponemos al Munchkin en su nueva posición, con la animación correspondiente.
- 300 – Comprueba si está tocando al Munchkin. Según si son vulnerables o no, van a comer (600) o morir (500).
- 390 – Con TIME controlamos que la velocidad sea más o menos estable para volver a 100.
- 400 – Si estamos sobre una pastilla normal recibimos un punto y hace un sonido.
- 405 – Si estamos sobre una pastilla energética, recibimos tres puntos, hace un sonido y inicializamos ciertas variables.
- 410 – Borramos el punto de la pantalla y lo sacamos de la matriz que controla su posición.
- 430 – Aquí llegamos si hemos comido todos los puntos del laberinto, activando la animación correspondiente.
- 500 – Si perdemos la única vida disponible hacemos una animación, controlamos el récord y volvemos a la presentación.
- 600 – Cuando nos comemos un Munchkin lo colocamos en su casa y sumamos puntos.
- 1000 – Bloque que se encarga de mostrar la pantalla de presentación.
- 1075 – Bloque que se encarga de controlar el laberinto al que queremos jugar.
- 1090 – Para elegir el controlador, lee la barra espaciadora o disparo de los joysticks.
- 4000 – Imprime los puntos (N%) en la posición (I%) indicada.
- 4100 – Hace desaparecer todos los SPRITES de pantalla.
- 4200 – Hace una pasa según el vaor de (N%).
- 5000 – Este bloque se encarga de mostrar el laberinto seleccionado en pantalla.
- 5130 – Mostramos los marcadores de “Puntos” y “Record”.
- 5500 – Inicializamos las variables necesarias.
- 5505 – Mostramos el SPRITE del Munchkin.
- 5510 – Posicionamos y mostramos a los 3 Munchers.
- 5540 – Reseteamos la matriz que controla donde están las pastillas del laberinto.
- 5545 – La posición de las 4 pastillas energéticas es fija. Siempre en los extremos.
- 5555 – Calcula y coloca las 12 pastillas en la posición correspondiente.
- 6000 – Seleccionamos el modo de video, activando el modo de SPRITES de 8×8 y doble tamaño.
- 6010 – Leemos los DATA de los SPRITES.
- 6020 – Leer los DATA de los caracteres redefinidos.
- 6040 – Montar las distintas piezas que forman el laberinto.
- 6060 – Definimos los colores de los gráficos definidos.
- 6080 – Leemos unas DATA que indican la velocidad del Munchkin y los Munchers.
- 8000 – Al pulsar CTRL+STOP volvemos al BASIC cambiando el modo de video y los colores.
- 9000 – Líneas DATA con los datos de los gráficos de los SPRITES.
- 9300 – Líneas DATA con los datos de las velocidades de los personajes del juego.
- 9500 – DATA con los datos del laberinto 1.
- 9600 – DATA con los datos del laberinto 2.
- 9700 – DATA con los datos del laberinto 3.
EL LISTADO
APUNTES FINALES
Este es uno de mis juegos favoritos de la PHILIPS G-7000, y siempre me había tentado la idea de realizar una conversión para otro sistema.Lo primero ha sido analizar el juego en si. Un personaje, tres enemigos y doce pastillas. Todo moviéndose por un laberinto con un pasillo lateral.El laberinto está compuesto por una cuadrícula de 7 filas y 9 columnas. En cada cuadrícula puede ir uno de los 5 bloques posibles: Nada, Pared izquierda, Pared superior, Pared superior-izquierda y un pequeño bloque que sirve para unir.Cuando un elemento se mueve, lo hace desde el centro de uno de los bloques hasta el siguiente. Mientras tanto no puede cambiar su dirección. Como veremos, esto facilitará las cosas. En el aspecto gráfico, los gráficos son de 8×8 pixels (toscos eso si) y con SPRITES de 8×8 ampliados se puede conseguir un aspecto idéntico al original.
Llegado a este punto, toca decidir que cosas tendría que eliminar para adaptarlo al rendimiento del BASIC y al hardware del MSX, y como quería que fuera esta versión.
Descartes
- Solo se dispone de 3 laberintos, en lugar de los 4 originales.
- No permite diseñar nuevos laberintos.
- Las píldoras no se mueven. En cada pantalla se colocan aleatoriamente.
- Las píldoras energéticas no cambian de color y siempre están en las esquinas.
- Al comer un Muncher aparece en su casa instantáneamente. No tiene que ir hasta ella.
- La casa central de los Munchers no gira.
- Los Munchers no pueden usar los pasillos laterales.
- Los Munchers no avisan cuando se está acabando el efecto de la píldora energética.
Primero de todo, voy a explicar como se organiza el laberinto:
- Como se ha dicho, tiene unas dimensiones de 7 filas y 9 columnas (más 1 de cierre a la derecha).
- Hay 5 posibles bloques, que van en cada una de las posiciones.
- En las líneas DATA (9500 por ejemplo) se ve como se organiza. En cada línea hay la información de una fila.
- El primer dato indica el tipo de bloque que va en una posición: 0 – Nada, 1 – Pared izquierda, 2 – Pared superior, 3 – Pared superior y izquierda, y 4 – Pixel superior izquierdo que se usa como junta entre algunas combinaciones de piezas.
- El segundo dato indica donde hay paredes en esa posición. El formato es binario: 1 – Derecha, 2 – Abajo, 4 – Izquierda, 8 – Arriba. Así, si hay pared arriba y a la izquierda: 8+4=12. De esta sencilla forma podremos controlar los movimientos.
El bloque principal del programa ocupa solo 22 líneas, pero está organizado de forma que se ejecuten la menor cantidad de líneas posibles en cada pasada.
Las primera 9 líneas controlan a nuestro personaje. Si (C<>0) el personaje ya se está moviendo de un bloque a otro y no podemos cambiar la dirección. Igual que en el original.
Al parar, miramos si hay alguna pastilla en esa posición, según información guardada en la matriz (M). En caso afirmativo, vamos a la rutina de comer pastilla (400).
Como cada bloque ocupa 24 pixels (3×3 caracteres) y el Munchkin se mueve de 4 en 4 pixels, al moverlo en una dirección avanzará 6 veces hasta llegar al siguiente bloque. Esto se controla con la variable (C).
Al intentar movernos hacemos un AND con la información de los muros guardada en la matriz (W) para ver si podemos movernos. En caso afirmativo ponemos en (D) la dirección (1-derecha, 2-bajar, 3-izquierda y 4-subir) y el contador C=6. Mientras se mueva hasta el siguiente bloque no podemos rectificar, y simplemente hemos de ir actualizando la posición del SPRITE. Cuando (C=3) (esta a medio camino entre un bloque y otro) se cambia la animación del Munchkin (A).
Con los enemigos hacemos lo mismo, pero primero miramos si esta en pausa (inicio de nivel o nos lo hemos comido) y se decrementa el contador (EW). En caso contrario miramos si ya se esta moviendo entre dos bloques (EC), y sino elegimos una dirección en la que moverse (ED). La dirección puede ser aleatoria (70% de posibilidades) o en la misma dirección que llevaba.
Con (Q>0) controlamos si los enemigos son vulnerables. Se reduce a medida que pasamos niveles.
En cada pasada del bucle principal muevo un único enemigo, de 8 en 8 pixels (doble de rápido que el protagonista). Son más rápidos pero se mueven menos… pero al moverlo compruebo si está tocando al Munchkin. En caso afirmativo perdemos la única vida de que disponemos. Igual que el original.
La velocidad según el movimiento, tanto del protagonista como de los perseguidores se ha guardado en matrices. Va bien para poder incrementar las coordenadas X e Y según convenga sin tener que hacer cálculos o IF extras.
El juego no es todo lo fluido que me gustaría pero funciona más que bien, y el aspecto es idéntico al original, excepto la parte de los marcadores. Se podría haber simulado pero habría llevado demasiado tiempo actualizar el marcador.
La inteligencia de los enemigos tampoco es nada del otro mundo. Simplemente se mueven hacia una dirección elegida la azar. Esto los hace más imprevisibles, pero bastante más tontos. Eso si, agiliza el programa.
Los hay que son el primo de ZUMOSOL,
y los hay que son el primo de ZITROR…
Va por ti, Rafa !!!
Pues nada más, solo me queda esperar que os guste.
Os invito a probarlo.
buff!! vaya curro, enhorabuena al autor, es un buen trabajo.
Enhorabuena al autor por su curro. Gracias a él y a Konamito por compartirlo. 😉