CAAD

Comunidad de Aventuras Conversacionales y Relatos Interactivos
Fecha actual 20 Ago 2017 12:48

Todos los horarios son UTC + 1 hora




Nuevo tema Responder al tema  [ 6 mensajes ] 
Autor Mensaje
NotaPublicado: 04 Jun 2014 13:13 
Desconectado
Grafista
Grafista
Avatar de Usuario

Registrado: 04 Sep 2008 17:23
Mensajes: 680
Quiero modificar las rutinas encargadas de imprimir los nombres de los objetos para que, además, creen hipervínculos a través de los que lanzar una acción por defecto (la acción "EXAMINAR", por ejemplo). Es decir, que la línea:
Código:
print "Puedes ver ", (the) jardin, ". En medio, ", (a) arbol, " bajo el que descansan ", (a) personas, " y ", (a) perro, ".";

se imprima de una forma más o menos de este tipo: «Puedes ver el jardín. En medio, un gran árbol bajo el que descansan unas personas y un perro Y que al pinchar sobre los hipervínculos se lance automáticamente la acción EXAMINAR <OBJ>.

¿Sabéis dónde hay que meter mano para poder hacer algo así?


Arriba
 Perfil  
 
NotaPublicado: 04 Jun 2014 13:49 
Desconectado
Semimomio
Semimomio
Avatar de Usuario

Registrado: 23 Abr 2004 08:49
Mensajes: 2884
Ubicación: España (Galicia)
Hola,

Citar:
se imprima de una forma más o menos de este tipo: «Puedes ver el jardín. En medio, un gran árbol bajo el que descansan unas personas y un perro.» Y que al pinchar sobre los hipervínculos se lance automáticamente la acción EXAMINAR <OBJ>.

¿Sabéis dónde hay que meter mano para poder hacer algo así?


Lo primero, tienes que compilar para Glulx, la máquina Z no te lo permite. Glulx tiene soporte para hiperlinks, aunque es bastante complicado. Si te fijas en el código fuente de la "Aventura Espacial" (donde se manejan hiperenlaces para las direcciones), te encontrarás con algo como esto:

Código:
Constant HL_SALIR   1;
Constant HL_ENTRAR  2;
Constant HL_NORTE   3;
Constant HL_SUR     4;
Constant HL_ESTE    5;
Constant HL_OESTE   6;
Constant HL_PROA    7;
Constant HL_POPA    8;
Constant HL_ESTR    9;
Constant HL_BABOR   10;
Constant HL_ARRIBA  11;
Constant HL_ABAJO   12;
Constant HL_GIRO    13;
Constant HL_AGIRO   14;

replace manageHyperlinks;
[ manageHyperlinks hl cmd obj;
! Retorna el comando equivalente a cada hipervínculo
    cmd = "";

    switch( hl ) {
        HL_SALIR:
            cmd = "sal";
            break;
        HL_ENTRAR:
            cmd = "entra";
            break;
        HL_NORTE:
            cmd = "norte";
            break;
        HL_SUR:
            cmd = "sur";
            break;
        HL_ESTE:
            cmd = "este";
            break;
        HL_OESTE:
            cmd = "oeste";
            break;
        HL_PROA:
            cmd = "proa";
            break;
        HL_POPA:
            cmd = "popa";
            break;
        HL_ESTR:
            cmd = "estribor";
            break;
        HL_BABOR:
            cmd = "babor";
            break;
        HL_ARRIBA:
            cmd = "sube";
            break;
        HL_ABAJO:
            cmd = "baja";
            break;
        HL_GIRO:
            cmd = "giro";
            break;
        HL_AGIRO:
            cmd = "antigiro";
            break;
        default:
            if ( hl >= HL_OBJ_BASE ) {
                obj = hl - HL_OBJ_BASE;
                cmd = obj;
            } else {
                cmd = "mirar";
            }

            break;
    }

    return cmd;
];


Para cada localidad, hice una respuesta particular para el comando salidas:

Código:
Espacio ZODE_S1___CAMARA_ESTANCA "ZODE S1 - Cámara estanca"
with
    grf grfCADES,
    description [;
        self.Habitacion::description();
        print "^La cámara estanca es un pequeño lugar de transición con dos puertas. Has entrado por una que ahora está cerrada, y también está la que se encuentra delante de ti.^";
        rtrue;
    ],
    out_to  ZOHA_S1__HANGAR,
    in_to   ZODE_S1___DESCOMPRESION,
    before [;
        salidas:
            print "Puedes ";
            setBeginHyperlink( HL_SALIR );
            print (s_fixed) "salir";
            setEndHyperlink();
            print " a los hangares, o ";
            setBeginHyperlink( HL_ENTRAR );
            print (s_fixed) "entrar";
            setEndHyperlink();
            print " al anillo, en la zona de descompresión.^";
            rtrue;
    ],
;


Finalmente, esas funciones especiales son más o menos sencillas:

Código:
[ setBeginHyperlink hlid;
    glk_set_hyperlink( hlid );
];

[ setEndHyperLink;
    glk_set_hyperlink( 0 );
];


Como puedes ver, es un auténtico fastidio andar a vueltas con los hiperenlaces. Se puede hacer, claro que sí, pero hay que montar una infraestructura importante. De hecho, verás que empecé a hacer algo parecido con los objetos, y al final quedó en nada. El inventario se ve en todo momento pero no tiene hiperenlaces.

Suerte.


PD: Ese problema no lo tienes ni con Kenshira ni con fi.js, oye ;-)

_________________
-- Baltasar, el arquero


Arriba
 Perfil  
 
NotaPublicado: 04 Jun 2014 14:16 
Desconectado
Implementador
Implementador

Registrado: 13 Feb 2005 18:57
Mensajes: 1854
El funcionamiento de los enlaces ya lo tratamos en su momento, baltasarq, y no creo que sea lo que pregunta.

Makinaimo, ¿algo como lo que dije allí valdría? viewtopic.php?f=12&t=5577
dddddd escribió:
También he experimentado con crear los enlaces justo con el nombre, en la propia definición de cada objeto (con self). Tiene la ventaja que siempre que se utilice el nombre (por ejemplo, también en la enumeración automática de objetos de una localidad) aparecerá como enlace.

Luego lo busco.


Arriba
 Perfil  
 
NotaPublicado: 04 Jun 2014 17:33 
Desconectado
Grafista
Grafista
Avatar de Usuario

Registrado: 04 Sep 2008 17:23
Mensajes: 680
Si, eso es; el mecanismo de los hipervínculos ya está montado. Lo que quiero es que siempre que se utilice el nombre del objeto se cree el hipervínculo, como dice dddddd. He probado a hacer algo pero no sé si es la mejor forma de hacerlo, ni si de esta forma cascará por algún lado: tengo una clase Thing para todos los objetos que creo en el modelo del mundo, con esta rutina short_name:

Código:
      short_name [;
         if (self provides real_name) {
            #Ifdef TARGET_GLULX;
            glk_set_hyperlink(self);
            #Endif; ! TARGET_GLULX;
            PrintOrRun(self, real_name);
            #Ifdef TARGET_GLULX;
            glk_set_hyperlink(0);
            #Endif; ! TARGET_GLULX;
            return true;
         }
         return false;
      ],

Así sólo habría que tener cuidado de que todos los objetos incluyan una propiedad real_name, cuya función sería la misma que la original de short_name.

Lo que quería saber es si las rutinas que imprimen los nombres de un objeto (como en print (name) obj;) se pueden modificar para meter esas líneas "glk_set_hyperlink()" dentro de ellas, en vez de andar caciqueando en la propiedad short_name y tener que andar inventando propiedades nuevas... no sé si me explico.


Arriba
 Perfil  
 
NotaPublicado: 04 Jun 2014 21:22 
Desconectado
Implementador
Implementador

Registrado: 13 Feb 2005 18:57
Mensajes: 1854
Mis pruebas iban en la línea del código que pones (sin entrar en tocar la clase). No tengo mucho que añadir al respecto, pero no tiene mala pinta. Estrategia parecida a include/nameable.h ¿no?

Makinaimo escribió:
Lo que quería saber es si las rutinas que imprimen los nombres de un objeto (como en print (name) obj;) se pueden modificar [...]
Todo será probar. Yo diría que parece más peligroso modificar (name), pero igual no hay problema. Tendrán que confirmarte los expertos informitas.

DM4 escribió:
Inform provides a stock of special printing rules built-in, and also allows the programmer to create new ones. The most important rules are:
(char)print out the character which this is the ZSCII code for
(string)print out this string
(address)print out the text of this dictionary word
(name)print out the name of this object (see §3)

Games compiled with the Inform library have several other printing rules built-in (like print (The) …), but as these aren't part of the Inform language as such they will be left until §26.

Cuando dicen "built-in" es posible que se refieran a que ésas también se definen a nivel de veneer, por si la librería no las proporciona, pero aquí estoy especulando y no creo que necesites llegar tan abajo.

Investigando un poco, y confirmando la cuestión en ifmud, el fichero clave de la librería es module/parserm.h:
zarf en ifmud escribió:
Código:
(Name) is PrintShortName(), (The) is CDefArt(), (the) is DefArt(), (A) is CInDefArt, (a) is InDefArt


Arriba
 Perfil  
 
NotaPublicado: 04 Jun 2014 21:46 
Desconectado
Grafista
Grafista
Avatar de Usuario

Registrado: 04 Sep 2008 17:23
Mensajes: 680
¡Genial! ¡Como siempre, muchas gracias por la ayuda 6ds!
He estado media tarde peleándome con ello y no terminaba de encontrar algo a gusto. Esta noche echo un ojo a esas rutinas.


Arriba
 Perfil  
 
Mostrar mensajes previos:  Ordenar por  
Nuevo tema Responder al tema  [ 6 mensajes ] 

Todos los horarios son UTC + 1 hora


¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado


No puede abrir nuevos temas en este Foro
No puede responder a temas en este Foro
No puede editar sus mensajes en este Foro
No puede borrar sus mensajes en este Foro

Buscar:
Saltar a:  
Desarrollado por phpBB® Forum Software © phpBB Group
Traducción al español por Huan Manwë para phpBB-Es.COM