CAAD

Comunidad de Aventuras Conversacionales y Relatos Interactivos
Fecha actual 19 Ago 2017 12:23

Todos los horarios son UTC + 1 hora




Nuevo tema Responder al tema  [ 84 mensajes ]  Ir a página Anterior  1, 2, 3, 4, 5, 6  Siguiente
Autor Mensaje
NotaPublicado: 04 Nov 2013 13:12 
Desconectado
Implementador
Implementador

Registrado: 13 Feb 2005 18:57
Mensajes: 1854
Como comentábamos el otro día por IRC, creo que te sigues complicando con el tema de las potencias de dos.

Además, para mi gusto, esos setters [chn_marco_*(int num)] no tienen mucho sentido, porque sólo sirven para cambiar el valor, cosa que podrás hacer directamente. Los setters pueden tener sentido en otras circunstancias pero aquí no veo la ventaja de usarlos.

Creo que estás reinventando el soporte para propiedades (las hermanas pequeñas de las relaciones).

Las propiedades puedes cambiarlar directamente, sin necesidad de los setters. Y como en tu caso estás creando una especie de flags, te valen unas cuantas propiedades bool.

Yo, en mi ignorancia de qué necesidades adicionales vas a tener (y por lo tanto sé libre de no hacerme ni puñetero caso), simplemente usaría las propiedades "en_estante", "ha_sido_examinado" y "con_foto"... y las pondría a true en los puntos en los que ahora estás llamando al chn_estante_*() correspondiente. Por ejemplo...

Código:
set( item("marco"), "ha_sido_examinado", true );
[Nótese que si este código está en el propio objeto "marco", puedes usar self en vez de item("marco")].

A mi entender, las condiciones serán más claras al comparar con propiedades que tienen un nombre relevante en vez de estar tratando con números sin significado obvio. En pseudocódigo (ambos):
Código:
si self.ha_sido_examinado and self.con_foto
    ....
sino si ...
    ...
sino si ...
    ...

en vez de (requiriendo comentarios porque los números no ayudan).
Código:
switch bandera_en_entero:
    0: // el caso de no tal y no cual
    1: // el caso de cual pero no tal
    2: // el caso de tal pero no cual
    3: // el caso de tal y cual


Espero haberme explicado con claridad.


Arriba
 Perfil  
 
NotaPublicado: 04 Nov 2013 15:13 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 09 Feb 2012 20:33
Mensajes: 855
Citar:
Además, para mi gusto, esos setters [chn_marco_*(int num)] no tienen mucho sentido, porque sólo sirven para cambiar el valor, cosa que podrás hacer directamente. Los setters pueden tener sentido en otras circunstancias pero aquí no veo la ventaja de usarlos.

Creo que estás reinventando el soporte para propiedades (las hermanas pequeñas de las relaciones).

Las propiedades puedes cambiarlar directamente, sin necesidad de los setters. Y como en tu caso estás creando una especie de flags, te valen unas cuantas propiedades bool.


Como comentas es como me he puesto a hacerlo. En principio me puse con el código de antes, para hacer pruebas, luego ya me puse a trabajar con las propiedades de los objetos.

Y el tema de usar switch y no if .. else... anidados, es por la forma que tengo de crear las respuestas. Es decir primero me creo en una hoja de cálculo, las combinaciones con las respuestas y pasarlo a un switch me es más cómodo y más rápido.
.. no sé si me explico.

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


Arriba
 Perfil  
 
NotaPublicado: 07 Nov 2013 11:54 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 09 Feb 2012 20:33
Mensajes: 855
Hola de nuevo!

Como puedo re-definir un verbo. Es decir, para un caso en concreto quiero separar los verbos quitar/coger. De tal forma que sean acciones independientes.
Por ejemplo, tengo un folio con una grapa.
Si cojo el folio, me llevo el folio y la grapa.
Código:
>coger folio
Coges el folio con su grapa que está unida.


Si cojo la grapa, me llevo la grapa y el folio
Código:
>coger grapa
Coges la grapa y el folio que están unidos.


Si quiero quitar la grapa del folio, es decir separar los dos elementos.
Código:
>quitar grapa del folio.
Coges la grapa y el folio que están unidos.


He intentado en el parsecommand del objeto "grapa"

Código:
if (equals(verb, "quitar"))


Pero luego he recordado que al parseCommand ya le llega el resultado del parser, es decir, que siempre le llegará el verbo "coger".

Ahora iba a ponerme con el pre-procesado de la entrada para "cazar" el verbo "quitar" y sinónimos, pero claro como solo es para un caso específico, tengo que mirar que tengamos el objeto, que estamos haciendo referencia a los dos objetos "grapa" "folio" etc....
Así que antes de nada pregunto si puedo separar los verbos "quitar/sacar/coger" y que sean acciones independientes.

PD: La aventura que estoy escribiendo no trata de papelerías ni de separar grapas de folios ni bolis de capuchones.... es solo un ejemplo que he puesto para no desvelar pistas antes de tiempo :p
PDD: Y sí, me gusta mucho complicarme las cosas 8)

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


Arriba
 Perfil  
 
NotaPublicado: 07 Nov 2013 12:22 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5268
Ubicación: Coruña
Sí que se puede separar esos verbos.

Lo de que "quitar" se traduzca a "coger" está definido como un alias (los tienes todos en esta lista: http://code.google.com/p/aetheria/sourc ... .lan?r=329)

Por defecto, las aventuras en español cargan esa lista de alias, pero tú la puedes cambiar en tiempo de ejecución.

Para quitar el alias que va de "quitar" a "coger", puedes hacer:

Código:
world.getLanguage().removeAlias("quitar","coger");


O, incluso más simple, poniendo sólo el verbo origen:

Código:
world.getLanguage().removeAlias("quitar");


Si por algún motivo en algún momento quisieras hacer lo contrario (añadir un alias nuevo), también podrías:

Código:
world.getLanguage().addAlias("agarrar","coger");


Puedes hacer estos cambios en cualquier momento, aunque en tu caso supongo que lo que tiene sentido es hacerlos al principio de la ejecución (por ejemplo en el método intro) para que estén vigentes a lo largo de toda la aventura.

_________________
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: 07 Nov 2013 12:33 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 09 Feb 2012 20:33
Mensajes: 855
Gracias!!!

Ya sabía yo que habría algo, esto de AGE es un buen invento. ;)

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


Arriba
 Perfil  
 
NotaPublicado: 08 Nov 2013 17:47 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 09 Feb 2012 20:33
Mensajes: 855
He estado mirando en la documentación en los siguientes puntos:
http://www.caad.es/aetheria/doc/doku.ph ... ropiedades,
http://www.caad.es/aetheria/doc/doku.ph ... clase_item

Para intentar encontrar un método que me de una lista de las propiedades que tengo en un objeto, pero no consigo encontrarlo (no se si existe).

En el caso de que se ejecute el código:
// En el parseCommand del World

Código:
if (equals(verb, "quemar")) {
        // miramos si es inflamable
        if (!get(target, "inflamable")) {
            //no es inflamable
            world.mprint("Eso no arde.\n",1);
            end();
        }
    }


Si el objeto tiene la propiedad inflamable, perfecto, pero en caso contrario, da errores.
Necesitaría antes de ejecutar el if, comprobar que el objeto tiene esa propiedad, en caso afirmativo continuar y si no pues parar. Ya que en caso contrario tengo que ponerle la propiedad inflamable a tooodos los objetos que cree, no vaya ser que un jugador teclee,
>quemar cosa
y si la cosa no tiene la propiedad inflamable tendría el problema.

El código sería:
// En el parseCommand del World

Código:
if (equals(verb, "quemar")) {
       //miramos si tiene la propiedad
       IF  not (target TIENE LA PROPIEDAD "inflamable")
              IMPRIMIR, "No puedes ir por ahí quemándolo todo."
       ELSE
       // miramos si es inflamable
        if (!get(target, "inflamable")) {
            //no es inflamable
            world.mprint("Eso no arde.\n",1);
            end();
        }
       ELSE PASA AL PARSECOMMAND DEL OBJETO Y TRATA ALLÍ EL VERBO QUEMAR
    }

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


Arriba
 Perfil  
 
NotaPublicado: 08 Nov 2013 18:41 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5268
Ubicación: Coruña
En el caso de que una propiedad no haya sido definida, get ( entidad , "propiedad" ) devuelve el valor null.

Así que puedes comprobar si un objeto no tiene definida la propiedad inflamable haciendo:

Código:
if ( get ( target , "inflamable" ) == null ) ...


Una alternativa a eso es, dado que sabes que tu propiedad es de tipo booleano, utilizar target.getPropertyValueAsBoolean("inflamable"). En este caso, cuando la propiedad no esté definida, se devolverá false (dado que le estás diciendo explícitamente que la propiedad es de tipo boolean, te da el valor por defecto de boolean, que es false); y por lo tanto podrías poner directamente el getPropertyValueAsBoolean en el if y el resultado sería que una entidad no es inflamable salvo que se diga lo contrario.

Este funcionamiento no se puede conseguir con el get ( tal , "cual" ) porque al no especificarle el tipo, no tiene manera de saber de qué tipo es una propiedad que no está definida. Así que devuelve siempre el valor por defecto más general que hay (que vale para todos los tipos), que es null. El error que obtuviste era por usar ese valor null como si fuera un booleano.

_________________
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: 08 Nov 2013 19:58 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 09 Feb 2012 20:33
Mensajes: 855
Teniendo en cuenta que la propiedad que he creado es boolean, el código me ha quedado:

//parseCommand de World.
Código:
if (equals(verb, "quemar")) {
 
          if (!target.getPropertyValueAsBoolean("inflamable")) { 
            //no es rompible
            world.mprint("No andes por ahí en plan destroyer.\n",1);
            end();
        }
    }


Me funciona ok.
Según lo que me comentas, si no me confundo en el caso de que la propiedad no sea boolean sería:

Código:
if (equals(verb, "quemar")) {
        if (get(target, "inflamable")==null) {
            world.mprint("No andes por ahí en plan destroyer.\n",1);
            end();
        }
    }


He probado cambiado la propiedad inflamable por 0 y 1 (valores numéricos) y también me funciona.

Gracias!

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


Arriba
 Perfil  
 
NotaPublicado: 08 Nov 2013 20:38 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5268
Ubicación: Coruña
El segundo caso que has puesto funciona siempre, para boolean y no boolean. Cualquier propiedad que no está definida, con el get ( tal , "cual" ) devuelve null.

_________________
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: 11 Nov 2013 08:39 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 09 Feb 2012 20:33
Mensajes: 855
Spoiler:
Al-Khwarizmi escribió:
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.


Retomando este tema, ya me he puesto con los personajes de mi historia. Solo me ha surgido un problema, en el caso de que le preguntemos a un personaje por otro personaje?

En el init de unos de los personajes he puesto

Código:
void onInit()
{
 
  Entity e;
  set(self,"hablaDe",item("cuchillo"),"");//"Peligroso el cuchillo.");
  set(self,"hablaDe",item("decoradoTucasa"),"");
  set(self,"hablaDe",mobile("federico"), ""); //federico es otro personaje de la historia.
 //set(self,"hablaDe", item("federico"),"");
// set(self, "hablaDe", e("federico"), "");
   
}


Para el caso de los objetos "normales" me funciona ok, pero para el caso de preguntarle por otro personaje de la historia no. He probado de las tres formas que paso en el código, y con ninguno de los tres me funciona. ¿cómo puedo relacionar los dos personajes?

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


Arriba
 Perfil  
 
NotaPublicado: 11 Nov 2013 09:34 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5268
Ubicación: Coruña
Pues con mobile("federico") debería funiconar exactamente igual que con los items (con item("federico") y e("federico") no, ya que esas construcciones serían incorrectas).

¿No será que tienes un error en otro lado? ¿Igual un despiste tipográfico, como que el personaje se llama Federico con mayúscula y tú pones mobile("federico") con minúscula, o algo así? ¿Te da algún mensaje de error en particular?

Otro problema podría ser que Federico esté en la misma sala donde estás hablando, en cuyo caso al poner "hablar a Fulano de Federico" puede estar saltando el parseCommand que hay en Federico antes que el de Fulano. Deberían saltar ambos (ya que el jugador se refiere a los dos personajes), pero si en el de Federico pones un end() o se produce alguna otra cosa que interrumpa la ejecución de la orden, el de Fulano no llegará a saltar.

_________________
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: 11 Nov 2013 09:49 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 09 Feb 2012 20:33
Mensajes: 855
Al-Khwarizmi escribió:
Pues con mobile("federico") debería funiconar exactamente igual que con los items (con item("federico") y e("federico") no, ya que esas construcciones serían incorrectas).

¿No será que tienes un error en otro lado? ¿Igual un despiste tipográfico, como que el personaje se llama Federico con mayúscula y tú pones mobile("federico") con minúscula, o algo así? ¿Te da algún mensaje de error en particular?

Otro problema podría ser que Federico esté en la misma sala donde estás hablando, en cuyo caso al poner "hablar a Fulano de Federico" puede estar saltando el parseCommand que hay en Federico antes que el de Fulano. Deberían saltar ambos (ya que el jugador se refiere a los dos personajes), pero si en el de Federico pones un end() o se produce alguna otra cosa que interrumpa la ejecución de la orden, el de Fulano no llegará a saltar.


A Federico lo tengo en otra sala. Pensaba lo mismo que tú, del error tipográfico, le cambié el nombre para asegurarme a "fede", más corto. Te paso el error que me sale nada más arrancar. Creo que hay por ahí un puntero que se me pierde.

Código:
//código a ejecutar cuando se inicializa el personaje
void onInit()
{

    set(self,"hablaDe",item("paquete"),"");
    set(self,"hablaDe",item("conversasVarias"),"");
    //set(self,"hablaDe",item("decoradoTucasa"),"");
    set(self,"hablaDe",mobile("fede"), "");
   
}


Spoiler:
**********BeanShell Runtime Error Report**********
*Error: java.lang.NullPointerException
*Location: URL: jar:file:/home/edu/Aventuras/Programas/Age/AgeCore.jar!/stdfunct.bsh
*Line: 78
*Offending text: world .getMobile ( s )
*Message: Sourced file: inline evaluation of: ``onInit( );'' : Method Invocation world.getMobile
*Script stack trace:
Called from method: mobile : at Line: 8 : in file: inline evaluation of: ``//código a ejecutar cuando se inicializa el personaje void onInit() { set(s . . . '' : mobile ( "fede" )
Called from method: onInit : at Line: 1 : in file: inline evaluation of: ``onInit( );'' : onInit ( )
*Exception was generated in native code. Stack trace follows: java.lang.NullPointerException
at eu.irreality.age.World.getMob(World.java:1891)
at eu.irreality.age.World.getMobile(World.java:1870)
at sun.reflect.GeneratedMethodAccessor32.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:616)
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.BSHReturnStatement.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.BSHArguments.getArguments(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.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:457)
at eu.irreality.age.ObjectCode.run(ObjectCode.java:289)
at eu.irreality.age.Mobile.execCode(Mobile.java:1545)
at eu.irreality.age.Mobile.constructMob(Mobile.java:1088)
at eu.irreality.age.Mobile.<init>(Mobile.java:198)
at eu.irreality.age.Mobile.getInstance(Mobile.java:223)
at eu.irreality.age.World.loadWorldFromXML(World.java:905)
at eu.irreality.age.World.loadWorldFromStream(World.java:1536)
at eu.irreality.age.World.<init>(World.java:1574)
at eu.irreality.age.filemanagement.WorldLoader.loadWorld(WorldLoader.java:241)
at eu.irreality.age.windowing.LoaderThread.run(LoaderThread.java:117)

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


Arriba
 Perfil  
 
NotaPublicado: 11 Nov 2013 10:20 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5268
Ubicación: Coruña
Hmm, ¿seguro que Federico es un personaje, y no es otra cosa - un item, una entidad abstracta, etc.?

Parece como el error que se produce cuando llamas a mobile("...") para obtener por ejemplo un item, o a item("...)" para obtener un mobile.

Error que por cierto tengo que hacer que dé un mensaje más comprensible, porque el que da ahora mismo claramente no lo es... y había hecho un cambio para hacer que lo fuera, pero a raíz de esto me acabo de dar cuenta de que lo hice mal :D

_________________
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: 11 Nov 2013 12:48 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 09 Feb 2012 20:33
Mensajes: 855
Pues lo requete-repaso y creo que está bien, fede es un personaje, el dibujo del corazón. He hecho la prueba de borrarlo y volverlo a crear y hace lo mismo.

También hice la prueba de asociar los personajes a la inversa y no da ningún fallo. ¿?
Es decir:

En el personaje federico: Nombre único (fede)
Código:
//código a ejecutar cuando se inicializa el personaje
void onInit()
{
set(self,"hablaDe",mobile("eugenia"), "");
   
}


En el personaje Eugenia: Nombre único (eugenia):

Código:
//código a ejecutar cuando se inicializa el personaje
void onInit()
{

    set(self,"hablaDe",item("paquete"),"");
    set(self,"hablaDe",item("conversasVarias"),"");
    //set(self,"hablaDe",mobile("fede"), "");  --->>>>>>ESTO TENGO QUE COMENTARLO EN CASO CONTRARIO DA ERROR.
   
}


Trasteando también me he dado cuenta otra cosa mientras escribía esto. A ver si consigo explicarme, luego he creado una copia de Eugenia, por lo que tengo los personajes:
Federico nombre único fede.
Eugenia nombre único eugenia.
Eugenia (copia) nombre único eugenia(copy).

Si a eugenia(copy) que la he creado después de federico(fede), y en su inicialización coloco:

Código:
//código a ejecutar cuando se inicializa el personaje
void onInit()
{
    set(self,"hablaDe",mobile("fede"), "");
    set(self,"hablaDe",item("paquete"),"");
    set(self,"hablaDe",item("conversasVarias"),"");
   
   
}


FUNCIONA!!!

Pero si al código de federico colocamos:

/
Código:
/código a ejecutar cuando se inicializa el personaje
void onInit()
{
set(self,"hablaDe",mobile("eugenia"), "");
set(self,"hablaDe",mobile("eugenia(copy)"), ""); 
   
}


Al asociarle la copia de eugenia(copy) es cuando vuelve a dar el fallo, es decir, que tiene que ver con el orden en que creo los personajes... no sé si he conseguido explicarme...

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


Arriba
 Perfil  
 
NotaPublicado: 11 Nov 2013 12:57 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 09 Feb 2012 20:33
Mensajes: 855
Por ahora lo puedo solventar ya que a Federico no tengo porqué preguntarle por Eugenia, así que he creado a fede y luego a Eugenia en este orden y no da ningún problema..
Pero más adelante en la historia si tendré personajes que tengan una relación mutua, en la que a cada uno de ellos le tendré que preguntar por el otro.

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


Arriba
 Perfil  
 
Mostrar mensajes previos:  Ordenar por  
Nuevo tema Responder al tema  [ 84 mensajes ]  Ir a página Anterior  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 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:  
cron
Desarrollado por phpBB® Forum Software © phpBB Group
Traducción al español por Huan Manwë para phpBB-Es.COM