Asalto y castigo [en SuperBASIC, para QDOS y SMSQ/E]
Descripción del contenido de la página
Versión de la aventura de texto Asalto y castigo en SuperBASIC, para QDOS y SMSQ/E.
Proyecto desarrollado entre 2011-03 y 2011-05.
El origen de la idea
A finales de marzo de 2011 tenía entre manos varios proyectos en S*BASIC para QL, entre ellos la enésima reencarnación de un viejo proyecto de juego conversacional, que se me estaba atascando. Se me ocurrió que para cambiar de perspectiva y recuperar la inspiración podría hacer una pausa... y reescribir para QL una aventura conversacional escrita en algún otro BASIC. Inmediatamente me acordé de Asalto y castigo. Era un juego logrado y con un código aparentemente claro cuya traducción al SuperBASIC de QL no ofrecería dificultad.
Pantallazos
Los pantallazos siguientes están tomados de los emuladores Q-emuLator y QPC2 (para Windows, pero funcionando de maravilla en Debian con Wine).
De Q-emuLator
En un sistema QL con la resolución de pantalla de la máquina original de 1984 (256x256 puntos efectivos con los mismos ocho colores de ZX Spectrum), se carga una imagen de presentación antes del programa principal, creada a partir de la carátula de casete diseñada por Neil Parsons para la versión de ZX Spectrum.
De QPC2
Cuando el programa arranca en un sistema QL moderno con modos de pantalla de alta resolución, como es QPC2, paradójicamente no se muestra pantalla de presentación. El motivo es que se da por supuesto que la carga del programa será muy rápida. No obstante quizá añada una pantalla con color real seguida de una pausa para estos casos en una futura versión.
El tamaño de la ventana del juego será el mayor posible hasta un máximo de 800x600, centrada en la pantalla. En las tomas siguientes la ventana mide 800x480; se aprecia en ellas la diferente gama de colores, igual a la de las versiones en Blassic y Locomotive BASIC.
Novedades
Novedades técnicas
El código final en SuperBASIC no se parece al código original en Blassic, que fue del que partí. SuperBASIC es un BASIC estructurado de alto nivel, que incluso recuerda un poco a Pascal. Aunque necesita números de línea, yo trabajo sin ellos y los añado solo al final. Como cuento en el historial de desarrollo, los cambios necesarios para que SuperBASIC se «tragara» el código en Blassic fueron pocos y casi triviales. Pero ese no era mi objetivo. El objetivo era reescribir el programa con todo lo que un BASIC avanzado como SuperBASIC ofrece: procedimientos, funciones y estructuras de control. El código debía ser lo más legible posible (que pudiera entenderse casi sin necesidad de comentarios) y por supuesto no debía quedar él ni un solo salto de línea. Afortunadamente el programa original estaba bien escrito: estaba dividido en subrutinas claras y los saltos se usaban solo como sustitutos de las estructuras de control, no para cambiar el flujo principal del programa.
No obstante, durante el proceso de traducción, tentado por la ausencia de limitaciones (la memoria o la velocidad de ejecución no eran un problema) hice algunos cambios internos en la organización y tratamiento de los datos. El más significativo es la reescritura del analizador lingüístico. El original era tan sencillo como eficiente, impuesto por las limitaciones del lenguaje y la máquina. El que yo he escrito a partir del código original es equivalente (es decir, no tiene capacidades nuevas: reconoce el mismo tipo de estructuras) pero internamente trabaja de otra forma, usando una lista de palabras invariables, que están asociadas a sus identificadores (lo que permite añadir sinónimos muy fácilmente), y utilizando una extensión del lenguaje para buscar valores en matrices de texto muy rápidamente.
Estuve tentado ir más alla en los cambios del analizador: una lista única de vocabulario (como hago en mis propios programas); reconocimiento de complementos preposicionales; orden variable de los elementos de la frase y otras capacidades nuevas que he programado varias veces para otros proyectos. Pero al final preferí no hacerlo.
Por último, el programa usa un juego de caracteres estándar ISO 8859-1, diferente del propio de QL. Eso significa escribir una función para la entrada de textos escrita a medida. La escribí a partir de la que tenía ya escrita para el proyecto CE4, añadiéndole mejoras tomadas de una función análoga muy completa que había escrito para El bosque encantado [en OPL+], a su vez una versión mejorada de la usada en Forth 5mx... El resultado final es tan bueno que sustituyó después a la función original de CE4.
Novedades estéticas
El aspecto es prácticamente idéntico al del original (salvo lógicamente por lo que respecta al tamaño de la pantalla). Tan solo hay un pequeño cambio en la disposición de un par de textos, que en el original mezclaban narración con diálogo y eran mostrados en conjunto como diálogo; en esta versión están separados en dos: la parte narrativa y la de diálogo.
Novedades de juego
La aventura en sí por supuesto es idéntica a la original... salvo por unos cambios que me tomé la libertad de introducir y que no afectan a la trama.
He añadido muchos sinónimos nuevos (por entretenimiento, pues la mayoría no aportan nada); entre ellos por supuesto «i». He creado un objeto nuevo, que en la versión original existía solo como parte de una descripción Y he añadido dos formas alternativas para solucionar dos de los puzles (una de ellas es una alternativa solo lingüística, una forma diferente de usar los mismos objetos; la otra es una alternativa con un objeto diferente pero muy relacionado). Ninguna de estas novedades afecta a la trama.
Quien conozca el juego no tendrá dificultad en encontrar las novedades leyendo el código del programa.
Estuve a punto de hacer un cambio significativo en el vocabulario que finalmente desestimé: separar en grupos los (seudo)sinónimos de «atacar» (que abarcan muchos usos diferentes) para poder discriminar precisamente sus acciones con diferentes objetos.
Requisitos
Memoria
El programa necesita más de 128 KiB de RAM (que es lo que proporcionaba la QL original) pero no he calculado cuánto más exactamente; con 384 KiB funciona bien.
Extensiones
El programa y su cargador usan varios funciones y comandos de tres extensiones de SuperBASIC, que se cargan en el inicio del cargador:
- De Display toolkit (de Dylwin Jones):
FLIM_W
,FLIM_H
,FLIM_X
,FLIM_Y
,DMODE
. - De MegaToolkit (de Michael A. Crowe):
TRUE
,FALSE
,CHAR_W
,CHAR_X
,POS_X
,POS_Y
,LNUM
. - De DIY Toolkit (de Simon N. Goodwin):
INARRAY%
,MINIMUM
.
Plataforma
Asalto y castigo ha sido probado solo en las versiones registradas de dos emuladores comerciales: Q-emuLator y QPC2, que son los mejores emuladores de QL disponibles con gran diferencia. Aunque solo existen versiones para Windows funcionan impecablemente en GNU/Linux con ayuda de Wine (todo el desarrollo y las pruebas han sido realizados con ambos emuladores sobre Debian).
QPC2
El programa funcionará también con la versión gratuita del emulador QPC2. La única limitación de la versión gratuita es que no permite modificar nada en los sistemas de ficheros, algo que Asalto y castigo no necesita hacer.
Q-emuLator
La versión gratuita de Q-emuLator limita la velocidad a la de máquina original y la memoria máxima a 384 KiB de RAM, pero el programa funciona bien en esas condiciones.
Sin embargo el programa no funciona en Q-emuLator con la ROM MGE (la española) de QDOS y una velocidad igual a la de la QL original. El motivo, que me explicó detalladamente Daniele Terdina, el autor del emulador, es un fallo en el código original de las ROM MGx, que el emulador parchea y arregla cuando funciona a una velocidad superior a la original. Se puede usar la ROM JS (la inglesa) que viene con el emulador; no habrá diferencia en el uso del teclado español, pues el emulador se ocupa de ello de forma trasparente.
Otras plataformas
En principio tiene que funcionar con otros emuladores (las pruebas con uQLx están pendientes).
No cabe esperar ningún problema en una QL real.
Sistema operativo
QDOS
En QDOS conviene usar la ROM MGE para la cómoda entrada de los signos y letras propios del español (aunque funcionaría igual con otra versión de la ROM usando los atajos de teclado propios). Con esta ROM sin embargo, como ya se ha explicado, el programa no funcionará en el emulador Q-emuLator cuando la velocidad de ejecución sea la de la QL original.
El programa no funcionará con ROM s AH o JM, las más antiguas de QDOS, debido a que no permiten usar en un programa extensiones cargadas por él mismo, como hace el cargador del juego.
Minerva
El programa ha sido probado con Q-emuLator y Minerva (ROM 1.89). El atajo de teclado propio de Minerva para acceder a las letras no inglesas (Ctrl+Enter) no funciona (no tiene que ver con Asalto y castigo) pero el emulador envía los caracteres correctos según la disposición del teclado del sistema anfitrión.
SMSQ y SMSQ/E
En ambos sistemas el programa carga si es necesario la tabla de teclado de español.
Tamaño de pantalla y resolución de color
Si el sistema QL admite modos y resoluciones de pantalla modernos, el programa usará una ventana central de un tamaño máximo de 800x600 y una gama de colores igual a la de las las versiones en Locomotive BASIC y en Blassic. En caso contrario la ventana será la clásica de 512x256 (256x256 efectivos en ocho colores) y los colores serán los ocho de la QL original (idénticos a los de la ZX Spectrum).
Código fuente
Los listados están excepcionalmente en una página propia, tanto por su longitud como para no arruinar la trama del juego a quien no lo conozca.
Descargas
Ofrezco el programa en varios formatos habituales en QL y sus emuladores:
- ZIP (37.07 KiB) El programa empaquetado con zip (sin directorios).
- WIN.ZIP (39.07 KiB) Imagen de disco duro de QXL, comprimida con zip.
- WIN.GZ (39.22 KiB) Imagen de disco duro de QXL, comprimida con gzip.
- IMG.ZIP (42.38 KiB) Imagen de disquete de QL, comprimida con zip.
- IMG.GZ (42.84 KiB) Imagen de disquete de QL, comprimida con gzip.
- QLPAK con ROM MGE (72.56 KiB) Formato QLPAK de Q-emuLator, con la ROM MGE (española) del sistema QDOS incluida (no funciona a la velocidad original de la QL, y por tanto tampoco en la versión gratuita de Q-emuLator, debido a un fallo de las ROM MGx).
- QLPAK con ROM JS (37.55 KiB) Formato QLPAK de Q-emuLator, que usa la ROM JS (inglesa) del sistema QDOS que trae el propio emulador (esto no supone un problema para escribir los signos y letras propios del español, pues el emulador se ocupa de ello).
En el repositorio en GitHub de la nueva versión de Asalto y castigo para SMSQ/E puede descargase también esta primera versión, etiquetada como «B-20170711».
De la página de Dylwin Jones es posible descargar cualquiera de las ROM para QL.
Cómo arrancar el programa
En un artículo aparte explico cómo arrancar un programa de QL en diferentes plataformas y qué fichero usar en cada caso; conviene también familiarizarse con las características de los emuladores QPC2 y Q-emuLator.
En caso de hacerlo con el emulador QPC2, recomiendo elegir la resolución de color de ocho bitios (256 colores) de entre las tres disponibles:
- QL colour: El juego usará los ocho colores de la QL original, que son los mismos de la ZX Spectrum.
- 8-bit colour: Modo de color recomendado. El juego usará una gama de colores igual a la de las versiones escritas en Locomotive BASIC y Blassic.
- High colour: El juego usará la misma gama de colores que en el modo anterior, pero puede que el emulador funcione algo más lento.