Ventanas GlkCómo hacer cosas con Glulx InformBlorbTest de capacidades

Test de capacidades

Imagina que tienes un juego que transcurre en una ciudad del salvaje Oeste, y que cuando el protagonista entra a la ciudad, pasa junto a un cartel que dice "Perro Muerto, Kansas, Población 213" con la pintura gastada sobre un madero estropeado y acribillado a balazos. El jugador sin embargo no sabe lo que pone hasta que no ordena "EXAMINA CARTEL", la descripción del lugar simplemente tiene la línea "Aquí ves un cartel" o algo así, para indicar que está ahí. Y digamos que tienes una magnífica imagen de un estropeado cartel con balazos. Lo ideal sería que pudieras mostrar la imagen si el intérprete que usa el jugador puede manejar gráficos, o imprimir un párrafo describiendo el cartel si no. Para esto sirve glk_gestalt() Hay como una docena de cosas que puedes testear. En este ejemplo, la constante a usar sería gestalt_Graphics, y el código del cartel sería más o menos así:

Object  cartel "cartel erosionado"
 with   nombre 'cartel' 'erosionado',
        descripcion [;
            if (glk_gestalt(gestalt_Graphics, 0))
            {
                ! Aqui iría el código para mostrar el gráfico
            } else
                "El cartel dice ~PERRO MUERTO, KANSAS, POBL. 213.~ O
                quizás ponía 2130, o 21300, alguien ha volado la
                esquina del cartel de un disparo.";
        ],
 has    estatico; 

Observa el 0 en la llamada a glk_gestalt - es obligatorio, porque glk_gestalt siempre requiere dos parámetros, incluso si el segundo no se necesita como en este caso. He aqui algunas constantes que puedes usar con glk_gestalt:
Constante Segundo parámetro Qué retorna
gestalt_Version 0 Un número de 32 bits que lleva codificado el número de versión de Glk (los 16 primeros bits, el número de versión mayor, los 8 siguientes el número menor y los 8 últimos el número sub-menor, de modo que la versión 0.6.1 se codificaría como 00000601
gestalt_CharOuput código de un carácter Esto es para comprobar si el intérprete es capaz de mostrar un carácter determinado (como la ñ). El resultado es uno de tres posibles valores: gestalt_CharOuput_ExactPrint si puede mostrarlo, gestalt_CharOutput_CannotPrint si no puede, o gestalt_CharOutput_ApproxPrint si lo cambia por algo parecido (por ejemplo n en vez de ñ)
gestalt_LineInput código de un carácter Como el anterior, pero para comprobar si ese carácter es admitido durante la lectura de una línea (o sea, la entrada que es procesada después de haber pulsado Intro)
gestalt_CharInput código de un carácter Como el anterior, pero para comprobar si ese carácter es admitido durante la lectura de una tecla (un tipo de entrada en el que sólo se procesa un carácter de cada vez)
gestalt_MouseInput tipo de ventana 1 si se soporta la entrada desde ratón, 0 si no
gestalt_Timer 0 1 si se soporta el tiempo real, 0 si no
gestalt_Graphics 0 1 si se soportan gráficos, 0 si no
gestalt_DrawImage tipo de ventana Este es para probar específicamente si se pueden colocar imágenes en un tipo concreto de ventana (wintype_TextBuffer o wintype_Graphics): 1 si se puede, 0 si no
gestalt_GraphicsTransparency 0 Esta es para comprobar si las imágenes PNG con zonas transparentes aparecerán realmente con la transparencia funcionando como debe. 1 si es así, 0 si no
gestalt_Sound 0 1 si hay sonido disponible, 0 si no
gestalt_SoundMusic 0 1 si se puede interpretar música MOD, 0 si no (esto puede retornar cero incluso si glk_gestalt(gestalt_Sound, 0) retornó 1 - en este caso sólo se soportan efectos de sonido AIFF
gestalt_SoundVolume 0 1 si funciona la función glk_schannel_set_volume(), 0 si no
gestalt_SoundNotify 0 1 si se puede hacer que HandleGlkEvent() ejecute el código que el programador desee en el momento que un sonido finaliza, 0 si no
gestalt_Hyperlinks 0 1 si se soportan los hipervínculos, 0 si no
gestalt_HyperlinkInput tipo de ventana 1 si los hipervínculos están soportados en ese tipo concreto de ventana, 0 si no.
Las siguientes secciones explicarán cómo sacar partido de estas capacidades - pero a cuando leas esas secciones, recuerda que antes de mostrar una imagen, o tocar música, o declarar un hipervínculo, o lo que sea, debes antes usar glk_gestalt() para comprobar si el intérprete del jugador puede hacer esas cosas. Si no, necesitarás preparar las cosas de forma alternativa - descripciones textuales de las imágenes, ese tipo de cosas - o al menos mostrar un mensaje advirtiendo al jugador de qué capacidades necesitaría en su intérprete para poder jugar tu juego. Idealmente, deberías hacer una llamada a glk_gestalt cada vez que fueras a usar una de las características opcionales de Glk - si solo haces la comprobación en Inicializar, te estás buscando problemas, si por ejemplo, el jugador comienza un juego en su lujoso ordenador de sobremesa, después guarda la partida y la carga de nuevo en su Palm para jugar en el avión más tarde. (Esto no implica necesariamente tener que escrbir un montón de glk_gestalt() - puedes por ejemplo crear una rutina MiDibujarGlk(), que haga las comprobaciones necesarias y después muestre la imagen en la forma que quieras)


Ventanas GlkCómo hacer cosas con Glulx InformBlorbTest de capacidades