Historial de desarrollo de La legionela del pisto en 2011
Descripción del contenido de la página
Historial de desarrollo en 2011 del proyecto La legionela del pisto, una aventura conversacional en Beta BASIC 4.0+D (con formato BBim) para ZX Spectrum.
2011-03-03
Antes de iniciar los cambios para tener preparadas las matrices de datos en el disquete (de forma que durante el inicio del programa solo sea necesario copiarlas al disco RAM), cronometré el proceso de arranque: cuarenta minutos tardan los programas auxiliares en preparar las matrices de datos y textos en el disco RAM, con el emulador al 100% de la velocidad de la ZX Spectrum.
Primeras modificaciones en el sistema de preparación de datos.
2011-03-04
Terminado el nuevo sistema de preparación de datos: El programa Library se llama ahora Init; hace lo mismo que antes pero en lugar de pasar el control a Texts copia las matrices de datos desde el disquete al disco RAM y después pasa el control a Main. Los antiguos programas Texts y Data ahora se llaman MakeTexts y MakeData y ya no son necesarios en la primera ejecución del juego: construyen las matrices de datos en el disquete (con una copia intermedia en el disco RAM).
Nuevos procedimientos volantes en el programa Init: ramToDisk
, diskToRam
...
9091 DEF PROC eraseRD f$
LOCAL c$,pointer
LET c$=CAT$(),pointer=LEN c$-12,f$=(f$+" ")( TO 10)
DO WHILE pointer>0
IF f$=c$(pointer TO pointer+9) THEN ERASE !f$
EXIT IF 1
9092 LET pointer=pointer-13
LOOP
END PROC
9375 DEF PROC ramToDisk f$
CLOSE #*4
OPEN #4;d*;f$RND
LIST #4;!f$
CLOSE #*4
END PROC
9378 DEF PROC diskToRam f$
eraseRD f$
CLOSE #*4
OPEN #4;d*;f$RND
INPUT #4;!f$
CLOSE #*4
END PROC
2011-03-05
Ajustes finales en el nuevo sistema de arranque.
El programa Init hace una copia de sus procedimientos volantes en el disquete, para que los programas MakeTexts y MakeData los carguen de ahí y no dependan de que Init haya sido ejecutado y los haya creado en el disco RAM.
Nuevos procedimientos volantes en el programa Init: eraseOver
, formatRD
, listTexts
...
9390 DEF PROC formatRD
DO UNTIL CAT$()=""
ERASE !CAT$()( TO 10)
LOOP
END PROC
9395 DEF PROC eraseOver f$,drive
DEFAULT drive=INT PI
LOCAL d$
LET d$="12*"(drive)
KEYIN " SAVE OVER d"+d$+";f$ CODE 0,0: ERASE d"+d$+";f$"
END PROC
Comprobación de la descripción escrita de la estructura de las matrices de datos.
Seguimiento de un error en la impresión de textos.
Nuevo programa CopyOvrls, para copiar los procedimientos volantes desde el disco RAM al disquete sólo cuando sea necesario actualizarlos, y evitar que Init haga el trabajo en cada ocasión.
Corregida sintaxis de INARRAY
en el proc getFirstHere
de Main.
2011-03-06
En el disquete quedaban dos entradas de directorio libres de las 80 predeterminadas. Lo copié a una nuevo formateado con FORMAT d2,7
para tener 140 entradas. Quizá en algún momento hagan falta más entradas o usar dos disquetes.
Corregido el fallo que dejaba parte de la matriz de textos en blanco: el programa MakeData tenía que ejecutarse justo a continuación de MakeTexts, como ocurría en el sistema de arranque anterior, pues MakeData también añade textos a la matriz. Ahora MakeTexts, cuando termina su tarea, arranca MakeData y este al final copia del disco RAM al disquete la versión actualizada de las matrices de textos.
Reorganizado el sistema de transferencia de variables en ficheros: Init crea initVars, que será leído por MakeTexts; MakeTexts creará textsVars, que será leído por MakeData; MakeData creará el fichero final, vars, que será leído por Main.
En Main
Sustituidas las llamadas dobles a getEntName
y getEnArticle
por getEntAName
.
Nuevo proc tellNLtext
, para llamar desde tellError
.
Proc text
renombrado getText
pues se trata de una seudofunción con parámetro por referencia.
En Init
Parámetro opcional en proc setupOverlays
, para copiar los procedimientos volantes del disco RAM al disquete sobre la marcha. Así no hay que cargar CopyOvrls para actualizarlos.
Incluido como procedimiento volante el proc showLocs
, que formaba parte del sistema depuración de Main.
Nuevo procedimiento volante debugData
para mostrar una lista de valores de cualquier tipo en los puntos de depuración.
9409 DEF PROC debugData DATA
LOCAL d,d$,datum
LET datum=ITEM()
DO WHILE datum
IF datum=1 THEN
READ d$
ELSE READ d
LET d$=STR$ d
9410 tell d$,debugInk
LOOP
END PROC
2011-03-07
Nuevos gráficos de escenarios.
Nuevo sistema para salvar la zona de texto de la pantalla al mostrar un nuevo gráfico. El sistema antiguo salvaba toda la pantalla en el disco RAM, con lo que al recuperarla quedaba el borde del gráfico del escenario anterior:
1940 DEF PROC describeLocation
LOCAL n$,s$
LET s$="scr.tmp"
eraseRD s$
SAVE !s$SCREEN$
showgraphic
LOAD !s$SCREEN$
getEntAName location,n$
tellNL "Estoy en "+n$+"."
listPresentEnts
action_EXITS
END PROC
2010 DEF PROC showGraphic
LOCAL g
LET g=!ent#(location,fGraphic)
IF g THEN loadgraphic g
2020 END PROC
2030 DEF PROC loadGraphic g
LOAD d*"scr-"+STR$ g SCREEN$
PAUSE PI
PAUSE VAL "1e3"
END PROC
El sistema nuevo usa GET
por líneas (no se puede hacer entero, que sería mucho más rápido, por falta de memoria, pues se necesitarían más de 5 KiB para guardar la zona de pantalla en una cadena de texto), las salva en una matriz del disco RAM y las recupera después con PLOT
. Solo queda resolver un problema con el estado de OVER
y CSIZE
, para evitar usarlos en cada PLOT
:
70 DIM !win$(19,280)
REM temp storage for window content
1950 DEF PROC describeLocation
LOCAL n$
showGraphic
getEntAName location,n$
tellNL "Estoy en "+n$+"."
listPresentEnts
action_EXITS
END PROC
2020 DEF PROC showGraphic
LOCAL g,row,r$,y
LET g=!ent#(location,fGraphic)
IF NOT g THEN GO TO 2070
2030 LET row=1
FOR y=23 TO 159 STEP 8
GET r$,16,y,28,1;1
LET !win$(row)=r$
LET row=row+1
NEXT y
GET o$,16,7,28,1;1
LET !win$(row)=r$
2040 loadGraphic g
2050 LET r$=!win$(19)
PLOT CSIZE 0; OVER 0;16,7;r$
2060 LET row=1
FOR y=23 TO 159 STEP 8
LET r$=!win$(row)
PLOT CSIZE 0; OVER 0;16,y;r$
LET row=row+1
NEXT y
2070 END PROC
2080 DEF PROC loadGraphic g
LOAD d*"scr-"+STR$ g SCREEN$
PAUSE PI
PAUSE VAL "1e3"
END PROC
Pero resulta que PLOT
, en su función ampliada de situar gráficos, usa los atributos de impresión de la ventana de salida. Para corregir los efectos indeseados había que usar CSIZE 0
y OVER 0
para modificar PLOT
, y además guardar primero los valores de las variables de Beta BASIC WXCOORD
y WYCOORD
(direcciones de memoria 57364 y 57365) y restaurarlos tras la operación. Por suerte había un sistema más sencillo y rápido: cambiar temporalmente a la ventana 0 durante la restauración de la pantalla. Además, no hacía falta salvar y restaurar la zona de entrada de comandos, pues inmediatamente se borraría:
1340DEF PROC showGraphic
LOCAL g,r,r$,y
LET g=!ent#(location,fGraphic)
IF g THEN
LET r=0
FOR y=23 TO 159 STEP 8
GET r$,16,y,28,1;1
LET r=r+1,!win$(r)=r$
NEXT y
loadGraphic g
WINDOW 0
FOR y=159 TO 23 STEP -8
PLOT 16,y;!win$(r)
LET r=r-1
NEXT y
WINDOW oWin
1350 END PROC
¿Y por qué no hacer la restauración en un solo paso? Para ello sólo bastaría unir las filas obtenidas por GET
con los caracteres de control adecuados:
70 DIM !win$(18*284+1)
REM temp storage for window content
1340 DEF PROC showGraphic
LOCAL c$,g,r,r$,y
LET g=!ent#(location,fGraphic),c$=CHR$ 10+CHR$ 13+CHR$ 3+CHR$ 3
IF g THEN
LET r=1
FOR y=23 TO 159 STEP 8
GET r$,16,y,28,1;1
LET !win$(r TO r+284)=r$+c$,r=r+284
NEXT y
loadGraphic g
WINDOW 0
PLOT 16,159;!win$()
WINDOW oWin
1350 END PROC
Pero el comando PLOT
provocaba un error de memoria porque al parecer necesita copiar toda la cadena desde el disco RAM antes de pasarla a la pantalla. Se podía imprimir por grupos de líneas, tantas como la memoria libre permitiera, pero eso no suponía mucha ventaja respecto a restaurar la pantalla línea por línea.
2011-08-31
Impresión de todo el código fuente para obtener ficheros de texto y convertirlos al formato BBim, aún en desarrollo.
2011-09-26
Código fuente pasado a formato BBim.