BLASTO para Commodore Plus/4 - C16

Foro dedicado a la programación en todo tipo de sistemas clásicos.
dancresp
Amiga 1200
Amiga 1200
Mensajes: 1393
Registrado: 23 Dic 2008, 17:53
Sistema Favorito: MSX
primer_sistema: ZX81
Primera consola: Atari 2600
Gracias dadas: 3 veces
Gracias recibidas: 20 veces

BLASTO para Commodore Plus/4 - C16

Mensajepor dancresp » 16 Feb 2016, 15:24

Blasto_4.gif
Blasto_4.gif (6.58 KiB) Visto 8940 veces


EL JUEGO
Este videojuego para sistemas arcade fue desarrollado en 1977 por la empresa Gremlin.

El objetivo del juego consiste en destruir todas las minas del campo minado antes de que acabe el tiempo. Para ello disponemos de una nave que podemos mover por las zonas vacías de la pantalla, y que pueden destruir todo lo que hay en ella. Hay que ir con cuidado porque al explotar las minas destruyen lo que hay a su alrededor.

Si conseguimos nuestro objetivo conseguiremos una partida gratis.

Controles:
Utiliza las teclas Q-A-O-P para controlar la nave.
Pulsa "Espacio" para disparar.


Descargar el juego:
Blasto.rar
(5.33 KiB) Descargado 317 veces


BLOQUES
Se ha dividido el listado en 10 bloques:

- Declaración de las matrices. Llamada a rutinas principales.
- Control de la nave.
- Control del disparo.
- Final de la partida.
- El disparo ha impactado con algo.
- Destruir una mina.
- Perder una nave.
- Presentación e inicio de la partida.
- Rutinas varias.
- DATA con los UDG del juego y el diseño de la zona de juego.


COMO FUNCIONA
Todo el programa ocupa 91 líneas.

10 - Definimos las matrices del juego.
50 – Salto a la subrutina que lee los gráficos, redefine los caracteres y define variables globales y modo de vídeo.
100 – Mover la nave.
140 – Si hay alguna mina pendiente de explotar se va a la rutina correspondiente 350.
150 – Control del disparo.
190 – Se reduce el tiempo disponible para finalizar la partida.
200 – Si queda tiempo vuelve a 100.
205 – Final de partida donde se controla si se ha superado el récord y si se han destruido todas las minas.
300 – Controla si el disparo ha tocado algo.
350 – Rutina que controla la destrucción de minas en cadena.
400 – Una mina ha explotado cerca y nuestra nave se destruye.
2000 – Pantalla inicial del juego.
2500 – Inicializar variables para la partida y rutina que coloca las minas.
2600 – Posición inicial de nuestra nave.
2700 – Rutina que muestra el laberinto de puntos en pantalla, sin las minas.
3000 – Se ajustan los colores, el volumen del sonido y indicamos la línea a saltar si hay un error en el programa.
3005 - Texto inicial con las instrucciones del juego.
3010 - Lectura de los DATA con el código máquina que permite redefinir los caracteres.
3015 – Lectura de los DATA de los UDG y de la zona de juego.
5000 – Rutina de vuelta al editor BASIC. Recupera los valores por defecto.
5100 – Rutina que muestra el marcador de puntos.
5300 – Rutina de PAUSA. Valor en (I).
5400 – Rutina que muestra el mensaje de fin de partida o partida gratis.
8000 - DATA con el código máquina que permite redefinir los caracteres.
9000 – DATA con los gráficos de los UDG y con las distintas filas que forman la zona de juego.


EL LISTADO

Código: Seleccionar todo

  10 DIMA$(8)
  50 GOSUB3000
  80 GOSUB2700:GOSUB5400:GOSUB2000
  90 DIML(68)

     ' Lectura del Teclado
 100 GETK$:IFK$="Q"THEN110
 102 IFK$="P"THEN115
 104 IFK$="A"THEN120
 108 IFK$="O"THEN125:ELSE140
     ' Mover la Nave
 110 IFG<>78THENG=78:GOTO130
 111 IFY>0THENIFPEEK(A-40)=32THENY=Y-1:POKEA,32:A=A-40
 112 GOTO130
 115 IFG<>79THENG=79:GOTO130
 116 IFX<31THENIFPEEK(A+1)=32THENX=X+1:POKEA,32:A=A+1
 117 GOTO130
 120 IFG<>80THENG=80:GOTO130
 121 IFY<23THENIFPEEK(A+40)=32THENY=Y+1:POKEA,32:A=A+40
 122 GOTO130
 125 IFG<>81THENG=81:GOTO130
 126 IFX>0THENIFPEEK(A-1)=32THENX=X-1:POKEA,32:A=A-1
     ' Mostrar la Nave en la nueva posición
 130 POKEA,G
 
    ' Controlar si hay Minas pendientes de Explotar
 140 IFM<NTHEN350
 
    ' Control del Disparo
 150 IFDTHEN160:ELSEIFK$<>" "THEN190
 155 D=1:B=G-77:C=-1
    ' Mover el Disparo
 160 ONBGOTO165,170,175,180
 165 IFC<>-1THEN167
 166 C=Y:K=A-40:IFC<=0THEND=0:GOTO190:ELSE185
 167 POKEK,32:C=C-1:IFC>0THENK=K-40:GOTO185:ELSED=0:GOTO190
 170 IFC<>-1THEN172
 171 C=31-X:K=A+1:IFC<=0THEND=0:GOTO190:ELSE185
 172 POKEK,32:C=C-1:IFC>0THENK=K+1:GOTO185:ELSED=0:GOTO190
 175 IFC<>-1THEN177
 176 C=23-Y:K=A+40:IFC<=0THEND=0:GOTO190:ELSE185
 177 POKEK,32:C=C-1:IFC>0THENK=K+40:GOTO185:ELSED=0:GOTO190
 180 IFC<>-1THEN182
 181 C=X:K=A-1:IFC<=0THEND=0:GOTO190:ELSE185
 182 POKEK,32:C=C-1:IFC>0THENK=K-1:ELSED=0:GOTO190
    ' El disparo toca algo?
 185 IFPEEK(K)<>32THEN300:ELSEPOKEK,76
 
    ' Control del Tiempo y Fin del Bucle Principal
 190 T=T+1:IFT=11THENT=0:TM=TM-1:CHAR1,19,1,"":PRINTUSING"##";TM
 200 IFTMTHEN100
 
     ' Final de la Partida
 205 IFP>RTHENR=P
 210 IFE=OTHENGOSUB5410:ELSEGOSUB5400
 215 I=5000:GOSUB5300:IFETHENGOSUB2000:GOTO100:ELSEGETKEYK$:GOSUB2500:GOTO100

    ' Que toca el disparo?
 300 D=0:F=PEEK(K)
 305 IFF=74THENPOKEK,77:SOUND1,990,3:P=P+10:GOSUB5100:POKEK,32:GOTO190
 310 IFF=75THENP=P+50:N=N+1:L(N)=K-41:POKEK,32:GOTO190:ELSE190

    ' Explosión de una Mina
 350 M=M+1:W=65:FORF=L(M)TOL(M)+80STEP40:FORI=FTOF+2
 355 K=PEEK(I):IFK=74THENP=P+10:ELSEIFK=75THENP=P+50:N=N+1:L(N)=I-41
 360 POKEI,W:W=W+1:SOUND3,W,2:NEXT:NEXT
 370 F=L(M):POKEF,32:POKEF+1,32:POKEF+2,32:POKEF+40,32:POKEF+41,32:POKEF+42,32
 375 POKEF+80,32:POKEF+81,32:POKEF+82,32:E=E-1:GOSUB5100:IFPEEK(A)<>32THEN190

    ' Destrucción de la Nave
 400 I=150:FORG=81TO77STEP-1:POKEA,G:SOUND1,650-(G*5),2:GOSUB5300:NEXT
 405 POKEA,32:GOSUB2600:GOTO190

    ' Presentación
2000 GETKEYK$
2005 SCNCLR:CHAR1,14,12,"PRESS START":I=900:GOSUB5300:GETKEYK$
2010 SCNCLR:CHAR1,11,9,"HIT ALL MINES FOR":CHAR1,15,13,"FREE GAME"
2015 GOSUB5300:GETKEYK$

    ' Poner Minas en la Pantalla e Iniciar Variables
2500 T=0:TM=90:E=68:N=0:M=0:GOSUB2700:FORF=1TOE
2505 I=3072+40*INT(RND(1)*22+1)+INT(RND(1)*30+5):IFPEEK(I)<>74THEN2505
2510 POKEI,75:NEXT

    ' Posición Inicial de la Nave
2600 X=29:Y=14:A=3665:G=81:POKEA,G:D=0:RETURN

    ' Mostrar la Zona de Juego
2700 SCNCLR:FORF=1TOLEN(B$):CHAR1,4,F-1,A$(VAL(MID$(B$,F,1))):NEXT:POKE3665,81
2705 CHAR1,18,0,"time":CHAR1,19,1,"90":P=0:GOSUB5100:RETURN

    ' Inicio del programa, Instrucciones y lectura de gráficos UDG y Laberinto
3000 POKE56,59:POKE52,59:CLR:COLOR0,1:COLOR1,2:COLOR4,1:VOL8:TRAP3300
3005 CHAR1,17,0,"BLASTO":CHAR1,9,5,"CONTROLS: MOVE = QAOP":CHAR1,19,6,"FIRE = SPACE"
3006 CHAR1,10,14,"*PRESS KEY TO START*":CHAR1,9,21,"(c) SCAINET SOFT, 2016"
3007 CHAR1,1,23,"DEDICATED TO JOSEPZIN & COMMODORE MANIA"
3010 FORA=1536TO1570:READB:POKEA,B:NEXT:SYS1536
3015 FORF=15880TO16015:READB:POKEF,B:NEXT:GOSUB3100
3020 FORF=1TO8:READA$(F):NEXT:READB$:F=RND(-TI):GETKEYK$:GOTO80
3100 PRINTCHR$(8):POKE65299,60:POKE65298,PEEK(65298)AND251:RETURN
3200 POKE65299,208:POKE65298,PEEK(65298)OR4:RETURN
3300 GOSUB3200:COLOR0,2:COLOR1,1:COLOR4,7:SCNCLR:PRINTERR$(ER),EL:END

    ' Rutina: Mostrar el Marcador de Puntos
5100 CHAR1,30,1,RIGHT$("0000"+MID$(STR$(P),2),5):RETURN
    ' Rutina: Pausa (Valor en "I")
5300 FORF=1TOI:NEXT:RETURN
    ' Rutina: Mensaje de Game Over
5400 CHAR1,18,10,"GAME":CHAR1,18,13,"OVER"
5405 CHAR1,5,23,"SINGLE PLAYER HIGH SCORE "+RIGHT$("0000"+MID$(STR$(R),2),5):RETURN
5410 CHAR1,16,10,"FREE GAME":CHAR1,15,12,"PRESS START":GOTO5405

    ' Código Máquina para redefinir UDG
8000 DATA169,0,133,208,169,208,133,209,169,0,133,210,169,60,133,211,162,4,160
8005 DATA0,177,208,145,210,200,208,249,230,209,230,211,202,208,240,96

    ' Gráficos del Juego (UDG)
9000 DATA0,0,0,0,0,0,0,0,4,4,134,198,204,237,191,156,12,24,56,112,230,204,124,24
9005 DATA3,207,153,60,48,126,236,9,136,193,20,124,249,43,129,156,240,124,15,60
9010 DATA96,48,252,78,31,28,56,56,113,101,76,192,191,172,236,198,195,137,140,128
9015 DATA67,225,240,120,28,12,70,0,0,0,56,40,56,0,0,0,56,108,198,146,198,108,56
9020 DATA0,40,170,170,170,170,170,40,0,136,193,20,124,249,43,129,156,16,16,16
9025 DATA146,254,124,16,0,48,96,96,254,96,96,48,0,16,124,254,146,16,16,16,0,24
9030 DATA12,12,254,12,12,24,0

    ' Partes y Formato del Laberinto
9100 DATA"JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ","J        JJ          JJ        J"
9110 DATA"JJJJJJ JJJJJJ JJJJ JJJJJJ JJJJJJ","JJJJJJ JJ              JJ JJJJJJ"
9120 DATA"J   JJ JJ JJJJJ  JJJJJ JJ JJ   J","J         JJJJJ  JJJJJ         J"
9130 DATA"J   JJJJJ JJJ      JJJ JJJJJ   J","JJJJJJJJJ              JJJJJJJJJ"
9140 DATA"122333455678876554333221"



APUNTES FINALES
Esta es la tercera versión que programo de este juego, después de las versiones de MSX y ORIC-1.

El código BASIC es una copia casi idéntica de la versión MSX, al que le he tenido que ajustar el puntero a la memoria de vídeo. Posteriormente he tenido que realizar algún cambio ya que detecté, después de volverme loco, que al anidar un IF en una misma línea, el ELSE reacciona de forma distinta. Por otra parte, al modificar el RAMTOP me destruía el tamaño de la matriz "L" y la dejaba en 10 elementos, obligándome a moverla a la línea 90. Con el cambio de los LOCATE/PRINT por CHAR, y la lectura del teclado, el juego funcionó bien.

Para conseguir una velocidad igual a la del juego original he accedido directamente a la memoria de video mediante POKE.

Principales descartes respecto al juego original:
- El juego original permite 2 jugadores simultáneos.
- La pantalla tiene 28 filas y 32 columnas, pero aquí solo 24 filas y 32 columnas.
- En el juego original hay 84 minas y aquí 64, ya que la zona de juego es más pequeña.

Por el resto, la mecánica del juego se ha respetado en su totalidad.

Reacción en cadena
El juego es técnicamente muy sencillo y la única dificultad, resuelta en la versión MSX, consiste en saber como resolver el problema de las explosiones de minas en cadena, ya que fácilmente pueden haber 2 o más minas juntas. Para ello se ha creado una matriz de 68 elementos (uno por mina) con dos punteros: “M“ y “N”.

Cuando nuestro disparo detecta que hemos tocado una mina incrementa el puntero “N”, guarda su posición en la matriz y la borra de la pantalla. A continuación se revisan las posiciones que hay alrededor. Cada vez que se encuentra otra mina se realiza la misma acción.

En la línea 140 miramos si el puntero “M” es inferior a “N” y si es cierto, vamos a la rutina que las hace explotar, incrementando el puntero “M”.


El juego ha sido programado en un Plus/4 real y la imagen del disquete se ha pasado a PC mediante un interface 1541-III.

Os invito a probarlo.

Blasto_System.jpg
Blasto_System.jpg (55.43 KiB) Visto 8940 veces

Blasto_4.gif
Blasto_4.gif (6.58 KiB) Visto 8940 veces

Blasto_3.gif
Blasto_3.gif (1.68 KiB) Visto 8940 veces

Blasto_2.gif
Blasto_2.gif (5.05 KiB) Visto 8940 veces

Blasto_1.gif
Blasto_1.gif (3.21 KiB) Visto 8940 veces

Blasto_6.gif
Blasto_6.gif (4.4 KiB) Visto 8940 veces

Blasto_5.gif
Blasto_5.gif (4.71 KiB) Visto 8940 veces
Buscando la IP de la W.O.P.R.

Avatar de Usuario
zitror
Amiga 2500
Amiga 2500
Mensajes: 5349
Registrado: 02 Jul 2006, 00:16
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
Ubicación: El interior de un Z80
Gracias dadas: 248 veces
Gracias recibidas: 103 veces
Contactar:

Re: BLASTO para Commodore Plus/4 - C16

Mensajepor zitror » 16 Feb 2016, 23:17

¡Genial Dani! y encima para unas máquinas con escasez de juegos como los chiquitines de Commodore =D>

Salu2 ;)
(C) 1.982 Sinclair Research Ltd

La buhardilla de Zitror

dancresp
Amiga 1200
Amiga 1200
Mensajes: 1393
Registrado: 23 Dic 2008, 17:53
Sistema Favorito: MSX
primer_sistema: ZX81
Primera consola: Atari 2600
Gracias dadas: 3 veces
Gracias recibidas: 20 veces

Re: BLASTO para Commodore Plus/4 - C16

Mensajepor dancresp » 17 Feb 2016, 00:15

zitror escribió:¡Genial Dani! y encima para unas máquinas con escasez de juegos como los chiquitines de Commodore =D>

Salu2 ;)

Gracias !!!

Y lo de la escasez de juegos es lo que pensaba yo hasta que descubrí esta página: http://plus4world.powweb.com/games.php?l=A&cols=&icons=
Buscando la IP de la W.O.P.R.

Avatar de Usuario
josepzin
Amiga 2500
Amiga 2500
Mensajes: 3103
Registrado: 12 Ene 2009, 14:36
Sistema Favorito: C64
primer_sistema: ZX81
Ubicación: Carthagonova
Gracias dadas: 4 veces
Gracias recibidas: 61 veces
Contactar:

Re: BLASTO para Commodore Plus/4 - C16

Mensajepor josepzin » 27 Ago 2016, 16:59

Archivos corruptos :(

Te falta agregarlo a http://plus4world.powweb.com/

Avatar de Usuario
josepzin
Amiga 2500
Amiga 2500
Mensajes: 3103
Registrado: 12 Ene 2009, 14:36
Sistema Favorito: C64
primer_sistema: ZX81
Ubicación: Carthagonova
Gracias dadas: 4 veces
Gracias recibidas: 61 veces
Contactar:

Re: BLASTO para Commodore Plus/4 - C16

Mensajepor josepzin » 27 Ago 2016, 20:05

Joerr, un juego dedicado para mi!!! se engrandece :)

Ahora lo pongo por C=mania, que también hay dedicatoria para ellos!

dancresp
Amiga 1200
Amiga 1200
Mensajes: 1393
Registrado: 23 Dic 2008, 17:53
Sistema Favorito: MSX
primer_sistema: ZX81
Primera consola: Atari 2600
Gracias dadas: 3 veces
Gracias recibidas: 20 veces

Re: BLASTO para Commodore Plus/4 - C16

Mensajepor dancresp » 29 Ago 2016, 09:47

josepzin escribió:Joerr, un juego dedicado para mi!!! se engrandece :)

Ahora lo pongo por C=mania, que también hay dedicatoria para ellos!

En algunos casos la dedicatoria es bien merecida.

Tendrás que entrar en RetroWiki para poder acceder al post sin problemas.
Buscando la IP de la W.O.P.R.

Avatar de Usuario
josepzin
Amiga 2500
Amiga 2500
Mensajes: 3103
Registrado: 12 Ene 2009, 14:36
Sistema Favorito: C64
primer_sistema: ZX81
Ubicación: Carthagonova
Gracias dadas: 4 veces
Gracias recibidas: 61 veces
Contactar:

Re: BLASTO para Commodore Plus/4 - C16

Mensajepor josepzin » 29 Ago 2016, 14:31

dancresp escribió:En algunos casos la dedicatoria es bien merecida.

Que obviamente no es este el caso, lo he entendido! :D :D :P


Volver a “Programación”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 10 invitados