Historial de desarrollo de Alien-B

Descripción del contenido de la página

Historial de desarrollo del programa Alien-B, con las principales tareas realizadas en cada día de trabajo.

Casi todo programa mínimamente complejo experimenta muchos cambios durante su desarrollo. Algunas veces el desarrollo de un proyecto incluso hace nacer un proyecto nuevo independiente, como sucedió en este caso. A menudo una idea planificada lleva a otra improvisada, y esta a otra insospechada.

En cada proyecto suelo anotar con detalle los cambios del código, incluidas las fechas. Así facilito su depuración, las futuras revisiones y la posible restauración de copias de seguridad. En el caso de lenguajes de programación modernos cuyo código fuente está en ficheros de texto, los cambios están incluidos en el propio código fuente. En el caso de lenguajes antiguos con los que hay que trabajar en su propio entorno, como en este caso con Beta BASIC, los registro de los cambios y los diarios del proyecto deben estar en ficheros independientes.

Esta página muestra una selección de los cambios en Alien-B durante el desarrollo del proyecto.

2010-06-01:

Primer día de trabajo: rutinas básicas, impresión de escenario y gráficos.

2010-06-02

Optimizada la velocidad con muchos pequeños trucos, principalmente duplicando código en el bucle principal para evitar llamadas a procedimientos. El movimiento empieza a ser casi aceptable con el emulador al 200% de velocidad de la Spectrum.

Cambiada la impresión directa de un UDG por la impresión de su definición en una cadena con el carácter 0, tanto para las naves como para la mirilla. He comprobado que así es un poco más rápido (he cronometrado una diferencia de 1989/2037).

Creados los rudimentos para que la nave cambie de dirección durante la bajada. Falta suavizar el giro.

Arreglado el fallo que impedía mover la mirilla en dos direcciones y sentidos diagonales.

2010-06-03

Terminado el sistema de bajada de naves, con cambios aleatorios de dirección y velocidad.

Nave

2010-06-04

Nuevos gráficos de 16x8 pixeles.

Nave

Duplicación de código en el bucle principal, para reducir el parpadeo de la nave.

Eliminación de la matriz de datos de naves, pues todo se calcula en directo.

Creación de márgenes invisibles alrededor de la zona de juego, para que parezca que las naves aparecen y desaparecen punto a punto.

Nave

2010-06-12

Modificado el campo para que no invada los márgenes laterales de 16 pixeles.

Problema: Las naves se siguen viendo en azul en los márgenes a pesar de haber imprimido el margen con tinta y papel negros.

2010-06-21

Corregido el fallo que hacía verse las naves en el borde; faltaba la tinta transparente.

2010-09-08

Creado el gráfico de la bandera de la Tierra, de 5x3 caracteres. Usé GIMP y SevenuP.

Añadida la detección de colisión de la mirilla. La Y de POINT debe ser 16 pixeles menor que la de PLOT.

2010-09-09

Creados diez gráficos de paisajes, de 256x64 pixeles, en dos ficheros: tercio de pantalla (2044 octetos) y sus atributos (256 octetos). Usé GIMP, SevenuP y una utilidad escrita para la ocasión: getscreen.

Paisaje

Proceso:

Creados dos gráficos de Tierra en una pantalla completa, con SevenuP. Quizá uno de ellos sirva en la presentación del juego.

2010-09-12

Escisión del proyecto en dos: Alien-B, versión de Alien-A, e Inebriated Day, un programa diferente en el que aplicaré todas las novedades gráficas que lo diferencian mucho de Alien-A y un nuevo argumento.

Paisaje

Eliminadas de Alien-B la gestión de paisajes, la bandera de Tierra y otras novedades.

2010-09-15

Reescritura del dibujo del paisaje.

Procedimiento para hacer temblar el paisaje cuando aterriza una nave.

2010-09-25

Primer boceto del efecto final del juego.

2010-10-01

Casi solucionado el problema de usar un nuevo juego de caracteres: hay que hacerle espacio antes de definir las ventanas o los atajos de teclado, pues el espacio libre se crea entre esa zona, justo encima de RAMTOP, y el código de Beta BASIC. Si existen ventanas o teclas definidas, no sabremos cuánto espacio ocupan y por tanto tampoco dónde empieza la zona liberada. Sin embargo parece que aún hay algún problema y el juego de caracteres se corrompe al reiniciar el programa.

2010-10-02

Terminado el menú principal.

Menú

Terminado el nuevo efecto de desintegración de las naves al ser alcanzadas, con circunferencias blancas y círculos rojos.

Quitadas las estrellas porque no había forma fácil de evitar hacer falsos blancos en ellas.

Perfeccionado el sistema para dar en el objetivo: los cuatro puntos centrales de la mirilla son comprobados.

Subido 8 pixeles el límite inferior de la mirilla, para implementar que las naves aterricen.

La puntuación se incrementa cada vez con la coordenada Y de la nave abatida, en lugar de con 1.

2010-10-03

Formato de los puntos y la marca en la barra de estado aumentado a cinco dígitos.

Añadida la impresión de la nave al final del procedimiento newAlienType, pues siempre se necesita hacerlo tras llamar a este procedimiento o a su superior newAlien.

2010-10-16

Sustituido un RETURN en el procedimiento navigate por un GO TO al END PROC. Al parecer el RETURN no actualiza la pila de retorno en un procedimiento y la memoria decrece.

Añadida la variable parking para mejorar el procedimiento navigate.

Modificado el sistema de aterrizaje para que las naves caigan repartidas de forma uniforme sin solaparse.

2010-10-17

Modificado el procedimiento navigate para que las naves sólo busquen un lugar de aterrizaje a partir de la mitad de la pantalla, y para que el procedimiento de búsqueda sea más rápido.

Corregido el problema creado por los círculos blancos de la explosión, que algunas veces coloreaban el paisaje o la línea superior de la pantalla. Ahora ambas zonas se recolorean tras cada explosión.

Sustituidos varios RETURN en el procedimiento fire por GO TO al END PROC. Al parecer el RETURN no actualiza la pila de retorno en un procedimiento y la memoria decrece.

Corregido el error en la detección del éxito de la invasión (debido al cambio de la coordenada Y final de las naves en tierra).

2010-11-16

Implementada la tecla "1" para detener y reanudar el juego (antes era "0", que pasó a usarse para el disparo).

Modificaciones en el procedimiento navigate y sus subordinados para evitar los bucles sin salida en que algunas veces quedan atrapadas las naves.

Implementado el número máximo de disparos.

Reformada la barra de estado.

Disparo

2010-11-21

Nuevo boceto del efecto final del juego, con una nave grande que aterriza ocupando toda la pantalla.

Nave

Tras comprobar que sólo quedaban poco más de 800 octetos de memoria libres cuando el juego estaba en marcha, el programa fue dividido en dos, separando todas las tareas de inicialización y pasando las variables de un programa a otro mediante un fichero en el disco RAM. Después se vio que era posible liberar 3 kilooctetos de memoria eliminando partes no utilizadas en el programa, y que eso bastaría para terminarlo, por lo que se desestimó la división; trabajar con varios programas interdependientes siempre hace más lento y laborioso el desarrollo.

Terminado el efecto de destrucción de las municiones restantes (que es parte del efecto final).

Reescrito el módulo de impresión del título principal: las letras aparecen creciendo en lugar de de repente, tras un efecto de cortinilla.

Independizado en efecto de la explosión en su propio procedimiento, para reutilizarlo en el menú.

Reescrito el procedimiento de impresión de los créditos bajo el menú, para que aparezcan letra a letra al azar.

Automatizada la asignación de número de nueva ventana.

2010-11-22

Terminado el efecto de la pantalla de espera antes de la primera partida: Las estrellas se van apagando mientras el programa prepara los datos, antes de mostrar el menú.

Estrellas

2010-11-23

Detectado el fallo de Beta BASIC en la anidación de funciones STRING$ que impedía que funcionara bien el procedimiento de coloreado del cielo.

Implementado el cuarto gráfico, con el tren de aterrizaje bajado, para el tramo final del aterrizaje.

Tren de aterrizaje

Terminado un paso más del efecto final tras la invasión: las naves posan su cuerpo principal en tierra.

Primer borrador de un paso del efecto final tras la invasión: las naves se unen.

2010-11-24

Terminados dos pasos del efecto final tras la invasión: las naves cierran sus ventanas y disparan a tierra.

Ataque

2010-12-01

Escrito el programa herramienta alien-b-t para extraer de una pantalla de ZX Spectrum un gráfico y guardarlo en matrices en el disquete de Plus D, con el formato de las cadenas gráficas de Beta BASIC.

Terminado el gráfico final del trípode a lo "La guerra de los mundos", y el efecto de su construcción a partir de las naves alienígenas.

Trípode

2010-12-02

Perfeccionado el efecto de transición entre las naves y el trípode. Las naves ahora se trasforman en un montículo del que nace el trípode.

Bocetado el último efecto: el parpadeo de ojo del trípode.

2010-12-03

Perfeccionado el efecto de amontonamiento de las naves.

Trípode

Bocetadas varias versiones del (pen)último efecto final, el fundido a negro.

2010-12-06

Unidas muchas líneas para ahorrar memoria y tiempo de ejecución. Algunos cambios de formato en el listado, con los mismos objetivos.

Comenzada la implementación de los bonos de munición según la puntuación.

Simplificado el procedimiento del movimiento coordinado de las ventanas de las naves en tierra: con una matriz de valores en lugar de una estructura ON.

Primeras versiones del (pen)último efecto final: el trípode escribe en el suelo, en perspectiva. con su rayo. Para hacerlo más rápido hay que tener los datos de los textos calculados por anticipado y grabados en el disquete. Por ello llevo el código del efecto a un nuevo programa herramienta, alien-b-m, que se ocupe de ello.

Trípode

Mejorado el programa herramienta alien-b-t para que sólo cree los gráficos del trípode que realmente se necesitan en el juego, no todas las combinaciones como hasta ahora (se llenaba el disco de ficheros inútiles).

2010-12-09

Primera versión funcional del programa herramienta alien-b-m.

2011-01-28

Reescritura y simplificación del algoritmo central de alien-b-m.

2011-01-30

Finalizada la nueva versión del algoritmo de cálculo de pixeles en alien-b-m, con un poco de trigonometría.

1150 DEF PROC coords char,row,bit, REF d$
1160   LOCAL x,y
       REM pixel coords
1170   LOCAL x2,y2
       REM left bottom coords of the character's theorical space
1180   LOCAL charH
       REM character height in pixels
1190   LOCAL a,b
       REM sides of the vanishing point triangle
1200   LOCAL a2,b2
       REM sides of the pixel triangle
1210   LET charH=8*scaleY
1220   LET x=x0+char*8*scaleX+8*scaleX-bit*scaleX,y=y0-row*scaleY
1230   LET x2=x0+char*8*scaleX,y2=y0-charH
1240   LET a=vpX-x,b=y2-y0,b2=y2-y,a2=a*b2/b,x=x+a2/6
1250   PLOT INK 9;x,y
1260   LET d$(1,xField)=CHR$ x,d$(1,yField)=CHR$ y,d$(1,sizeField)=CHR$ ((row+1)/4)
       REM returned data
1270 END PROC

Modificado el formato de la matriz de datos creada por alien-b-m.

2011-01-31

Segregación del código que crea los UDG en un programa propio, alien-b-u, para ahorrar memoria y tiempo de inilicialización en el programa principal.

2011-02-01

Reescrito el código que dibuja el suelo, usando cálculo trigonométrico con el mismo punto de fuga utilizado para los textos.

Código antiguo:

DEF PROC field
  WINDOW fieldWin
  PAPER black
  INK black
  CLS
  PLOT n32,fieldMaxY
  DRAW TO NOT PI,fieldMaxY-n4
  PLOT n64,fieldMaxY
  DRAW TO NOT PI,fieldMaxY-VAL "30"
  PLOT VAL "96",fieldMaxY
  DRAW VAL "-50",-fieldMaxY
  PLOT VAL "128",fieldMaxY
  DRAW NOT PI,-fieldMaxY
  PLOT VAL "160",fieldMaxY
  DRAW VAL "50",-fieldMaxY
  PLOT VAL "192",fieldMaxY
  DRAW TO VAL "255",fieldMaxY-VAL "30"
  PLOT VAL "224",fieldMaxY
  DRAW TO VAL "255",fieldMaxY-n4
  hLines fieldMaxY,fieldMaxY-INT PI,fieldMaxY-n8,VAL "37",VAL "22",VAL "21"
  colorField
  WINDOW skywin
END PROC
DEF PROC colorField color
  DEFAULT color=FN b(fieldInk,fieldPaper,fieldBright)
  LOCAL c$
  LET c$=CHAR$(0)+STRING$(28,CHR$ (color))+CHAR$(0)
  POKE 23008,STRING$(7,c$)
END PROC
DEF PROC hLines DATA
  LOCAL y
  DO UNTIL NOT ITEM()
    READ y
    PLOT NOT PI,y
    DRAW maxX,NOT PI
  LOOP
END PROC

Aspecto y código nuevos:

Suelo

DEF PROC ground
  WINDOW groundWin
  PAPER black
  INK black
  CLS
  vLines n8
  hLines groundMaxY,groundMaxY-n3,groundMaxY-n8,CODE "%",VAL "22",VAL "21"
  colorGround
  WINDOW skywin
END PROC
DEF PROC vLines lines
  LOCAL a1,b1
  REM sides of the vanishing point triangle
  LOCAL a2,b2
  REM sides of the triangle whose third side has to be drawn
  LOCAL x,x2
  LET a1=vpY-groundMinY,a2=groundH
  FOR x=0 TO maxX STEP maxX/lines
    LET b1=vpX-x,b2=b1*a2/a1,x2=x+b2
    PLOT x,groundMinY
    DRAW TO x2,groundMaxY
  NEXT x
END PROC
DEF PROC hLines DATA
  LOCAL y
  DO UNTIL NOT ITEM()
    READ y
    PLOT n0,y
    DRAW maxX,n0
  LOOP
END PROC

Terminados el programa alien-b-m y el procedimiento tripodWrite.

Prueba de mensajeMensaje final

Renombrados todos los programas herramienta.

2011-02-02

Segregación en un programa herramienta nuevo, alien-b-s, del código que crea los gráficos principales (las naves y la mirilla), para ahorrar memoria y tiempo de inilicialización en el programa principal.

Gráficos

Formateo del disquete con la opción de Beta DOS para ampliar a 100 las 80 entradas en el directorio, que iban a agotarse.

Inicio del sistema de registro de las mejores puntuaciones; nuevo programa herramienta alien-b-r para crear la lista predeterminada.

Mejores puntuaciones

2011-02-03

Eliminado el código (incompleto) iniciado hace tiempo para implementar la recarga de municiones en función de los rangos de puntuación. La idea estaba desechada y de todas formas no había memoria para implementar al mismo tiempo el registro de las mejores puntuaciones. El código estaba al final del procedimiento shootedDown:

LET ammoScore=ammoScore+aY-aMinY+1
IF ammoScore>VAL "167" THEN IF maxAmmo>ammo THEN LET ammo=ammo+1,ammoScore=ammoScore-VAL "167"
  printAmmo

Código nuevo para mostrar mensaje al disparar sin munición.

 840 DEF PROC fire
       IF ammo THEN shoot
         PRINT #0;AT 0,ammo+1;" "
         LET ammo=ammo-1
       ELSE noAmmo
 850 END PROC

 910 DEF PROC noAmmo
       LOCAL m$
       ON lang
         LET m$="SIN MUNICI"+CHR$ 145+"N"
         LET m$="NUL MUNICIO"
         LET m$="NO AMMO"
 920   center0 m$,,red,1
       center0 "            "
     END PROC

Creada la primera versión de la pantalla de mejores puntuaciones, y el código para actualizarla con la puntuación y el nombre del jugador.

2011-02-04

Corregido el nuevo procedimiento fixCoords (usado para ajustar las coordenadas de la ventana de mejores puntuaciones a un cuadro de atributos), pues ambas coordenadas requieren cálculos diferentes:

DEF PROC fixCoords REF x, REF y
  LET x=INT x
  DO
  EXIT IF NOT MOD(x,n8)
    LET x=x-n1
  LOOP
  LET y=INT y
  DO
  EXIT IF NOT MOD(y+1,n8)
    LET y=y-n1
  LOOP
END PROC

Modificado el cálculo de la puntuación: por cada acierto se suma la coordenada Y de la mirilla, no la de la nave o su posición relativa sobre el terreno como antes; esto da un pequeño margen de puntos adicional según el punto exacto de impacto sobre la nave.

Nueva versión mejorada de la pantalla de mejores puntuaciones (titulada «mejores perdedores»), con el juego de caracteres estándar para las iniciales de los jugadores:

Mejores perdedores

Reestructurado el código para introducir el nombre del jugador. Versión anterior:

2040 DEF PROC inputName REF n$,lin
       LOCAL col,firstCol,k$,lastCol
       LET firstCol=scoreDigits+n1,lastCol=firstCol+recordNameLen-n1,col=firstCol,n$="   "
       WINDOW recordsWin
2050   DO
         LET col=col*(col>=firstCol AND col<=lastCol)+firstCol*(col>lastCol)+lastCol*(firstCol>col)
         PRINT AT lin,firstCol;n$;AT lin,col; FLASH n1;n$(col-firstCol+n1)
         GET k$
         LET k$=SHIFT$(n1,k$)
       EXIT IF k$=CHR$ VAL "13" AND n$<>"   " AND n$(n1)<>" "
2060     IF k$=CHR$ n8 THEN LET col=col-n1
2070     IF k$=CHR$ VAL "9" THEN LET col=col+n1
2080     IF k$>=" " AND k$<="Z" THEN LET n$(col-firstCol+n1)=k$,col=col+n1
2090   LOOP
     END PROC

Nueva versión más clara y mejor estructurada, con un ON de selección de comandos de edición y un procedimiento para cada uno, aunque más costosa en memoria y tiempo de ejecución:

2030 DEF PROC inputName REF n$,lin
       LOCAL c,c$,col,firstCol,k$,lastCol
       LET c$=CHR$ 8+CHR$ 9+CHR$ 12+CHR$ 13,firstCol=scoreDigits+n1,lastCol=firstCol+recordNameLen-n1,col=firstCol,n$="   "
       WINDOW recordsWin
       normalFont
2040   DO
         LET col=col*(col>=firstCol AND col<=lastCol)+firstCol*(col>lastCol)+lastCol*(firstCol>col)
         PRINT AT lin,firstCol;n$;AT lin,col; FLASH n1;n$(col-firstCol+n1)
         GET k$
         LET c=INSTRING(n1,c$,k$)
       EXIT IF c=n4 AND n$<>"   " AND n$(n1)<>" "
         ON c+n1
           normalKey
           leftKey
           rightKey
           deleteKey
2050   LOOP
       gameFont
     END PROC
2060 DEF PROC normalKey
       LET k$=SHIFT$(1,k$)
       IF k$>=" " AND k$<="Z" THEN LET n$(col-firstCol+n1)=k$
         rightKey
2070 END PROC
2080 DEF PROC leftKey
       LET col=col-n1
     END PROC
2090 DEF PROC rightKey
       LET col=col+n1
     END PROC
2100 DEF PROC deleteKey
       IF col>firstCol THEN LET n$=n$(2 TO )+" "
         leftKey
2110 END PROC

2011-02-05

Corregido fallo: tras actualizar la primera posición de la tabla de mejores tiempos, la nueva marca no era conservada en la variable record.

Modificado el cálculo del tamaño de los puntos del mensaje final, para hacerlo más legible. Está en programa alien-b-m y en el procedimiento tripodWrite del programa principal.

Unificados los procedimientos waitScreenOn y waitScreenOff en uno solo.

El programa alien-b-u crea ahora también los UDG usados en el programa alien-b-m, para simplificar.

En el programa alien-b-m las definiciones de los mensajes pasan de estar en líneas DATA a ser parámetros en llamadas directas al procedimiento que crea los mensajes; así es más fácil hacer pruebas.

Páginas relacionadas

Futuros invasores alienígenas más calmaditos; Beta BASIC y la relatividad de la velocidad
Apuntes dispersos de un (retro)programador. 31 de mayo de 2010.
El huevo de Forth; los alienígenas en su punto; y un dado que no se mueva
Apuntes dispersos de un (retro)programador. 1 de junio de 2010.
Por una conjunción copulativa; viajando en el tiempo
Apuntes dispersos de un (retro)programador. 18 de julio de 2010.
Una borrachera marciana, un virus mágico y una bandera; 767 octetos más uno; las máquinas sin tiempo
Apuntes dispersos de un (retro)programador. 29 de setiembre de 2010.
Juego de caracteres en Beta BASIC; problemas con causa
Apuntes dispersos de un (retro)programador. 17 de octubre de 2010.
alien-b-m
Programa herramienta escrito en Beta BASIC para crear los datos de los mensajes del juego Alien-B.
alien-b-r
Programa herramienta escrito en Beta BASIC para crear la tabla de mejores puntuaciones del juego Alien-B.
alien-b-s
Programa herramienta escrito en Beta BASIC para crear las cadenas gráficas del juego Alien-B.
alien-b-t
Programa herramienta escrito en Beta BASIC para crear gráficos necesarios para el juego Alien-B.
alien-b-u
Programa herramienta escrito en Beta BASIC para crear los GDU del juego Alien-B.