Historial de desarrollo de CE4 [para QL]

Descripción del contenido de la página

Historial de desarrollo del proyecto de aventura conversacional CE4 escrita en SBASIC (con formato SBim) para QL.

Etiquetas:

2011-03-13

Inicié el proyecto con el código que había empezado a preparar para convertirlo de Sinclair BASIC en MasterBASIC para SAM Coupé.

La traducción a SBASIC quedó muy avanzada.

2011-03-14

Primeras pruebas de ejecución con QPC2. Corrección de errores.

2011-03-15

Corrección de errores. Procedimiento tell.

2011-03-16

Primera distribución de las ventanas.

Pruebas de compatibilidad con SupeBASIC y QDOS, en Q-emuLator. Cambios en varios puntos para hacerlo compatible.

2011-03-17

Reescrito el formato de los datos y su gestión. Todas los grupos de matrices principales (verbos, nombres, cosas, curas, lugares) se convierten en dos grupos para obtener más flexibilidad: una para los términos del vocabulario y otra para las «entidades» del juego.

2011-03-18

Nuevo bucle para el analizador. En lugar de IF anidados, una estructura SELect con un cálculo de las combinaciones posibles.

Más sinóminos y acciones (exits_a, y movimientos directos con una palabra). Nuevas propiedades de las entidades. Errores corregidos. Mejoras en textos y en acciones.

2011-03-19

Corregidos fallos en not_having, list_present_things y otros.

Rediseñada la pantalla para ocupar todo el espacio disponible y usar el modo de alta resolución de color y la paleta de 256 colores.

Primeras pruebas para poner imágenes en ventanas con la extensión LW_BMP8LOAD.

No mantendré la compatibilidad con SuperBASIC, con QDOS y con los modos de pantalla antiguos. El programa aprovechará las ventajas de SBASIC y SMSQ/E. Funcionará en la versión demo de QPC2 y será distribuido en un fichero .WIN.

Mejorados diversos textos y algoritmos. Funciones para pasar cadenas ISO 8859-1 a mayúsculas (sólo las letras ASCII y las castellanas).

2011-03-20

Retoques y ampliaciones al azar en algunos textos.

2011-03-21

Primeras pruebas con los gráficos de los escenarios, BMP de 800x256 procesados con GIMP.

2011-03-22

Gráficos.

2011-03-23

Nuevos gráficos. Solo quedan tres para completar el mapa, aunque muchos son aún provisionales.

Información de depuración en la ventana del nombre del escenario. Corregidos errores en el mapa, causados por una sustitución automática de valores.

2011-03-23

Completados los gráficos, muchos aún temporales.

Nuevas funciones para textos habituales al azar. Mensajes de errores sintácticos con textos al azar.

Inicio del nuevo analizador con dos pasadas que permitirá reconocer objetos cuyos términos consten de varias palabras.

Para que sea efectivo hay que quitar antes las palabras que no son reconocidas en la frase original, convirtiendo por ejemplo "por favor abre la puerta que va al norte ya mismo" en "abre puerta norte".

2011-03-24

Terminada la primera versión operativa del nuevo analizador. Primeras pruebas con nombres compuestos, como "puerta norte".

Las palabras que forman parte de términos que constan de varias palabras, como "de" en "caja de caudales" deben darse de alta como términos independientes, no asociados a acción entidad, para que pasen el primer filtro del analizador.

2011-03-25

Nuevas funciones case0$(), case1$()#, #!if$() y else$() para completar and$() (que simula la funcionalidad de AND en Sinclair BASIC con cadenas de texto:

deffn and$(txt$,condition)
  if condition:ret txt$:else ret ""
enddef

deffn if$(condition,txt1$,txt2$)
  if condition:ret txt1$:else ret txt2$
enddef

deffn else$(condition,txt1$,txt2$)
  if condition:ret txt2$:else ret txt1$
enddef

deffn case0$(index,txt1$,txt2$,txt3$)
  sel on index
    =0:ret txt1$
    =1:ret txt2$
    =2:ret txt3$
  end sel
enddef

deffn case1$(index,txt1$,txt2$,txt3$)
  sel on index
    =1:ret txt1$
    =2:ret txt2$
    =3:ret txt3$
  end sel
enddef

2011-03-26

Modificada la función accept$(): para que devuelva el control si no se pulsa una tecla en unos segundos, y use un parámetro por referencia para distinguir el tipo de salida.

Convertida la función command$() en el procedimiento command para gestionar mejor las llamadas a accept$() y devolverle el comando en curso si no se completó la vez anterior.

Primera versión restaurada de la rutina de movimiento de los personajes secundarios.

2011-03-31

Mensajes de espera variables al azar si el jugador no escribe.

Arreglada la elección de lugar para la linterna (no tenía en cuenta que se tratara de un lugar fuera del edificio).

2011-05-10

Revisión del código. Corrección de pequeños errores.

Creada la función location_picture$ con parte del código del procedimiento show_location_picture.

2011-05-11

Uso del método de seudo-etiquetas (con la extensión LNUM de MegaToolkit), creado para Asalto y castigo [en SuperBASIC, para QDOS y SMSQ/E], para calcular el número de datos a leer de las líneas DATA.

División del procedimiento principal del analizador en varios procedimientos y funciones, para hacerlo más legible y más fácil de modificar.

Sustitución de la rutina de entrada de textos por la versión ampliada que fue escrita para Asalto y castigo [en SuperBASIC, para QDOS y SMSQ/E].

2011-05-13

Renombrada la función iso_input$ como accept.

Corregido error en la rutina de entrada de textos: el cursor no avanzaba si se escribía en medio de la frase.

Ampliada la rutina de entrada de textos con los atajos de teclado para borrar la línea hasta el principio o hasta el final.

Renombradas y completadas las funciones de cambio de textos a mayúsculas en ISO 8859-1.

Sustituida la función is_term (que hacía una búsqueda bruta) por la extensión inarray%.

Ampliada la rutina de entrada para permitir escribir comas, con ciertas condiciones. Esto permitirá escribir varias órdenes en una sola línea.

Ampliada la rutina de entrada para permitir escribir comas, con ciertas condiciones. Modificado el primer nivel del analizador para detectarlas y llamarse recursivamente. Esto permite escribir varias órdenes en una sola línea.

2011-05-14

Rediseñado el formato de datos de términos, entidades y acciones, para implementar un analizador más potente que busque en la frase los términos desde los más largos a los más cortos, y después deduzca la entidad más probable en función de su accesibilidad. Es un sistema parecido al de Finen per Imago pero con la ventaja de que los términos pueden constar de varias palabras.

Implementado el recuento de líneas DATA también para calcular el número de entidades.

Modificado el sistema de discriminación de entidades que son direcciones: bitio de propiedad en lugar de rango de identificador.

Implementado el tabulador en el editor de línea, para avanzar o retroceder ocho posiciones.

Intento frustrado de evitar definir expresamente las variables que hacen de identificadores de entidades y acciones. La idea era indicar los nombres en las líneas DATA con el resto de los datos, y definirlas con ayuda de TYPE_IN (de la extensión Turbo Toolkit). Pero TYPE_IN utiliza como consola el canal cero de la tarea principal, lo que es un problema insoluble. Otros intentos de crear un procedimiento equivalante (creando un fichero temporal con el código e interpretándolo con DO, MERGE o MRUN fracasaron también por las limitaciones de estos comandos, que detienen la ejecución y/o no pueden funcionar en procedimientos, funciones o subrutinas). Sigue la nueva versión (en pruebas) del código con TYPE_IN, que tuvo que ser desechada:

  rem Terms data

  for i=1 to terms
    read i$
    if len(i$)>term_max_len
      fatal_error "Nombre de término demasiado largo: «"&i$&"».",-4
    endif
    let term$(i)=i$
    read this_term_action$,this_term_entity$,term_properties(i)
    if len(this_term_action$)
      type_in "let this_term_action="&this_term_action$&chr$(enter)
      if not this_term_action
        rem El identificador de acción es desconocido. Hay que crearlo.
        let actions=actions+1
        print #tmp_file,"let "&this_term_action$&"="&actions&":"
      endif
      let term_action(i)=this_term_action
    endif
    if len(this_term_entity$)
      type_in "let this_term_entity="&this_term_entity$&chr$(enter)
      if not this_term_entity
        rem El identificador de término es desconocido. Hay que crearlo.
        let entity_count=entity_count+1:rem local!!!
        print #tmp_file,"let "&this_term_entity$&"="&entity_count&":"
      endif
      let term_entity(i)=this_term_entity
      if term_properties(i) || main_name_tb
        let entity_term(this_term_entity)=i
      endif
    endif
  endfor i

Versión anterior recuperada:

  rem Terms data

  for i=1 to terms
    read i$
    if len(i$)>term_max_len
      fatal_error "Nombre de término demasiado largo: «"&i$&"».",-4
    endif
    let term$(i)=i$
    read term_action(i),term_entity(i),term_properties(i)
    if term_entity(i) and (term_properties(i) || main_name_tb)
      let entity_term(term_entity(i))=i
    endif
  endfor i

Terminadas las modificaciones en la rutina de entrada de comandos para que funcione de forma aparentemente asíncrona. La rutina termina si no se pulsa una tecla en un plazo variable, para que el programa siga su curso, y continúa en el mismo punto en la siguiente llamada. El efecto es transparente para el jugador. Es el mismo método utilizado en Colegio Erevest 3.

Creado el índice de la matriz términos, ordenado por longitud decreciente. Esto permitirá implementar el nuevo algoritmo del analizador lingüístico.

2011-05-15

Ampliada la gestión de errores del analizador. Añadida la opción para mostrar mensajes de error estrictos en lugar de las respuestas variables del protagonista.

Implementados los primeros comandos para configuración del programa: gráfico[s] [sí|no], sonido[s] [sí|no] y gramática [sí|no] (para mostrar los errores de gramática de forma explícita y distinta, no solo como comentarios del protagonista).

Añadido a la rutina de entrada el control de una posible coma final, para eliminarla. Esto simplifica el tratamiento de frases vacías en el analizador.

Arreglado en tellNL el problema de que al iniciar un nueva párrafo se imprimía una línea en blanco si la última línea había ocupado todo el ancho. Bastaba no imprimir el salto de línea cuando el cursor está en el borde izquierdo:

defproc tellNL(text$)
  if pos_x(#ow):print #ow,\
  print #ow," ";
  tell(text$)
enddef

Primer boceto del sistema de ayuda.

2011-05-16

Añadida la función device$() que fue escrita para el cargador de Asalto y castigo [en SuperBASIC, para QDOS y SMSQ/E].

Perfeccionado el procedimiento tell para que detecte la última palabra de la última línea de la ventana y espere unos segundos la pulsación de una tecla antes de seguir imprimiendo el texto.

Añadidos los atajos de teclado Ctrl+L para borrar la pantalla, F1 para mostrar la ayuda F2 para (des)activar los gráficos.

Añadida la acción esperar.

Mejoradas la acciones del sistema (gráficos, sonidos, gramática) para que distingan si se ha producido un cambio de modo efectivo y actúen en consecuencia. Mejorado el cambio del modo con gráficos a sin gráficos y viceversa. Añadida el comando del sistema "depuración [sí|no]" para activar o desactivar los mensajes de depuración.

2011-05-19

Programación del historial de comandos, a partir del código de El bosque encantado [en OPL+].

Conversión de todas las funciones, variables y matrices numéricas de reales a enteras, para ganar velocidad en los bucles y en las estructuras SELect. Esto rompe la compatibilidad con SuperBASIC, que no permite una variable entera como índice de una estructura SELect.

Eliminación de variables locales intermedias entre parámetros e índices de SELect, que eran necesarias en SuperBASIC (sobre los sistemas operativos QDOS y Minerva). El programa definitivamente solo funcionará en SBASIC sobre el sistema operativo SMSQ/E. Esto facilitará el desarrollo.

Eliminadas las funciones que devolvían el tamaño en pixeles de los caracteres a partir de sus medidas estándar de CSIZE. En su lugar se usan las funciones CHAR_W y CHAR_H de MegaToolkit.

2011-05-23

Conversión de algunas variables numéricas pendientes de reales a enteras, en la definición de ventanas.

Corrección de algunos fallos de cálculo en la definición de ventanas, que impedían que estas se distribuyeran correctamente en una pantalla de 1024x768 puntos.

2012-01-29

Conversión del código a formato SBim.

La función lines_between%() ya no es necesaria:

deffn lines_between%(procedure_1$,procedure_2$)

  // Devuelve el número de líneas de programa entre dos procedimientos o funciones.
  // Return the number of program lines between two procedure or functions.

  loc line_step%
  let line_step%=10
  ret (lnum(procedure_2$)-lnum(procedure_1$)) div line_step%-1

enddef

Se usaba para calcular el número de valores en DATA, como en este ejemplo:

let terms%=lines_between%("label_terms_start","label_terms_end")

Esto obligaba a definir dos procedimientos que sirvieran como etiquetas, como en este ejemplo:

defproc label_terms_start:enddef

Con la facilidad para definir etiquetas en el formato SBim basta crear dos etiquetas y restarlas.

2012-02-01

Etiquetas independientes para cada bloque de datos, para poder hacer RESTORE de forma selectiva.

Convertidas en enteras algunas variables reales que quedaban.

Convertidas en etiquetas efectivas las últimas etiquetas pendientes, que están en una zona del código que aún no se ejecuta.

2012-02-15

Corregido un fallo pendiente en SBim. Añadidas al código las marcas de plegado predeterminadas de Vim, para facilitar la edición.

2015-12-26

Primeros cambios en el fichero de arranque para adaptarlo a SMSQmulator. Todas las extensiones parecen funcionar bien.

2015-12-27

Hago unas pequeñas modificaciones para que el código arranque con el emulador SMSQmulator. Actualizo el formato de los comentarios de desarrollo. Completo la cabecera del código fuente. Cambio la licencia. Hago algunas pruebas y anoto errores pendientes.

2016-01-24

Arreglado el fallo por el que la ventana de entrada de comandos no se veía: se usaba la altura máxima de la pantalla, pero no se contaba la barra de menú de SMSQmulator.

Ahora funciona bmp8load, que es el comando que carga las imágenes; tenía una nota de que no funcionaba en SMSQmulator.

2017-09-11

Creo un repositorio de Git para preservar la evolución del proyecto y retomar su desarrollo en algún momento.

Esta página ya no será actualizada. La historia del desarrollo podrá seguirse en el repositorio, cuando sea publicado.