Asalto y castigo [en Forth]
Descripción del contenido de la página
Juego de aventuras de texto escrito en Forth con Gforth.
Proyecto activo. Iniciado en 2011-07-05. 60% completado.
Objetivo
El objetivo del proyecto es hacer una nueva versión de la aventura conversacional Asalto y castigo pero, al contrario que la versión gemela para QL, con un intérprete de comandos más potente, textos ampliados y nuevas funcionalidades tanto en el mundo del juego como en el manejo del programa.
Por otra parte, el desarrollo en Forth de una aventura conversacional ya escrita me permitiría centrarme en poner en práctica varias ideas, algoritmos y código que hasta entonces habían estado dispersos durante años en diferentes proyectos inacabados. Este objetivo se está cumpliendo solo en el campo de las ideas, porque el planteamiento de desarrollo fue novedoso desde el principio y no ha hecho falta buscar en proyectos antiguos muestras de código reutilizables.
Estado
El desarrollo de esta versión de Asalto y castigo empezó en 2011-07. En el momento de actualizar estas líneas (2017-11) el proyecto está muy avanzado y la aventura es totalmente jugable. Tan solo resta comprobar, ajustar y mejorar algunos detalles.
En qué Forth
Como se suele decir, «cuando has visto un Forth... has visto un Forth». Es cierto. El lenguaje es completamente reescribible hasta la raíz, lo que desde sus orígenes ha contribuido a la proliferación de implementaciones de todo tipo.
Originalmente mi intención fue escribir el programa en SP-Forth, porque aparte de alguna peculiaridad útil para usar en un juego conversacional, sus dos versiones (la original para Windows y la nueva para GNU/Linux) permiten crear ejecutables, lo que facilitaría la distribución y el uso del juego. Diversas pegas de la versión para GNU/Linux y la falta de documentación suficiente sobre algunos aspectos de esta implementación del lenguaje hicieron que ampliara el código para soportar lina, un Forth clásico con núcleo en ensamblador y que también puede crear ejecutables (en este caso, como buen Forth clásico, mediante una de las más preciadas características de Forth: la metacompilación del propio sistema).
Más tarde modifiqué el código para hacerlo compatible también con Gforth, probablemente el sistema Forth más popular en entornos GNU y uno de los más potentes y elaborados. El motivo fue que Gforth proporciona algunas funcionalidades relativas a la entrada y salida en la consola de las que lina y SP-Forth carecen y que sería laborioso reescribir. Por ejemplo, Gforth proporciona de serie un editor completo de línea de comandos y un historial de comandos, ambos utilizables directamente por el juego.
Desgraciadamente Gforth no permite crear ejecutables; la única opción para distribuir un programa preparado para su ejecución es crear una imagen del sistema y abrirla con un Gforth instalado en el sistema. La imagen del sistema podrá ejecutarse en sistemas Gforth de la misma versión y que se ejecuten en plataformas compatibles a nivel de procesador (por la cuestión de las diferentes maneras de almacenar los valores en la memoria). A pesar de este inconveniente, la rapidez de Gforth, su fiablidad, su abundante y minuciosa documentación y el buen manejo que permite de la consola y del teclado lo han convertido en la herramienta central del proyecto.
Por todo lo dicho, y porque mantener tres versiones simultáneas del código mediante compilación condicional aumenta mucho el trabajo, el programa finalmente fue escrito únicamente para Gforth.
La concisión de Forth
Forth no es popular; ni siquiera es bien conocido entre los programadores. Se aleja muchísimo de los caminos trillados en programación. Acercarse a este lenguaje por primera vez exige un cierto esfuerzo inicial para pensar y programar de una forma diferente a la habitual, pero la recompensa es una gran libertad creativa y un desarrollo eficaz.
Si Forth no es popular y los juegos conversacionales tampoco, parece obvio que su intersección ha de ser puramente testimonial. Hay algunos pocos juegos de este tipo escritos en Forth, de código abierto y fáciles de encontrar. Son de estilo antiguo y de ninguna manera muestran lo que el lenguaje es capaz de hacer.
Forth ofrece simultáneamente las ventajas de un compilador y las ventajas de un intérprete; y de la misma manera combina las ventajas de un lenguaje de bajo nivel como ensamblador y las ventajas de cualquier lenguaje de alto nivel en que uno pueda pensar. Uno de los frutos de ello es la concisión con que permite expresar la solución a un problema, siempre que esto se haga dentro del espíritu propio de Forth, sin intentar copiar los métodos de otros lenguajes.
Como ejemplo muestro a continuación el antiguo núcleo del intérprete de comandos del juego, en dos versiones (las operaciones necesarias son de bajo nivel y dependen de las interioridades de cada sistema Forth).
Versión para lina:
: evaluate_command ( ca len -- )
save set-src
begin (word) ?dup
while present ?dup if >cfa execute then
repeat drop restore ;
\ Analiza el comando, ejecutando las palabras reconocidas que contenga.
Versión para Gforth:
: (evaluate_command) ( -- )
begin parse-name ?dup
while find-name ?dup if name>int execute then
repeat drop ;
\ Analiza la fuente actual, ejecutando las palabras reconocidas que contenga.
: evaluate_command ( ca len -- )
['] (evaluate_command) execute-parsing ;
\ Analiza el comando, ejecutando las palabras reconocidas que contenga.
Descarga
Esta nueva versión de la aventura Asalto y castigo aún no está totalmente terminada, pero el código puede verse y descargarse en GitHub.