CAAD

Comunidad de Aventuras Conversacionales y Relatos Interactivos
Fecha actual 15 Nov 2019 23:04

Todos los horarios son UTC + 1 hora




Nuevo tema Responder al tema  [ 16 mensajes ]  Ir a página 1, 2  Siguiente
Autor Mensaje
NotaPublicado: 27 Feb 2011 21:25 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 23 Mar 2010 20:11
Mensajes: 1141
Ubicación: Valencia
Hola,

necesito una ayudita para evitar uno de los mensajes por defecto de Inform.

Tengo un objeto que lo he añadido al scope del jugador con add_to_scope para que pueda ser examinado desde cualquier localidad de la aventura.

Código:
>>ex sonidos
Oyes el llanto de un bebé. Parece que vienen del ala oeste de la Antares.
>>oeste
Vas al oeste
>>ex sonidos
Continuas oyendo los llantos del bebé. Vienen del otro lado de la puerta del Almacen O-14.


Para lo que quiero, me funciona perfectamente. Pero tengo un efecto secundario muy feo...

Como el objeto lo tengo en el scope del jugador en todo momento, lo puedo usar para cualquier cosa, y se producen cosas como esta:

Código:
>>abrir puerta con sonidos
(primero tratas de coger los sonidos)
Dificilmente podrás coger eso.


¿Cómo puedo hacer para que no trate de coger el objeto omnipresente? Solo quiero sobreescribir el comportamiento por defecto para dicho objeto (que no trate de cogerlo). Para el resto de objetos me sirve lo que hace por defecto.

Gracias!!

_________________
El humor existe para recordarnos que por muy alto que sea el trono en el que uno se siente, todo el mundo usa su culo para sentarse.


Arriba
 Perfil  
 
NotaPublicado: 28 Feb 2011 10:00 
Desconectado
Semimomio
Semimomio
Avatar de Usuario

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

Viendo el DM4, sección mensajes del sistema:

http://www.inform-fiction.org/manual/html/sa4.html

El mensaje que te molesta es el número 26 de Miscellany (si estás utilizando InformATE!, debes sustituir miscellany por miscelanea, before por antes, y LibraryMessages por MensajesLibreria). Por tanto:

Código:
object LibraryMessages
with
    before [;
        Miscellany:
            if ( lm_n == 26
              && noun == objSonidos )
           {
                print "Los sonidos son algo etéreo, y...^ ";
                rtrue;
            }
   ],
;


Y de esta forma evitas el mensaje en el caso de que se trate de "primero tratas...." para sonidos. Tal y como está, sin tocar nada más, debería mostrarte (no lo he probado): Los sonidos son algo etéreo y... Difícilmente podrías coger eso. Si quieres modificar el mensaje "difícilmente podrías coger eso", lo más sencillo es ir al objeto objSonidos y (cambia "take" por "coger" si usas InformATE!):

Código:
Object objSonidos
with
        ! más cosas...
        before [;
            Take:
                   "... lo etéreo no es tangible...";
        ],


Ahora saldría:

Código:
Los sonidos son algo etéreo y ... lo etéreo no es tangible...

_________________
-- Baltasar, el arquero


Arriba
 Perfil  
 
NotaPublicado: 28 Feb 2011 11:12 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 23 Mar 2010 20:11
Mensajes: 1141
Ubicación: Valencia
Muchas gracias!!

No había caido que existe el LibraryMessages... cosas de novato... :oops:

_________________
El humor existe para recordarnos que por muy alto que sea el trono en el que uno se siente, todo el mundo usa su culo para sentarse.


Arriba
 Perfil  
 
NotaPublicado: 28 Feb 2011 14:34 
Desconectado
Grafista
Grafista
Avatar de Usuario

Registrado: 04 Sep 2008 17:23
Mensajes: 745
Si el uso que das al objeto "sonidos" es tan sencillo como el que has puesto en el ejemplo, tal vez te interese más implementarlo en la rutina before de cada localidad, y ahorrarte implementar el objeto en sí.

Código:
Object   Ala_Oeste
 with     ! Aquí van más cosas....
           before [;
                   Listen:
                         "Continuas oyendo los llantos del bebé. Vienen del otro lado de la puerta del Almacen O-14.";
            ];
 has      light;

Y así quedaría algo de este estilo:

Código:
> escucha
Oyes el llanto de un bebé. Parece que viene del ala oeste de la Antares.

> oeste
Vas al oeste.

> escucha
Continuas oyendo los llantos del bebé. Vienen del otro lado de la puerta del Almacén O-14.


Arriba
 Perfil  
 
NotaPublicado: 28 Feb 2011 15:20 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 23 Mar 2010 20:11
Mensajes: 1141
Ubicación: Valencia
La verdad es que el uso va a ser bastante más complicado y requiero de un objeto.

He puesto un ejemplo muy sencillo para no dar ninguna pista sobre la aventura que podría presentar a la FICOMP. :lol:

_________________
El humor existe para recordarnos que por muy alto que sea el trono en el que uno se siente, todo el mundo usa su culo para sentarse.


Arriba
 Perfil  
 
NotaPublicado: 28 Feb 2011 17:15 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 24 Dic 2010 14:37
Mensajes: 929
Para InformATE tienes también mi viejo 'Sonidos', que incluía 'Ruidos' que tendrían la misma función que lo que estás pidiendo. Puedes inspirarte en el código o bien traducirla a INFSP.


Arriba
 Perfil  
 
NotaPublicado: 01 Mar 2011 00:23 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 23 Mar 2010 20:11
Mensajes: 1141
Ubicación: Valencia
Gracias a todos.

Igual lo de los sonidos no ha sido un buen ejemplo, pero era el que se me ha ocurrido rápidamente...

Pongo otro ejemplo más elaborado, que no tiene nada que ver con mi aventura (así no desvelo nada, jejeje), pero que el funcionamiento es el que quiero... y como lo he solucionado, por si alguien ve una manera mejor.

Un submarino nuclear... que ha tenido una avería y hay una fuga radioactiva...
Tengo un objeto "radiacion" que lo he añadido al scope del jugador, para que esté donde esté pueda examinar o medir la radiación.

Quiero que se puedan hacer cosas como:

Código:
>>ex radiacion
El contador geiger te indica que estás en peligro.
>>oeste
Vas al oeste
>>ex radiación
El contador geiger marca la zona amarilla.
>>sellar la radiación con la aleación de amianto y kriptonita.
Serás condecorado por tan valienta acción.
>>Coger radiación.
Todavía no se ha inventado nada con lo que coger radiación


Sin embargo, no quiero este comportamiento:

Código:
>>abrir compuerta con radiación
(primero tratas de coger la radiación)
[Action Take with noun 117684 (Radiacion)]
Todavía no se ha inventado nada con lo que coger radiación.


Toda esta historia la he solucionado con esto:
Código:
Object LibraryMessages
  with
    before [ ;
      Prompt:
        print "^>> ";
        rtrue;
      Miscellany:
        if (lm_n == 26 && lm_o == oRadiacion) {
            print "";
            give oRadiacion mal_uso_radiacion;
            rtrue;
        };
    ],
;

Cuando el parser trata de coger automáticamente la radiación, no escribo nada y le doy el atributo mal_uso_radiacion al objeto.
Código:
Object oRadiacion "Radiacion"
  with
    !names y descripciones bla, bla bla.
     before [ ;
       take: if (self has mal_uso_radiacion) {
               keep_silent=true;
               rfalse;
             }
             print "Todavía no se ha inventado nada con lo que coger radiación.";
             rtrue;
     ],
     after [ ;
       Take: move self to limbo;
             keep_silent=false;
             give self ~mal_uso_radiacion;
     ],
has female;

Antes de coger la radiación, si tiene el atributo de mal_uso_radiacion pongo el parser en modo silecioso (para que no salga lo de "Cogida") y dejo que siga la acción por defecto, que cogerá la radiación.
Si no tiene el atributo, muestro la frase de que no se puede coger y aborto la acción.
Después de coger la radiación, la devuelvo al limbo, quito el modo silecioso y le quito el atributo al objeto.

Con esto he conseguido el comportamiento que necesito, teniendo al alcance el objeto en cualquier momento del juego, pero no dejándolo usar para acciones en las que el objeto requiere ser cogido:

Código:
>>abrir compuerta con radiación
[Action Take with noun 117684 (Radiacion)]
[Action Open with noun 118196 (Compuerta) and second 117684 (Radiacion)]
Nunca conseguirás abrir la compuerta de esa manera.  --> Correcto! Me sale el mensaje del before open de la compuerta, sin abortar antes la ejecución al no poder coger la radiación.
>>coger radiación
Todavía no se ha inventado nada con lo que coger radiación. --> Correcto! Mensaje del before take de la radiación
>>ex radiación
El contador geiger marca la zona amarilla. --> Correcto! A pesar de coger la radiación y luego moverla al limbo, sigue estando en el scope del jugador.


Y ahora me someto a apedreamiento público... ¿he cometido alguna barbaridad y/o herejía con el código que he implementado?

_________________
El humor existe para recordarnos que por muy alto que sea el trono en el que uno se siente, todo el mundo usa su culo para sentarse.


Última edición por joruiru el 01 Mar 2011 15:27, editado 1 vez en total

Arriba
 Perfil  
 
NotaPublicado: 01 Mar 2011 08:52 
Desconectado
Guionista
Guionista
Avatar de Usuario

Registrado: 20 Ene 2007 20:09
Mensajes: 356
Buenas, Joruiru, ¿no es más fácil discriminar el objeto "radiación" de la "puerta con radiación" a nivel de parsing? (y confieso que igual no he entendido el problema ;)).

Me refiero a:

Código:
Object puerta "puerta al reactor" Dormitorio
with
   name 'puerta' 'al' 'del' 'reactor',
   adjectives 'con' 'radiactividad', // Aquí un adjetivo para diferenciar de la radiactividad a secas
   before [;
      Open: "Con la radiactividad extendiéndose por todo el buque, no parece una acción razonable abrir la puerta al reactor.";
   ]
has female scenery;

Object radiacion "radiación"
  with
    name 'radiacion' 'radiactividad',
    description [;
       if (location == Dormitorio)
          "Moviendo por la sala el detector Geiger, parece que el origen está en un lugar cerca de la puerta.";
       else
          "El detector Geiger indica una actividad muy por encima de lo recomendado.";
    ],
    before [;
       Take, Open, Close, Push: "La radiactividad es intangible.";
       
    ],
    found_in SalaDeMando Dormitorio,
    has female scenery
 ;


Por otra parte no te recomiendo utilizar los mensajes de la librería para esos menesteres, ya que estos deberían ser independientes del estado concreto del mundo (es mi opinión).


Arriba
 Perfil  
 
NotaPublicado: 01 Mar 2011 09:12 
Desconectado
Semimomio
Semimomio
Avatar de Usuario

Registrado: 24 Ago 2007 00:41
Mensajes: 2023
Ubicación: Chile
Yo conseguía el efecto que quieres hace tiempo, cuando escribí Dalubi (ya no disponible online). En Dalubi había un objeto *mágico*, que estaba presente en todas las habitaciones de tu juego (sin hacer nada especial a nivel de código) y que te listaba las salidas disponibles. Lo interesante es que conseguí un comportamiento relativamente limpio (a nivel de código) para que fuera imposible coger el objeto bajo ninguna circunstancia y para que no se asumiera su presencia ni se apareciera en ningún caso en las inferencias del parser ni en los "coger todo".

Buscaré el código más tarde, porque es de madrugada y dormiré. Cuando lo pille te lo copio para que compares.

Y sobre si es tu solución es "limpia" o no: DESPREOCÚPATE. Mientras funcione, todo bien. ;)

Saludos. :mrgreen:

_________________
Eliuk Blau
eliukblau (AT) gmail.com
http://www.caad.es/eliukblau/


Arriba
 Perfil  
 
NotaPublicado: 01 Mar 2011 09:35 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 23 Mar 2010 20:11
Mensajes: 1141
Ubicación: Valencia
Mastondon... "puerta con radiación" no era un objeto... Era una orden del tipo "sellar objeto compuerta con el objeto radiación" para ver que como el objeto "radiación" es omnipresente, lo puedo usar en cualquier lugar.

El comportamiento feo viene porque en las gramáticas de los verbos, en algunos el segundo objeto está definido como "held", por lo que el parser trata de cogerlo antes, y como el objeto "radiación" no permite cogerse, aborta la acción completa y no me llega a tratar el objeto que realmente es el de la acción principal.

Gracias Eliuk. Sí que me interesa ver tu código para aprender.

_________________
El humor existe para recordarnos que por muy alto que sea el trono en el que uno se siente, todo el mundo usa su culo para sentarse.


Arriba
 Perfil  
 
NotaPublicado: 01 Mar 2011 09:54 
Desconectado
Semimomio
Semimomio
Avatar de Usuario

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

Joruiru, el único problema que le veo a tu solución (que se basa en lo que contesté antes, lo sé), es que el objeto radiacion o sonidos o lo que sea es susceptible de ser manejado por otras acciones, como por ejemplo, cuando metes todo en una mochila. Aunque suene increíble, la acción meter no pasa por coger, aunque parezca estúpido (bueno, si ya lo tienes, no hay por qué cogerlo).

En fin, que debes "filtrar" las acciones para dejar sólo aquellas a las que quieras responder (en mi opinión). El react_before del objeto es un buen sitio:

Código:
Object radiacion "radiación"
  with
    name 'radiacion' 'radiactividad',
    description [;
       if (location == Dormitorio)
          "Moviendo por la sala el detector Geiger, parece que el origen está en un lugar cerca de la puerta.";
       else
          "El detector Geiger indica una actividad muy por encima de lo recomendado.";
    ],
    react_before [;
       if ( action == ##Examine ) {
           rfalse;
       } else {
           "No se puede hacer tal cosa con algo intangible como la radiación";
       }
    ],
    found_in SalaDeMando Dormitorio,
    has female scenery
;


Ahora ya puedes estar bastante seguro de que no va a haber ningún comportamiento extraño con verbos imprevistos, como por ejemplo "probar radiacion", "saborear radiacion", "tocar radiacion", que devolverían mensajes por defecto que resultarían inapropiados.

_________________
-- Baltasar, el arquero


Arriba
 Perfil  
 
NotaPublicado: 01 Mar 2011 10:52 
Desconectado
Guionista
Guionista
Avatar de Usuario

Registrado: 20 Ene 2007 20:09
Mensajes: 356
joruiru escribió:
Mastondon... "puerta con radiación" no era un objeto... Era una orden del tipo "sellar objeto compuerta con el objeto radiación" para ver que como el objeto "radiación" es omnipresente, lo puedo usar en cualquier lugar.

En ese caso sólo se me ocurre aplicar lo que ha dicho Baltasar o reescribir las gramáticas sobre "held" de las acciones afectadas para que vayan sobre objetos "no tenidos".

Quizás si explicas el caso concreto se podría buscar una solución óptima.


Arriba
 Perfil  
 
NotaPublicado: 01 Mar 2011 21:02 
Desconectado
Semimomio
Semimomio
Avatar de Usuario

Registrado: 24 Ago 2007 00:41
Mensajes: 2023
Ubicación: Chile
joruiru escribió:
El comportamiento feo viene porque en las gramáticas de los verbos, en algunos el segundo objeto está definido como "held", por lo que el parser trata de cogerlo antes, y como el objeto "radiación" no permite cogerse, aborta la acción completa y no me llega a tratar el objeto que realmente es el de la acción principal.

Gracias Eliuk. Sí que me interesa ver tu código para aprender.


Sí, a veces un objeto puede romper completamente la cadena de acciones, lo cual es bastante irritante, la verdad. En mi código que te comenté, he conseguido evitar ese comportamiento.

Acá va:

Código:
!===============================================================================
! BONUS: MAGIAS UTILES
!-------------------------------------------------------------------------------
! Si se ha definido la constante DALUBI_MOSTRAR_SALIDAS en el codigo del
! juego, este 'objeto magico' mostrara siempre todas las salidas que tenga
! la localidad actual en la que se encuentre el jugador. Esta magia fue
! inspirada del codigo de 'Grendel', 'Zak' y 'Ceotan' en el modulo
! 'salidas.h' (para InformATE!). He realizado un gran retoque del codigo
! original para que ahora el objeto flotante que lista las salidas no pueda
! ser manipulado de ninguna forma por el jugador. NOTA: aprovecho el atributo
! 'neuter' para que no se le asocien pronombres a este objeto (en español no
! hay genero neutro... bueno, casi, salvo algunas abstracciones y pronombres
! encliticos 'lo/los/le/les' pero en el caso de cualquier nombre
! (sustantivo-adjetivo-verbo) se usa masculino o femenino
#ifdef DALUBI_MOSTRAR_SALIDAS;
  Object Dalubi_MuestraSalidas
    with
      ! el objeto va a estar en todas las localidades
      found_in [; rtrue; ],
      ! hacemos salto de linea y mostramos las salidas
      describe [; new_line; <<salidas>>; ],
      ! cada turno el objeto sera ocultado (por si acaso ^_^)
      each_turn [; give self concealed; ],
      ! ante toda accion <Mirar/Ir> el objeto sera 'desocultado'
      react_before [;
        Look,Go: give self ~concealed;
      ],
      ! despues de toda accion el objeto se ocultara (menos en accion <Go>)
      ! (util en los caso de cadenas de acciones [EJ: 'COGE TODO'])
      react_after  [;
        Go: rfalse;
        default: give self concealed;
      ],
    has
      ! neuter: no le asociara pronombres; static: no sera manipulado
      neuter static;
#endif; ! DALUBI_MOSTRAR_SALIDAS


Saludos! :mrgreen:

_________________
Eliuk Blau
eliukblau (AT) gmail.com
http://www.caad.es/eliukblau/


Arriba
 Perfil  
 
NotaPublicado: 03 Mar 2011 20:03 
Desconectado
Archivero
Archivero

Registrado: 08 Sep 2008 22:04
Mensajes: 274
Y como siempre, Inform ofrece varias vías para conseguir un mismo objetivo. Otra que puedes explorar es usar el punto de entrada "InScope" (pag 235 del manual inglés, conocido como "AlAlcance" en InformATE). En él puedes alterar las reglas de alcance cada turno según el criterio que quieras. Uno de estos criterios puede ser la acción que vaya a llevarse a cabo... lo que significa que puedes determinar que en cualquier momento un objeto esté disponible para unas acciones y no para otras. Para hacer que el objeto "radiacion" esté al alcance de la acción "Examinar" y no lo esté para ninguna otra bastaría con añadir esta rutina "InScope":

Código:
[InScope ;
   if(action_to_be == ##Examine) PlaceInScope(radiacion);
   rfalse;
];


-Se usa "action_to_be" en lugar de la comunmente utilizada "action" ya que en las llamadas a InScope el valor definitivo de "action" aún no está establecido (el parser "se está pensando" si la acción va a ser esa o no)

-La función PlaceInScope pone el objeto deseado al alcance. Los alcances se actualizan cada turno siguiendo las reglas estandar, luego el cambio que hagamos sólo afecta a los turnos en los que la acción vaya a ser "Examinar" y nunca en ningún otro caso.

-Retornar rfalse es necesario para que el parser aplique los alcances normales al resto de objetos presentes.

-Con este método la respuesta a "Abrir puerta con radiación" será directamente la habitual de "No veo eso que dices" sin que se intente coger la radiación en ningún momento.

-En este ejemplo se cambia el alcance si la acción va a ser "Examinar", pero la condición puede ser cualquier otra (o combinaciones de varias) que se te ocurra: que el jugador esté en determinados lugares, que sea determinada hora, que la acción sea "Examinar" Y el contador geiger esté a mano, etc...

--


Arriba
 Perfil  
 
NotaPublicado: 03 Mar 2011 20:40 
Desconectado
Implementador
Implementador

Registrado: 09 Jun 2010 14:50
Mensajes: 1655
Ubicación: Argentina
DrVanHalenFan escribió:
Y como siempre, Inform ofrece varias vías para conseguir un mismo objetivo. Otra que puedes explorar es usar el punto de entrada "InScope" (pag 235 del manual inglés, conocido como "AlAlcance" en InformATE). En él puedes alterar las reglas de alcance cada turno según el criterio que quieras. Uno de estos criterios puede ser la acción que vaya a llevarse a cabo... lo que significa que puedes determinar que en cualquier momento un objeto esté disponible para unas acciones y no para otras. Para hacer que el objeto "radiacion" esté al alcance de la acción "Examinar" y no lo esté para ninguna otra bastaría con añadir esta rutina "InScope":

Código:
[InScope ;
   if(action_to_be == ##Examine) PlaceInScope(radiacion);
   rfalse;
];


-Se usa "action_to_be" en lugar de la comunmente utilizada "action" ya que en las llamadas a InScope el valor definitivo de "action" aún no está establecido (el parser "se está pensando" si la acción va a ser esa o no)

-La función PlaceInScope pone el objeto deseado al alcance. Los alcances se actualizan cada turno siguiendo las reglas estandar, luego el cambio que hagamos sólo afecta a los turnos en los que la acción vaya a ser "Examinar" y nunca en ningún otro caso.

-Retornar rfalse es necesario para que el parser aplique los alcances normales al resto de objetos presentes.

-Con este método la respuesta a "Abrir puerta con radiación" será directamente la habitual de "No veo eso que dices" sin que se intente coger la radiación en ningún momento.

-En este ejemplo se cambia el alcance si la acción va a ser "Examinar", pero la condición puede ser cualquier otra (o combinaciones de varias) que se te ocurra: que el jugador esté en determinados lugares, que sea determinada hora, que la acción sea "Examinar" Y el contador geiger esté a mano, etc...

--

No sé programar más que algunas cositas en Inform, pero por lo que aquí fui leyendo me parece que esta solución es la mejor de las propuestas. De todas formas, es Joruiru quien decidirá qué solución hace un mejor equilibrio entre facilidad de implementación y funcionalidad.


Arriba
 Perfil  
 
Mostrar mensajes previos:  Ordenar por  
Nuevo tema Responder al tema  [ 16 mensajes ]  Ir a página 1, 2  Siguiente

Todos los horarios son UTC + 1 hora


¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 4 invitados


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:  
cron
Desarrollado por phpBB® Forum Software © phpBB Group
Traducción al español por Huan Manwë para phpBB-Es.COM