CAAD

Comunidad de Aventuras Conversacionales y Relatos Interactivos
Fecha actual 11 Jul 2020 06:27

Todos los horarios son UTC + 1 hora




Nuevo tema Responder al tema  [ 48 mensajes ]  Ir a página 1, 2, 3, 4  Siguiente
Autor Mensaje
NotaPublicado: 16 Sep 2005 03:35 
Desconectado
Yiepp
Yiepp
Avatar de Usuario

Registrado: 07 Sep 2005 04:45
Mensajes: 54
Ubicación: Cerca de Barcelona
Hola

Estoy intentando hacer un sinónimo, pero la gramática es lo que peor se me da de inform, como a todos, supongo. Tengo delante el manual original para asegurarme que no me dejo nada (por los trocitos no traducidos al documentate) y gramatica.h, acciones.h, Eparser.h (etc, incluso fhablaoo.h)pero aún así­ no me salgo.

Intenté buscar en google groups RAIF, pero no doy con lo necesario.

Quiero conseguir un sinónimo que sea:

recordar [tema]

y sea equivalente a consultar [tema] en memoria

Probé esto, y lo único que hace es que recordar sea sinónimo de consultar, y funciona si solo tienes tu memoria.
Código:
Verb 'recuerda' = 'consulta';
VerboIrregular "recordar" with imperativo 'recuerda';


Luego se me ocurrió:
Código:
[ RecordarSub;
!   memoria.Consultar(uno);
   <<Consultar uno memoria>>;
];

Verb 'recuerda'
   *            -> Recordar;
   * topic         -> Recordar;
VerboIrregular "recordar" with imperativo 'recuerda';


Todo muy bonito, pero, no he conseguido de ninguna manera llamar en RecordarSub a Consultar uno en memoria. ¿cómo serí­a?

No hay forma fácil en inform de hacer que si el jugador teclea algo especí­fico, pase alguna otra cosa???


Arriba
 Perfil  
 
 Asunto: Al revés
NotaPublicado: 16 Sep 2005 07:21 
Desconectado
Semimomio
Semimomio
Avatar de Usuario

Registrado: 15 Dic 2004 21:28
Mensajes: 2302
Serí­a:

Código:
<<consultar memoria uno>>;


Arriba
 Perfil  
 
NotaPublicado: 16 Sep 2005 10:03 
Desconectado
Grafista
Grafista

Registrado: 09 Mar 2004 17:20
Mensajes: 504
presi escribió:
Serí­a:

Código:
<<consultar memoria uno>>;


Puees, mirándolo desde el curro y con grave riesgo de meter la pata, dirí­a que el "orden" es correcto, pero hay un error de bulto anterior.

Tened en cuenta que en la lógica de la gramática de "consultar" el "uno" es el objeto en el que se consulta... y no hay "otro" (o "second" en la inglesa).

Es decir, que si vamos a hacer que:

Citar:
recordar "lo que sea"


sea sinónimo de (o lo llame desde su rutina):

Citar:
consultar "lo que sea" en memoria


hay que tener en cuenta que lo que la librerí­a asume son los siguientes supuestos:

-que hay un objeto "memoria" al alcance del jugador al que va a referenciar como "uno"

-Y que este objeto "memoria" va a interceptar en su rutina "antes" la acción "consultar" dejando en manos del autor la responsabilidad de meter ahí­ una rutina de parsing que se encargue de analizar la cadena de texto "lo que sea" en busca de cualquier cosa que le interese. Para ayudarle un "poquito" en ello, el token de gramática "topic" ha ajustado las variables "consultar_desde" y "consultar_num_palabras"... y a partir de ahi el programador que se busque la vida :?

El verdadero error de Bruce ha sido asumir que una linea de gramatica como "recordar <topic>" iba a meter en "uno" lo que hubiera en topic, cuando el token "topic" lo que hace es "tragarse lo que le echen sin rechistar" sin adjudicar valores ni a "uno" ni a "otro"

Sip, la vida es dura a veces... :roll:


Arriba
 Perfil  
 
NotaPublicado: 16 Sep 2005 14:34 
Desconectado
Semimomio
Semimomio
Avatar de Usuario

Registrado: 15 Dic 2004 21:28
Mensajes: 2302
Radio Marte Libre escribió:
hay que tener en cuenta que lo que la librerí­a asume son los siguientes supuestos:

-que hay un objeto "memoria" al alcance del jugador al que va a referenciar como "uno"


Sí­, eso lo daba por supuesto ya que es lo más lógico desde el punto de vista de la orientación a objetos, que haya un objeto memoria que contenga los elementos para recordar, en lugar de colocar esos elementos directamente en la rutina de acción recordar.

Radio Marte Libre escribió:
-Y que este objeto "memoria" va a interceptar en su rutina "antes" la acción "consultar" dejando en manos del autor la responsabilidad de meter ahí­ una rutina de parsing que se encargue de analizar la cadena de texto "lo que sea" en busca de cualquier cosa que le interese. Para ayudarle un "poquito" en ello, el token de gramática "topic" ha ajustado las variables "consultar_desde" y "consultar_num_palabras"... y a partir de ahi el programador que se busque la vida :?

El verdadero error de Bruce ha sido asumir que una linea de gramatica como "recordar <topic>" iba a meter en "uno" lo que hubiera en topic, cuando el token "topic" lo que hace es "tragarse lo que le echen sin rechistar" sin adjudicar valores ni a "uno" ni a "otro"


Cierto, en ese caso, aunque la llamada a la acción consultar con memoria y uno funcionarí­a, no hace falta poner el uno, quedarí­a entonces:

Código:
<<consultar memoria>>


simplemente.


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 16 Sep 2005 16:01 
Desconectado
Yiepp
Yiepp
Avatar de Usuario

Registrado: 07 Sep 2005 04:45
Mensajes: 54
Ubicación: Cerca de Barcelona
¡<<consultar memoria uno>> y <<consultar memoria>> funcionan!

O sea, que me equivoqué en el orden, y eso me llevó a la frustación y a pelearme durante hora y media con inform... pero no se me ocurrió este orden.

Pero si se teclea recordar a secas, peta... por lo que intenté:

Código:
[ RecordarSub;
   if (uno == nothing) print_ret "Utiliza: recordar [tema], con [tema] siendo una sola palabra.";
   else
      <<Consultar memoria>>;
];

Verb 'recuerda'
   *              -> Recordar
   * topic        -> Recordar;
VerboIrregular "recordar" with imperativo 'recuerda';



Y no va... siempre entra en "Utiliza: recordar"... como se ha dicho, uno no tiene nada... ¿pero donde está el topic metido, entonces?

Por ahora lo he arreglado a lo bestia/cutre: dos funciones diferentes y que le den a la gramática.

¡Gracias por vuestras respuestas!


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 16 Sep 2005 17:48 
Desconectado
Yiepp
Yiepp
Avatar de Usuario

Registrado: 07 Sep 2005 04:45
Mensajes: 54
Ubicación: Cerca de Barcelona
consultar_desde y consultar_num_palabras tienen un comportamiento extraño.

Mi objeto memoria es básicamente el diccionario de ruinas.

Ahora ya tengo recordar como sinónimo... puesto todo en una sola rutina:

Código:
[ RecordarSub;
   print consultar_desde, ".^";
   print consultar_num_palabras, ".^";
   if (consultar_desde == 0)
      print_ret "Utiliza: recordar [tema], con [tema] siendo una sola palabra.";
   else
      <<Consultar memoria>>;   
];



Ahora al menos ya no peta, y la primera vez sale el mensaje adecuado:

> recordar
0
0
utiliza: recordar [tema]

> recordar
0
0
utiliza: recordar [tema]

> recordar sidhe
2
1
Sidhe: "Una poderosa raza..."

> recordar
2
1
De eso no te acuerdas. ! [el mensaje por defecto de consultar]

¿Parece que no está actualizando las variables?

Si utilizo más palabras, aumenta la cuenta, y sigue así­ en recordar. Cambia un poco el efecto:

> recordar el sidhe
2
2
Sidhe: "Una..."

> recordar
2
2
Busca <nombre del conocimiento> en memoria. ! [ ayuda ]

Extraño comportamiento...


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 16 Sep 2005 18:23 
Desconectado
Grafista
Grafista

Registrado: 09 Mar 2004 17:20
Mensajes: 504
Brucehum escribió:
¡<<consultar memoria uno>> y <<consultar memoria>> funcionan!

O sea, que me equivoqué en el orden, y eso me llevó a la frustación y a pelearme durante hora y media con inform... pero no se me ocurrió este orden.

Pero si se teclea recordar a secas, peta... por lo que intenté:

Código:
[ RecordarSub;
   if (uno == nothing) print_ret "Utiliza: recordar [tema], con [tema] siendo una sola palabra.";
   else
      <<Consultar memoria>>;
];

Verb 'recuerda'
   *              -> Recordar
   * topic        -> Recordar;
VerboIrregular "recordar" with imperativo 'recuerda';



Y no va... siempre entra en "Utiliza: recordar"... como se ha dicho, uno no tiene nada... ¿pero donde está el topic metido, entonces?

Por ahora lo he arreglado a lo bestia/cutre: dos funciones diferentes y que le den a la gramática.

¡Gracias por vuestras respuestas!


Una opción plenamente válida, aunque... ¡Truco del almendruco!

Código:
[RecordarSub;
   switch (num_palabras)
   {
      1:
         "Has tecleado recordar sin nada despues!";
      default:
         print "Recordando...^";
         <<Consultar memoria>>;
   }
];


Ya puestos, podí­as haber puesto cualquier cosa exótica en lugar de <<Consultar memoria>>, como <<cantar memoria>> o <<comer memoria>> e interceptar las acciones "cantar" o "comer" an el "antes" de "memoria" ¡y también funcionarí­a! XDD
En cualquier caso, una vez que llamas a <<consultar memoria>> ¿qué haces allí­ exactamente? (ya es curiosidad malsana) :twisted:


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 16 Sep 2005 19:07 
Desconectado
Yiepp
Yiepp
Avatar de Usuario

Registrado: 07 Sep 2005 04:45
Mensajes: 54
Ubicación: Cerca de Barcelona
Pues si, la versión con switch da resultados mucho más consistentes que:
if (consultar_desde == 0)
print_ret "Utiliza: recordar [tema], con [tema] siendo una sola palabra.";
else
<<Consultar memoria>>;

Consultar es directamente el look_up del inform original, el diccionario de Ruinas de InformAte, por ejemplo.


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 17 Sep 2005 16:36 
Desconectado
Grafista
Grafista

Registrado: 09 Mar 2004 17:20
Mensajes: 504
Bruce escribió:
Pues si, la versión con switch da resultados mucho más consistentes


Sip, no es tanto porque sea con "switch" como por el hecho de que "num_palabras" es una variable mucho más fiable para este fin, ya que, como cabí­a esperar y ya has comprobado, el token "topic" sólo interviene, y actualiza las variables "consultar_desde" y "consultar_num_palabras"... ¡cuando hay un topic! si no, no hace nada y las deja como estaban.

Bruce escribió:
Consultar es directamente el look_up del inform original, el diccionario de Ruinas de InformAte, por ejemplo.


Aah, bien, bien. Buena aproximación, aunque, no obstante, como ya sabes, no te deja jugar con el contenido de "uno" como pretendí­as al principio. Se puede abordar el tema con otra perspectiva alternativa. Pongamos un ejemplo "relativamente" sencillo para que quienes lean esto vayan haciéndose una visión de la amplitud de opciones que ofrece Inform. En este caso, vamos a hacerlo de tal manera que tengamos un objeto "memoria" en el que, en vez de poner una rutina de parsing sobre el topic que salte ante la llamada de la acción "consultar", simplemente vamos a meter tal cual los objetos que el jugador pueda "recordar" en la aventura. estos, a su vez, sólo tendrán que reaccionar en su propiedad "antes" ante la acción "recordar", sin necesidad de desviar esta. Y además queda abierta la posibilidad de jugar con el "uno". Veamos:

Primerp creo un objeto "memoria" cuya única razón de ser será contener dentro de sí­ a los objetos que hubiera que "recordar":

Código:
Object memoria;


En principio no necesita nada más. Luego vamos a poner en su interior unos pocos objetos "recordables". En este ejemplo, 3 supuestas personas del pasado del protagonista que este puede recordar en cualquier momento:

Código:
Object felipe "Felipe" memoria
with nombre 'Felipe',
antes
[;
   recordar:"Felipe... un tí­o majo, ¡qué recuerdos!";
]
has propio;

Object maria "Marí­a" memoria
with nombre 'Maria',
antes
[;
   recordar:"Marí­a... ¡aaah, pecados de juventud!";
];

Object pilar "Pilar" memoria
with nombre 'pilar' 'pili' 'pilarin' 'maripili',
antes
[;
   recordar:"Quita, quita, no me la recuerdes... ";
];


Notese que para que un objeto se pueda recordar, los únicos requisitos van a ser que esté dentro de "memoria" y que su propiedad "antes" intercepte la acción "recordar".

Definimos la gramática de la acción recordar, aquí­ ya empezamos a retorcerlo todo un poquito:

Código:
Verb 'recordar' 'recuerda'
   *               ->   Recordar
   *   'a//' scope=AlcanceMemoria   ->   Recordar
   *   scope=AlcanceMemoria      ->   Recordar;


Huum ¿qué demonios es eso? Estamos exprimiendo las posibilidades de los tokens gramaticales. La primera linea se encarga de la posibilidad de que el jugador teclee "Recordar" sin poner nada más después. Las otras usan el token "scope=<rutina>" para admitir como gramaticalmente correctas las frases en las que el jugador teclee "recordar" seguido de un objeto que esté en ese momento "al alcance" (que es lo que hace normalmente) tanto según las reglas de alcance habituales de la librerí­a como de las que hayamos definido en esa <rutina>, que en este caso llamamos, arbitrariamente, "AlcanceMemoria"

Esa rutina "AlcanceMemoria" va a ser la siguiente:

Código:
[AlcanceMemoria;
   switch (estadio_alcance)
   {
      1:
         rfalse;
      2:   
         DentroDelAlcance(memoria);
         rfalse;
      3:
         "Eso no te recuerda nada en particular";
   }
];


Uuf ¿qué es todo ese lí­o? Básicamente dejemoslo en que "por arte de magia" esta rutina hace que durante la acción "recordar", y sólo durante "recordar", los objetos que haya en "memoria" estén al alcance del jugador y puedan reaccionar ante ella desde su propiedad "antes" con total normalidad. La explicación detallada viene en los capí­tulos 31 (tokens de la gramática) y 32 (el alcance -scope-) del manual DM4 inglés original. De hecho, en el cap. 32 hay un ejemplo casi idéntico a éste donde aclaran con pelos y señales cómo va todo eso del "estadio_alcance" y qué hace exactamente la rutina "DentroDelAlcance"

Citar:
Nota mental: apuntar las diferencias entre la explicación del DM4 inglés sobre el funcionamiento de Scopewithin() (pag 234) y las del Manual de Referencia español sobre su equivalente DentroDelAlcance() (pag 83) por si hubiera que avisar de una posible errata en éste último


Ya sólo quedarí­a poner la rutina de la acción recordar, "RecordarSub" en la que salga la frse de respuesta por defecto. En realidad se podrí­a complicar un poco más, jugando con el "uno" para que diese distintas respuestas si el jugador pusiera "recordar" sin poner nada después o pusiera, por ejemplo, "recordar" refiriendose a un objeto presente. Pero por el momento con una sóla respuesta cumple con creces su misión:

Código:
[RecordarSub;
   
   "No recuerdas gran cosa en este momento...";
   
];


La alternativa rebuscada podrí­a ser algo como:

Código:
[RecordarSub;
   switch (uno)
   {
      nothing:
         "No recuerdas gran cosa en este momento...";
      default:
         print_ret (_El) uno, " no te trae ningún recuerdo en concreto.";
   }
];


Pero insisto en que con la anterior va que chuta.

Meto el código completo en el spoiler:

[spoiler]Constant Historia "Recordando^";
Release 0;

Include "EParser";
Include "Acciones";
Include "Mensajes";

Object Sitio_01 "Sitio 1",
with descripcion "Estás en el sitio 1.",
has luz;

Object libro "libro" Sitio_01
with nombre 'libro';

Object memoria;

Object felipe "Felipe" memoria
with nombre 'Felipe',
antes
[;
recordar:"Felipe... un tí­o majo, ¡qué recuerdos!";
]
has propio;

Object maria "Marí­a" memoria
with nombre 'Maria',
antes
[;
recordar:"Marí­a... ¡aaah, pecados de juventud!";
];

Object pilar "Pilar" memoria
with nombre 'pilar' 'pili' 'pilarin' 'maripili',
antes
[;
recordar:"Quita, quita, no me la recuerdes... ";
];

[RecordarSub;

"No recuerdas gran cosa en este momento...";

];

[Inicializar;
localizacion = Sitio_01;
modomirar = 2;
];

[AlcanceMemoria;
switch (estadio_alcance)
{
1:
rfalse;
2:
DentroDelAlcance(memoria);
rfalse;
3:
"Eso no te recuerda nada en particular";
}
];

Include "Gramatica";

Verb 'recordar' 'recuerda'
* -> Recordar
* 'a//' scope=AlcanceMemoria -> Recordar
* scope=AlcanceMemoria -> Recordar;[/spoiler]

(y rezo por que esta vez el sistema no me suelte un "hosting not found" como en el primer intento de postear esto, menos mal que lo habí­a escrito en mi editor de textos antes de copiarlo en la pantalla de "publicar respuesta", sino habrí­a tenido que teclearlo todo otra vez XDDD)


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 18 Sep 2005 00:36 
Desconectado
Yiepp
Yiepp
Avatar de Usuario

Registrado: 07 Sep 2005 04:45
Mensajes: 54
Ubicación: Cerca de Barcelona
¡Bonita solución!

Recuerda un poco a la librerí­a del buscador de temas.

¡Estoy probando a ver como queda en mi aventura (comentando la versión actual de código, por si acaso)!

Cuando comenté lo de la versión con Switch, simplemente me referí­a a tu versión, obviamente el switch no hace nada especial, una serí­a de ifs, aunque más feos, darí­an el mismo servicio.


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 18 Sep 2005 01:09 
Desconectado
Yiepp
Yiepp
Avatar de Usuario

Registrado: 07 Sep 2005 04:45
Mensajes: 54
Ubicación: Cerca de Barcelona
Curiosidades (de la implementación de Radio Marte Libre en mi aventura):

Si se pone memoria como objjugador... el programa peta al hacer inventario.

Irdonde avellano te lleva a tu memoria, un lugar en el que no quieres estar pues es oscuro.

Tengo dos habitaciones. En las dos esta_en el mismo objeto, avellanos, que también está en memoria (m_avellanos). En una de las dos está un PSI llamado Korrigan, que también está en memoria (m_Korrigan). Pues bien, si hago recordar avellanos, especifica que es el "Avellano (C-Coll)" que es el nombre visible de m_avellanos y lo muestra, en cambio, el PSI, Korrigan, no lo recuerda cuando el PSI está presente ("Korrigan no te trae ningún recuerdo en concreto").

Si voy a otra habitación en la que hay otro tipo de árbol que únicamente está en una habitación, sigue funcionando bien, recuerda.

Pero voy a otro PSI (que puse en memoria como m_druida) y pasa igual que con Korrigan, "Druida no te trae ningún recuerdo en concreto.".

Nota: Los PSI están hechos con la librerí­a fhablaoo... o sea, de clase Personaje.


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 18 Sep 2005 01:19 
Desconectado
Yiepp
Yiepp
Avatar de Usuario

Registrado: 07 Sep 2005 04:45
Mensajes: 54
Ubicación: Cerca de Barcelona
¿Tiene alguna ventaja utilizar

Código:
VerboIrregular "recordar" with imperativo 'recuerda';

sobre

Código:
Verb 'recordar' 'recuerda'

?


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 18 Sep 2005 05:23 
Desconectado
Grafista
Grafista

Registrado: 09 Mar 2004 17:20
Mensajes: 504
Brucehum escribió:
Pero voy a otro PSI (que puse en memoria como m_druida) y pasa igual que con Korrigan, "Druida no te trae ningún recuerdo en concreto.".


El sí­ntoma es inapelable, si el Korrigan y el Druida de las habitaciones te están dando la respuesta por defecto de "RecordarSub" es que, por algún motivo, no están interceptando la acción "recordar" en su propiedad "antes". ¡ Mira a ver si no se te ha olvidado alguna cosa por ahi!

De todos modos, y si lo he entendido bien, estás duplicando objetos y personjes (un Korrigan en la localidad y otro (llamado m_korrigan) dentro de "memoria", lo que es un poco excesivo (y además bastante poco elegante 8) )

Yo particularmente, si resulta que hay que poder recordar cosas que andan pululando por las localidades del juego, me olvidarí­a por completo de la "memoria" y tomarí­a otra ví­a:

Quirarí­a el objeto "memoria" y cualquier mención a él. Definirí­a una clase de objeto a la que llamarí­a, pongamos, "recordable", y harí­a que todos los objetos que puedan "recordarse" en la aventura pertenezcan a ella.

Código:
Class Recordable;


(ello no deberí­a ser un problema para los objetos que ya pertenecen a otras clases, como "Personaje", ya que Inform admite "herencia multiple", ver capí­tulo 3.8 del DM4 para los detalles)

Luego, en el switch de la rutina que he llamado "AlcanceMemoria", para el caso en que "estadio_alcance" valga 2, sustituirí­a el "DentroDelAlcance(memoria)" por un bucle que pusiera al alcance a todos los objetos de la clase que he creado, algo como:

Código:
[AlcanceMemoria x;
   switch (estadio_alcance)
   {
      1:
         rfalse;
      2:   
         objectloop (x ofclass recordable) PonerAlAlcance(x);
         rfalse;
      3:
         "Eso no te recuerda nada en particular";
   }
];


Ahora todo los objetos "recordables" están al alcance de la acción "recordar"... ¡estén donde estén! y así­ podrán reaccionar adecuadamente a esta.

Nueva versión del ejemplo completo de antes:

[spoiler]Constant Historia "Recordando^";
Release 0;

Include "EParser";
Include "Acciones";
Include "Mensajes";

Class Personaje;
Class Recordable;

Object Sitio_01 "Sitio 1",
with descripcion "Estás en el sitio 1.^Hay una salida al norte.",
al_n Sitio_02,
has luz;

Object Sitio_02 "Sitio 2"
with descripcion "Estás en el sitio 2.^Ves una salida al sur.",
al_s Sitio_01,
has luz;

Recordable libro "libro" Sitio_01
with
nombre 'libro',
descripcion "Un bonito libro...",
antes
[;
recordar:"¡Recuerdas haber leido el libro de pequeño!";
];

Recordable felipe "Felipe"
with nombre 'Felipe',
antes
[;
recordar:"Felipe... un tí­o majo, ¡qué recuerdos!";
]
has propio;

Object maria "Marí­a" class Personaje Recordable
with nombre 'Maria',
antes
[;
recordar:
if (self in localizacion)
"Marí­a... al verla aquí­ frente a tí­... afloran los recuerdos...";
else
"Marí­a... ¡aaah, pecados de juventud!, Ojalá estuviera aquí­...";
],
has animado femenino propio;

Recordable pilar "Pilar"
with nombre 'pilar' 'pili' 'pilarin' 'maripili',
antes
[;
recordar:"Quita, quita, no me la recuerdes... ";
]
has femenino propio;

[RecordarSub;
"No recuerdas gran cosa en este momento...";
];

[Inicializar;
localizacion = Sitio_01;
modomirar = 2;
move maria to sitio_02;
];

[AlcanceMemoria x;
switch (estadio_alcance)
{
1:
rfalse;
2:
objectloop (x ofclass Recordable)
PonerAlAlcance(x);
rfalse;
3:
"Eso no te recuerda nada en particular";
}
];

Include "Gramatica";

Verb 'recordar' 'recuerda'
* -> Recordar
* 'a//' scope=AlcanceMemoria -> Recordar
* scope=AlcanceMemoria -> Recordar;
[/spoiler]

Fijate en cómo he jugado con el personaje de Marí­a. Ahora no sólo está en los recuerdos del jugador, sino que la he puesto en una de las localidades. La cosa es que intercepta la acción "recordar" tanto si estás en el mismo sitio que ella como si no (y para que se note más, el texto es diferente.


Arriba
 Perfil  
 
 Asunto: Recuerdos...
NotaPublicado: 19 Sep 2005 09:42 
Radio Marte Libre escribió:
...
La cosa es que intercepta la acción "recordar" tanto si estás en el mismo sitio que ella como si no (y para que se note más, el texto es diferente.


RML, ¿por qué no ordenas esta aportación un poco y la transformas en una librerí­a que cualquiera pueda importar y usar?


Arriba
  
 
NotaPublicado: 19 Sep 2005 21:06 
Desconectado
Grafista
Grafista

Registrado: 09 Mar 2004 17:20
Mensajes: 504
Hector el Oso escribió:
RML, ¿por qué no ordenas esta aportación un poco y la transformas en una librerí­a que cualquiera pueda importar y usar?


Es que, si te digo la verdad, hacerlo una librerí­a no me parece tan "buena" idea, me explico:

Si te fijas, me estoy limitando a aplicar un mecanismo de la librerí­a que, de hecho, ya viene detallado en el manual con un caso similar. hacer una librerí­a para decirle a la librerí­a InformATE "haz lo que haces normalmente" me parecerí­a una redundancia realmente poco necesaria (otra cosa es que sea un "mecanismo" poco conocido por estar en una parte del manual no traducida, pero, sigh... ¡esa es otra historia! :( )

Además, la gracia del token "scope=<rutina>" es que permite al autor definir sus propias reglas de alcance para una determinada y concreta acción. Si yo hago ahora una librerí­a para añadir a InformATE una acción "recordar" en la que defina mi propia regla de alcance... ya le estoy tapando la posibbilidad al autor de crear la suya. Me sentirí­a algo así­ como si le estuviera "imponiendo" mi criterio u obligándole a hacer las cosas "a mi manera", lo cual, además de hacerme sentir poco cómodo es, a mi parecer, contrario a lo que una librerí­a deberí­a ser. Como siempre he dicho, una librerí­a ideal deberí­a "adaptarse" a la aventura, y no obligar a la aventura a "adaptarse" a la librerí­a.


Y como hemos visto, lo que a mí­ me puede venir bien en una determinada situación o para un fin concreto, probablemente no vaya a venirle bien a todo el mundo en la mayorí­a de las situaciones. Fijate en que al principio yo pensaba que lo de aplicar la función DentroDelAlcance() a un objeto "memoria" que contuviese a todos los objetos susceptibles de ser recordados iba a adaptarse a la situación de Bruce... hasta que él nos contó que también habrí­a que poder "recordar" a objetos y personajes que estuviesen en las localidades del juego, momento en el que salió a la luz que esa aproximación causaba más problemas de los que resolví­a. A su vez el enfoque que puse después probablemente se adapte mejor a unos escenarios que a otros dependiendo de las necesidaes del autor.

En cualquier caso podrí­amos coger un código como:

Código:
Class Recordable;

[AlcanceMemoria x;
   switch (estadio_alcance)
   {
      1:
         rfalse;
      2:   
         objectloop (x ofclass Recordable)
            PonerAlAlcance(x);
         rfalse;
      3:
         "Eso no te recuerda nada en particular";
   }
];

[RecordarSub;
   switch (uno)
   {
      nothing:
         "No recuerdas gran cosa en este momento...";
      default:
         print_ret (_El) uno, " no te trae ningún recuerdo en particular.";
   }
];

Verb 'recordar' 'recuerda'
   *                        ->   Recordar
   *   'a//' scope=AlcanceMemoria   ->   Recordar
   *   scope=AlcanceMemoria      ->   Recordar;


(código editado a las 22.13, que lo habí­a mezclado con parte del ejemplo siguiente :oops: :oops: :oops: )

...podrí­amos copiarlo, salvarlo como "recordar.h" (o algo así­n) y especificar en las instrucciones que, para tener objetos que se "recuerden" en la aventura estos deben pertenecer a la clase "recordable" y pillar en su "antes" la acción "recordar". Luego no habrí­a más que incluirlo en el código fuente con un:

Código:
include "recordar";


...y, en teorí­a, funcionarí­a. El include deberí­a ir después del "include "gramatica";" ... aunque lo he probado en distintos sitios y se lo ha tragado con total tranquilidad.

Una aproximación alternativa, sin clases ni "antes" podrí­a ser esta:

Código:
[AlcanceRecuerdo x;
   switch (estadio_alcance)
   {
      1:
         rfalse;
      2:
         objectloop (x provides recuerdo)
            PonerAlAlcance(x);
         rfalse;
      3:
         "Eso no te recuerda nada en particular";
   }
];

[RecordarSub;
   switch (uno)
   {
         nothing:
            "No recuerdas gran cosa en este momento...";
         default:
            if (uno provides recuerdo)
               ImprimirOEjecutar (uno, recuerdo);
            else
               print_ret (_El) uno, " no te trae ningún recuerdo en particular.";
   }
];

Verb 'recordar' 'recuerda'
   *                        ->   Recordar
   *   'a//' scope=AlcanceRecuerdo   ->   Recordar
   *   scope=AlcanceRecuerdo      ->   Recordar;


En este caso la única condición para que un objeto se pueda recordar es que tenga una propiedad llamada "recuerdo", que le puedes poner a cualquier objeto, sea de la clase que sea.
Esta propiedad puede ser o bien una cadena de texto (que se imprimirá automáticamente ante la acción "recordar") o bien una rutina en la que el autor ponga las acciones que quiera. Usar la propiedad "antes", aunque ya no sea necesario, sigue siendo una opción disponible si para un determinado objeto el autor quiere saltarse el proceso.

Pero insisto en que yo no soy particularmente partidario de hacer librerí­as para estas cosas. :)


Arriba
 Perfil  
 
Mostrar mensajes previos:  Ordenar por  
Nuevo tema Responder al tema  [ 48 mensajes ]  Ir a página 1, 2, 3, 4  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 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