CAAD

Comunidad de Aventuras Conversacionales y Relatos Interactivos
Fecha actual 18 Jul 2018 00:14

Todos los horarios son UTC + 1 hora




Nuevo tema Responder al tema  [ 7 mensajes ] 
Autor Mensaje
NotaPublicado: 20 Jun 2011 15:25 
Desconectado
xyzzy

Registrado: 09 Mar 2004 22:50
Mensajes: 9150
Existe un problema con este método y es que si se aplica sobre un objeto contenido dentro de uno fijo, lo muestra como !target.isGettable()
Código:
void parseCommandOnContents ( Mobile aCreature , String verb , String args , Vector path , Entity target )
//void parseCommandOnContentsGeneric ( Mobile aCreature , String verb , String args1 , String args2 , Vector path1 , Vector path2 , Entity obj1 , Entity obj2 )
{
 
    if ( equals(verb,"coger")){
             if( target instanceof Item && !target.isGettable()){
                aCreature.write("No puedes coger eso está fijo al suelo.\n");
end();}     
   
         }    
 }


Aplicado este código sobre un caldero metido dentro de unos helechos (objeto fijo), se considera que el caldero no es gettable y no se puede coger. Si comento el primer método y descomento el segundo el caldero se puede coger sin ningún problema.

La versión de AGE es aún la anterior a la recién actualizada, pero imagino que se dará en ambas versiones.

_________________
Si la mentira tuviera color, todos seríamos daltónicos...


Arriba
 Perfil  
 
NotaPublicado: 20 Jun 2011 15:33 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5300
Ubicación: Coruña
Éste es el problema de siempre... recuerda que parseCommandOnContents se llama sobre los objetos contenidos y también sobre los objetos que los contienen. Si quieres trabajar sólo con el objeto contenido (el caldero), tienes que comprobar primero que equals(target,path.get(0)). Si no, puedes recibir el caldero o el helecho.

Véase:
viewtopic.php?p=58278#p58278
viewtopic.php?p=53757#p53757
viewtopic.php?p=48232#p48232
viewtopic.php?p=48550#p48550
viewtopic.php?p=47977#p47977

_________________
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 2011 16:03 
Desconectado
xyzzy

Registrado: 09 Mar 2004 22:50
Mensajes: 9150
Al-Khwarizmi escribió:
Éste es el problema de siempre... recuerda que parseCommandOnContents se llama sobre los objetos contenidos y también sobre los objetos que los contienen. Si quieres trabajar sólo con el objeto contenido (el caldero), tienes que comprobar primero que equals(target,path.get(0)). Si no, puedes recibir el caldero o el helecho.

Véase:
viewtopic.php?p=58278#p58278
viewtopic.php?p=53757#p53757


Me moriré sin pillarlo. :oops: :oops:

A ver, en esos temas se habla de onContents referentes a dos objetos, y yo aquí me refiero a un onContents que se supone hace referencia a un solo objeto.
Si precisamente he elegido "ése" es porque en el submenú de métodos de entrada dice:
"referente a una cosa".
Y he pensado... "si solo se refiere a una cosa, solo me tendré que preocupar por esa cosa y por nada más."
Pero si además lees:
//target: entidad a la que se refer�a el comando (la seta en el ejemplo anterior).
Ya no te queda duda de que target será siempre el objeto que mencione el jugador.

Que sí, que si hubiera leído bien la explicación me habría enterado de que más arriba dice que hay que referirse a ese objeto como ((Item)path.get(0))
Pero... si el comando se refiere a un solo objeto, y solo se nombra un objeto y queda claro que el jugador solo quiere actuar sobre ese objeto... ¿por qué no se asigna automáticamente ese valor a ese objeto?
No lo entiendo. :(
De todos modos si funciona así, miraré de hacerlo de otro modo.

_________________
Si la mentira tuviera color, todos seríamos daltónicos...


Arriba
 Perfil  
 
NotaPublicado: 20 Jun 2011 16:18 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5300
Ubicación: Coruña
Vale, el comentario que pone

Citar:
//target: entidad a la que se refería el comando (la seta en el ejemplo anterior).


está mal en ese caso concreto, porque se ve que lo copypasteé del parseCommand sin onContents. Así que acepto mi culpa por esa errata.

En todo caso, todos los parseCommandOnContents funcionan igual. Como dice en el menú, son "sobre contenedores y objetos contenidos". O sea, se pueden invocar sobre un objeto contenido al que el jugador se ha referido, o sobre un contenedor que lo contenga. Es siempre lo mismo, sean para un objeto o para dos, y sean del mundo o del objeto en sí (aunque parece que sólo este caso tiene la errata en el comentario).

Como explicaba en uno de esos posts anteriores, el parseCommandOnContents puede servir para dos cosas:

1. Capturar órdenes sobre uno o dos objetos a los que se refiere el jugador, y que pueden estar contenidos en contenedores.
2. Que desde un objeto contenedor, puedas capturar órdenes sobre objetos que están dentro.

Tú el uso 2 nunca lo estás utilizando. Para tu aventura, estás usando sólo el uso 1. Pero si no haces ninguna comprobación, el método salta en ambos casos, tanto en el 1 como en el 2. Estas comprobaciones con path1.get(0) lo que hacen es excluir el 2, para que te quedes con el que te interesa, que es el 1.

jenesis escribió:
Pero... si el comando se refiere a un solo objeto, y solo se nombra un objeto y queda claro que el jugador solo quiere actuar sobre ese objeto... ¿por qué no se asigna automáticamente ese valor a ese objeto?


Porque eso excluiría el uso 2. Si se hiciera así, estos parseCommandOnContext no servirían para que un contenedor pudiese influir en las acciones sobre los objetos que están dentro (y conseguir eso sería complicadísimo).

¿Te has planteado utilizar lo de containedItemsInScope, como decía en viewtopic.php?p=58278#p58278 ? Esa funcionalidad te permite que todos los parseCommands hagan automáticamente 1, sin hacer 2 (eso sí, tendrías que hacer comprobaciones si con alguno *no* quieres hacer el uso 1).

_________________
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 2011 17:18 
Desconectado
xyzzy

Registrado: 09 Mar 2004 22:50
Mensajes: 9150
Citar:
"Esto quiere decir que, por defecto, las únicas acciones que se pueden llevar a cabo sobre objetos dentro de contenedores son las acciones coger y mirar por defecto de AGE, el resto no funcionarán. Esto incluye también a las acciones que se definan o redefinan mediante los métodos de análisis de la entrada vistos en capítulos anteriores. "


Hay principalmente dos tipos de contenedores, aquellos que dejan lo que contienen al alcance del jugador y aquellos que no. Ambos tipos pueden a su vez dejar ver su contenido o no permitirlo.

Las razones para que el objeto contenido no estén al alcance del jugador pueden ser varias.
Que el contenedor esté cerrado.
Que el contenedor sea profundo.
Que el contenedor esté a su vez fuera del alcance del jugador.

Las razones para que el contenido se muestre o no, pueden ser:
Que el contenedor sea opaco y esté cerrado.
Que el contenedor sea profundo y esté oscuro.
Que el contenedor esté dentro de otro que no muestre su contenido.

Pero las razones no nos importan, lo que importa es que se necesitan solo cuatro variables para almacenar toda la información referente a un objeto contenido.

Una que indique que dicho objeto está contenido.
Otra que indique si el contenedor permite su manipulación
Otra que indique si el contenedor permite su visualización.
Otra que indique si el contenedor es a su vez visible y manipulable.

Las norma principal es que si el contenedor se mueve, todo lo que contiene se desplaza con él y que si no es manipulable o visible tampoco lo es lo que contiene.

Una pestaña más en la ficha de los items.
"contenedores"
con las propiedades:
accesible -> en caso de que lo que se introduzca quede al alcance del jugador.
transparente-> en caso de que lo que se introduzca quede visible.


Por otro lado en cada item dos nuevas propiedades "atHand" y "onView", ambas debería ponerse a false o true en virtud del contenedor que los acogiera. Además de que se podrían utilizar para muchas otras cosas.

Y el programador ya solo tiene que comprobar en cada parseCommand
if(get(self, "atHand"))
{
Todas las acciones que intenten manipular al objeto.
}

Y el sistema sería el que se preocuparía de comprobar si....
if(item("objeto"), "onView"))
{
Para dar la descripción por defecto.
}


Seguramente estaré pidiendo peras al olmo, pero no he podido evitar exponerlo del modo que yo lo haría, otra cosa es que sea víable. :oops: :oops: :oops:

_________________
Si la mentira tuviera color, todos seríamos daltónicos...


Arriba
 Perfil  
 
NotaPublicado: 20 Jun 2011 17:56 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5300
Ubicación: Coruña
Viable es. Pero la verdad, prefiero tener un método que resuelve todos los casos, a tener nada menos que cuatro propiedades, y aun así no implementar toda la funcionalidad que implementa ese método. Porque la cosa no termina ahí... ¿cómo defines un contenedor que no permite ver lo que hay dentro, ni tampoco cogerlo, pero sí tocarlo (por ejemplo porque la boca es estrecha y sólo cabe la mano)? ¿Y un contenedor que permite manipular lo que hay dentro, pero que tiene una trampa de forma que cada vez que lo haces te dañas el brazo y te hace un punto de daño? ¿Y un contenedor que te permite ver su interior pero lo deforma? Todo eso está cubierto por el procedimiento actual y no lo estaría por las cuatro propiedades, a pesar de ser un diseño mucho más complejo.

A mí me gustan los diseños simples y que lo cubren todo, para tener modelos de mundo enormes pero rígidos ya hay otros sistemas y a ti misma no te gustan en gran medida por los problemas que causa ese estilo de modelar las cosas (al final, siempre crean rigideces).

En tu caso concreto, tampoco tienes que complicarte tanto la vida, sólo tienes que hacer una de dos opciones: (1) o usar containedItemsInScope, o (2) poner siempre, siempre, siempre esa comprobación que ya hemos puesto aquí varias veces. Tal vez se podría hacer una plantilla para esto último.

_________________
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 2011 18:27 
Desconectado
xyzzy

Registrado: 09 Mar 2004 22:50
Mensajes: 9150
Al-Khwarizmi escribió:
En tu caso concreto, tampoco tienes que complicarte tanto la vida, sólo tienes que hacer una de dos opciones: (1) o usar containedItemsInScope, o (2) poner siempre, siempre, siempre esa comprobación que ya hemos puesto aquí varias veces. Tal vez se podría hacer una plantilla para esto último.


No, no te molestes.
Hazlo solo en caso de que algún otro usuario tenga problemas en este punto.
Yo ya lo tengo bastante claro.

_________________
Si la mentira tuviera color, todos seríamos daltónicos...


Arriba
 Perfil  
 
Mostrar mensajes previos:  Ordenar por  
Nuevo tema Responder al tema  [ 7 mensajes ] 

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