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 tecla RETURN para disparar el misil.
Descargar el juego en formato ".TAP":
BLOQUES
Se ha dividido el listado en 10 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 los gráficos del juego.
COMO FUNCIONA
Todo el programa ocupa 88 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 la tecla RETURN 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).
220 – 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).
450 – Mostramos los puntos y hacemos una pausa (5500) y actualizamos el marcador.
470 – Al pasar el nivel incrementamos su valor si es inferior a 5.
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 – Cambiar los colores, ocultar el cursor y desactivar mayúsculas.
5002 – Pantalla de Instrucciones mientras se leen los gráficos.
5010 - Inicio de rutina para redefinir el juego de caracteres.
5020 – Guardamos en la matriz C$ el atributo de color de cada fila de la pantalla.
5040 – Inicializamos la matriz de la altura de los distintos enemigos V().
5050 – Inicializar la posición de las bombas enemigas.
5100 – Muestra el marcador de puntos o récord.
5400 – Rutina de borrado de pantalla activando los colores por fila correspondientes.
5600 – Muestra las 6 filas de enemigos en su posición y con el color correspondiente.
9000 – Línea DATA con los gráficos del juego.
EL LISTADO
Código: Seleccionar todo
10 DIME$(6),V(6),BX(6),BY(6),C$(21)
30 R=0:GOSUB5000
50 GOSUB2000
*** Mover tanque
100 K=PEEK(520):X1=X
110 IFK=170THENIFX>5THENX=X-1
120 IFK=176THENIFX<34THENX=X+1
130 IFT=2THEN160
140 IFK=175THENPLOTX-1,22," ":T=2:Y=20:ZAP:GOTO200
150 PLOTX-1,20," m ":PLOTX-1,21," n ":PLOTX-2,22," opq ":GOTO200
*** Control disparo
160 PLOTX1,Y," ":PLOTX1,Y+1," ":Y=Y-1:IFY=2THENY=20:T=1:GOTO200
170 IFSCRN(X,Y)<>32THEN400
180 PLOTX,Y,"m":PLOTX,Y+1,"n"
*** Movimiento enemigos
200 IFB=1THENE$(A)=RIGHT$(E$(A),1)+LEFT$(E$(A),39):GOTO220
210 E$(A)=RIGHT$(E$(A),39)+LEFT$(E$(A),1)
220 PLOT2,V(A),MID$(E$(A),3,36):B=-B:IFA<6THENA=A+1ELSEA=1
*** Control disparos enemigos
250 IFBY(A)THEN270
260 F=INT(RND(1)*30)+5:IFSCRN(F,5)<>32THENBX(A)=F:BY(A)=6:PLOTBX(A),BY(A),"l"
265 GOTO100
270 F=BY(A):PLOTBX(A),F," ":F=F+1:I=SCRN(BX(A),F):IFI>108THEN500
280 IFI=32THENPLOTBX(A),F,"l":BY(A)=FELSEBY(A)=0
300 GOTO100
*** Control de colisiones del misil
400 T=1:IFY>5THEN500
410 IFSCRN(X,Y)=97ORSCRN(X,Y)=100THENI=X:GOTO420
415 IFSCRN(X,Y)=98ORSCRN(X,Y)=101THENI=X-1:GOTO420
418 PLOTX,Y," ":PLOTX,Y+1," ":GOTO200
420 F=(Y-1)/2:PLOTI,Y,"rst":SHOOT:J=INT(RND(1)*3+1)*50:P=P+J
430 E$(F)=MID$(E$(F),1,I)+" "+MID$(E$(F),I+4):Q=Q-1:A=1:B=1
440 PLOTI-1,Y,STR$(J)+" ":WAIT30
450 F=5:I=P:GOSUB5100
460 Y=20:IFQ>0THEN200
*** Pasar nivel
470 IFN<5THENN=N+1
480 WAIT200:GOSUB2500:GOTO100
*** Perder una vida
500 PLOTX-1,Y,"uvw":PLOTX-1,Y+1,"xyz":EXPLODE:WAIT180
510 PLOTX-1,Y," ":PLOTX-1,Y+1," ":IFT=1THENPLOTX-1,Y+2," "
520 GOSUB5600:IFL=1THEN550ELSEL=L-1
530 A$=STR$(L)+" ":IFL>1THENFORF=2TOL:A$=A$+"opq ":NEXT
540 PLOT2,24,A$+" ":X=19:GOTO100
*** Final partida
550 PLOT15,7,"GAME OVER":WAIT400:IFR<PTHENR=P
560 GETA$:GOTO50
*** Pantalla de presentación
2000 CLS:PLOT3,0,"SCORE(1) HI-SCORE SCORE(2)"
2005 PLOT9,1,"0":F=18:I=R:GOSUB5100
2010 PLOT27,24,"CREDIT 00":PLOT18,6,"PLAY"
2020 PLOT 14,8,"GALAXY WARS":PLOT 14,10,"INSERT COIN"
2030 PLOT12,12,"(1 OR 2 PLAYERS)":PLOT12,14,"*1 PLAYER 1 COIN"
2040 PLOT12,16,"*2 PLAYERS 2 COINS"
2050 GETA$:GOSUB5400:PLOT13,11,"PLAY PLAYER(1)"
*** Pantalla zona de juego
2060 FORI=1TO10:PLOT9,1," ":WAIT10:PLOT9,1,"0":WAIT10:NEXT
2070 PLOT2,23,"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii"
2080 PLOT3,24,"3 opq opq"
2090 N=1:L=3:P=0
*** Posicionar a los enemigos
2500 E$(1)=" abc def abc def ":E$(2)=E$(1):B=1
2510 FORF=3TO6
2520 E$(F)="":B=-B:IFB=1THENA$="gh"ELSEA$="jk"
2530 E$(F)=E$(F)+A$+LEFT$(" ",RND(1)*7+(6-N))
2540 IFLEN(E$(F))<34THEN2530
2550 E$(F)=LEFT$(E$(F)+" ",40)
2560 NEXT
2570 GOSUB5600:A=1:B=1:X=19:T=1:Q=8:Y=20
2580 PLOTX-1,20," m ":PLOTX-1,21," n ":PLOTX-2,22," opq "
2590 RETURN
*** Pantalla Instrucciones, lectura gráficos e inicializar variables
5000 CLS:INK7:PAPER0:POKE#BBA3,0:POKE#26A,10
5002 PLOT15,0,"GALAXY WARS":PLOT8,7,"CONTROLS: LEFT = Z"
5004 PLOT18,8,"RIGHT = X":PLOT18,9,"FIRE = RETURN"
5006 PLOT10,16,"*PRESS KEY TO START*":PLOT9,22,"(C) SCAINET SOFT, 2013"
5008 PLOT1,24,"VERSION DEDICATED TO CHEMA & SILICEBIT"
5010 FORF=46856TO47063:READD:POKEF,D:NEXT
5020 FORF=1TO21:C$(F-1)=CHR$(VAL(MID$("111117777777777222222",F,1))):NEXT
5040 V(1)=3:V(2)=5:V(3)=9:V(4)=11:V(5)=13:V(6)=15
5050 FORF=1TO6:BX(F)=0:BY(F)=0:NEXT:GETA$:RETURN
*** Mostrar marcador
5100 PLOTF,1,RIGHT$(" "+STR$(I),5):RETURN
*** Borrar pantalla y dejar atributos color
5400 FORF=3TO23
5410 PLOT1,F,C$(F-3)+" "
5420 NEXT
5430 RETURN
*** Mostrar los enemigos
5600 FORF=1TO6
5610 IFBY(F)<>0THENPLOTBX(F),BY(F)," ":BY(F)=0
5620 PLOT2,V(F),MID$(E$(F),3,36)
5630 NEXT
5640 RETURN
*** Graficos UDG
9000 DATA2,5,8,0,15,61,31,3,18,61,16,56,63,21,63,6,0,0,32,0,32,56,48,0
9010 DATA8,4,2,1,15,58,31,3,0,1,18,60,63,42,63,6,32,0,0,0,32,56,48,0
9020 DATA6,31,63,61,54,60,31,6,0,32,54,48,55,48,54,0,0,0,0,63,63,63,0,0
9030 DATA0,1,27,3,59,3,25,0,24,62,63,55,27,51,62,24,16,8,4,8,28,20,8,4
9040 DATA4,4,12,12,30,30,12,12,12,12,12,30,30,63,51,33
9050 DATA 7,7,1,63,63,24,31,21,51,63,33,63,63,33,63,18,56,56,32,63,63,6,62,42
9060 DATA34,17,8,4,46,20,25,34,2,20,56,1,3,41,4,18,8,16,32,0,40,16,48,8
9070 DATA0,4,2,9,4,1,0,4,0,21,4,14,27,17,4,4,0,4,8,18,4,16,0,4
9080 DATA8,1,0,0,1,2,0,0,0,21,21,53,27,17,32,0,2,16,0,32,16,8,32,0
APUNTES FINALES
Este juego es una adaptación de la versión programada previamente para el COMMODORE-16 y el ZX-SPECTRUM.
Para ello he copiado, casi línea a línea el código de la versión C-16, y haciendo pequeñas modificaciones ya que tienen el mismo número de filas y los dos pueden usar el ELSE.
Por primera vez he usado un emulador para desarrollarlo: el EUPHORIC bajo MS-DOS. El resultado ha sido muy satisfactorio ya que este emulador permite, pulsando F3, que el teclado se corresponda con el del PC y esto hace que teclear un programa sea muy cómodo y rápido. Sacar un listado o cargar/grabar un programa es igual de sencillo.
La única complicación a la hora de desarrollar esta versión ha sido el “coñazo” que supone tener que codificar todos los gráficos otra vez, ya que el ORIC usa caracteres de 6 pixels de ancho y no 8 como el resto de ordenadores. Así, el diseño del misil es ligeramente más estrecho y las naves superiores ocupan 3 caracteres de ancho en lugar de 2. De todas formas, he hecho que si tocas a una nave por el lado derecho no la destruyas.
Respecto al sonido he vuelto a tirar de los que lleva predefinidos el propio equipo ya que es un tema que se me da fatal.
Y respecto al aspecto (rima), gracias al peculiar sistema de memoria de pantalla de este sistema, es la única versión en que realmente he podido reproducir el efecto “celofán”, al emular las franjas de colores.
Descartes respecto al original de TAITO:
- Esta versión es un poco más ancha y bastante 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 de ellos.
- 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 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.
El bloque principal del programa solo ocupa 18 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 de los enemigos 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.
Respecto al rendimiento, esta versión funciona tan bien (si no algo más) que las dos anteriores (C-16 y SPECTRUM).
La verdad es que a pesar de sus bugs, este BASIC tira más que bien.
Pues nada más, solo me queda esperar que os guste.
Os invito a probarlo.