Blasto para ORIC

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 ORIC

Mensajepor dancresp » 10 Feb 2014, 23:48

Blasto_3.gif
Blasto_3.gif (5.02 KiB) Visto 5183 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:
Controla la nave con Q – A – O - P.
Pulsa el “espacio” para disparar.

Descargar juego en formato "TAP":
BLASTO.rar
(1.64 KiB) Descargado 313 veces


Blastos.jpg
Blastos.jpg (52.24 KiB) Visto 5183 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 vida.
- 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 73 líneas.

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

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 – Inicio del bucle principal.
102 – Se consulta el teclado y si no se pulsa ninguna tecla se salta a 140.
110 – Se mueve la nave en función de la tecla pulsada.
140 – Si hay alguna mina pendiente de explotar se va a la rutina correspondiente 350.
150 – Control del disparo. Si está activo salta a 160 y sino mira si se ha pulsado la tecla de disparo.
160 – Mover el disparo en función de su dirección.
190 – Se reduce el tiempo disponible para finalizar la partida.
200 – Si queda tiempo salta 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 – Control de que ha tocado el disparo.
350 – Rutina que controla la destrucción de minas en cadena.
400 – Una mina ha explotado cerca y nuestra nave queda 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 – Selección de colores, borrar de pantalla, ocultar cursor y ocultar el “CAPS” superior.
3010 – Lectura de los DATA de los UDG.
3015 – Lectura de los DATA de los segmentos de la zona de juego.
5100 – Rutina que muestra el marcador de puntos.
5400 – Rutina que muestra el mensaje de fin de partida o partida gratis.
9000 – DATA con los gráficos de los UDG.
9100 – DATA con las distintas filas que forman la zona de juego.


EL LISTADO

Código: Seleccionar todo

  10 DIMA$(8),L(78)
  50 GOSUB3000:GOSUB2700:GOSUB5400:GOSUB2000

     ' Inicio del Bucle Principal
 100 REPEAT
     ' Lectura del Teclado
 102 J=PEEK(520):IFJ=56THEN140
 105 IFJ=157THEN115
 106 IFJ=174THEN120
 107 IFJ=149THEN125
 108 IFJ<>177THEN140
     ' Mover la Nave
 110 IFG<>110THENG=110:GOTO130
 111 IFY>0THENIFPEEK(A-40)=32THENY=Y-1:POKEA,32:A=A-40
 112 GOTO130
 115 IFG<>111THENG=111:GOTO130
 116 IFX<31THENIFPEEK(A+1)=32THENX=X+1:POKEA,32:A=A+1
 117 GOTO130
 120 IFG<>112THENG=112:GOTO130
 121 IFY<25THENIFPEEK(A+40)=32THENY=Y+1:POKEA,32:A=A+40
 122 GOTO130
 125 IFG<>113THENG=113: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
 152 IFJ<>132THEN190
 155 D=1:B=G-109:C=-1
     ' Mover el Disparo
 160 ONBGOTO165,170,175,180
 165 IFC<>-1THEN167
 166 C=Y:K=A-40:IFC<=0THEND=0:GOTO190ELSE185
 167 POKEK,32:C=C-1:IFC>0THENK=K-40:GOTO185ELSED=0:GOTO190
 170 IFC<>-1THEN172
 171 C=31-X:K=A+1:IFC<=0THEND=0:GOTO190ELSE185
 172 POKEK,32:C=C-1:IFC>0THENK=K+1:GOTO185ELSED=0:GOTO190
 175 IFC<>-1THEN177
 176 C=25-Y:K=A+40:IFC<=0THEND=0:GOTO190ELSE185
 177 POKEK,32:C=C-1:IFC>0THENK=K+40:GOTO185ELSED=0:GOTO190
 180 IFC<>-1THEN182
 181 C=X:K=A-1:IFC<=0THEND=0:GOTO190ELSE185
 182 POKEK,32:C=C-1:IFC>0THENK=K-1:GOTO185ELSED=0:GOTO190
     ' El disparo toca algo?
 185 IFPEEK(K)<>32THEN300ELSEPOKEK,108

     ' Control del Tiempo y Fin del Bucle Principal
 190 T=T+1:IFT=10THENT=0:TI=TI-1:PLOT18,1,STR$(TI)+" "
 200 UNTILTI=0

     ' Final de la Partida
 205 IFP>RTHENR=P
 210 IFE=0THENGOSUB5410ELSEGOSUB5400
 215 WAIT500:GETC$:IFETHENGOSUB2000:GOTO100ELSEGOSUB2500:GOTO100

     ' Que toca el disparo?
 300 D=0:F=PEEK(K)
 305 IFF=106THENPOKEK,109:P=P+10:GOSUB5100:POKEK,32:GOTO190
 310 IFF=107THENP=P+50:N=N+1:L(N)=K-41:POKEK,32
 315 GOTO190

     ' Explosi¢n de una Mina
 350 M=M+1:W=97:SHOOT:FORF=L(M)TOL(M)+80STEP40:FORI=FTOF+2
 355 K=PEEK(I):IFK=106THENP=P+10
 356 IFK=107THENP=P+50:N=N+1:L(N)=I-41
 360 POKEI,W:W=W+1: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:IFM=NTHENGOSUB5100
 380 IFPEEK(A)<>32THEN190

     ' Destrucci¢n de la Nave
 400 FORG=113TO109STEP-1:POKEA,G:WAIT15:NEXT:EXPLODE:POKEA,32:GOSUB2600:GOTO190

     ' Presentaci¢n
2000 GETC$:CLS:PLOT14,12,"PRESS START":WAIT90:GETC$
2010 CLS:PLOT11,9,"HIT ALL MINES FOR":PLOT15,13,"FREE GAME":WAIT90:GETC$

     ' Poner Minas en la Pantalla e Iniciar Variables
2500 T=0:TI=90:E=78:N=0:M=0:INK0:GOSUB2700:FORF=1TOE
2505 I=48041+40*INT(RND(1)*24+1)+INT(RND(1)*30+4):IFPEEK(I)<>106THEN2505
2510 POKEI,107:NEXT:INK7

     ' Posici¢n Inicial de la Nave
2600 X=29:Y=16:A=48713:G=113:POKEA,G:D=0:RETURN

     ' Mostrar la Zona de Juego
2700 CLS:FORF=1TOLEN(B$):PRINT"  ";A$(VAL(MID$(B$,F,1))):NEXT:POKE48713,113
2705 PLOT18,0,"TIME":PLOT19,1,"90":P=0:GOSUB5100:RETURN

     ' Inicio del programa y lectura de gr ficos UDG y Laberinto
3000 INK7:PAPER0:CLS:R=0:POKE#BBA3,0:POKE#26A,10
3010 FORF=46856TO46991:READA:POKEF,A:NEXT
3015 FORF=1TO8:READA$(F):NEXT:READB$:RETURN

     ' Rutina: Mostrar el Marcador de Puntos
5100 PLOT30,1,RIGHT$("00000"+MID$(STR$(P),2),5):RETURN
     ' Rutina: Mensaje de Game Over
5400 PLOT18,11,"GAME":PLOT18,14,"OVER"
5405 PLOT5,25,"SINGLE PLAYER HIGH SCORE "+RIGHT$("0000"+MID$(STR$(R),2),5)
5406 RETURN
5410 PLOT16,11,"FREE GAME":PLOT15,14,"PRESS START":GOTO5405

     ' Gr ficos del Juego (UDG)
9000 DATA0,0,0,0,0,0,0,0,2,2,34,50,54,55,47,46,6,12,12,24,50,54,30,12
9005 DATA0,55,45,14,8,30,54,5,4,49,10,30,61,5,33,46,56,30,7,14,16,8,31,22
9010 DATA15,14,12,12,25,19,22,48,47,39,54,50,49,37,38,32,17,49,56,28,14,6,18,0
9015 DATA0,0,28,20,28,0,0,0,0,28,54,42,54,28,0,0,8,42,42,42,42,42,8,0
9020 DATA36,49,10,30,60,21,35,45,0,8,8,42,62,8,0,0,0,24,16,62,16,24,0,0
9025 DATA0,8,62,42,8,8,0,0,0,12,4,62,4,12,0,0

     ' Partes y Formato del Laberinto
9100 DATA"jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj"
9105 DATA"j        jj          jj        j"
9110 DATA"jjjjjj jjjjjj jjjj jjjjjj jjjjjj"
9115 DATA"jjjjjj jj              jj jjjjjj"
9120 DATA"j   jj jj jjjjj  jjjjj jj jj   j"
9125 DATA"j         jjjjj  jjjjj         j"
9130 DATA"j   jjjjj jjj      jjj jjjjj   j"
9135 DATA"jjjjjjjjj              jjjjjjjjj"
9140 DATA"12233345567788776554333221"


APUNTES FINALES
Esta es la versión ORIC del juego programado previamente para el sistema MSX.

A falta de más tiempo libre, ha aprovechado los viajes en tren al trabajo para programar el juego con la versión MS-DOS del emulador EUPHORIC. Afortunadamente este emulador permite, pulsando “F3”, mapear el teclado del ORIC con las teclas del PC lo que facilita mucho la introducción del programa. Desde el emulador he generado el TAP y desde el “Oricutron” de Windows he generado el listado en un fichero de texto, y lo he comentado posteriormente.

El listado de esta versión es muy parecido, y algunas partes idénticas, a la de la versión MSX, teniendo en cuenta las particularidades de cada sistema. Así, se ha cambiado la dirección de la memoria de vídeo y el método de lectura de los controles de la nave. Algunas líneas se han desdoblado para evitar problemas con el “bug” de la instrucción ELSE.

Este ha sido un excelente ejemplo para comparar el rendimiento de estos dos sistemas, y aunque ambas versiones rinden perfectamente, el MSX se ha tenido que “frenar” para evitar que fuera demasiado rápido y aquí no ha sido necesario.

En este aspecto he de reconocer que aunque la velocidad es perfecta durante el desarrollo del juego, me esperaba un mejor rendimiento en el ORIC. Hay que tener en cuenta que en las dos versiones se POKEa directamente en la memoria de vídeo para ganar velocidad y que no hay muchas líneas de código que ejecutar, excepto en el caso de la explosión de una mina o una explosión de minas en cadena, y en el ORIC tira justo lo suficiente.

Principales descartes respecto al arcade original:
- El juego original permite 2 jugadores simultáneos y aquí solo uno.
- La pantalla tiene 28 filas y aquí hay 26 (22 en MSX).
- En el juego original hay 84 minas y aquí 78 (64 en MSX), ya que la zona de juego es algo más pequeña.
- Los gráficos son ligeramente distintos a la versión original.
- Esta versión no permite el uso de joystick.

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

Las cosillas de la versión ORIC
Como siempre que se programa en el ORIC, los gráficos se han tenido que rediseñar ya que en lugar de la habitual matriz de 8x8 pixels pasamos a una de 8x6. Así, a la explosión (que ocupa 9 bloques) se le han tenido que recortar 6 pixels horizontalmente, la nave se ha tenido que rediseñar para dejarla en un tamaño real de 5x5 pixels y las minas tienen un aspecto diferente.

Como el ORIC tiene un modo texto de 26 filas y 40 columnas, el aspecto de la zona de juego es casi idéntica a la versión arcade.

Para el control de la nave se lee el teclado mediante un “PEEK 520” y así se evitan problemas con las mayúsculas/minúsculas.

Y para el sonido, una vez más he tirado de los predefinidos por el ORIC.

Reacción en cadena
El juego es técnicamente muy sencillo y la única dificultad ha consistido 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 he creado una matriz de 78 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”.

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

Os invito a probarlo.

Blasto_1.gif
Blasto_1.gif (4.27 KiB) Visto 5183 veces

Blasto_2.gif
Blasto_2.gif (1.23 KiB) Visto 5183 veces

Blasto_3.gif
Blasto_3.gif (5.02 KiB) Visto 5183 veces

Blasto_4.gif
Blasto_4.gif (4.44 KiB) Visto 5183 veces

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

Avatar de Usuario
Hark0
Amiga 1200
Amiga 1200
Mensajes: 1695
Registrado: 11 Jul 2012, 23:44
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: (Otro)
Primera consola: (Otro)
Ubicación: Cornellà de Llobregat - Barcelona
Contactar:

Re: Blasto para ORIC

Mensajepor Hark0 » 13 Feb 2014, 08:10

Estas que no paras ¿eh? :mrgreen: =D>
http://www.zxuno.com
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA.

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 ORIC

Mensajepor dancresp » 14 Feb 2014, 01:24

Hark0 escribió:Estas que no paras ¿eh? :mrgreen: =D>

Debo ser hiperactivo, porque mira que últimamente tengo poquito tiempo... pero lo aprovecho. Eso si. :---)
Buscando la IP de la W.O.P.R.

Avatar de Usuario
radastan
Amiga 2500
Amiga 2500
Mensajes: 4542
Registrado: 11 Jun 2007, 19:29
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Sega Genesis/Megadrive
Primera consola: TV Games/Pong Clone
Ubicación: Córdoba
Gracias dadas: 9 veces
Gracias recibidas: 40 veces
Contactar:

Re: Blasto para ORIC

Mensajepor radastan » 14 Feb 2014, 08:30

Queremos roguelikes y dugeon crawlers...
Yo tengo una máquina del tiempo, se llama ZX Spectrum, siempre me devuelve a los buenos momentos.
(\.../) (\.../) (\.../) (\.../)
( *.*) ('.'= ) ('.'= ) ('.'= )
(")_(") (")_(") (")_(") (")_(")
╔═══╦═══╦═══╦══╦══╗
║╔═╗║╔═╗║╔═╗╠╣╠╩╣╠╝
║║─║║╚══╣║─╚╝║║─║║
║╚═╝╠══╗║║─╔╗║║─║║
║╔═╗║╚═╝║╚═╝╠╣╠╦╣╠╗
╚╝─╚╩═══╩═══╩══╩══╝

Avatar de Usuario
Hark0
Amiga 1200
Amiga 1200
Mensajes: 1695
Registrado: 11 Jul 2012, 23:44
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: (Otro)
Primera consola: (Otro)
Ubicación: Cornellà de Llobregat - Barcelona
Contactar:

Re: Blasto para ORIC

Mensajepor Hark0 » 14 Feb 2014, 10:09

radastan escribió:Queremos roguelikes y dugeon crawlers...



Jijiji....
http://www.zxuno.com
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA.


Volver a “Programación”

¿Quién está conectado?

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