DrVanHalenFan escribió:
...hasta ahora, es decir,

Blauk ha dado con la respuesta... ¡pero se limita a dar un código a copypastear sin explicarnos lo que nos interesa saber de verdad, es decir, cómo acceder a esa longitud. Rastreando su código se puede ver que el meollo de la cuestión radica en pasar el resultado de la función "print (name)" aplicada a location a la rutina "PrintToBuffer" que anda escondida por parserm.h (ver
aquí (Z) y
aquí (Glulx)). Síííí señoooor, ¡ahí estaba el truco! ¡Muy bueno!
Exactamente

.
Me excuso por no explicarlo detalladamente, porque ando muy corto de tiempo, y creí que Makinaimo necesitaría el código pronto para no "desmoralizarse",

.
En fin, que sucede básicamente por esto: todas las funciones que vienen dentro de la rutina DrawStatusLine que copié vienen por defecto en Lib. 6/11 (que no en InformATE!) y son todas biplataforma (es por eso que he animado a Morgul a pasar InformATE! a Lib 6/11 para benificiarse de estas MUY UTILES rutinas y varias más). Además, ese código es exacto al de la StatusLine por defecto de 6/11, salvo que yo quité todos lo relacionado con la puntuación y otra hierbas y dejé sólo lo del título centrado.
El truco es el siguiente: no tenemos forma de acceder al título en la cabecera de un objeto (por medio de una propiedad) ni tenemos la seguridad de que el nombre siempre esté en short_name() [porque podría estar sólo en la cabecera del objeto]. Así que lo que tenemos que hacer es redirigir la salida de texto, cualquier texto que sea impreso en un momento determinado [ej: nombre de la localidad], hacia un buffer de texto (un array especial). Esto en Z se hace fácilmente, pero en Glulx es una cosa de diablos [el que no me crea, que mire la rutina PrintAnyToArray(), por dentro, que es la que usa PrintToBuffer() para funkar en Glulx]. En Z se redirige el texto hacia una salida especial, en Glulx hay que imprimir en la memoria... y otras cosas bien extrañas.
No me gusta reinventar la rueda, y Lib. 6/11 tiene varias rutinas biplataforma para hacerlo casi todo. Simplemente es cosa de usarlas y ya. PrintAnyToArray() es la forma de imprimir a un array, y es muy práctica porque te devuelve el número de caracteres impresos. Si quieres obtener sólo el numero de caracteres, y que el array no se modifique, le pones al segundo parámetro cero (el primero es el array). Lamentablemente, esta es sólo para Glulx. Pero para hacerlo portable, encapsularon su funcionalidad en PrintToBuffer(), que funka en Z y en Glulx.

, así que usamos esta.
Lo que hacemos es encapsular todo el código que "infiere" el nombre de la localidad en una rutina que devuelva texto [ImprimirNombreLocalidad()]. Y luego, le decimos a PrintToBuffer() que imprima a un array el texto "devuelto" por esa rutina. Usamos la cantidad de caracteres impresos devueltos por PrintToBuffer() para hacer el cálculo de la posición centrada... cambiamos el cursor a la posición deseada, y luego llamamos de nuevo a ImprimirNombreLocalidad() para que imprima "efectivamente" el nombre.

Esa es toda la ciencia.
Saludos!

P.S.1: No Balta, como habrás visto, no usa ninguna librería externa. Si así hubiera sido, hubiera indicado las dependencias inmediatamente antes de poner nada.
[EDITADO]P.S.2: También puede usarse la Barra.h para conseguir el mismo efecto. Entiendo que los valores de "disposición" pueden convertirse en rutinas y la librería los ejecutará. Si conviertes en rutina y metes dentro de la rutina el código para que se calcule el largo de texto con PrintToBuffer() debería funcionar también.
OJO: La rutina ImprimirNombreLocalidad() es muy importante: imprimir el nombre de la localidad no es simplemente hacer "print (name) location" y ya... hay que hacer una serie de comprobaciones menores, como se ve en la rutina, para evitar errores. Así que si usas barra, de todas formas deberías imprimir el nombre con ImprimirNombreLocalidad(). Saludos!