Autor Tema: Blasto - Commodore 16  (Leído 5452 veces)

dancresp

  • Sinver
  • *
  • Mensajes: 12
  • SYS 0
    • Ver Perfil
Blasto - Commodore 16
« en: Septiembre 08, 2016, 23:33:28 »


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:
http://retroinvaders.com/commodoremania/foro/index.php?action=dlattach;topic=1647.0;attach=2268

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]
  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.
« última modificación: Septiembre 08, 2016, 23:38:05 por dancresp »

SirArthur

  • Commodore Master
  • *****
  • Mensajes: 210
  • No.. yo no me lo hago en los cementerios ;)
    • Ver Perfil
Re:Blasto - Commodore 16
« Respuesta #1 en: Septiembre 14, 2016, 10:30:40 »
Felicidades por el trabajo,la dedicación para estar mejorando tu juego constantemente y por publicarlo asi accesible para todo el que quiera cotillearlo. Menuda currada de post y de montón de información detallada por cierto!. Sin duda voy a probarlo! :)

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 13630
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Re:Blasto - Commodore 16
« Respuesta #2 en: Septiembre 14, 2016, 11:20:35 »
Suscribo.

Es una delicia leer todas las explicaciones y detalles del juego.
www.retroinvaders.com | www.commodoreplus.org  | josepzin.blogspot.com

dancresp

  • Sinver
  • *
  • Mensajes: 12
  • SYS 0
    • Ver Perfil
Re:Blasto - Commodore 16
« Respuesta #3 en: Septiembre 14, 2016, 12:29:27 »
Felicidades por el trabajo,la dedicación para estar mejorando tu juego constantemente y por publicarlo asi accesible para todo el que quiera cotillearlo. Menuda currada de post y de montón de información detallada por cierto!.
Siempre los hago así, aunque este es de los más sencillos.

Debo tener vocación de maestro, aunque en el colegio me odiaban...  ;D