CAAD

Comunidad de Aventuras Conversacionales y Relatos Interactivos
Fecha actual 20 Nov 2017 07:11

Todos los horarios son UTC + 1 hora




Nuevo tema Responder al tema  [ 84 mensajes ]  Ir a página 1, 2, 3, 4, 5, 6  Siguiente
Autor Mensaje
NotaPublicado: 19 Jun 2012 14:44 
Desconectado
Dragón
Dragón

Registrado: 22 Oct 2010 10:09
Mensajes: 117
Bueno, abro este hilo porque como estoy empezando con AGE, me van surgiendo bastantes dudas y errores en la programación, así los tengo todos juntitos...

Estoy en este momento con el manual, en la "manipulación básica de entidades", con el ejercicio del plátano.
Ya he creado el objeto plátano y el objeto piel de plátano.
En el objeto plátano he puesto, copiado del ejemplo, el siguiente código:

Código:
/*Método de análisis sintáctico de la entrada referida a una cosa*/
void parseCommand( Mobile aCreature , String verb , String args )
{
   if (equals (verb, "comer"))
    {
        if (aCreature.hasItem(self))
        {
        aCreature.write("Te comes el plátano. Ñam, ñam. ¡Qué rico!\n");
        aCreature.removeItem(self);
        aCreature.write("Te quedas con la piel, por si te resulta útil.\n");
        aCreature.addItem( item("piel de plátano") );
        }
        else
        {
        aCreature.write("Para comerte el plátano, necesitarías cogerlo primero.");
        }
        end();
    }
}


Y al probar el juego, al intentar comerme el plátano me sale este error:

Código:
Tu orden:  coger platano
Coges el plátano.
Un bonito y apetecible plátano.

Tu orden:  comer platano
Te comes el plátano. Ñam, ñam. ¡Qué rico!
Te quedas con la piel, por si te resulta útil.
bsh.TargetError found at parseCommand(), command was comer platano, item number 30000001, error was Sourced file: inline evaluation of: ``parseCommand( arg0, arg1, arg2);'' : Method Invocation aCreature.addItem : at Line: 11 : in file: inline evaluation of: ``/*Método de análisis sintáctico de la entrada referida a una cosa*/ void parseCo . . . '' : aCreature .addItem ( item ( "piel de plátano" ) )

Target exception: java.lang.NullPointerException
**
Error: java.lang.NullPointerException
Location: inline evaluation of: ``/*Método de análisis sintáctico de la entrada referida a una cosa*/ void parseCo . . . ''
Line: 11
Offending text: aCreature .addItem ( item ( "piel de plátano" ) )
Message: Sourced file: inline evaluation of: ``parseCommand( arg0, arg1, arg2);'' : Method Invocation aCreature.addItem
Detailed trace: Sourced file: inline evaluation of: ``parseCommand( arg0, arg1, arg2);'' : Method Invocation aCreature.addItem : at Line: 11 : in file: inline evaluation of: ``/*Método de análisis sintáctico de la entrada referida a una cosa*/ void parseCo . . . '' : aCreature .addItem ( item ( "piel de plátano" ) )

Target exception: java.lang.NullPointerException

   at bsh.BSHMethodInvocation.eval(Unknown Source)
   at bsh.BSHPrimaryExpression.eval(Unknown Source)
   at bsh.BSHPrimaryExpression.eval(Unknown Source)
   at bsh.BSHBlock.evalBlock(Unknown Source)
   at bsh.BSHBlock.eval(Unknown Source)
   at bsh.BSHBlock.eval(Unknown Source)
   at bsh.BSHIfStatement.eval(Unknown Source)
   at bsh.BSHBlock.evalBlock(Unknown Source)
   at bsh.BSHBlock.eval(Unknown Source)
   at bsh.BSHBlock.eval(Unknown Source)
   at bsh.BSHIfStatement.eval(Unknown Source)
   at bsh.BSHBlock.evalBlock(Unknown Source)
   at bsh.BSHBlock.eval(Unknown Source)
   at bsh.BshMethod.invokeImpl(Unknown Source)
   at bsh.BshMethod.invoke(Unknown Source)
   at bsh.BshMethod.invoke(Unknown Source)
   at bsh.Name.invokeLocalMethod(Unknown Source)
   at bsh.Name.invokeMethod(Unknown Source)
   at bsh.BSHMethodInvocation.eval(Unknown Source)
   at bsh.BSHPrimaryExpression.eval(Unknown Source)
   at bsh.BSHPrimaryExpression.eval(Unknown Source)
   at bsh.Interpreter.eval(Unknown Source)
   at bsh.Interpreter.eval(Unknown Source)
   at bsh.Interpreter.eval(Unknown Source)
   at eu.irreality.age.ObjectCode.run(ObjectCode.java:402)
   at eu.irreality.age.ObjectCode.run(ObjectCode.java:235)
   at eu.irreality.age.Item.execCode(Item.java:1875)
   at eu.irreality.age.Player.executeParseCommandForOneEntity(Player.java:2843)
   at eu.irreality.age.Player.resolveParseCommandForOneEntity(Player.java:2933)
   at eu.irreality.age.Player.execCommand(Player.java:808)
   at eu.irreality.age.Player.execCommand(Player.java:622)
   at eu.irreality.age.Player.characterChangeState(Player.java:2248)
   at eu.irreality.age.Player.changeState(Player.java:2085)
   at eu.irreality.age.Entity.update(Entity.java:311)
   at eu.irreality.age.Player.update(Player.java:277)
   at eu.irreality.age.Entity.update(Entity.java:95)
   at eu.irreality.age.World.update(World.java:2704)
   at eu.irreality.age.GameEngineThread.run(GameEngineThread.java:306)

Target report: java.lang.NullPointerException
   at eu.irreality.age.Inventory.addItem(Inventory.java:53)
   at eu.irreality.age.Mobile.addItem(Mobile.java:3624)
   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
   at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
   at java.lang.reflect.Method.invoke(Unknown Source)
   at bsh.Reflect.invokeMethod(Unknown Source)
   at bsh.Reflect.invokeObjectMethod(Unknown Source)
   at bsh.Name.invokeMethod(Unknown Source)
   at bsh.BSHMethodInvocation.eval(Unknown Source)
   at bsh.BSHPrimaryExpression.eval(Unknown Source)
   at bsh.BSHPrimaryExpression.eval(Unknown Source)
   at bsh.BSHBlock.evalBlock(Unknown Source)
   at bsh.BSHBlock.eval(Unknown Source)
   at bsh.BSHBlock.eval(Unknown Source)
   at bsh.BSHIfStatement.eval(Unknown Source)
   at bsh.BSHBlock.evalBlock(Unknown Source)
   at bsh.BSHBlock.eval(Unknown Source)
   at bsh.BSHBlock.eval(Unknown Source)
   at bsh.BSHIfStatement.eval(Unknown Source)
   at bsh.BSHBlock.evalBlock(Unknown Source)
   at bsh.BSHBlock.eval(Unknown Source)
   at bsh.BshMethod.invokeImpl(Unknown Source)
   at bsh.BshMethod.invoke(Unknown Source)
   at bsh.BshMethod.invoke(Unknown Source)
   at bsh.Name.invokeLocalMethod(Unknown Source)
   at bsh.Name.invokeMethod(Unknown Source)
   at bsh.BSHMethodInvocation.eval(Unknown Source)
   at bsh.BSHPrimaryExpression.eval(Unknown Source)
   at bsh.BSHPrimaryExpression.eval(Unknown Source)
   at bsh.Interpreter.eval(Unknown Source)
   at bsh.Interpreter.eval(Unknown Source)
   at bsh.Interpreter.eval(Unknown Source)
   at eu.irreality.age.ObjectCode.run(ObjectCode.java:402)
   at eu.irreality.age.ObjectCode.run(ObjectCode.java:235)
   at eu.irreality.age.Item.execCode(Item.java:1875)
   at eu.irreality.age.Player.executeParseCommandForOneEntity(Player.java:2843)
   at eu.irreality.age.Player.resolveParseCommandForOneEntity(Player.java:2933)
   at eu.irreality.age.Player.execCommand(Player.java:808)
   at eu.irreality.age.Player.execCommand(Player.java:622)
   at eu.irreality.age.Player.characterChangeState(Player.java:2248)
   at eu.irreality.age.Player.changeState(Player.java:2085)
   at eu.irreality.age.Entity.update(Entity.java:311)
   at eu.irreality.age.Player.update(Player.java:277)
   at eu.irreality.age.Entity.update(Entity.java:95)
   at eu.irreality.age.World.update(World.java:2704)
   at eu.irreality.age.GameEngineThread.run(GameEngineThread.java:306)
**


He revisado el código y está letra por letra como en el ejemplo, así que no se donde está el fallo....


Arriba
 Perfil  
 
NotaPublicado: 19 Jun 2012 14:48 
Desconectado
Dragón
Dragón

Registrado: 22 Oct 2010 10:09
Mensajes: 117
Anda que....

Si antes pongo la duda, antes la resuelvo....

Resulta que a la piel de plátano le había puesto de nombre "P"iel de plátano y al no ponerle la P mayúscula al referirme a ella daba error.

Ya veo que discrimina entre mayúsculas y minúsculas y también en los acentos, porque un error parecido me dió antes al poner platano, sin tilde....

Sigo en ello.


Arriba
 Perfil  
 
NotaPublicado: 19 Jun 2012 14:56 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5274
Ubicación: Coruña
Efectivamente, mayúsculas, minúsculas y tildes importan en los nombres únicos. En el caso de que no exista ninguna entidad con el nombre único que pones, item ( "nombre" ) devuelve null, de ahí que se produjese una NullPointerException por pasarle a addItem un parámetro nulo.

Estos fallos al referirse a entidades son comunes, tal vez debería hacer que si se activa un modo debug, además de devolver null estas funciones (item, mobile, etc.) saquen un mensaje de warning.

_________________
Actúa siempre de tal modo que las decisiones de tu voluntad pudiesen servir como preceptos de una legislación universal (E. Kant)


Arriba
 Perfil  
 
NotaPublicado: 20 Jun 2012 23:36 
Desconectado
Dragón
Dragón

Registrado: 22 Oct 2010 10:09
Mensajes: 117
Bueno, sigo con el manual y con los errores sin solución :roll:

Voy por la sección "propiedades y relaciones", con el tema de los temporizadores, y siguiendo el ejemplo, he creado un objeto radiador con el siguiente código:

Código:
/*Método de actualización de esta entidad*/

//pe: propiedad que se actualiza
//(pe.getName(): nombre)
//w: el mundo

void update ( PropertyEntry pe , World w )
{
    if (equals(pe.getName(),"encendido"))
    {
        if (get(self,"encendido"))
        {
            set (self,"encendido",false,10);
            if (mobile("jugador").getRoom().hasItem(self))
            {
                mobile("jugador").write("El radiador se apaga solo por el efecto del termostato.\n");
            }
        }
        else
        {
            set (self,"encendido",true,10);
            if (mobile("jugador").getRoom().hasItem(self))
                {
                mobile("jugador").write("El radiador se enciende solo por el efecto del termostato.\n");
                }
        }
    }
}


Le he creado la propiedad "encendido" con valor "false" y tiempo restante "10", y al probarlo, cuando llega la actualización del objeto me ocurre el siguiente error:

Código:
Syntax error in BeanShell code in object: [ eu.irreality.age.Item:30000004:radidor ]
Loaded to call method update
With arguments: encendido:false (null) !0 [World: Prueba, internal handle eu.irreality.age.World@339d5fef]
File: inline evaluation of: ``/*Método de actualización de esta entidad*/  //pe: propiedad que se actualiza  / . . . ''
Stack trace: Sourced file: inline evaluation of: ``update( arg0, arg1);'' : Command not found: set( eu.irreality.age.Item, java.lang.String, boolean, int ) : at Line: 21 : in file: inline evaluation of: ``/*Método de actualización de esta entidad*/  //pe: propiedad que se actualiza  / . . . '' : set ( self , "encendido" , true , 10 )

   at bsh.Name.invokeLocalMethod(Unknown Source)
   at bsh.Name.invokeMethod(Unknown Source)
   at bsh.BSHMethodInvocation.eval(Unknown Source)
   at bsh.BSHPrimaryExpression.eval(Unknown Source)
   at bsh.BSHPrimaryExpression.eval(Unknown Source)
   at bsh.BSHBlock.evalBlock(Unknown Source)
   at bsh.BSHBlock.eval(Unknown Source)
   at bsh.BSHBlock.eval(Unknown Source)
   at bsh.BSHIfStatement.eval(Unknown Source)
   at bsh.BSHBlock.evalBlock(Unknown Source)
   at bsh.BSHBlock.eval(Unknown Source)
   at bsh.BSHBlock.eval(Unknown Source)
   at bsh.BSHIfStatement.eval(Unknown Source)
   at bsh.BSHBlock.evalBlock(Unknown Source)
   at bsh.BSHBlock.eval(Unknown Source)
   at bsh.BshMethod.invokeImpl(Unknown Source)
   at bsh.BshMethod.invoke(Unknown Source)
   at bsh.BshMethod.invoke(Unknown Source)
   at bsh.Name.invokeLocalMethod(Unknown Source)
   at bsh.Name.invokeMethod(Unknown Source)
   at bsh.BSHMethodInvocation.eval(Unknown Source)
   at bsh.BSHPrimaryExpression.eval(Unknown Source)
   at bsh.BSHPrimaryExpression.eval(Unknown Source)
   at bsh.Interpreter.eval(Unknown Source)
   at bsh.Interpreter.eval(Unknown Source)
   at bsh.Interpreter.eval(Unknown Source)
   at eu.irreality.age.ObjectCode.run(ObjectCode.java:402)
   at eu.irreality.age.ObjectCode.run(ObjectCode.java:235)
   at eu.irreality.age.Item.execCode(Item.java:1875)
   at eu.irreality.age.Entity.update(Entity.java:272)
   at eu.irreality.age.Entity.update(Entity.java:95)
   at eu.irreality.age.World.update(World.java:2710)
   at eu.irreality.age.GameEngineThread.run(GameEngineThread.java:306)

Cause report: [no exception]


He probado a darle a la propiedad el valor "true" y ocurre el mismo error.


Arriba
 Perfil  
 
NotaPublicado: 21 Jun 2012 01:07 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5274
Ubicación: Coruña
Je, pues el caso es que acabas de encontrar un fallo en la documentación.

La función

set ( entidad , propiedad , valor , tiempo )

que se usa en ese ejemplo, realmente no existe. El valor y el tiempo hay que fijarlos por separado:

Código:
set ( entidad , propiedad , valor );
setTime ( entidad , propiedad, tiempo );


Siento el error, que se debe a que realmente eres la primera persona que aprende siguiendo la documentación desde el principio, supongo que aún te encontrarás alguno más :/

A ver si mañana cambio la documentación para eliminar ese fallo.

_________________
Actúa siempre de tal modo que las decisiones de tu voluntad pudiesen servir como preceptos de una legislación universal (E. Kant)


Arriba
 Perfil  
 
NotaPublicado: 21 Jun 2012 11:15 
Desconectado
Dragón
Dragón

Registrado: 22 Oct 2010 10:09
Mensajes: 117
Ya podia buscar el fallo :D

Bueno, probare luego a ver si consigo que se encienda el radiador xD

Hay otra manera de aprender que no sea con el manual?

Mientras hare de tester del manual xD


Arriba
 Perfil  
 
NotaPublicado: 21 Jun 2012 11:52 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5274
Ubicación: Coruña
Louen escribió:
Ya podia buscar el fallo :D

Bueno, probare luego a ver si consigo que se encienda el radiador xD

Hay otra manera de aprender que no sea con el manual?

Mientras hare de tester del manual xD

Ya acabo de corregir esa página de la wiki para que no aparezca la información confusa sobre la función que no existe. Se agradece que lo hayas encontrado, así el siguiente no se dará de bruces con eso :D

Si usas la documentación en PDF, en ésa todavía no está corregido el fallo, ya que el PDF lo maqueta Notxor a partir de la wiki.

Aparte de la documentación, creo que la forma mejor de aprender es entrar en el IRC (#aetheria) y hablar allí en directo con los otros autores, por la tarde solemos estar dos o tres la mayoría de los días.

También puedes abrir con el PUCK, y mirar cómo están hechas, cualquiera de las aventuras hechas con AGE (son todas software libre); aunque te aviso que si abres aventuras un poco antiguas ("Fuego" o "Morluck's", por ejemplo) verás cosas hechas de formas complicadas por las limitaciones de las versiones antiguas de AGE, que en las versiones modernas (como lo que enseña el manual, que está actualizado) son mucho más fáciles de hacer. Por poner un ejemplo, en los tiempos de "Fuego" no existían parseCommand de dos entidades, así que para reconocer dos entidades había que reconocer una y luego llamar a métodos para reconocer la otra... hoy es mucho más sencillo porque AGE ya da el trabajo hecho, y aunque la forma en que está hecho "Fuego" funciona, no tendría sentido aprender a programar así porque es bastante más incómodo. Así que yo usaría estas aventuras añejas como mucho como referencia adicional; pero no como modelo: para eso mejor el manual, que aunque por desgracia parece que tiene alguna errata, está actualizado.

"Burbuja" y "Libro" ya están programadas con versiones modernas de AGE, y sí que serían una referencia mejor; aunque jenesis usa un estilo de programación con los parseCommands (usar siempre el más genérico para todo) que a mí personalmente me parece más difícil que el que recomiendo en el manual (usar el específico para cada caso dejándose guiar por el menú)... pero bueno, eso ya es muy subjetivo, igual a ti te resulta más fácil entender el estilo de jenesis que el del manual (a ella así se lo parecía, planeaba escribir su propio tutorial para novatos).

Y en general no te cortes en preguntar, sea por IRC, sea por foro, o por donde sea. Las preguntas no molestan, al contrario, ayudan (sin ir más lejos, gracias a ésta que has hecho he arreglado un fallo en al documentación).

_________________
Actúa siempre de tal modo que las decisiones de tu voluntad pudiesen servir como preceptos de una legislación universal (E. Kant)


Arriba
 Perfil  
 
NotaPublicado: 22 Jun 2012 22:22 
Desconectado
Dragón
Dragón

Registrado: 22 Oct 2010 10:09
Mensajes: 117
Nada, no hay manera, he cambiado el código con las indicaciones que me has dado, ahora queda así:

Código:
/*Método de actualización de esta entidad*/

//pe: propiedad que se actualiza
//(pe.getName(): nombre)
//w: el mundo

void update ( PropertyEntry pe , World w )
{
    if (equals(pe.getName(),"encendido"))
    {
        if (get(self,"encendido"))
        {
            set (self,"encendido",false);
            setTime (self,"encendido",10);
            if (mobile("jugador").getRoom().hasItem(self))
            {
                mobile("jugador").write("El radiador se apaga solo por el efecto del termostato.\n");
            }
        }
        else
        {
            set (self,"encendido",true);
            setTime (self,"encendido",10);
            if (mobile("jugador").getRoom().hasItem(self))
                {
                mobile("jugador").write("El radiador se enciende solo por el efecto del termostato.\n");
                }
        }
    }
}


Y el error que me da es:

Código:
Tu orden:  espera
bsh.TargetError found at update routine, entity is [ eu.irreality.age.Item:30000004:radiador ], property entry is encendido
Target exception: java.lang.NullPointerException: Attempt to invoke method getRoom on null value

**
Error: java.lang.NullPointerException: Attempt to invoke method getRoom on null value
Location: inline evaluation of: ``/*Método de actualización de esta entidad*/  //pe: propiedad que se actualiza  / . . . ''
Line: 24
Offending text: .getRoom ( )
Message: Sourced file: inline evaluation of: ``update( arg0, arg1);''
Detailed trace: Sourced file: inline evaluation of: ``update( arg0, arg1);'' : at Line: 24 : in file: inline evaluation of: ``/*Método de actualización de esta entidad*/  //pe: propiedad que se actualiza  / . . . '' : .getRoom ( )

Target exception: java.lang.NullPointerException: Attempt to invoke method getRoom on null value

   at bsh.UtilTargetError.toEvalError(Unknown Source)
   at bsh.UtilEvalError.toEvalError(Unknown Source)
   at bsh.Reflect.invokeObjectMethod(Unknown Source)
   at bsh.BSHPrimarySuffix.doName(Unknown Source)
   at bsh.BSHPrimarySuffix.doSuffix(Unknown Source)
   at bsh.BSHPrimaryExpression.eval(Unknown Source)
   at bsh.BSHPrimaryExpression.eval(Unknown Source)
   at bsh.BSHIfStatement.evaluateCondition(Unknown Source)
   at bsh.BSHIfStatement.eval(Unknown Source)
   at bsh.BSHBlock.evalBlock(Unknown Source)
   at bsh.BSHBlock.eval(Unknown Source)
   at bsh.BSHBlock.eval(Unknown Source)
   at bsh.BSHIfStatement.eval(Unknown Source)
   at bsh.BSHBlock.evalBlock(Unknown Source)
   at bsh.BSHBlock.eval(Unknown Source)
   at bsh.BSHBlock.eval(Unknown Source)
   at bsh.BSHIfStatement.eval(Unknown Source)
   at bsh.BSHBlock.evalBlock(Unknown Source)
   at bsh.BSHBlock.eval(Unknown Source)
   at bsh.BshMethod.invokeImpl(Unknown Source)
   at bsh.BshMethod.invoke(Unknown Source)
   at bsh.BshMethod.invoke(Unknown Source)
   at bsh.Name.invokeLocalMethod(Unknown Source)
   at bsh.Name.invokeMethod(Unknown Source)
   at bsh.BSHMethodInvocation.eval(Unknown Source)
   at bsh.BSHPrimaryExpression.eval(Unknown Source)
   at bsh.BSHPrimaryExpression.eval(Unknown Source)
   at bsh.Interpreter.eval(Unknown Source)
   at bsh.Interpreter.eval(Unknown Source)
   at bsh.Interpreter.eval(Unknown Source)
   at eu.irreality.age.ObjectCode.run(ObjectCode.java:402)
   at eu.irreality.age.ObjectCode.run(ObjectCode.java:235)
   at eu.irreality.age.Item.execCode(Item.java:1875)
   at eu.irreality.age.Entity.update(Entity.java:272)
   at eu.irreality.age.Entity.update(Entity.java:95)
   at eu.irreality.age.World.update(World.java:2710)
   at eu.irreality.age.GameEngineThread.run(GameEngineThread.java:306)

Target report: java.lang.NullPointerException: Attempt to invoke method getRoom on null value
   at bsh.Reflect.resolveExpectedJavaMethod(Unknown Source)
   at bsh.Reflect.invokeObjectMethod(Unknown Source)
   at bsh.BSHPrimarySuffix.doName(Unknown Source)
   at bsh.BSHPrimarySuffix.doSuffix(Unknown Source)
   at bsh.BSHPrimaryExpression.eval(Unknown Source)
   at bsh.BSHPrimaryExpression.eval(Unknown Source)
   at bsh.BSHIfStatement.evaluateCondition(Unknown Source)
   at bsh.BSHIfStatement.eval(Unknown Source)
   at bsh.BSHBlock.evalBlock(Unknown Source)
   at bsh.BSHBlock.eval(Unknown Source)
   at bsh.BSHBlock.eval(Unknown Source)
   at bsh.BSHIfStatement.eval(Unknown Source)
   at bsh.BSHBlock.evalBlock(Unknown Source)
   at bsh.BSHBlock.eval(Unknown Source)
   at bsh.BSHBlock.eval(Unknown Source)
   at bsh.BSHIfStatement.eval(Unknown Source)
   at bsh.BSHBlock.evalBlock(Unknown Source)
   at bsh.BSHBlock.eval(Unknown Source)
   at bsh.BshMethod.invokeImpl(Unknown Source)
   at bsh.BshMethod.invoke(Unknown Source)
   at bsh.BshMethod.invoke(Unknown Source)
   at bsh.Name.invokeLocalMethod(Unknown Source)
   at bsh.Name.invokeMethod(Unknown Source)
   at bsh.BSHMethodInvocation.eval(Unknown Source)
   at bsh.BSHPrimaryExpression.eval(Unknown Source)
   at bsh.BSHPrimaryExpression.eval(Unknown Source)
   at bsh.Interpreter.eval(Unknown Source)
   at bsh.Interpreter.eval(Unknown Source)
   at bsh.Interpreter.eval(Unknown Source)
   at eu.irreality.age.ObjectCode.run(ObjectCode.java:402)
   at eu.irreality.age.ObjectCode.run(ObjectCode.java:235)
   at eu.irreality.age.Item.execCode(Item.java:1875)
   at eu.irreality.age.Entity.update(Entity.java:272)
   at eu.irreality.age.Entity.update(Entity.java:95)
   at eu.irreality.age.World.update(World.java:2710)
   at eu.irreality.age.GameEngineThread.run(GameEngineThread.java:306)


A ver si lo conseguimos entre los dos... :lol: :lol:


Arriba
 Perfil  
 
NotaPublicado: 22 Jun 2012 22:31 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5274
Ubicación: Coruña
Dice que has llamado a getRoom() sobre un valor nulo. ¿El personaje jugador de tu aventura se llama realmente "jugador"? Mira que su nombre único sea ése, en minúsculas, y si no tendrás que cambiar en el código "jugador" por el verdadero nombre único.

Definitivamente voy a tener que hacer ese modo debug donde se muestren warnings al acceder a objetos que no existen, parece que es algo problemático cuando uno está empezando.

_________________
Actúa siempre de tal modo que las decisiones de tu voluntad pudiesen servir como preceptos de una legislación universal (E. Kant)


Arriba
 Perfil  
 
NotaPublicado: 22 Jun 2012 23:03 
Desconectado
Dragón
Dragón

Registrado: 22 Oct 2010 10:09
Mensajes: 117
Pues si, ese era el fallo :roll: :roll:

Creo que sería una buena actualización esa que comentas. :lol:


Arriba
 Perfil  
 
NotaPublicado: 22 Jun 2012 23:48 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5274
Ubicación: Coruña
No será difícil, a ver si lo añado en los próximos días.

_________________
Actúa siempre de tal modo que las decisiones de tu voluntad pudiesen servir como preceptos de una legislación universal (E. Kant)


Arriba
 Perfil  
 
NotaPublicado: 30 Oct 2013 00:02 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 09 Feb 2012 20:33
Mensajes: 855
Buenas,

Algún ejemplo de aventura escrita en AGE que aparezcan conversaciones con PNJ´s. Con varias opciones... es decir, en la última que probé en AGE, las conversaciones al teclear temas, aparecía uno u dos como mucho.
...., mi intención es crear un personaje, el cual te responderá por cualquier objeto que haya aparecido en la aventura, tenga relevancia o no. De tal forma que si por el objeto que le preguntemos no tiene relevancia te responderá:

Personaje: Sobre eso no tengo nada que decirte.

>>hablar con frutero sobre la gasolina
Frutero: Sobre eso no tengo nada que decirte.


y en caso contrario la respuesta programada para ese objeto y el personaje al cual le preguntamos.
Por ejemplo:
>>hablar con frutero sobre el melón
Frutero: el melón está de muerte y baratito.


Luego al teclear:
>>temas frutero

Te saldrá un listado de temas con los que puede hablar con el frutero.
>>melón, melocotones... etc

Tengo una estructura creada en informaTE que aún estoy depurando, pero me gustaría empezar con AGE y me interesa especialmente este tema para un proyecto que tengo en mente.

Gracias!!!!

_________________
Te quiero... lo siento Yoda sólo tenemos café.


Arriba
 Perfil  
 
NotaPublicado: 30 Oct 2013 00:36 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5274
Ubicación: Coruña
Supongo que la última que probaste sería "El Karma de la Cepa", ¿no? No sé cómo funciona por dentro el sistema que han usado y si sería fácil extenderlo para que haya más temas, igual los autores te pueden responder.

En todo caso, aun partiendo de cero, lo que dices no es difícil de hacer. Ahora me tengo que ir a la cama, pero mañana en cuanto pueda te echo un cable.

_________________
Actúa siempre de tal modo que las decisiones de tu voluntad pudiesen servir como preceptos de una legislación universal (E. Kant)


Arriba
 Perfil  
 
NotaPublicado: 30 Oct 2013 07:35 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 09 Feb 2012 20:33
Mensajes: 855
Al-Khwarizmi escribió:
Supongo que la última que probaste sería "El Karma de la Cepa", ¿no? No sé cómo funciona por dentro el sistema que han usado y si sería fácil extenderlo para que haya más temas, igual los autores te pueden responder.

En todo caso, aun partiendo de cero, lo que dices no es difícil de hacer. Ahora me tengo que ir a la cama, pero mañana en cuanto pueda te echo un cable.


OK, hoy que tengo el día despejado voy a cotillear creando habitaciones, objetos.... en cuanto me vaya aclarando con esto y me ponga con un personaje vuelvo a retomar la pregunta.

Gracias

_________________
Te quiero... lo siento Yoda sólo tenemos café.


Arriba
 Perfil  
 
NotaPublicado: 30 Oct 2013 10:42 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5274
Ubicación: Coruña
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 ... _criaturas

Con 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.

_________________
Actúa siempre de tal modo que las decisiones de tu voluntad pudiesen servir como preceptos de una legislación universal (E. Kant)


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