Bien, ahora que tengo un poco de tiempo libre, te respondo a tu duda.
Hay diversas formas de hacerlo y dependen un poco de hasta qué punto quieras ser flexible (por ejemplo, de si los temas serán siempre objetos de la aventura o no, y de si las respuestas pueden variar dinámicamente o no).
A juzgar por cómo lo has planteado, me imagino que tus temas serán objetos de la aventura. He aquí una forma sencilla de hacerlo, de forma que además se pueden variar las respuestas dinámicamente sin problema.
Creamos el frutero, y en su método de inicialización (insertar código - definir eventos de personaje - al inicializarse el personaje) ponemos:
Código:
void onInit()
{
set(self,"hablaDe",item("Pera"),"Ah, la pera. Una fruta jugosa y rica, sin duda.");
set(self,"hablaDe",item("Manzana"),"La fruta prohibida.");
set(self,"hablaDe",item("Mango"),"Una fruta tropical muy interesante. Pero no la vendo.");
}
Donde se supone que tienen que existir en la aventura unas entidades llamadas (nombre único) Pera, Manzana y Mango, que pueden estar en la misma habitación que el frutero o no.
Lo que hemos hecho aquí es crear una relación "hablaDe" del frutero (self) a la pera (item("Pera")), cuyo valor es la cadena que queremos que el frutero nos responda cuando le preguntemos por la pera ("Ah, la pera. Una fruta jugosa y rica, sin duda."). Lo mismo hacemos con la manzana y el mango.
Tienes información sobre cómo funcionan las relaciones en:
http://www.caad.es/aetheria/doc/doku.ph ... relaciones (pero no dudes en preguntar cualquier cosa - pongo el enlace a la documentación por si quieres profundizar, no con ánimo de hacer un RTFM).
Bien. Ahora vamos a usar esas relaciones para que cuando nos pongan "temas frutero" se listen todas las frutas de las que sabe hablar, y cuando nos pongan "preguntar al frutero por XXX" el frutero diga la frase adecuada. Para ello, sin salir del frutero, vamos a Insertar código - redefinir metodos de personaje - metodo de analisis de la entrada (estandar) - referente a este personaje, y ponemos:
Código:
void parseCommand( Mobile aCreature , String verb , String args )
{
if ( equals(verb,"preguntar") )
{
temas = self.getRelatedEntities("hablaDe");
for ( Entity e : temas )
{
if ( e.matchesCommand(args,false) > 0 )
{
self.say( get(self,"hablaDe",e) );
end();
}
}
self.say("No se nada de eso");
end();
}
if ( equals(verb,"temas") )
{
temas = self.getRelatedEntities("hablaDe");
for ( Entity e : temas )
{
aCreature.write(e.getOutputNameThe() + "\n");
}
end();
}
}
¿Qué hace este código?
Lo primero que conviene saber es que self.getRelatedEntities("hablaDe") nos devuelve todas las entidades con las que el frutero está relacionado mediante una relación "hablaDe" (este método también viene documentado en el enlace que te pasé antes). Con esto, es muy fácil responder al comando "temas": obtenemos dicha lista, la recorremos con un bucle (he usado el formato de bucle nuevo de Java 1.5+, pero también valdría igualmente hacer un clásico for ( int i = 0 ; i < temas.size() ; i++ ) e ir obteniendo temas.get(i)) y le decimos al jugador que ha preguntado por los temas el nombre de cada uno de ellos. Para sacar el nombre, utilizamos el método getOutputNameThe() que lo devuelve como "la manzana", "la pera", etc. También se pueden utilizar otros métodos para que salga sólo "manzana", "pera", etc. en su lugar, véase
http://www.caad.es/aetheria/doc/doku.ph ... _criaturasCon el comando "preguntar" hacemos algo parecido. Obtenemos esa misma lista de entidades, la recorremos, y para cada una de ellas hacemos e.matchesCommand(args,false) > 0. Esto nos dice si la cadena "args", que tecleó el jugador, se refiere a la entidad (en cuyo caso matchesCommand devuelve un valor mayor que cero). Véase matchesCommand en
http://www.caad.es/aetheria/doc/doku.ph ... clase_item (nótese que aunque eso es una lista de métodos de cosas - Items -, este método existe en cualquier entidad, o sea, este código vale también para preguntar por personajes, etc.)
Una vez que encontramos la entidad a la que se refirió el jugador, con get(self,"hablaDe",e) obtenemos la frase que el frutero sabe acerca de dicha entidad, y hacemos que la diga. En el caso de que ninguna entidad matchee, decimos en su lugar la frase por defecto.
Y ya está, con esto debería funcionar la cosa como sigue:
> temas frutero
la pera
la manzana
el mango
> preguntar al frutero sobre el mango
El frutero dice "Una fruta tropical muy interesante. Pero no la vendo.".
Nótese que puedes hacer en cualquier momento cosas como
Código:
set(self,"hablaDe",item("Pera"),"Ah, la pera. Una fruta jugosa y rica, sin duda.");
para cambiar la opinión del frutero sobre la pera. Y si quieres que pase a no saber nada sobre la pera (amnesia o algo), la pondrías a null.
Algo que tal vez te preguntes es por qué no hemos usado el parseCommand sobre dos entidades, ya que al "preguntar al frutero sobre el mango", el jugador está mencionando dos entidades. La respuesta es que el parseCommand sobre dos entidades sólo funciona si ambas están alcanzables. Si el jugador teclea "preguntar al frutero sobre el mango" pero el mango está en otra localidad, no salta el parseCommand sobre dos entidades. Sólo salta sobre la que está presente (el frutero). Por eso en este caso tenemos que usar matchesCommand para ver que habla del mango. En la mayoría de los casos (cuando se interactúa con objetos que están presentes), no es necesario eso.