Space Invasion 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

Space Invasion para ORIC

Mensajepor dancresp » 21 Ene 2015, 09:40

Space_Invasion_Top.gif
Space_Invasion_Top.gif (6.05 KiB) Visto 6999 veces


EL JUEGO
Nuevo intento de los invasores del espacio para hacerse con el control de nuestro planeta !!!

¿Para que ir dando tumbos cuando puedes ir directo a tu objetivo?

Los invasores van bajando en columnas y con la ayuda de nuestro tanque debemos seleccionar el tipo de invasor y disparar.
Si el invasor está en esa columna será destruido y el resto retrocederán.
Hay que evitar que lleguen a la zona de búnkeres o la victoria será suya.

Cada nivel lo componen 35 invasores y disponemos de 60 disparos para acabar con ellos.
Al superar niveles aparecen nuevos tipos de invasores y descienden más rápidamente.

El juego guarda la máxima puntuación alcanzada en una partida.

Descargar juego en formato "TAP":
SpaceInvasion.rar
(1.82 KiB) Descargado 222 veces


BLOQUES
He dividido el listado en 12 bloques:

- Declaración de las matrices.
- Control de nuestro tanque.
- Control de nuestro objetivo.
- Control de nuestro disparo.
- Mover invasores.
- Pasar Nivel.
- Perder una vida.
- Presentación.
- Mostrar pantalla de juego.
- Rutinas varias.
- Cargar UDG.
- Bloques de gráficos.


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.
20 – Llamada a rutina para leer gráficos y mostrar la pantalla de presentación del juego.
100 – Inicio del bucle principal.
105 – Control del teclado y comprobamos si se ha de mover horizontalmente nuestro tanque.
120 – Si se pulsa “M” (Mover) se cambia el invasor de la posición correspondiente.
150 – Si se pulsa “L” (Disparo) se comprueba si el invasor seleccionado está en esa columna, destruyéndolo.
200 – Si el contador de velocidad (W) no llega al valor deseado se incrementa en uno y se salta a la línea 220.
205 – Se selecciona una columna aleatoriamente y si quedan invasores por salir se añade uno, y si no se añade un espacio en la columna.
210 – Se comprueba si la columna ha llegado al búnker. En caso afirmativo se salta a la línea de perder vida (500).
215 – Refresca la columna de invasores seleccionada.
220 – Control de Tiempo para que cada pasada por el bucle principal tarde lo mismo.
225 – Final del bucle principal. Si “E=0” vuelve al REPEAT de la línea 100. Si “E=1” salta a 500 (Perder vida).
400 – Rutina de nivel superado (E=.1). Se incrementa el nivel en 1, pero si pasamos del nivel 9 volvemos al 7.
500 – Rutina que se ejecuta cuando un invasor llega al búnker. Si nos queda alguna vida se actualizan los marcadores, sino muestra el mensaje de “GAME OVER” y después de una pausa volvemos a la pantalla de presentación.
2000 – Pantalla de presentación del juego.
2050 – Espera que pulsemos una tecla para empezar el juego.
2100 – Muestra los marcadores de la parte derecha de la zona de juego.
2500 – Se actualiza el estado de las cinco columnas de invasores y del invasor “objetivo”.
2505 – Muestra la parte izquierda de la zona de juego. Donde realmente se desarrolla la acción.
3000 – Configuraciones de los colores del juego y POKE para ocultar cursor y mayúsculas.
3005 – Cargamos los colores en C$() y leemos los DATA con los UDG.
3010 - Guardamos en la matriz G$ los gráficos que forman cada invasor y su color.
3015 – Lectura del número de invasores distintos por nivel “D()” y su velocidad “G()”.
4000 – Rutina para imprimir los valores de “REST” y “AMMO”. Se pasa la posición vertical en “Y” y el valor en “N”.
4200 – Rutina para imprimir los valores de “SCORE” y “HI-SCORE”. Se pasa la posición vertical en “Y” y el valor en “N”.
4500 – Rutina para el borrado parcial de la pantalla.
9000 – DATA con los UDG del juego.
9500 – DATA con los colores y gráficos de cada tipo de invasor.
9800 – DATA con el número de invasores distintos por nivel.
9805 DATA con la velocidad de cada nivel.


EL LISTADO

Código: Seleccionar todo

  10 DIMG$(10),I$(5),C$(8),D(9),G(9)
  20 GOSUB3000:GOTO2000

 100 REPEAT:POKE#276,0
 105 K=PEEK(520):IFK=56THEN200
 110 IFK=170THENIFP>1THENP=P-1:PLOTP*3+2,22,"st   "
 115 IFK=176THENIFP<5THENP=P+1:PLOTP*3-1,22,"   st"
 120 IFK<>130THEN150
 130 T(P)=T(P)+1:IFT(P)>D(L)THENT(P)=1
 135 PLOTP*3+1,20,G$(T(P))
 150 IFK<>143ORB=0THEN200
 155 A$=I$(P):B$=CHR$(48+T(P)):B=B-1:Y=4:N=B:GOSUB4000
 160 FORF=8TO1STEP-1:IFMID$(A$,F,1)=B$THENF=-F
 165 NEXT:IFF=0THEN200
 170 F=ABS(F)-1:I=T(P):IFI=7THENI=25
 175 S=S+I:Y=5:N=S:GOSUB4200:M=M+1:IFM=35THENE=.1
 180 IFF=1THENA$=MID$(A$,2)ELSEA$=LEFT$(A$,F-1)+MID$(A$,F+1)
 185 I$(P)=A$:F=P:W=99:GOTO215

 200 W=W+1:IFW<G(L)THEN220
 205 F=INT(RND(1)*5)+1:I=0:IFOTHENI=INT(RND(1)*D(L))+1:O=O-1:Y=6:N=O:GOSUB4000
 210 W=0:I$(F)=CHR$(48+I)+I$(F):A$=I$(F):IFMID$(A$,8,1)>"0"THENE=1
 215 Z=F*3+1:K=4:FORI=1TO7+E:PLOTZ,K,G$(VAL(MID$(I$(F),I,1))):K=K+2:NEXT
 220 IFPEEK(#276)>230THEN220
 225 UNTILE:IFE=1THEN500

 400 PING:WAIT300:L=L+1:IFL=10THENL=7
 405 Y=10:N=L:GOSUB4000:GOTO2500

 500 EXPLODE:I=5:IFV=1THEN515
 505 V=V-1:PLOT2,25,STR$(V):IFV>1THENFORF=2TOV:PLOTI,25,"st":I=I+2:NEXT
 510 PLOTI,25,"  ":WAIT300:GOTO2500
 515 PLOT13,25,C$(5)+"<GAME  OVER>":WAIT500:GETA$:IFS>RTHENR=S

2000 CLS:PLOT1,0,C$(1)+" SCORE<1>     HI-SCORE     SCORE<2>":PLOT1,1,C$(3)
2005 Y=5:N=S:GOSUB4200:Y=18:N=R:GOSUB4200:L=1:V=3:S=0
2010 PLOT17,5,C$(6)+"PLAY":PLOT12,7,C$(1)+"SPACE INVASION"
2015 PLOT8,10,C$(6)+"*SCORE ADVANCE TABLE*"
2020 FORF=1TO3:PLOT4,11+F*2,G$(F)+C$(7)+"= "+CHR$(48+F)+" POINTS **"
2025 PLOT21,11+F*2,G$(F+3)+C$(7)+"= "+CHR$(51+F)+" POINTS":NEXT
2030 PLOT4,19,G$(8)+C$(7)+"= 8 POINTS **"+G$(9)+C$(7)+"= 9 POINTS"
2035 PLOT13,21,G$(7)+C$(7)+"= 25 POINTS"
2040 PLOT1,24,C$(2)+"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
2045 PLOT1,25,C$(2)+" 3 stst":PLOT27,25,C$(1)+"CREDIT 00"
2050 PLOT5,1,"0000":GETA$:GOSUB4500

2100 PLOT23,10,C$(1)+"*LEVEL:"+C$(3)+"1":PLOT 23,15,C$(1)+"*KEYS:"
2105 PLOT26,17,C$(7)+"Z : LEFT":PLOT26,18,C$(7)+"X : RIGHT"
2110 PLOT26,19,C$(7)+"L : FIRE":PLOT26,20,C$(7)+"M : CHANGE"

2500 PLOT23,4,C$(1)+"*AMMO :"+C$(3)+"50":PLOT23,6,C$(1)+"*REST :"+C$(3)+"35"
2505 FORF=1TO5:T(F)=1:I$(F)="00000000":NEXT
2510 FORF=4TO17:PLOT2,F,C$(4)+"w               "+C$(4)+"w":NEXT
2515 FORF=4TO16STEP3:PLOTF,18,C$(4)+"uv":NEXT
2520 PLOT2,20,C$(3)+">":PLOT19,20,C$(3)+"<"
2525 FORF=4TO16STEP3:PLOTF,20,G$(1):NEXT
2530 PLOT4,22,C$(2)+"      st      ":P=3:W=0:E=0:O=35:M=0:B=50:GOTO100

3000 CLS:INK7:PAPER0:R=0:POKE#BBA3,0:POKE#26A,10
3005 FORF=0TO7:C$(F)=CHR$(F):NEXT:FORF=46856TO47047:READD:POKEF,D:NEXT
3010 FORF=0TO9:READI,A$:G$(F)=CHR$(I)+A$:NEXT
3015 FORF=1TO9:READD(F):NEXT:FORF=1TO9:READG(F):NEXT:RETURN

4000 PLOT32,Y,MID$(STR$(N),2)+" ":RETURN
4200 PLOTY,1,RIGHT$("0000"+MID$(STR$(N),2),4):RETURN
4500 FORF=3TO22:PLOT2,F,"                                    ":NEXTF:RETURN

9000 DATA 1,3,7,13,15,5,8,4,32,48,56,44,60,40,4,8
9005 DATA 1,3,7,13,15,2,5,10,32,48,56,44,60,16,40,20
9010 DATA 8,36,47,59,63,31,8,16,4,9,61,55,63,62,4,2
9015 DATA 8,4,15,27,63,63,40,6,4,8,60,54,63,63,5,24
9020 DATA 3,31,63,57,63,14,25,12,48,62,63,39,63,28,38,12
9025 DATA 3,31,63,57,63,6,13,48,48,62,63,39,63,24,44,3
9030 DATA 3,7,13,15,6,3,4,2,48,56,44,60,24,48,8,16
9035 DATA 3,7,13,15,6,3,2,4,48,56,44,60,24,48,16,8
9040 DATA0,1,7,15,21,63,29,8,0,32,56,60,42,63,46,4
9045 DATA 1,3,3,31,63,63,63,63,0,32,32,60,62,62,62,62
9050 DATA 7,15,31,63,63,63,60,60,56,60,62,63,63,63,15,15
9055 DATA 12,30,18,30,30,18,30,12,0,0,0,0,0,63,0,0

9500 DATA 7,"  ",1,"cd",2,"ab",2,"ef",1,"gh",3,"kl",6,"ij"
9505 DATA 5,"qr",6,"op",3,"mn"

9800 DATA 6,6,6,7,7,7,9,9,9
9805 DATA 6,5,4,6,5,4,6,5,4



APUNTES FINALES
Este juego es una nueva versión de un juego adaptado previamente para el ACORN ELECTRON, MSX y ATARI XL.

Esta es la mejor versión, ya que a parte del color se ha ajustado más el nivel de dificultad, haciendo que progresivamente vayan apareciendo más variedad de enemigos, y la velocidad es cíclica, de forma que cada 3 niveles llega a su máximo para descender en el siguiente. También he cambiado el orden en el que aparecen los invasores en nuestro selector, agrupándolos según tipo y posición, y diferenciándolos por colores. Si no fuera por la respuesta del teclado, que más adelante detallaré, sería la versión definitiva.

Como el ORIC funciona a 40 columnas, he utilizado la disposición de elementos en pantalla de las versiones ACORN ELECTRON y ATARI XL, y verticalmente es todo un poco más estirado ya que he usado 25 filas.

Como siempre, el tener unos caracteres de 8x6 pixels me ha obligado a rediseñar algunos gráficos, como el búnker o el tanque, y he aprovechado los del “Nuclear Invaders” para los invasores.

Para leer el teclado se ha optado por hacerlo con PEEK(520) que nos permite leer la última tecla pulsada, evitando problemas con mayúsculas o minúsculas. Desgraciadamente el disponer de un buffer de teclado de una única tecla hace que la lectura no sea todo lo fiable queme gustaría, y obliga a dejar pulsada la tecla más tiempo del deseable. De todas formas, la dificultad se ha adaptado a esta limitación para que el juego funcione correctamente. Este problema ya sucede en ATARI pero funcionaba perfectamente en ELECTRON y MSX.

He eliminado todos los cálculos y todos los AND/OR posibles. Uso un IF y si no se cumple ya no tengo que comprobar más valores. También he evitado el uso de ELSE siempre que ha sido posible para evitar los “bugs” del intérprete BASIC.

Para que la velocidad sea constante, teniendo en cuenta que hay veces que se ejecutan más líneas que otras, en la línea 100 inicializo la posición de memoria #276 a 0, ya que esta posición y la siguiente forman un registro de 16 bits que se decrementa en uno 50 veces por segundo. En la línea 220 creo un bucle que mira que el valor de la esa posición (el byte bajo) sea inferior o igual a 230. Especialmente al actualizar una columna de invasores consume más tiempo del habitual, y de esta forma conseguimos que la velocidad de ejecución sea constante. Lástima del tema de la lectura del teclado...

Y como siempre, para el tema de sonido he demostrado una vez mi absoluta incapacidad en este campo, y limitándome a tirar de los propios del sistema.

Coloreando el juego
El realizar un juego colorido con el ORIC seguía siendo una asignatura pendiente, y que mejor que realizar una adaptación de este juego “a todo color”. La gestión del color por parte del ORIC no ayuda, pero este juego se ha podido colorear con cierta facilidad y aunque el resultado no es tan “retro” si que es mucho más atractivo y claro a la hora de jugar.

Para el ORIC, un atributo de color es un carácter que puede colocar en cualquier punto de la pantalla. A partir de este carácter, todo lo que aparezca a su derecha tendrá ese color hasta que encuentre otro atributo de color, que volverá a afectar a todo lo que tenga a su derecha. Esto provoca que si haces un PRINT en una posición de la pantalla donde hay un atributo de color se pierda, y lo mostrado por el PRINT coja el color del atributo anterior, dando un espectáculo visual ciertamente caótico, y complicando mucho la programación de juegos en color.

Para evitarlo es necesario dejar espacios entre los distintos elementos, donde están los atributos de color. Gracias a la disposición de los elementos en este juego ha sido fácil colorearlo, como salta a la vista.


Os invito a probarlo.

Space_Invasion_1.gif
Space_Invasion_1.gif (4.92 KiB) Visto 6999 veces

Space_Invasion_2.gif
Space_Invasion_2.gif (5.93 KiB) Visto 6999 veces

Space_Invasion_3.gif
Space_Invasion_3.gif (6.02 KiB) Visto 6995 veces

Space_Invasion_4.gif
Space_Invasion_4.gif (5.93 KiB) Visto 6999 veces
Buscando la IP de la W.O.P.R.

paulfiction
ZX Spectrum 16
ZX Spectrum 16
Mensajes: 8
Registrado: 16 Dic 2013, 17:04

Re: Space Invasion para ORIC

Mensajepor paulfiction » 21 Ene 2015, 14:51

Que olorcillo mas rico a clasico...a ver si monto el oric y le doy un tiento, gracias!

Avatar de Usuario
antoniovillena
Amiga 1200
Amiga 1200
Mensajes: 2013
Registrado: 16 Abr 2012, 21:22
Gracias recibidas: 8 veces

Re: Space Invasion para ORIC

Mensajepor antoniovillena » 21 Ene 2015, 20:18

Estás últimamente que no paras.

Avatar de Usuario
alt
Amiga 2500
Amiga 2500
Mensajes: 4153
Registrado: 07 Sep 2004, 21:52
Ubicación: madrid
Gracias dadas: 1024 veces
Gracias recibidas: 1735 veces
Contactar:

Re: Space Invasion para ORIC

Mensajepor alt » 21 Ene 2015, 21:43

De nuevo, ¡muchas gracias, tío! :-D

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: Space Invasion para ORIC

Mensajepor dancresp » 21 Ene 2015, 22:29

antoniovillena escribió:Estás últimamente que no paras.

Ahora voy a parar unos días que vuelvo a estar de trabajo hasta las cejas, pero no sin antes dejarte un regalito.

Atento a mañana por la noche... :-ss
Buscando la IP de la W.O.P.R.

Avatar de Usuario
antoniovillena
Amiga 1200
Amiga 1200
Mensajes: 2013
Registrado: 16 Abr 2012, 21:22
Gracias recibidas: 8 veces

Re: Space Invasion para ORIC

Mensajepor antoniovillena » 22 Ene 2015, 00:20

Dime al menos que es para ZX81

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: Space Invasion para ORIC

Mensajepor dancresp » 22 Ene 2015, 00:43

antoniovillena escribió:Dime al menos que es para ZX81

eslo

:tecle:
Buscando la IP de la W.O.P.R.


Volver a “Programación”

¿Quién está conectado?

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