lunes, 14 de julio de 2008

Aventuras para Speccy con Inferno

En la Kdd de Zaragoza 2008, presenté Inferno a todos los que estaban allí y todavía no lo conocían. Grendel se interesó por todos los lenguajes que Inferno (en realidad, txtMap), es capaz de generar. Se interesó mucho por "BAS", el plugin que genera la aventura en Basic.

El código está adaptado (ya que hay millones de varianes de Basic) a Blassic, un intérprete de BASIC que reclama compatibilidad con el mayor número de BASIC's posibles.

Entonces, comenté que podía servir para aquellos interesados en crear aventuras en BASIC para el Speccy, puesto que crea los DATA's con las conexiones entre localidades, las localidades y los objetos.

Grendel preguntó ... ¿podemos hacerlo? ... me dejó un poco descolocado, pero dije que sí, claro. Tenía instalado el BASIn, así que ¿por qué no intentarlo?

Generamos el código con Inferno, lo copiamos y lo pegamos en BASIn, y nos dió un error. Se trata de un error chorras, ya que genera dos líneas con el mismo número de línea: así que modificamos el número de línea y ya está.

La aventura se ejecutó, aparte de este problemilla (que estará arreglado en la siguiente versión de txtMap), sin ningún problema, excepto por un pequeño detalle: sólo se mostraba la primera letra de la descripción de cada localidad.

Esto es un problema de Blassic, que emula mejor el Microsoft Basic, digámoslo así, que el Sinclair Basic. Así, en Blassic, para crear un vector de MaxLocalidades, txtMap genera el siguiente código, compatible con Blassic:

6000 LET MaxLocalidades = 2: Dim H$(MaxLocalidades)





... para después cargar las descripciones de los DATA's .

Para el Sinclair BASIC, en realidad, es necesario hacer lo siguiente:

6000 LET MaxLocalidades = 2: Dim H$(MaxLocalidades, 255)





Curiosamente, en Sinclair BASIC es necesario hacer una tabla de caracteres, y no un vector de cadenas, cuando cada cadena individual no tiene límite de caracteres. Una curiosa decisión.

Por supuesto, esta segunda forma no es compatible con Blassic, que trataría de generar una tabla de cadenas, que no es lo que se persigue.

Una vez hecho esto, el código se ejecutó correctamente en BASIn, sin ningún problema.

Aquel que quiera hacer aventuras en Basic, pues ya sabe ... :-D

2 comentarios:

rockersuke dijo...

Incidentalmente, aparte de aplaudir que Inferno pueda hasta con el Basic de Spectrum, hay que decir que meter las descripciones de las localidades en matrices de cadenas es lo último que haría alguien con intención de hacer una aventura en Basic de Spectrum. No es que no se pueda hacer, que por supuesto sí se puede (y, de hecho, un servidor lo hacía en "En Busca De La Joya Encantada", claro que ahí no me quedaban más narices para poder gestionar todos los datos en 10 líneas de código ^_^') sino que cualquier ventaja que pudiera obtenerse de ello no compensaría un par de inconvenientes mayores:

-Duplicación del texto en la memoria: al meter el texto en una matriz en realidad lo estás metiendo dos veces, una en la zona de la memoria donde reside el código fuente y otra en la "zona de variables" del Spectrum. En otros entornos no sería un problema, pero en los 48 Ks del Speccy no es como para ir haciéndolo alegremente XDD. Se puede grabar el programa guardando las matrices de la zona de variables y suprimiendo el texto del listado, pero aparte de conllevar otros riesgos, no creo que esa precisamente fuera una posibilidad contemplada por Inferno.

-Gasto de espacio en memoria por cada descripción de localidad equivalente a la descripción más larga. El intérprete de Basic del Spectrum era muy versátil para otras cosas relacionadas con el manejo de cadenas, pero éste no era precisamente su fuerte. Cada elemento de la matriz alfanumérica consume impepinablemente la misma longitud, con lo que una descripción del tipo "Estás en una cueva y lo ves todo muy negro." se comería la misma memoria que otra que ocupase lo que el primer capítulo del Quijote... vamos, que se las iba uno a ver, ciertamente, muy negras para que su aventura tuviese más de un puñadito de localidades ;-)

Vamos, que cualquier otra vía siempre será más recomendable. ¡Otra cosa es que como reto a superar, lo de poder diseñar en Inferno para Spectrum sea una capacidad admirable en sí misma!

--

baltasarq dijo...

Supongo que el interesado podrá dividir su código entre los datas y el resto, y cargar primero los datas, cargar la info, y cargar entonces (con merge) el código del parser de la aventura (vamos, todo lo que no son descripciones y conexiones).

Con respecto al malgasto de memoria, es cierto, el Speccy consumirá la misma cantidad de memoria para cada descripción, sea cual sea su longitud. Si el pones 128 o 255 pues todas tendrán 128 o 255 de largo, las usen o no. De hecho, eso tiene relación con la diferencia comentada entre Blassic y Sinclair Basic.

De todas formas, si hay otra forma que sea portable, y que además no incurra en estos problemas, pues oye, soy todo orejas.