Autor Tema: Galaxy Wars [juego Basic]  (Leído 2255 veces)

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 9020
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Galaxy Wars [juego Basic]
« en: Mayo 17, 2013, 10:35:44 »
He visto esto en el foro Retrowiki, me pareció muy interesante para compartirlo aqui :)

Enlace: http://www.retrowiki.es/fororw/viewtopic.php?f=777&t=29875



EL JUEGO
Este videojuego arcade fue desarrollado por Universal y manufacturado por Taito en 1979.

El objetivo del juego consiste en destruir la flotilla de invasores que hay en la zona superior de la pantalla. Para ello controlamos una plataforma con un misil. Al disparar el misil debe esquivar los asteroides y los disparos enemigos e impactar en un invasor.

Controles:
Pulsa Z o X para mover la plataforma y el misil a izquierda o derecha.
Pulsa la barra espaciadora para disparar el misil.

Descargar el juego en formato ".D64":
http://www.retrowiki.es/fororw/download/file.php?id=3604


BLOQUES
He dividido el listado en 11 bloques:

- Declaración de las matrices. Llamada a rutinas principales.
- Controlar nuestra plataforma o misil.
- Control de los invasores y asteroides.
- Control de los disparos enemigos.
- Detección de impacto del misil. Toca asteroide, invasor o disparo enemigo.
- Perder una vida.
- Pantalla de Presentación.
- Inicio de la partida.
- Rutinas  varias.
- DATA con rutina en código máquina que duplica el juego de caracteres en otra posición.
- DATA con los gráficos del juego.


COMO FUNCIONA
Todo el programa ocupa 87 líneas.

A continuación indico el principio de las distintas partes del programa:

10 - Definimos las matrices del juego.
30 – Inicializamos el récord (R) y vamos a la rutina que redefine los gráficos.
50 – Vamos a la presentación del juego.
100 - Movemos la plataforma o misil en la dirección indicada.
130 -  Si se ha disparado el misil (T=2) salta a 160.
140 – Si se pulsa el espacio disparamos el misil y borramos la plataforma.
160 – Borramos el misil y modificamos la posición vertical (Y).
170 – Si la punta del misil toca algo saltamos a 400.
180 – Ponemos el misil en la nueva posición.
200 – Movemos una de las 6 filas de enemigo o asteroides en la dirección correspondiente. (B=1: Derecha, B=-1:Izquierda).
210 – Imprimimos la fila del enemigo.
250 – Miramos si esta activa una de las 6 bombas enemigas.
260 – Si no lo está, miramos si en una posición de la pantalla hay un invasor para activar su disparo.
270 – Si el disparo toca la plataforma o misil salta a 500.
400 – Si la posición Y es mayor de 5 es que hemos impactado con un asteroide o disparo y salta a 500.
410 – Calculamos la posición del invasor destruido.
420 – Ponemos la explosión, suena un sonido y calculamos los puntos (50, 100 o 150).
430 – Borramos el invasor de la fila y restamos un invasor a los restantes (Q).
440 – Mostramos los puntos y hacemos una pausa (5500) y actualizamos el marcador.
500 – Ponemos una explosión en la posición del misil y reproducimos un sonido.
520 – Actualizamos el marcador de vidas.
550 – Si no hay más vidas finaliza la partida.
2000 – Pantalla de presentación del juego.
2050 – Al pulsar una tecla borramos la pantalla (5400) y se hace parpadear el marcador del jugador 1.
2500 – Montamos las tiras de los invasores.
2510 – Rutina que genera aleatoriamente las tiras de los asteroides. Más llenas en niveles avanzados.
2570 – Inicialización de las variables principales de la partida.
5000 – Inicio de rutina para redefinir el juego de caracteres. Aquí se baja el RAMTOP 1KB.
5010 – Se carga la rutina en ensamblador desde los DATA en memoria y se ejecuta.
5020 – Copiamos los DATA de los gráficos en la nueva posición y cambiamos los colores de pantalla.
5040 – Inicializamos la matriz de la altura de los distintos enemigos V().
5050 – Guardamos en una matriz los colores de cada tira C$().
5100 – Rutina que activa el juego de caracteres redefinido.
5200 – Activa el juego de caracteres original. El nuestro queda residente en memoria.
5300 – Activa los colores por defecto del C-16 cuando está en BASIC.
5400 – Rutina de borrado de pantalla.
5500 – Rutina de PAUSA. Valor en (J).
5600 – Muestra las 6 filas de enemigos en su posición y con el color correspondiente.
8000 – Valores DATA de la rutina en código máquina que duplica el juego de caracteres en otra posición de memoria.
9000 – Línea DATA con los gráficos del juego.


EL LISTADO

 
APUNTES FINALES
Llevaba tiempo dándole vueltas a programar este juego y ha sido ideal para mi primera incursión en la programación del C-16.

Por fin un equipo Commodore con un BASIC decente !!!

Principales descartes respecto al original:
-   Esta versión es más ancha y menos alta ya que en el juego original la pantalla es vertical.
-   Hay alguna fila de asteroides menos, debido al tamaño vertical.
-   Durante el ascenso del misil podemos controlarlo horizontalmente, pero no controlamos la velocidad.
-   Los invasores no aceleran cuando solo quedan un par.
-   Los asteroides no descienden al llegar a los extremos.
-   Las puntuaciones están limitas a 50, 100 y 150 puntos.
-   No hay animaciones en los enemigos.   

El primer problema ha consistido en poder redefinir los gráficos, ya que este sistema no lo permite desde el BASIC.

Por suerte tenía una rutina en unas fotocopias de una revista de C-16 y tras alguna ligera modificación la he podido usar sin problemas. La rutina se encarga de bajar el RAMTOP 1KB y copia los 128 caracteres del SET 1. A partir de aquí los podemos redefinir desde BASIC sin problema. Con un par de POKE podemos activar y desactivar este juego de caracteres alternativo.

El control de los enemigos es muy simple. Hay 6 tiras con los enemigos en su posición correspondiente. Las filas pares rotan a la izquierda y las impares a la derecha. Con LEFT$ y RIGHT$ muevo un carácter de un extremo al otro e imprimo la fila con el color correspondiente. Todo muy rápido y sencillo gracias al comando CHAR.

El bloque principal del programa ocupa solo 17 líneas. En cada pasada muevo una fila de enemigos y controlo un disparo enemigo. El contador es común en los dos casos (A).

Para ganar velocidad he prescindido de las animaciones de los enemigos. He optado por usar los gráficos intercalados.

En las colisiones solo reviso si la cabecera del misil toca algo, pero no la parte baja. Respecto a las bombas enemigas solo la activa revisa si toca algo. Esto hace que el juego sea más rápido pero se puede dar el caso que toquemos algo y no nos pase nada.  Como el proceso es rápido, tiene su riesgo... y mejor no jugársela.

Para detectar las colisiones accedo directamente a la zona de memoria reservada al video. Hay 1 KB para los caracteres y otro para los atributos de color.


Respecto al equipo
Este es mi primer programa con el C-16 y la verdad es que la experiencia ha sido plenamente satisfactoria. Por fin he podido usar un equipo Commodore y programarlo con comodidad.

Tiene un buen BASIC con muchos comandos impensables en el VIC-20 y el C-64.

Temas tan engorrosos como poner algo en una posición concreta de la pantalla, reproducir un sonido o acceder a un joystick tiene sus propios comandos.

También hay comandos para acceder a la disquetera fácilmente. Ver el contenido de un disquete, copiar o borrar un fichero ya no supone ningún problema.

Las únicas pegas que le he encontrado es que el casete es muy lento, algo típico en los equipos Commodore, y que han tenido el detalle de cambiar los conectores del casete y los joystick. Así no ha sido necesario usar los comandos que nos permiten acceder a las palancas de control.

El equipo tiene poca memoria pero la verdad es que cunde bastante. Incluso permite el uso de gráficos en alta resolución en modo multicolor. Por ahora ignoro como se hace…

Pues nada más, solo me queda esperar que os guste.

Os invito a probarlo.
« última modificación: Junio 09, 2013, 09:45:56 por josepzin »

marcos64

  • Commodore Master
  • *****
  • Mensajes: 2585
    • Ver Perfil
    • http://marcos64.orgfree.com/
Re:GALAXY WARS
« Respuesta #1 en: Mayo 17, 2013, 11:14:35 »
Pues esta muy bien el jueguecito. Lo he probado rapido en el YAPE y me ha impresionado teniendo en cuenta que es en BASIC. A ver cuando tengo tiempo para jugarlo en la maquina real.

Lo he comunicado a los de Plus/4 World que parece que no se habian enterado.
http://marcos64.orgfree.com/
Actualizacion 22/4/2018: Actualizada Load'N'Run numero 5 con nuevos TAPs y PRGs.

migrator

  • Commodorista
  • ***
  • Mensajes: 67
  • SYS 0
    • Ver Perfil
Re:GALAXY WARS
« Respuesta #2 en: Mayo 17, 2013, 15:42:28 »
Muy bueno, felicidades!!

Yo también lo he probado en el Yape. Cuando tenga tiempo lo hago en el C16.

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 9020
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Re:GALAXY WARS
« Respuesta #3 en: Mayo 19, 2013, 10:59:12 »
Actualizado el juego, que tenía un error del HiScore que no queda actualizado.

Citar
Lo he probado en el "plus/4" que tengo montado y en la carga desde cinta si que funciona bien... -hypo

Sea como sea, he actualizado el listado y la imagen "D64". Había un signo cambiado en la línea 550 (R>P debía ser R<P).