La aventura de Ug

Descripción del contenido de la página

Mini aventura conversacional experimental escrita en Abersoft Forth para la Sinclair ZX Spectrum.

Etiquetas:

Historia del programa

Empecé a escribir La aventura de Ug hacia 1988, como un sencillo experimento sobre cómo se crearía una aventura conversacional en Forth utilizando el propio intérprete de Forth, es decir, sin programar un intérprete específico para el juego, usando por tanto palabras de Forth para los comandos.

Las aventuras conversacionales siempre me han interesado mucho como programador. Por aquellos años estaba escribiendo Finen per Imago, en Z80 para ZX Spectrum. Al igual que con los juegos de acción, nunca me ha gustado mucho jugar con aventuras conversacionales, sino programarlas. Me interesan mucho por su relación con la inteligencia artificial: analizadores lingüísticos y representación de mundos virtuales...

Escribí La aventura de Ug en Abersoft Forth, el sistema Forth que más usé con la ZX Spectrum. Nunca se convirtió en un juego jugable y el fichero debió de perderse en uno de los innumerables cambios de soportes que hice a lo largo de los años... cintas de casete, discos Beta, discos DISCiPLE y finalmente ficheros TAP y otros para usar con emuladores... Por fortuna son muy pocos los programas que he perdido.

En el verano de 2009, recopilando material antiguo para publicar, encontré un viejo listado de La aventura de Ug, con sus pálidos caracteres de impresora matricial sobre papel continuo... Lo tecleé pacientemente en el Abersoft Forth bajo el emulador Fuse para que no volviera a perderse.

En enero de 2010 decidí terminar el programa, añadirle las funcionalidades que le faltaban y corregir sus errores.

Editar código Forth en 2010 con más incomodidad que en 1970

Lo más latoso de trabajar con Abersoft Forth es usar un editor de líneas típico de Forth y enfrentar la necesidad de meter con calzador todo el código fuente en sólo diez bloques (el primero, el número 0, no puede usarse para compilar código), pues ese es todo el espacio que el sistema ofrece, en forma de «disco RAM», como solución de compromiso para poder grabar el código fuente en cinta de casete.

Los editores de línea de Forth son muy potentes y eficaces, pero son muy incómodos en una pantalla que tenga menos de 64 columnas; la de la ZX Spectrum tiene 32, lo que supone que muchas veces el código no se lee bien o no cabe todo en la pantalla.

Eché en falta trabajar no ya con un editor de textos normal, sin las limitaciones de los bloques, sino al menos con el original sistema del Ace Forth de la Jupiter Ace, que prescinde de los clásicos bloques del Forth: permite editar las definiciones compiladas y sustituir cualquier entrada del diccionario por la última definición... ¡Una idea tan sencilla como eficaz!

Lo cierto es que para escribir La aventura de Ug he pasado más tiempo intentando ajustar el código fuente en las estrecheces de los bloques que programando.

He echado en falta la versión de Abersoft Forth para microductoras (los microdrives de Sinclair), pero al parecer nunca llegó a comercializarse. Hace meses escribí a John Jones-Steele, el autor de Abersoft Forth, tras localizar la empresa donde actualmente trabaja, preguntándole si él conservaba alguna copia de dicha versión, pero nunca recibí respuesta. Bajo un emulador de ZX Spectrum, trabajar con microductoras es cómodo. Un Forth que grabara y leyera cada bloque de código fuente en un fichero independiente en microductora o disquete sería mucho más cómodo y potente.

Hice una pequeña investigación y descubrí (en World of Spectrum, ¿dónde si no?) dos programas que podrían haberme sido muy útiles. Uno es Full Screen FORTH Editor, un editor de pantalla completa para Abersoft Forth; y otro Forth Microdrive Converter, un modificador de Artic Forth para hacerle usar microductoras en lugar de casetes. Por desgracia no se conserva ninguna copia de ellos, a pesar de que en su día sus autores los anunciaron en publicaciones y los vendieron por correo.

Artic Forth fue el primer sistema Forth que usé en la ZX Spectrum. Tenía un sistema muy útil para copiar cualquier texto de la pantalla en la línea de comandos, lo que facilitaba el trabajo interactivo con el intérprete. Pero su principal limitación es que sólo guardaba un bloque de código fuente en memoria, lo que obligaba a estar usando continuamente el casete y convertía la edición de programas en una pesadilla. Pero usando microductoras hubiera sido muy cómodo.

Así, edité el código fuente de La aventura de Ug con más estrecheces que el genio de Charles Moore a comienzos de los 1970. Pero fue muy interesante.

El argumento

El nombre de Ug es un homenaje al protagonista de las historietas de Hug, el troglodita, un peculiar personaje que aún recuerdo de cuando empecé a devorar historietas en la infancia.

En el mundo de este otro Ug, el de La aventura de Ug, no hay mucho que hacer salvo morir de aburrimiento o morir sin más. Como empecé diciendo, el programa es sólo un experimento de programación, por lo cual, aunque es jugable, no tiene gran interés.

La misión de Ug (en todas las aventuras hay una misión) consiste en encontrar un huevo y llevarlo a su cueva. En el prototipo de 1988 se trataba de un diamante. ¿Cómo no reparé en tamaño anacronismo? Y en cualquier caso, ¿qué utilidad tendría para Ug un diamante? Así que cambié el diamante por un huevo, que Ug puede comerse si quiere (aunque tendrá que ser en La aventura de Ug 2, pues la presente versión tiene un vocabulario muy reducido y no hay manera de comer nada). Resumiendo: Ug deberá salir de su cueva, encontrar el huevo, y regresar con él a su cueva.

En el diminuto mapa hay varios escenarios trampa, que provocan la muerte instantánea o hacen perder todos los objetos (los programadores de aventuras que hacen eso deberían ser colgados de los pulgares; salvo yo porque, como ya he explicado varias veces, La aventura de Ug es un experimento). También hay una serpiente cabreada, ante la cual la salud de Ug se resentirá seriamente a menos que antes haya encontrado un palo.

Por último, La aventura de Ug comparte algo más con esos juegos de aventuras a cuyos programadores deberían colgar de los pulgares: El juego siempre es igual. No hay nada elegido al azar. El mapa no cambia; y la serpiente, el palo y el huevo siempre están en los mismos sitios. Eso es algo que nunca entendí de la mayoría de los juegos de aventuras. No cuesta nada introducir el azar en el programa para darle mayor realismo e interés. Si yo no lo he hecho es porque (lo diré una vez más) este programita es un experimento sin pretensiones, y además porque ya casi no me cabía más código fuente en 10 KiB. Pero La aventura de Ug 2, que verá la luz cualquier década de estas, tendrá esa y otras mejoras.

En fin, tanto si logra su objetivo como si no, al final la única salida para que el pobre Ug ponga algo de acción en su aburrida vida es tirarse a un pozo o a un lago helado.

Vocabulario y sintaxis

La aventura de Ug sólo tiene tres órdenes y siete complementos (algunos de ellos con sinónimos) que internamente no son más que constantes de Forth que quedan en la pila. La palabra UG comprueba el contenido de la pila y ejecuta la orden correspondiente. Por tanto, la sintaxis para darle órdenes a Ug es: «ORDEN COMPLEMENTO UG». Ejemplos:

VE NORTE UG
AGARRA PALO UG
VETE SUR UG
DEJA PALO UG

Por capricho, he dado un toque de azúcar sintáctica, definiendo un par de artículos y preposiciones como palabras de Forth que no hacen nada. Aunque al bueno de Ug le da completamente igual, esto nos permite expresarnos más elegantemente:

VE HACIA EL SUR UG
RECOGE EL PALO UG
SUELTA LA SERPIENTE UG
VETE AL OESTE UG

Tampoco costaría nada crear sinónimos de los complementos terminados con una coma, pero no lo he hecho: VE HACIA EL NORTE, UG. También sería posible escribir una palabra UG, que leyera la entrada de texto que la sigue, para poder escribir: UG, VETE AL NORTE. Ambas ideas son interesantes y no se excluyen entre sí, pero tendrán que esperar a otra versión del programa o a otra aventura en Forth. La verdad es que en Forth todo es posible.

Órdenes

Complementos

Abreviaturas

Quien sepa Forth se habrá dado cuenta de que es trivial definir palabras que nos ahorren mucho trabajo, por ejemplo para movernos por el mapa (no importa si ya existen palabras con el mismo nombre en el vocabulario del sistema):

: N VE NORTE UG ;
: S VE SUR UG ;
: E VE ESTE UG ;
: O VE OESTE UG ;

Pantallazos

No hay mucho que ver de una aventura conversacional sin gráficos, pero ahí va:

Código fuente

Versión original de 1988, inacabada

Bloque 0

LA AVENTURA DE UG

Version: 1988, inacabada

Copyright (C) 1988 Marcos Cruz
http://programandala.net

Licencia/Permesilo/License:
http://programandala.net/licencia








Bloque 1

( VARIABLES )
: TASK ;
0 CONSTANT VE
1 CONSTANT DEJA
2 CONSTANT COGE
0 CONSTANT DIAMANTE
1 CONSTANT PALO
2 CONSTANT SERPIENTE
7 CONSTANT NORTE
4 CONSTANT SUR
5 CONSTANT ESTE
6 CONSTANT OESTE
0 VARIABLE SUJETO
0 VARIABLE VERBO
0 VARIABLE OBJETOS
0 VARIABLE LUGAR -->

Bloque 2

( MAPA )
: LLENAR
35 0 DO SALIDAS I + C! LOOP ;
0 0 0 6
7 0 0 5
0 8 9 4
5 0 9 6
4 6 8 2
0 5 7 1
0 0 6 0
1 3 5 0
0 2 4 0
LLENAR


-->

Bloque 3

( RUTSERPE )
: RUTSERPE
OBJETOS 2+ C@ LUGAR @ =
IF CR ." HAY UNA SERPIENTE VENENOSA QUE SE CABREA Y TE ATACA"
CR OBJETOS 1+ C@ 0=
IF ." PERO LE SACUDES UN PALAZO Y LA DEJAS TIESA"
10 OBJETOS 2+ C!
ELSE ." TE PEGA UN BOCADO Y LA PALMAS AL INSTANTE" QUIT
THEN
THEN
;




-->

Bloque 4

( PAISAJE )
: PAISAJE LUGAR @ CASE
0 OF ." ESTAS EN TU CUEVA"
OBJETOS C@ 0= IF CR ." LO CONSEGUISTE" QUIT THEN ENDOF
1 OF ." HAS ENTRADO EN EL PANTANO Y LA HAS PALMADO" QUIT ENDOF
2 OF ." HAS CAIDO EN UN POZO SIN FONDO" QUIT ENDOF
3 OF ." ESTAS EN UN CAMINO DESIERTO" ENDOF
4 OF ." ESTAS EN UN VALLE VERDE" ENDOF
5 OF ." ESTAS EN EL DESFILADERO DEL     OFIDIO" RUTSERPE ENDOF
7 OF ." ESTAS EN EL ATAJO DE LA COLINA" ENDOF
8 OF ." TE HAS AHOGADO EN UN LAGO HELADO" ENDOF
8 OF ." ESTAS EN LA GRUTA DEL DIAMANTE"
OBJETOS C@ IF CR ." EL BRILLO DEL DIAMANTE SAGRADO  TE
CIEGA LOS OJOS" THEN ENDOF
ENDCASE ;
-->

Bloque 5

    ( MOVER )
: MOVER
-3 SUJETO +!
SALIDAS LUGAR @ 4 * + SUJETO @ + C@ DUP 0=
IF CR ." NO HAY SALIDA POR AHI" DROP
ELSE 1 - LUGAR ! THEN
CR PAISAJE - ;

-->








Bloque 6

( DEJAR COGER NO )
: DEJAR
OBJETOS SUJETO @ + DUP C@ 0=
IF LUGAR @ SWAP C! CR ." DEJADO" CR
ELSE DROP CR ." NO LO TIENES"
THEN ;
: COGER
OBJETOS SUJETO @ + C@ DUP DUP 0=
IF DROP DROP CR ." YA LO TIENES"
ELSE LUGAR @ =
IF 0 SWAP C! CR ." COGIDO" CR
ELSE DROP CR ." NO LO VEO POR AQUI"
THEN THEN ;
: NO CR ." NO PUEDES HACER ESO" CR ;

-->

Bloque 7

( UG EMPEZAR )
: UG
SUJETO ! DUP DUP VERBO !
2 > SWAP 0 < OR NOT
IF VERBO @ CASE
0 OF 6 3 TEST IF MOVER ELSE NO THEN ENDOF
1 OF 1 0 TEST IF DEJAR ELSE NO THEN ENDOF
2 OF 1 0 TEST IF COGER ELSE NO THEN ENDOF
ENDCASE
CR ." Y AHORA QUE?" CR
ELSE CR ." NO ENTIENDO" CR
THEN ;
: EMPEZAR 0 LUGAR ! 8 OBJETOS C! 4 OBJETOS 1+ C! 8 OBJETOS 2+ C!
CLS ." BIENVENIDO A LA AVENTURA DE UG" CR PAISAJE ;

;S

Versión de 2010-01-29, terminada

Bloque 0

La aventura de Ug

Una aventura conversacional
troglodita y primitiva

Version: 2010-01-29

Escrita en Abersoft Forth
para la Sinclair ZX Spectrum

Copyright (C) 1988,2010 Marcos Cruz (http://programandala.net)

Licencia/Permesilo/License:
http://programandala.net/licencia
Instrucciones:
http://programandala.net/es.programa.la_aventura_de_ug

Bloque 1

( Cargador)
FORTH DEFINITIONS DECIMAL : TASK ;
: .TITULO ." La aventura de Ug" CR CR ;
CLS .TITULO ." Cargando..."
2 LOAD
3 LOAD
4 LOAD
5 LOAD
6 LOAD
7 LOAD
8 LOAD
9 LOAD
10 LOAD




Bloque 2

( Variables y utilidades)
0 VARIABLE LUGAR 0 VARIABLE ORDEN 0 VARIABLE COMPLEMENTO
7 CONSTANT #OBJETOS 0 VARIABLE OBJETOS #OBJETOS 2 - ALLOT
4 CONSTANT #SALIDAS ( puntos cardinales)
255 CONSTANT X ( punto cardinal sin salida)
254 CONSTANT MANO ( localizacion de objetos en inventario)
255 CONSTANT LIMBO ( localizacion de objetos eliminados)
4 CONSTANT COLOR 7 CONSTANT COLOR-ORDEN 2 CONSTANT COLOR-MUERTO
: DEPTH ( --u) SP@ S0 @ - -2 / ;
: OBJETO ( u--a) OBJETOS + ;
: AHI ( u1 u2--) OBJETO C! ; : CERRADA? ( a--f) X = ;
: DONDE ( u1--u2) OBJETO C@ ;
: AQUI? ( u--f) DONDE LUGAR @ = ;
: MIO? ( u--f) DONDE MANO = ;
: MIO ( u--) MANO SWAP AHI ;
: PAUSE KEY DROP ; : B- 0 BRIGHT ; : B+ 1 BRIGHT ;

Bloque 3

( Vocabulario)
0 DUP CONSTANT VE CONSTANT VETE
1 DUP DUP CONSTANT DEJA CONSTANT SUELTA CONSTANT TIRA
2 DUP DUP DUP
CONSTANT COGE CONSTANT TOMA CONSTANT AGARRA CONSTANT RECOGE
: LA ; : EL ; : HACIA ; : AL ;
0 DUP CONSTANT NORTE CONSTANT N
1 DUP CONSTANT SUR CONSTANT S
2 DUP CONSTANT ESTE CONSTANT E
3 DUP CONSTANT OESTE CONSTANT O
4 CONSTANT HUEVO 5 CONSTANT PALO 6 CONSTANT SERPIENTE
: .COMPLEMENTO ( u--) CASE N OF ." NORTE" ENDOF S OF ." SUR"
ENDOF E OF ." ESTE" ENDOF O OF ." OESTE" ENDOF
HUEVO OF ." HUEVO" ENDOF
PALO OF ." PALO" ENDOF SERPIENTE OF ." SERPIENTE" ENDOF
ENDCASE ;

Bloque 4

( Mapa)
0 CONSTANT CUEVA 1 CONSTANT PANTANO 2 CONSTANT POZO
3 CONSTANT CAMINO 4 CONSTANT VALLE 5 CONSTANT DESFILADERO
6 CONSTANT ATAJO 7 CONSTANT LAGO 8 CONSTANT GRUTA : X, X C, ;
0 VARIABLE (MAPA) ( cueva:) X, CAMINO C, X, X,
( pantano:) X, VALLE C, X, X, ( pozo:) X, X, X, X,
( camino:) CUEVA C, ATAJO C, VALLE C, X,
( valle:) PANTANO C, LAGO C, DESFILADERO C, CAMINO C,
( desfiladero:) POZO C, GRUTA C, X, VALLE C,
( atajo:) CAMINO C, GRUTA C, LAGO C, X, ( lago:) X, X, X, X,
( gruta:) DESFILADERO C, X, X, X,
: MAPA ( --a) (MAPA) 2+ ; : >MAPA ( u--a) #SALIDAS * MAPA + ;
: .SALIDA ( a u--) SWAP OVER + C@ CERRADA?
IF DROP ELSE .COMPLEMENTO SPACE THEN ;



Bloque 5

( Argumento)
: QUE COLOR-ORDEN PAPER QUIT ;
0 VARIABLE MUERTO : MUERE 1 MUERTO ! QUE ; : VIVE 0 MUERTO ! ;
: VIVO? MUERTO @ IF COLOR-MUERTO PAPER
CR ." UG HA MUERTO Y NO PUEDE OIRTE" SP!
CR ." QUIZA QUIERAS " B+ ." EMPEZAR" B- ."  OTRA VEZ" QUE THEN ;
: PELEA SERPIENTE AQUI?
IF CR ." LA SERPIENTE SE CABREA Y ME     ATACA"
CR PALO MIO? IF ." PERO LA GOLPEO CON EL PALO Y LA DEJO TIESA"
LIMBO SERPIENTE AHI
ELSE ." ME PEGA UN BOCADO Y LA PALMO AL INSTANTE" MUERE
THEN THEN ;
: OBJETIVO HUEVO MIO? IF CR ." LO CONSEGUI"
CR ." EL HUEVO YA ESTA EN MI CUEVA" QUE THEN ;
: PERDIDO LIMBO PALO AHI LIMBO HUEVO AHI
CR ." SI LLEVABA ALGO LO HE PERDIDO ENEL AGUA CENAGOSA" ;

Bloque 6

( Paisaje y cambio de lugar)
: .SALIDAS CR ." HAY SALIDA HACIA: " CR
LUGAR @ >MAPA #SALIDAS 0 DO DUP I .SALIDA LOOP DROP ;
: .E ." ESTOY EN " ; : .PAISAJE ( u--) CR CASE
CUEVA OF .E ." MI CUEVA" OBJETIVO ENDOF
PANTANO OF .E ." EL PANTANO" PERDIDO ENDOF
POZO OF ." CAIGO EN UN POZO SECO Y ME MATO" MUERE ENDOF
CAMINO OF .E ." UN CAMINO DESIERTO" ENDOF
VALLE OF .E ." UN VALLE VERDE" ENDOF
DESFILADERO OF .E ." UN DESFILADERO" ENDOF
ATAJO OF .E ." EL ATAJO DE LA COLINA" ENDOF
LAGO OF ." CAIGO AL LAGO HELADO Y MUERO" MUERE ENDOF
GRUTA OF .E ." LA GRUTA MISTERIOSA" ENDOF ENDCASE .SALIDAS ;
: .QUE CR ." Y AHORA QUE?" QUE ;



Bloque 7

( Movimiento y objetos presentes)
: SALIDA ( u1 u2--u3)
#SALIDAS * MAPA + + C@ ;
0 VARIABLE VISTO
: .VEO VISTO @ 0= IF CR ." VEO: " THEN 1 VISTO ! ;
: .VISTO ( u--) DUP AQUI?
IF .VEO .COMPLEMENTO ELSE DROP THEN ;
: .VISTOS 0 VISTO ! SERPIENTE 1+ HUEVO DO I .VISTO LOOP ;
: >LUGAR ( u--) DUP LUGAR ! .PAISAJE .VISTOS PELEA ;
: MOVER COMPLEMENTO @ LUGAR @ SALIDA DUP CERRADA?
IF DROP CR ." NO HAY SALIDA HACIA EL " COMPLEMENTO @
.COMPLEMENTO ELSE >LUGAR THEN ;





Bloque 8

( Manipular objetos)
: HECHO CR ." HECHO!" ;
: DEJAR COMPLEMENTO @ MIO?
IF LUGAR @ COMPLEMENTO @ AHI HECHO
ELSE CR ." NO LO TENGO!"
THEN ;
: COGER COMPLEMENTO @ MIO?
IF CR ." YA LO TENGO"
ELSE COMPLEMENTO @ AQUI?
IF COMPLEMENTO @ MIO HECHO
ELSE CR ." NO VEO ESO POR AQUI"
THEN THEN ;





Bloque 9

( Comprobaciones)
: FUERA? ( n1 n2 n3--f) DUP >R SWAP > SWAP R> SWAP < OR ;
: ENTRE? ( n1 n2 n3--f) FUERA? 0= ;
: COMPLEMENTO? ( n1 n2--f) COMPLEMENTO @ ENTRE? ;
: ORDEN? ( n1 n2--f) ORDEN @ ENTRE? ;
: PORTABLE? ( --f) HUEVO SERPIENTE COMPLEMENTO? ;
: DIRECCION? ( --f) NORTE OESTE COMPLEMENTO? ;
: NO CR ." NO PUEDO HACER ESO" ;
: FRASE? ( u1 u2--f) DEPTH 2 = IF COMPLEMENTO ! ORDEN !
VE COGE ORDEN? NORTE SERPIENTE COMPLEMENTO? AND
ELSE SP! 0 THEN ;






Bloque 10

( Principal)
: UG ( u1 u2--) COLOR PAPER VIVO? FRASE?
IF ORDEN @ CASE
VE OF DIRECCION? IF MOVER ELSE NO THEN ENDOF
DEJA OF PORTABLE? IF DEJAR ELSE NO THEN ENDOF
COGE OF PORTABLE? IF COGER ELSE NO THEN ENDOF
ENDCASE .QUE
ELSE CR ." NO ENTIENDO" CR
THEN ;
: COLORES 0 FLASH B- 0 GOVER 0 INK COLOR PAPER COLOR BORDER ;
: EMPEZAR COLORES CLS 0 LIST
GRUTA HUEVO AHI DESFILADERO SERPIENTE AHI VALLE PALO AHI
."   " B+ ." Pulsa una tecla para empezar" B- SPACE
PAUSE CLS .TITULO VIVE CUEVA >LUGAR .QUE ;
EMPEZAR


Descargas

Ficheros de cinta de casete virtual

Estos ficheros contienen el código fuente del programa, tal como lo graba Abersoft Forth en cinta de casete (11 KiB). Hay que usar cualquiera de ellos como fichero de cinta de entrada en un emulador bajo el que ya esté funcionando Abersoft Forth, usar el comando LOADT para cargarlo y a continuación 1 LOAD para compilarlo y arrancarlo.

Instantáneas del sistema

Estas instantáneas están tomadas cuando el juego ya ha sido compilado y arrancado y sólo espera la pulsación de una tecla para empezar.

Publico tres formatos diferentes, el más reciente y versátil SZX y los más antiguos SNA y Z80. Cualquiera de ellos, cargado en un emulador que lo acepte, permite empezar a jugar a La aventura de Ug de inmediato.