NUCLEAR INVADERS para AMSTRAD CPC

dancresp
Mensajes: 5091
Registrado: 13 Nov 2010 02:08
Agradecido : 37 veces
Agradecimiento recibido: 105 veces

NUCLEAR INVADERS para AMSTRAD CPC

Mensajepor dancresp » 10 Feb 2014 23:41

DSC_0173.jpg


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 “RETURN” en la pantalla de presentación para empezar la partida.

Controles:
Z - Izquierda / X - Derecha
RETURN - Disparo

Descargar el juego en formato DSK:
NuclearInvaders.rar
(3.63 KiB) Descargado 108 veces


BLOQUES
He dividido el listado en 14 bloques:

- Declaración de las matrices.
- Control de nuestro tanque.
- Control de nuestro disparo.
- Mover UFO.
- Mover invasor.
- Destruir enemigo ó UFO.
- Perder una vida.
- Pasar Nivel.
- Presentación.
- Mostrar pantalla de juego.
- Cargar gráficos.
- Inicializar variables y matrices del juego.
- Rutinas varias.
- Bloques de gráficos.


COMO FUNCIONA
Todo el programa ocupa 78 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 la presentación(2000).
100 – Comprobamos si se ha de mover nuestro tanque, mostrándolo en la nueva posición.
130 – Si hay un disparo en pantalla lo movemos, sino miramos si se ha pulsado disparo (RETURN).
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 – Si no se han destruido todos los invasores (T) volvemos a la línea 100, y si no quedan seguimos hasta 300.
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.
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. Mensaje al jugador uno para que esté listo y se dibuja la central nuclear.
2800 – Posiciona y muestra a los invasores y nuestro tanque en pantalla. Reinicia el valor de ciertas variables.
3000 – Cargamos los gráficos desde las líneas DATA a la VRAM. Primero se cargan los SPRITES y después los UDG.
5000 – Rutinas varias usadas en distintas partes del juego.
9000 – Datos de los gráficos UDG del juego.
9500 – Datos de los invasores según posición y animación.


EL LISTADO

Código: Seleccionar todo

  10 DIM X(10),Y(10),Q(10),S(10),B$(11,2),M(4)

  30 GOSUB 3000:GOTO 2000
   
     *** Mover tanque
 100 TI=TIME
 110 IF INKEY(71)=0 THEN IF H>3 THEN H=H-1:LOCATE H,22:PRINT"opq "
 120 IF INKEY(63)=0 THEN IF H<36 THEN LOCATE H,22:PRINT" opq":H=H+1

     *** Control disparo
 130 IF D THEN 150
 140 IF INKEY(18) THEN 170 ELSE D=22:G=H+1
 150 LOCATE G,D:IF COPYCHR$(#0)="z" THEN PRINT " "
 155 IF D=4 THEN D=0:GOTO 170
 160 D=D-2:LOCATE G,D:IF COPYCHR$(#0)=" " THEN PRINT "z" ELSE 400

     *** Control UFO
 170 IF U=0 THEN W=W-1:IF W THEN 200
 180 IF U<37 THEN U=U+1:LOCATE U,4:PRINT" mn":GOTO 200
 185 LOCATE U,4:PRINT "   ":U=0:W=200

     *** Control invasores
 200 IF Q(M)=0 THEN 250
 210 IF S(M) THEN 240 ELSE IF RND(1)<0.6 THEN 250
 220 S(M)=(INT(RND(1)*2)+1)/2:IF M>5 THEN S(M)=-S(M):GOTO 250 ELSE 250
 240 X(M)=X(M)+S(M):LOCATE X(M),Y(M):PRINT B$(M,ABS(A)):IF ABS(19-X(M))<E THEN 500
 250 IF M<10 THEN M=M+1:GOTO 260
 255 M=1:A=NOT(A):SOUND 1,M(J),10,12:IF J=4 THEN J=1 ELSE J=J+1
 260 IF TIME<TI+20 AND TIME>TI THEN 260
 270 IF T THEN 100

     *** Pasar nivel
 300 I=1500:GOSUB 5100:N=20:GOSUB 5200:IF C<6 THEN C=C+1
 310 GOTO 2500

     *** ¿Que toca el disparo? (410=Invasor / 450=UFO)
 400 IF D=4 THEN 450 ELSE F=(D-4)/2:IF F>5 THEN D=0:GOTO 170
 410 I=ABS(G>20):K=F+I*5:LOCATE X(K),Y(K):PRINT B$(11,I):S(K)=0:Q(K)=Q(K)-1
 420 P=P+G(F):T=T-1:LOCATE X(K),Y(K):PRINT "   ":SOUND 2,2637,20,12
 430 X(K)=I*37+1:IF Q(K) THEN LOCATE X(K),Y(K):PRINT B$(K,0):GOTO 470 ELSE 470
 450 U=U+1:LOCATE U,4:PRINT"rs":F=INT(RND(1)*3+1)*50:P=P+F:I=150:GOSUB 5100
 455 FOR N=1 TO 3:SOUND 2,1760,15,12:SOUND 2,1319,15,12:NEXT
 460 LOCATE U-1,4:PRINT STR$(F)+" ":GOSUB 5100:LOCATE U,4:PRINT "   ":U=0:W=200
 470 D=0:N=5:I=P:GOSUB 5000:GOTO 170
     
     *** Perder vida / Fin partida
 500 FOR F=1 TO 8:SOUND 2,3951,15,12:SOUND 2,2093,15,12:NEXT
 510 IF L=1 THEN 540 ELSE L=L-1
 520 A$=MID$(STR$(L),2)+" ":IF L>1 THEN FOR F=2 TO L:A$=A$+"{|":NEXT
 530 LOCATE 3,24:PRINT A$+"  ":N=20:GOSUB 5200:GOTO 2500
 540 LOCATE 16,18:PRINT "GAME  OVER":I=5000:GOSUB 5100:IF R<P THEN R=P

     *** Pantalla presentación
2000 CLS:LOCATE 3,1:PRINT"SCORE<1>      HI-SCORE      SCORE<2>"
2010 N=5:I=P:GOSUB 5000:N=19:I=R:GOSUB 5000
2030 LOCATE 5,24:PRINT"{|{|":LOCATE 30,24:PRINT"CREDIT 00"
2040 LOCATE 19,6:PRINT"PLAY":PRINT:PRINT TAB(13);"NUCLEAR INVADERS"
2050 LOCATE 10,12:PRINT"*SCORE ADVANC TABLE*"
2060 LOCATE 14,14:PRINT"mn =? MYSTERY":PRINT:PRINT TAB(14);"cd =30 POINTS"
2080 PRINT:PRINT TAB(14);"gh =20 POINTS":PRINT:PRINT TAB(14);"kl =10 POINTS"
2090 IF INKEY(18) THEN 2090

     *** Inicio partida: Zona de juego
2100 N=18:GOSUB 5200:LOCATE 14,13:PRINT"PLAY PLAYER<1>":P=0:L=3:C=3
2110 I=100:FOR F=1 TO 10:LOCATE 5,2:PRINT"    ":GOSUB 5100
2120 LOCATE 5,2:PRINT"0000":GOSUB 5100:NEXT:N=13:GOSUB 5200
2130 LOCATE 2,23:PRINT STRING$(38,ASC("t")):PRINT"  3"
2500 F=(C+1)*2+2:A$="":B$="":E=(C*2+4)/2
2510 LOCATE 19-C,5:PRINT LEFT$(D$,F):LOCATE 19-C,16:PRINT LEFT$(D$,F)
2520 FOR F=1 TO C+1:A$=A$+"vw":B$=B$+"xy":NEXT:A$="u"+A$+"u":B$="u"+B$+"u"
2530 FOR F=6 TO 14 STEP 2:LOCATE 19-C,F:PRINT A$:PRINT TAB(19-C);B$:NEXT

     *** Inicio partida: Mostrar invasores y tanque
2800 FOR F=1 TO 5:Y(F)=F*2+4:Y(F+5)=Y(F):X(F)=1:X(F+5)=38:NEXT
2810 FOR F=1 TO 10:LOCATE X(F),Y(F):PRINT B$(F,0):Q(F)=3:S(F)=0:NEXT
2820 LOCATE 3,22:PRINT"opq":H=3:M=1:D=0:U=0:W=200:T=30:A=0:J=1:GOTO 100

     *** Lectura de gráficos e inicializar variables globales
3000 MODE 1:BORDER 0:INK 0,0:PAPER 0:INK 1,26:PEN 1:SYMBOL AFTER 97
3010 FOR F=97 TO 124
3020 FOR I=1 TO 8:READ Q(I):NEXT:SYMBOL F,Q(1),Q(2),Q(3),Q(4),Q(5),Q(6),Q(7),Q(8)
3030 NEXT:D$="uuuuuuuuuuuuuuuu":G(1)=30:G(2)=20:G(3)=20:G(4)=10:G(5)=10:R=0
3040 FOR F=1 TO 5:READ A$,C$:B$(F,0)=" "+A$:B$(F,1)=" "+C$
3050 B$(F+5,0)=A$+" ":B$(F+5,1)=C$+" ":NEXT:B$(11,0)=" rs":B$(11,1)="rs "
3060 M(4)=1975:M(3)=1760:M(2)=1567:M(1)=1396:RETURN

     *** Rutinas varias (5000=Marcador / 5100=Pausa / 5200=Borrar Pantalla)
5000 LOCATE N,2:PRINT RIGHT$("000"+MID$(STR$(I),2),4):RETURN
5100 FOR N=1 TO I:NEXT:RETURN
5200 LOCATE 1,3:FOR F=1 TO N:PRINT TAB(2);SPC(38):NEXT:RETURN

     *** Graficos y Animaciones de invasores
9000 DATA 1,3,7,13,15,5,8,4,128,192,224,176,240,160,16,32
9005 DATA 1,3,7,13,15,2,5,10,128,192,224,176,240,64,160,80
9010 DATA 8,36,47,59,63,31,8,16,32,72,232,184,248,240,32,16
9015 DATA 8,4,15,27,63,63,40,6,32,64,224,176,248,248,40,192
9020 DATA 3,31,63,57,63,14,25,12,192,248,252,156,252,112,152,48
9025 DATA 3,31,63,57,63,6,13,48,192,248,252,156,252,96,176,12
9030 DATA 0,7,31,63,109,255,57,16,0,224,248,252,182,255,156,8
9035 DATA 0,0,0,7,15,15,15,15,16,56,56,255,255,255,255,255,0,0,0,224,240,240,240,240
9040 DATA 4,34,16,8,96,4,18,36,34,136,16,32,12,32,144,72
9045 DATA 0,0,0,0,0,255,0,0,251,251,251,0,223,223,223,0
9050 DATA 3,28,35,32,33,35,33,32,224,28,226,2,194,226,194,130
9055 DATA 37,47,46,38,32,28,3,0,82,122,58,50,2,28,224,0,0,16,16,16,16,16,0,0
9060 DATA 1,3,3,127,255,255,255,255,0,128,128,252,254,254,254,254
9500 DATA "cd","ab","gh","ef","gh","ef","ij","kl","ij","kl"


APUNTES FINALES
Después de las versiones para DRAGON-32, MSX, ORIC-1, JUPITER ACE, ZX-SPECTRUM y ZX-81 (en Forth), le ha tocado el turno al AMSTRAD CPC. Para esta versión he usado un CPC-6128 con monitor de fósforo verde. Nunca lo había programado pero he quedado muy satisfecho, excepto por algún detallito que ya comentaré.

Para empezar, decir que creo que este es un juego ideal para hacer versiones para distintos sistemas y poder sacar unas buenas conclusiones respecto al rendimiento de los distintos intérpretes de BASIC (o FORTH para el JUPITER ACE).

Para esta versión he partido de la versión del ORIC, y si se consultan los dos listados se verá que los programas son prácticamente idénticos, excepto por las instrucciones de posición en pantalla (LOCATE en lugar de PLOT), lectura de teclado y comandos de sonido. Por el resto, el código es muy transportable. Si se consulta la versión de SPECTRUM se verá que también es muy parecido, con las correspondientes diferencias en los mismos comandos.
Para esta versión los gráficos vuelven a ser los mismos de las versiones anteriores, excepto la del ORIC.

Conclusiones de esta versión:
- El CPC tiene un BASIC muy rápido… excepto a la hora de acceder a la pantalla. Allí su rendimiento cae radicalmente, casi comparable con un ZX-81. Es muy curioso. La impresión de la zona de juego o el borrado de pantalla que en otras versiones es casi instantáneo, aquí es con diferencia el más lento.
- Por el contrario, el juego se ha tenido que frenar (línea 260) para hacerlo más jugable y conseguir una sensación de velocidad constante, gracias a la variable de sistema TIME. En otras versiones no ha sido necesario.
- Respecto al aspecto, el juego luce muy bien en la pantalla de fósforo verde gracias a su scan-line y buena definición.
- El sonido tiene muchas posibilidades, y de una forma bastante sencilla se pueden hacer efectos más que decentes. Yo soy un inútil y me he salido bastante bien, aunque me habría gustado hacerlo más parecido al original. Es lo que hay.

En resumen, creo que después de la versión de MSX, esta es la mejor, sin duda.


Para terminar, todo el desarrollo se ha programado en un AMSTRAD CPC-6128 original con monitor en fósforo verde, y se ha listado en una impresora matricial conectada a un AMSTRAD CPC-6128+.

Posteriormente se ha tecleado todo en el emulador “WinApe” para conseguir la imagen del disquete y el listado.

Os invito a probarlo.

DSC_0168.jpg

DSC_0170.jpg

DSC_0172.jpg

DSC_0173.jpg

DSC_0176.jpg

DSC_0177.jpg

Avatar de Usuario
ron
Mensajes: 17701
Registrado: 28 Oct 2010 14:20
Ubicación: retrocrypta
Agradecido : 697 veces
Agradecimiento recibido: 749 veces

Re: NUCLEAR INVADERS para AMSTRAD CPC

Mensajepor ron » 11 Feb 2014 00:09

-4mstr4d -drinks -thumbup -hk -clapping -groupwave -dance4 -roll1

BlackHole
Mensajes: 786
Registrado: 03 Ago 2011 23:07
Ubicación: Aluche, Madrid
Agradecido : 3 veces
Agradecimiento recibido: 65 veces

Re: NUCLEAR INVADERS para AMSTRAD CPC

Mensajepor BlackHole » 11 Feb 2014 01:20

dancresp escribió:pero desgraciadamente parece que el MODE 1 no permite el blanco y negro, y se ha quedado en un blanco sobre azul, con borde negro
3000 MODE 1:BORDER 0:PAPER 0:INK 1,27:CLS:SYMBOL AFTER 97

Hola dancresp,

Con el comando PAPER 0 lo que consigues es que el fondo utilice el primer tintero (de los 4 disponibles en MODE 1) pero el color de la tinta de un tintero se establece con el comando INK. Tenemos 2 bits en modo 1 para escoger tinteros, si ponemos PAPER 4 o PAPER 8 vamos a obtener el mismo resultado. Por ejemplo en MODE 2, tenemos 2 tinteros y podemos referenciarlos con cualquier número: los pares con bit 0 y los impares con bit 1, porque el resto de los bits se descartan. En MODE 0 tenemos 16 tinteros con 4 bits. No sé si se entiende el esquema y si me he explicado bien.

Después (o antes) de PAPER 0, debemos usar el comando INK 0,0 para dar al tintero 0 el color de firmware número 0 que corresponde al negro. Si ponemos INK 0,6 automáticamente todo el fondo se pone rojo; si ponemos INK 0,24 automáticamente todo se pone amarillo, sin necesidad de escribir o borrar porque en realidad cambiamos el valor de la paleta en el chip de vídeo.

Es con el comando PEN cuando escogemos escribir sobre el fondo con uno de los tinteros disponibles (hasta 16 en MODE 0) y todo lo que pintemos con él, podríamos cambiarlo automáticamente a otro color con el comando INK de golpe. Por defecto, si corremos tu juego con el equipo recién inicializado, todo se vería como has diseñado porque la pluma elegida es la 1, pero no hay darlo nunca por supuesto. Basta que escribamos PEN 3 antes de ejecutar el juego, para que todo se vea rojo sobre azul por mucho que tú tengas la orden INK en la línea 3000.

Así que la forma "correcta" de inicializar el vídeo, teniendo en cuenta que en BASIC el comando MODE limpia la pantalla y que el blanco brillante tiene el código 26, sería más bien:
3000 MODE 1:BORDER 0:INK 0,0:PAPER 0:INK 1,26:PEN 1:SYMBOL AFTER 97

Un saludo.

Avatar de Usuario
vade-retro
Mensajes: 86
Registrado: 26 Jul 2012 22:20
Agradecido : 3 veces

Re: NUCLEAR INVADERS para AMSTRAD CPC

Mensajepor vade-retro » 12 Feb 2014 14:01

Te ha quedado genial -good Además, esos tonos verdes del monitor de Amstrad le vienen que ni pintado, parece que estas jugando en la máquina arcade.

A ver si busco el momento de sacar el CPC para probarlo en la maquina real.

Avatar de Usuario
sabreman
Mensajes: 70
Registrado: 09 Ene 2011 23:20
Ubicación: Barcelona

Re: NUCLEAR INVADERS para AMSTRAD CPC

Mensajepor sabreman » 12 Feb 2014 14:44

Jo Dancresp, una chulada.
Cada vez te quedan menos computadoras que versionar ! (lo de menos es un decir, porque hay para diez vidas, pero por lo menos de las clásicas sí).
¿Te has planteado hacer un mini-libro/pdf con toda la documentación que estás generando sobre este juego para diferentes plataformas?, sería un puntazo.

saludos,

dancresp
Mensajes: 5091
Registrado: 13 Nov 2010 02:08
Agradecido : 37 veces
Agradecimiento recibido: 105 veces

Re: NUCLEAR INVADERS para AMSTRAD CPC

Mensajepor dancresp » 12 Feb 2014 16:21

Con la aportación del amigo BlackHole el juego ya es en blanco y negro auténtico.

He actualizado el listado y la imagen del disquete.

sabreman escribió:Cada vez te quedan menos computadoras que versionar ! (lo de menos es un decir, porque hay para diez vidas, pero por lo menos de las clásicas sí).

Bueno, poco a poco van cayendo... la verdad es que el código es muy transportable.

Pero para rompedora, la próxima versión.

sabreman escribió:¿Te has planteado hacer un mini-libro/pdf con toda la documentación que estás generando sobre este juego para diferentes plataformas?, sería un puntazo.

Por ahora tengo todos mis posts en PDF. Algo saldrá...

Avatar de Usuario
web8bits
Mensajes: 964
Registrado: 31 Oct 2010 10:34
Ubicación: Vigo
Agradecido : 84 veces
Agradecimiento recibido: 52 veces
Contactar:

Re: NUCLEAR INVADERS para AMSTRAD CPC

Mensajepor web8bits » 12 Feb 2014 17:21

Impresionante trabajo, gracias por compartirlo.

Un saludo

FloppySoftware

Re: NUCLEAR INVADERS para AMSTRAD CPC

Mensajepor FloppySoftware » 13 Feb 2014 23:26

Dancresp, antes que nada, felicitarte por lo prolífico que eres, por tus proyectos, y por esta versión en especial de Nuclear Invaders.

¿Para cuándo una versión en PCW?

Incluso me había animado a hacerla yo mismo, pero... me encuentro con esto: COPYCHR$(#0).

El resto de comandos BASIC se pueden cambiar por sus equivalentes en Mallard Basic, o eliminar algunos incluso (sonido, por ejemplo), pero esto...

Todavía no entiendo cómo los chicos de Locomotive no crearon un basic para PCW, porque el Mallard no es otra cosa que una versión genérica para CP/M, sin ningún tipo de control de pantalla. Lástima.

Siempre se puede hacer una rutina en código máquina, realmente no sería difícil hacerla. Hummmm... pensaré en ello.

De nuevo, enhorabuena.

Saludos.

Avatar de Usuario
jojo073
Mensajes: 3166
Registrado: 14 Nov 2010 20:41
Agradecido : 42 veces
Agradecimiento recibido: 106 veces

Re: NUCLEAR INVADERS para AMSTRAD CPC

Mensajepor jojo073 » 14 Feb 2014 00:32

Que guay!!!!

dancresp
Mensajes: 5091
Registrado: 13 Nov 2010 02:08
Agradecido : 37 veces
Agradecimiento recibido: 105 veces

Re: NUCLEAR INVADERS para AMSTRAD CPC

Mensajepor dancresp » 14 Feb 2014 00:59

FloppySoftware escribió:¿Para cuándo una versión en PCW?

Incluso me había animado a hacerla yo mismo, pero... me encuentro con esto: COPYCHR$(#0).

El resto de comandos BASIC se pueden cambiar por sus equivalentes en Mallard Basic, o eliminar algunos incluso (sonido, por ejemplo), pero esto...

Pues ya tenía recopilada información para ver como redefinir los gráficos en BASIC, pero como tenías pensado hacerla tu mismo, no te voy a chafar el plan. -507

El COPYCHR$(#0) lo que hace es coger el carácter que hay en la posición de pantalla (es el #0) en la que te has posicionado con el LOCATE anterior.
Es muy simple, pero si no puedes acceder a la memoria de vídeo...

La alternativa está en revisar la matriz de las posiciones de los invasores y ver si coincide con la posición de tu disparo. Es sencillo, pero afectará al rendimiento porque hay que hacer un bucle de 10 repeticiones (una por cada invasor).

Para mejorar el cálculo, puedes comprobar si estas en el lado derecho o izquierdo y esto reduce el bucle a 5 repeticiones, y en función de la altura podrías limitarlo a una única comprobación, pero es algo más laborioso...

También te quedará comprobar si has tocado al UFO !!!

Anímate, que así me ahorráis trabajo... -grin

FloppySoftware

Re: NUCLEAR INVADERS para AMSTRAD CPC

Mensajepor FloppySoftware » 15 Feb 2014 12:32

Jo Dancresp, tú siempre dándome largas!!! -rofl

Yo lo que quiero es que se involucre más gente en programar para PCW. -507

Pero no hay manera!!! -nb


Volver a “Lenguajes de Programación y herramientas Dev”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado