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.
2010-06-04
Nuevos gráficos de 16x8 pixeles.
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.
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.
Proceso:
- Con GIMP: recortar la zona deseada, cambiarle el tamaño a 256x64, cambiar el lienzo a 256x192, mover la zona a la parte inferior, grabar como PNG.
- Con SevenuP: importar el PNG y exportarlo como SCR.
- Con getscreen: seguir las instrucciones para cargar el SCR desde el emulador.
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.
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.
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.
2010-11-21
Nuevo boceto del efecto final del juego, con una nave grande que aterriza ocupando toda la pantalla.
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ú.
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.
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.
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.
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.
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.
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:
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.
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.
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.
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:
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.