Nuclear Invaders para ZX-Spectrum
Publicado: 20 Dic 2013, 23:08
EL JUEGO
Vuelven los invasores del espacio!!!
En el año 1977 intentaron invadir las ciudades de la tierra, y fracasaron.
Ahora vuelven con un malvado plan: destruir las centrales nucleares para dejar el planeta inhabitable.
Con la ayuda de nuestro tanque debemos evitar que cumplan con su objetivo.
Cada nivel lo componen 30 invasores, y al superarlo aparecerá una central más grande y los invasores deberán recorrer menos distancia para llegar a ella.
Destruye el UFO que aparece por la parte superior para conseguir puntos extras.
Pulsa “ENTER” en la pantalla de presentación para empezar la partida.
Descargar el juego en formato ".SNA":
Descargar el juego en formato ".WAV":
http://www.scainetsoft.com/download/software/NuclearInvaders_WAV.rar
BLOQUES
He dividido el listado en 13 bloques:
- Declaración de matrices.
- Control de nuestro tanque.
- Control de nuestro disparo.
- Mover UFO.
- Mover invasores.
- Destruir enemigo ó UFO.
- Pasar Nivel.
- Perder una vida / Fin juego.
- Presentación.
- Mostrar pantalla de juego.
- Cargar rutina código máquina, redefinir gráficos UDG y inicializar variables y matrices del juego.
- Rutinas varias.
- Bloque de código máquina y gráficos.
COMO FUNCIONA
Todo el programa ocupa 83 líneas.
A continuación indico el principio de las distintas partes del programa:
10 - Definimos las matrices del juego.
30 – Llamada a rutinas para leer gráficos (3000), mostrar presentación(2000).
100 – Comprobamos si se ha de mover nuestro tanque.
130 – Si hay un disparo en pantalla lo movemos, sino miramos si se ha pulsado disparo (ENTER).
170 – Si hay un UFO en pantalla lo movemos, sino decrementamos el contador (W).
200 – Rutina de movimiento de invasores. Se mueve uno distinto en cada pasada. Primero miramos si todavía hay invasores en la posición correspondiente (3 por posición), sino hay, salimos. Si tiene alguna velocidad asignada lo movemos, y sino mediante un número aleatorio decidimos si se ha de empezar a mover. Durante el movimiento cambiamos su animación y miramos si ha llegado a la central nuclear.
250 – Contador del próximo invasor a mover (M).
260 – Volvemos a la línea 100.
300 - Código de pasar nivel. Se ejecuta cuando destruimos los 30 invasores. Se incrementa el control de dificultad (C) que indicará la anchura de la central nuclear.
400 – Esta rutina se ejecuta cuando el disparo detecta que ha tocado algo (en 160). Aquí se calcula si se ha tocado un invasor o el UFO y actúa en consecuencia. En 410 se destruye un invasor y en 450 se destruye el UFO.
440 - Si se han destruido todos los invasores (T=0) saltamos a la línea 300 para pasar de nivel.
500 – Rutina que se ejecuta cuando un invasor llega a la central nuclear. Se reproduce un sonido y se borra una vida. Si quedan vidas volvemos a empezar el nivel y sino vamos a la pantalla de presentación después de una pausa.
2000 – Pantalla de presentación del juego.
2100 – Borrado de la pantalla de presentación y muestra el mensaje al jugador uno para que esté listo
2500 - Se dibuja la central nuclear con un ancho en función del nivel de dificultad.
2800 – Posiciona y muestra a los invasores y nuestro tanque en pantalla. Reinicia el valor de ciertas variables.
3000 – Borra la pantalla y muestra la pantalla de instrucciones.
3020 – Carga y ejecuta la rutina en código máquina que nos permite redefinir el juego de caracteres.
3025 – Redefinimos los 21 UDG que permite el sistema.
3028 – Redefinimos 5 caracteres más: Los 4 que forman los barriles y el disparo.
3040 – Cargamos las animaciones de los distintos invasores y su puntuación.
3045 – Guardamos las explosiones y la pared de la nuclear.
5000 – Rutina para imprimir un número en un marcador. Pasar el valor en (I) y la posición en (N).
5100 – Rutina de pausa. Pasar el valor en (N). Se prescinde de PAUSE para evitar que se anule al pulsar una tecla.
5200 – Rutina de borrado de parte de la pantalla, respetando los marcadores superiores y inferiores.
8900 – Datos de la rutina en código máquina que duplica el juego de caracteres.
9000 – Datos de los gráficos UDG del juego. 26 en total.
9600 – Datos de los invasores según posición y animación.
EL LISTADO
APUNTES FINALES
Esta versión se ha realizado a partir del listado de la versión del ORIC-1 y los gráficos de la versión de MSX/JUPITER ACE.
Dado que mi primer SPECTRUM fue un INVES+, nunca había programado en un gomas, y me habían limitado a usarlo solo para jugar. La verdad es que es una experiencia agradable ya que el teclado es bastante fiable y como no, muy blandito.
Diferencias entre SPECTRUM y ORIC
La adaptación desde la versión de ORIC ha sido bastante sencilla y rápida. Estás son las principales diferencias:
- Aquí hay que definir e inicialicen las variables.
- PRINT AT equivale al PLOT y los parámetros van invertidos.
- SCREEN$ equivale a SCR.
- Al pasar de una resolución de 40x25 a 32x22 (es un lío
usar las últimas dos filas) he aprovechado el formato de la
versión del JUPITER ACE.
- Para el sonido se usa BEEP, y como siempre es muy simple.
- Al no poder usar ELSE alguna línea se ha tenido que partir en dos y he usado un GOTO para evitar la segunda parte.
- Respecto a los gráficos, al igual que en ORIC es muy sencillo redefinirlos, pero al estar limitado a 21 he tenido que usar
una rutina en código máquina. Aquí son de 8x8 pixels y no de 6x8 y he usado del MSX y el JUPITER ACE.
A diferencia de la versión de JUPITER ACE que “dificultaba” el apuntar, para el tanque se han usado 3 UDG. De esta forma la parte del cañón está en medio de un gráfico y no desplazado a la derecha. Esto afecta al marcador inferior de vidas ya que los tanques están más separados. En MSX al usar SPRITES no tenía este problema.
El bucle principal de desarrollo va de la línea 100 hasta la 260, 20 líneas en total. Aquí se controla el tanque, el disparo, el UFO y un invasor. Como el proceso es rápido, todo se mueve de forma bastante fluida. Tenía mis dudas sobre el rendimiento de esta versión pero se deja jugar perfectamente.
Para detectar si el disparo toca algún enemigo, antes de mostrar el disparo en su nueva posición miro si hay algo, y en caso afirmativo salto a la línea 400. Aquí compruebo por posición vertical si es el UFO o un invasor, que por posición vertical calculo la fila y por posición horizontal la columna. Un detalle que ya vi en el juego “GALAXY WARS” es que para el SPECTRUM los 21 UDG definibles (de “A” a “U”) tienen el mismo código ASCII. Esto puede supiner un problema en otros juegos.
En esta versión muestro una pantalla previa de instrucciones donde indico las teclas de control. Mientras, se van redefiniendo los gráficos e inicializando algunas matrices y variables.
En el tema del sonido, en el que soy un perfecto inútil, he optado por usar sencillos pitidos más propios de una Game&Watch de Nintendo. Así no afecta al rendimiento.
Conseguir UDG extras
La principal dificultad que me he encontrado es que el juego necesita redefinir 26 gráficos y por defecto el SPECTRUM solo permite redefinir 21. Para evitar este problema he usado una pequeña rutina en código máquina que programé en 1990 y que simplemente realiza un duplicado del juego de caracteres desde su posición inicial en la ROM (dirección 15360) a una zona reservada de la RAM a partir de la dirección 60000. Para ello bajo el RAMTOP hasta esa posición con CLEAR 59999.
La rutina en CM empieza en la posición 63000 y se puede llama con un RANDOMIZE USR 63000. Con esto se realiza la copia de los caracteres y se cambia el valor de la variable de sistema (dirección 23606 y 23607) que indica donde está el juego de caracteres. De esta forma usa nuestros caracteres y no los originales de la ROM.
Con una llamada a RANDOMIZE USR 63022 volvemos a activar los caracteres de la ROM restaurando el valor de la variable de sistema, ya que según los caracteres que se redefinan afectaría a la presentación de los listados. De todas formas la copia de los caracteres se mantiene en memoria y se puede volver a activar en cualquier momento con un RANDOMIZE USR 63011.
Para este juego he usado los 21 UDG que permite por defecto el sistema y 5 más, aprovechando caracteres de improbable uso durante la programación. Con esto puedo listar el programa y hacer que todo se vea bien.
Y como siempre…
Para terminar, todo este desarrollo se ha programado en un SPECTRUM 48K original, conectado por RF a un televisor de 15”, usando un COMPUTONE como medio de almacenamiento y una ZX-PRINTER para imprimir el listado y los pantallazos.
Os invito a probarlo.