Galaxy Wars para ORIC-1/ATMOS

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

Galaxy Wars para ORIC-1/ATMOS

Mensajepor dancresp » 20 Sep 2013, 11:07

GalWar_3.gif
GalWar_3.gif (3.5 KiB) Visto 4532 veces


EL JUEGO
Este videojuego arcade fue desarrollado por Universal y manufacturado por Taito en 1979.

El objetivo del juego consiste en destruir la flotilla de invasores que hay en la zona superior de la pantalla. Para ello controlamos una plataforma con un misil. Al disparar el misil debe esquivar los asteroides y los disparos enemigos e impactar en un invasor.

Controles:
Pulsa Z o X para mover la plataforma y el misil a izquierda o derecha.
Pulsa la tecla RETURN para disparar el misil.

Descargar el juego en formato ".TAP":
GALWAR.rar
(1.97 KiB) Descargado 361 veces



BLOQUES
Se ha dividido el listado en 10 bloques:
- Declaración de las matrices. Llamada a rutinas principales.
- Controlar nuestra plataforma o misil.
- Control de los invasores y asteroides.
- Control de los disparos enemigos.
- Detección de impacto del misil. Toca asteroide, invasor o disparo enemigo.
- Perder una vida.
- Pantalla de Presentación.
- Inicio de la partida.
- Rutinas varias.
- DATA con los gráficos del juego.


COMO FUNCIONA
Todo el programa ocupa 88 líneas.

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

10 - Definimos las matrices del juego.
30 – Inicializamos el récord (R) y vamos a la rutina que redefine los gráficos.
50 – Vamos a la presentación del juego.
100 - Movemos la plataforma o misil en la dirección indicada.
130 - Si se ha disparado el misil (T=2) salta a 160.
140 – Si se pulsa la tecla RETURN disparamos el misil y borramos la plataforma.
160 – Borramos el misil y modificamos la posición vertical (Y).
170 – Si la punta del misil toca algo saltamos a 400.
180 – Ponemos el misil en la nueva posición.
200 – Movemos una de las 6 filas de enemigo o asteroides en la dirección correspondiente. (B=1: Derecha, B=-1:Izquierda).
220 – Imprimimos la fila del enemigo.
250 – Miramos si esta activa una de las 6 bombas enemigas.
260 – Si no lo está, miramos si en una posición de la pantalla hay un invasor para activar su disparo.
270 – Si el disparo toca la plataforma o misil salta a 500.
400 – Si la posición Y es mayor de 5 es que hemos impactado con un asteroide o disparo y salta a 500.
410 – Calculamos la posición del invasor destruido.
420 – Ponemos la explosión, suena un sonido y calculamos los puntos (50, 100 o 150).
430 – Borramos el invasor de la fila y restamos un invasor a los restantes (Q).
450 – Mostramos los puntos y hacemos una pausa (5500) y actualizamos el marcador.
470 – Al pasar el nivel incrementamos su valor si es inferior a 5.
500 – Ponemos una explosión en la posición del misil y reproducimos un sonido.
520 – Actualizamos el marcador de vidas.
550 – Si no hay más vidas finaliza la partida.
2000 – Pantalla de presentación del juego.
2050 – Al pulsar una tecla borramos la pantalla (5400) y se hace parpadear el marcador del jugador 1.
2500 – Montamos las tiras de los invasores.
2510 – Rutina que genera aleatoriamente las tiras de los asteroides. Más llenas en niveles avanzados.
2570 – Inicialización de las variables principales de la partida.
5000 – Cambiar los colores, ocultar el cursor y desactivar mayúsculas.
5002 – Pantalla de Instrucciones mientras se leen los gráficos.
5010 - Inicio de rutina para redefinir el juego de caracteres.
5020 – Guardamos en la matriz C$ el atributo de color de cada fila de la pantalla.
5040 – Inicializamos la matriz de la altura de los distintos enemigos V().
5050 – Inicializar la posición de las bombas enemigas.
5100 – Muestra el marcador de puntos o récord.
5400 – Rutina de borrado de pantalla activando los colores por fila correspondientes.
5600 – Muestra las 6 filas de enemigos en su posición y con el color correspondiente.
9000 – Línea DATA con los gráficos del juego.


EL LISTADO

Código: Seleccionar todo

10 DIME$(6),V(6),BX(6),BY(6),C$(21)

 30 R=0:GOSUB5000
 50 GOSUB2000

     *** Mover tanque
 100 K=PEEK(520):X1=X
 110 IFK=170THENIFX>5THENX=X-1
 120 IFK=176THENIFX<34THENX=X+1
 130 IFT=2THEN160
 140 IFK=175THENPLOTX-1,22,"   ":T=2:Y=20:ZAP:GOTO200
 150 PLOTX-1,20," m ":PLOTX-1,21," n ":PLOTX-2,22," opq ":GOTO200

     *** Control disparo
 160 PLOTX1,Y," ":PLOTX1,Y+1," ":Y=Y-1:IFY=2THENY=20:T=1:GOTO200
 170 IFSCRN(X,Y)<>32THEN400
 180 PLOTX,Y,"m":PLOTX,Y+1,"n"
 
     *** Movimiento enemigos
 200 IFB=1THENE$(A)=RIGHT$(E$(A),1)+LEFT$(E$(A),39):GOTO220
 210 E$(A)=RIGHT$(E$(A),39)+LEFT$(E$(A),1)
 220 PLOT2,V(A),MID$(E$(A),3,36):B=-B:IFA<6THENA=A+1ELSEA=1

     *** Control disparos enemigos
 250 IFBY(A)THEN270
 260 F=INT(RND(1)*30)+5:IFSCRN(F,5)<>32THENBX(A)=F:BY(A)=6:PLOTBX(A),BY(A),"l"
 265 GOTO100
 270 F=BY(A):PLOTBX(A),F," ":F=F+1:I=SCRN(BX(A),F):IFI>108THEN500
 280 IFI=32THENPLOTBX(A),F,"l":BY(A)=FELSEBY(A)=0
 300 GOTO100

     *** Control de colisiones del misil
 400 T=1:IFY>5THEN500
 410 IFSCRN(X,Y)=97ORSCRN(X,Y)=100THENI=X:GOTO420
 415 IFSCRN(X,Y)=98ORSCRN(X,Y)=101THENI=X-1:GOTO420
 418 PLOTX,Y," ":PLOTX,Y+1," ":GOTO200
 420 F=(Y-1)/2:PLOTI,Y,"rst":SHOOT:J=INT(RND(1)*3+1)*50:P=P+J
 430 E$(F)=MID$(E$(F),1,I)+"   "+MID$(E$(F),I+4):Q=Q-1:A=1:B=1
 440 PLOTI-1,Y,STR$(J)+" ":WAIT30
 450 F=5:I=P:GOSUB5100
 460 Y=20:IFQ>0THEN200

     *** Pasar nivel
 470 IFN<5THENN=N+1
 480 WAIT200:GOSUB2500:GOTO100

     *** Perder una vida
 500 PLOTX-1,Y,"uvw":PLOTX-1,Y+1,"xyz":EXPLODE:WAIT180
 510 PLOTX-1,Y,"   ":PLOTX-1,Y+1,"   ":IFT=1THENPLOTX-1,Y+2,"   "
 520 GOSUB5600:IFL=1THEN550ELSEL=L-1
 530 A$=STR$(L)+" ":IFL>1THENFORF=2TOL:A$=A$+"opq ":NEXT
 540 PLOT2,24,A$+"   ":X=19:GOTO100

     *** Final partida
 550 PLOT15,7,"GAME  OVER":WAIT400:IFR<PTHENR=P
 560 GETA$:GOTO50

     *** Pantalla de presentación
2000 CLS:PLOT3,0,"SCORE(1)     HI-SCORE     SCORE(2)"
2005 PLOT9,1,"0":F=18:I=R:GOSUB5100
2010 PLOT27,24,"CREDIT 00":PLOT18,6,"PLAY"
2020 PLOT  14,8,"GALAXY WARS":PLOT 14,10,"INSERT  COIN"
2030 PLOT12,12,"(1 OR 2 PLAYERS)":PLOT12,14,"*1 PLAYER  1 COIN"
2040 PLOT12,16,"*2 PLAYERS 2 COINS"
2050 GETA$:GOSUB5400:PLOT13,11,"PLAY PLAYER(1)"

     *** Pantalla zona de juego
2060 FORI=1TO10:PLOT9,1," ":WAIT10:PLOT9,1,"0":WAIT10:NEXT
2070 PLOT2,23,"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii"
2080 PLOT3,24,"3 opq opq"
2090 N=1:L=3:P=0

     *** Posicionar a los enemigos
2500 E$(1)="        abc    def    abc    def        ":E$(2)=E$(1):B=1
2510 FORF=3TO6
2520 E$(F)="":B=-B:IFB=1THENA$="gh"ELSEA$="jk"
2530 E$(F)=E$(F)+A$+LEFT$("               ",RND(1)*7+(6-N))
2540 IFLEN(E$(F))<34THEN2530
2550 E$(F)=LEFT$(E$(F)+"       ",40)
2560 NEXT
2570 GOSUB5600:A=1:B=1:X=19:T=1:Q=8:Y=20
2580 PLOTX-1,20," m ":PLOTX-1,21," n ":PLOTX-2,22," opq "
2590 RETURN

     *** Pantalla Instrucciones, lectura gráficos e inicializar variables
5000 CLS:INK7:PAPER0:POKE#BBA3,0:POKE#26A,10
5002 PLOT15,0,"GALAXY WARS":PLOT8,7,"CONTROLS: LEFT  = Z"
5004 PLOT18,8,"RIGHT = X":PLOT18,9,"FIRE  = RETURN"
5006 PLOT10,16,"*PRESS KEY TO START*":PLOT9,22,"(C) SCAINET SOFT, 2013"
5008 PLOT1,24,"VERSION DEDICATED TO CHEMA & SILICEBIT"
5010 FORF=46856TO47063:READD:POKEF,D:NEXT
5020 FORF=1TO21:C$(F-1)=CHR$(VAL(MID$("111117777777777222222",F,1))):NEXT
5040 V(1)=3:V(2)=5:V(3)=9:V(4)=11:V(5)=13:V(6)=15
5050 FORF=1TO6:BX(F)=0:BY(F)=0:NEXT:GETA$:RETURN

     *** Mostrar marcador
5100 PLOTF,1,RIGHT$("    "+STR$(I),5):RETURN

     *** Borrar pantalla y dejar atributos color
5400 FORF=3TO23
5410 PLOT1,F,C$(F-3)+"                                      "
5420 NEXT
5430 RETURN

     *** Mostrar los enemigos
5600 FORF=1TO6
5610 IFBY(F)<>0THENPLOTBX(F),BY(F)," ":BY(F)=0
5620 PLOT2,V(F),MID$(E$(F),3,36)
5630 NEXT
5640 RETURN

     *** Graficos UDG
9000 DATA2,5,8,0,15,61,31,3,18,61,16,56,63,21,63,6,0,0,32,0,32,56,48,0
9010 DATA8,4,2,1,15,58,31,3,0,1,18,60,63,42,63,6,32,0,0,0,32,56,48,0
9020 DATA6,31,63,61,54,60,31,6,0,32,54,48,55,48,54,0,0,0,0,63,63,63,0,0
9030 DATA0,1,27,3,59,3,25,0,24,62,63,55,27,51,62,24,16,8,4,8,28,20,8,4
9040 DATA4,4,12,12,30,30,12,12,12,12,12,30,30,63,51,33
9050 DATA 7,7,1,63,63,24,31,21,51,63,33,63,63,33,63,18,56,56,32,63,63,6,62,42
9060 DATA34,17,8,4,46,20,25,34,2,20,56,1,3,41,4,18,8,16,32,0,40,16,48,8
9070 DATA0,4,2,9,4,1,0,4,0,21,4,14,27,17,4,4,0,4,8,18,4,16,0,4
9080 DATA8,1,0,0,1,2,0,0,0,21,21,53,27,17,32,0,2,16,0,32,16,8,32,0



APUNTES FINALES
Este juego es una adaptación de la versión programada previamente para el COMMODORE-16 y el ZX-SPECTRUM.
Para ello he copiado, casi línea a línea el código de la versión C-16, y haciendo pequeñas modificaciones ya que tienen el mismo número de filas y los dos pueden usar el ELSE.

Por primera vez he usado un emulador para desarrollarlo: el EUPHORIC bajo MS-DOS. El resultado ha sido muy satisfactorio ya que este emulador permite, pulsando F3, que el teclado se corresponda con el del PC y esto hace que teclear un programa sea muy cómodo y rápido. Sacar un listado o cargar/grabar un programa es igual de sencillo.
La única complicación a la hora de desarrollar esta versión ha sido el “coñazo” que supone tener que codificar todos los gráficos otra vez, ya que el ORIC usa caracteres de 6 pixels de ancho y no 8 como el resto de ordenadores. Así, el diseño del misil es ligeramente más estrecho y las naves superiores ocupan 3 caracteres de ancho en lugar de 2. De todas formas, he hecho que si tocas a una nave por el lado derecho no la destruyas.

Respecto al sonido he vuelto a tirar de los que lleva predefinidos el propio equipo ya que es un tema que se me da fatal.

Y respecto al aspecto (rima), gracias al peculiar sistema de memoria de pantalla de este sistema, es la única versión en que realmente he podido reproducir el efecto “celofán”, al emular las franjas de colores.

Descartes respecto al original de TAITO:
- Esta versión es un poco más ancha y bastante menos alta ya que en el juego original la pantalla es vertical.
- Hay alguna fila de asteroides menos, debido al tamaño vertical.
- Durante el ascenso del misil podemos controlarlo horizontalmente, pero no controlamos la velocidad.
- Los invasores no aceleran cuando solo quedan un par de ellos.
- Los asteroides no descienden al llegar a los extremos.
- Las puntuaciones están limitas a 50, 100 y 150 puntos.
- No hay animaciones en los enemigos.

El control de los enemigos es muy simple. Hay 6 tiras con los enemigos en su posición correspondiente. Las filas pares rotan a la izquierda y las impares a la derecha.

El bloque principal del programa solo ocupa 18 líneas. En cada pasada muevo una fila de enemigos y controlo un disparo enemigo. El contador es común en los dos casos (A).

Para ganar velocidad he prescindido de las animaciones de los enemigos. He optado por usar los gráficos de los enemigos intercalados.

En las colisiones solo reviso si la cabecera del misil toca algo, pero no la parte baja. Respecto a las bombas enemigas solo la activa revisa si toca algo. Esto hace que el juego sea más rápido pero se puede dar el caso que toquemos algo y no nos pase nada. Como el proceso es rápido, tiene su riesgo... y mejor no jugársela.

Respecto al rendimiento, esta versión funciona tan bien (si no algo más) que las dos anteriores (C-16 y SPECTRUM).
La verdad es que a pesar de sus bugs, este BASIC tira más que bien.


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

Os invito a probarlo.



GalWar_1.gif
GalWar_1.gif (2.72 KiB) Visto 4532 veces

GalWar_2.gif
GalWar_2.gif (2.63 KiB) Visto 4532 veces

GalWar_3.gif
GalWar_3.gif (3.5 KiB) Visto 4532 veces

GalWar_4.gif
GalWar_4.gif (3.38 KiB) Visto 4532 veces

GalWar_5.gif
GalWar_5.gif (3.03 KiB) Visto 4532 veces

GalWar_6.gif
GalWar_6.gif (3.1 KiB) Visto 4532 veces

Diseño_UDG.jpg
Diseño_UDG.jpg (74.98 KiB) Visto 4532 veces
Buscando la IP de la W.O.P.R.

Avatar de Usuario
jltursan
Amiga 2500
Amiga 2500
Mensajes: 4028
Registrado: 13 Oct 2006, 19:45
Sistema Favorito: MSX
primer_sistema: Dragon
Ubicación: Serracines, Madrid, España
Gracias dadas: 57 veces
Gracias recibidas: 157 veces
Contactar:

Re: Galaxy Wars para ORIC-1/ATMOS

Mensajepor jltursan » 20 Sep 2013, 18:08

¡Muy buen trabajo y excelente versión! =D>
Posiblemente esta es la que más me gusta...aunque también es posible que influya el hecho de que el Galaxy War sea un juego que me gusta bastante :-)

Avatar de Usuario
scooter
Amiga 1200
Amiga 1200
Mensajes: 1031
Registrado: 17 Jul 2012, 09:25
primer_sistema: C64
Ubicación: Alicante

Re: Galaxy Wars para ORIC-1/ATMOS

Mensajepor scooter » 21 Sep 2013, 00:31

Me ha gustado la hoja de papel :lol: he tenido un flashback de cuando hacía sprites para el c64

Avatar de Usuario
imd
Atari 1040 STf
Atari 1040 STf
Mensajes: 830
Registrado: 16 Jul 2010, 15:58
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: (Otro)
Primera consola: (Otro)
Gracias dadas: 1 vez
Gracias recibidas: 1 vez
Contactar:

Re: Galaxy Wars para ORIC-1/ATMOS

Mensajepor imd » 22 Sep 2013, 10:52

Otro que tengo que probar en mi oric, a ver como me las apaño para cargarlo.
Estupendo artículo .


Volver a “Programación”

¿Quién está conectado?

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