CAAD

Comunidad de Aventuras Conversacionales y Relatos Interactivos
Fecha actual 11 Jul 2020 05:09

Todos los horarios son UTC + 1 hora




Nuevo tema Responder al tema  [ 11 mensajes ] 
Autor Mensaje
NotaPublicado: 07 Mar 2006 23:06 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 10 Sep 2004 00:17
Mensajes: 3069
Ubicación: Chile
Saludos:

Estoy en pleno desarrollo de una AC corta (mi proyecto "Goteras") y me topo con un problema ya resuelto antes, pero en forma poco elegante...


Supongan que (como en mi anterior "El Protector") tengo una localidad:

Código:
Localidad_Aldea Aldea "La Aldea"
with
   descripcion "Estás en la aldea";
[...]


Notar que uso clases para las distintas localidades (efectos, respuestas por omisión distintas, etc.) Lo curioso del caso, es que si quiero que al poner "x aldea" o "mirar aldea" me responda con el texto de la aldea y no el texto de omision, la solución que he usado es:

1. Crear una clase "Objeto Localidad"

Código:
Class ObjLocalidad
with
   descripcion [;<<Mirar>>;],
has escenario;


2. Crear el objeto aldea específico:

Código:
   ObjLocalidad ObjAldea "Aldea" Aldea
   with
      nombre 'aldea',
   has femenino;


...y así para cada localidad.

¿Existe algún método menos (ejem) engorroso y elegante?

Se despide, de antemano agradecido,

_________________
[Incanus]
El Escritorio - Blog Aventurero y Literario


Arriba
 Perfil  
 
NotaPublicado: 08 Mar 2006 00:39 
Desconectado
Implementador
Implementador
Avatar de Usuario

Registrado: 10 Mar 2004 21:40
Mensajes: 1444
Ubicación: Nímgar, Ciudad Lunar
Incanus escribió:
Saludos:

Estoy en pleno desarrollo de una AC corta (mi proyecto "Goteras") y me topo con un problema ya resuelto antes, pero en forma poco elegante...


Supongan que (como en mi anterior "El Protector") tengo una localidad:

Código:
Localidad_Aldea Aldea "La Aldea"
with
   descripcion "Estás en la aldea";
[...]


Notar que uso clases para las distintas localidades (efectos, respuestas por omisión distintas, etc.) Lo curioso del caso, es que si quiero que al poner "x aldea" o "mirar aldea" me responda con el texto de la aldea y no el texto de omision, la solución que he usado es:

1. Crear una clase "Objeto Localidad"

Código:
Class ObjLocalidad
with
   descripcion [;<<Mirar>>;],
has escenario;


2. Crear el objeto aldea específico:

Código:
   ObjLocalidad ObjAldea "Aldea" Aldea
   with
      nombre 'aldea',
   has femenino;


...y así para cada localidad.

¿Existe algún método menos (ejem) engorroso y elegante?

Se despide, de antemano agradecido,


Realmente no sé lo que preguntas, pero si quieres poner 'detalles' para enriquecer cosas a 'examinar' te recomiendo que uses 'Decorados.h'


Arriba
 Perfil  
 
NotaPublicado: 08 Mar 2006 03:41 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 10 Sep 2004 00:17
Mensajes: 3069
Ubicación: Chile
Mel Hython escribió:
Realmente no sé lo que preguntas, pero si quieres poner 'detalles' para enriquecer cosas a 'examinar' te recomiendo que uses 'Decorados.h'


Aquello es una alternativa, sobre todo si

-> en la localidad de <nombre> ponemos un decorado identificado como "<nombre>"

de tal forma que, estando en la localidad <nombre> los comandos

-> <<mirar>>
-> <<mirar>> "<nombre>"

den ambos como salida la descripción de la localidad <nombre>

Mi duda es si esto puede incorporarse (de algún modo) como interfaz del objeto de la localidad, sin pasar por el uso de decorados o pseudo-objetos invisibles ad-hoc...

_________________
[Incanus]
El Escritorio - Blog Aventurero y Literario


Arriba
 Perfil  
 
NotaPublicado: 08 Mar 2006 06:59 
Desconectado
Semimomio
Semimomio
Avatar de Usuario

Registrado: 15 Dic 2004 21:28
Mensajes: 2302
Incanus escribió:
Mi duda es si esto puede incorporarse (de algún modo) como interfaz del objeto de la localidad, sin pasar por el uso de decorados o pseudo-objetos invisibles ad-hoc...


Que yo sepa no es posible.


Arriba
 Perfil  
 
NotaPublicado: 08 Mar 2006 09:48 
Desconectado
Semimomio
Semimomio
Avatar de Usuario

Registrado: 23 Abr 2004 08:49
Mensajes: 2956
Ubicación: España (Galicia)
Hola !

Incanus escribió:
Supongan que (como en mi anterior "El Protector") tengo una localidad:

Código:
Localidad_Aldea Aldea "La Aldea"
with
   descripcion "Estás en la aldea";
[...]


1. Crear una clase "Objeto Localidad"

Código:
Class ObjLocalidad
with
   descripcion [;<<Mirar>>;],
has escenario;


2. Crear el objeto aldea específico:

Código:
   ObjLocalidad ObjAldea "Aldea" Aldea
   with
      nombre 'aldea',
   has femenino;


...y así para cada localidad.

¿Existe algún método menos (ejem) engorroso y elegante?


Este problema es, para mi gusto, de los más engorrosos en inform/informATE!. Así, estás en una localidad llamada "camino", con al descripción de que va de no sé donde a no sé dónde más ... "ex camino", no ves de eso por aqií ... mmmppphhh

Bien, en realidad, veamos, se me ocurren dos soluciones, una incompleta (no funciona) y otra completa.

Primero la incompleta:

Código:
Object ObjLocalidadReboteExaminar
with
        esta_en [;
               rtrue;
         ]
   descripcion [;<<Mirar>>;],
has escenario;


Ya tenemos un objeto que a) hace el trabajo y b) está en todas las localidades para hacerlo ... sólo queda que c) reaccione al nombre de la localidad. Lo dejo ahí por si a alguien se le ocurre.

La segunda solución es la que utilicé en "El trono de Inglaterra", empleando la librería de decorados de Zak. Ya que tienes, igual que en el trono, distintas clases de localidades, deberías tener distintas clases de decorados, que se correspondieran. Así, si tienes la clase Aldea, que representa a todas las localidades de la Aldea, deberías tener la clase DecoradoAldea, que representa a todos los decorados de las localidades de la Aldea. Sólo queda meter un objeto de la clase DecoradoAldea en cada localidad que pertenezca a la clase Aldea. Para eso DecoradoAldea debe ser capaz de generar objetos dinámicamente:

Código:
class DecoradoAldea(20)
with
    ! más cosas ...
;


¿Cómo sabes cuántas necesitas? O bien las cuentas o bien tiras por lo alto (cuidado, no te pases que la máquina Z no es grande) y haces una rutinilla que te indique cuantos objetos sobran, tal y como está hecho en el trono. Después, ajustas.

Bájate el código y lo miras.

Salud !

Baltasar

_________________
-- Baltasar, el arquero


Arriba
 Perfil  
 
NotaPublicado: 08 Mar 2006 14:10 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 10 Sep 2004 00:17
Mensajes: 3069
Ubicación: Chile
baltasarq escribió:
Este problema es, para mi gusto, de los más engorrosos en inform/informATE!. Así, estás en una localidad llamada "camino", con al descripción de que va de no sé donde a no sé dónde más ... "ex camino", no ves de eso por aqií ... mmmppphhh


Sí... en efecto, DocumentatE! indica en el primer apartado sobre localidades que los atributos nombre e irrelevante son equivalente, por lo que la solución trivial (usar nombre como atributo en cada localidad) nos deja ya no igual sino peor :cry:

Veamos, ahora, la primera alternativa:

baltasarq escribió:
Bien, en realidad, veamos, se me ocurren dos soluciones, una incompleta (no funciona) y otra completa.

Primero la incompleta:

Código:
Object ObjLocalidadReboteExaminar
with
        esta_en [;
               rtrue;
         ]
   descripcion [;<<Mirar>>;],
has escenario;


Ya tenemos un objeto que a) hace el trabajo y b) está en todas las localidades para hacerlo ... sólo queda que c) reaccione al nombre de la localidad. Lo dejo ahí por si a alguien se le ocurre.


Las partes a) y b) las entiendo perfecto, pero para c) sólo se me ocurre (apurado) la ridiculez de ponerle a este objeto la propiedad nombre con sinónimos para todos los nombres de localidades... así, al usar en cualquier localidad el comando:

Código:
<<mirar>> <nombre>


con <nombre> el nombre de alguna localidad, nos retornará la descripción de la localidad actual. Funciona... estúpidamente y en forma equivoca.

Voy a ver si consigo usar el objeto con antes sobre Mirar de un modo astuto. Esta alternativa (si funciona) es mejor que crear un objeto-escenario por cada localidad (mi primer post del hilo).

Veamos, pues, la segunda alternativa:

baltasarq escribió:
La segunda solución es la que utilicé en "El trono de Inglaterra", empleando la librería de decorados de Zak. Ya que tienes, igual que en el trono, distintas clases de localidades, deberías tener distintas clases de decorados, que se correspondieran. Así, si tienes la clase Aldea, que representa a todas las localidades de la Aldea, deberías tener la clase DecoradoAldea, que representa a todos los decorados de las localidades de la Aldea. Sólo queda meter un objeto de la clase DecoradoAldea en cada localidad que pertenezca a la clase Aldea.


Efectivamente, usando "Decorados.h" y clases de decorados fue que implementé los decorados para clase de localidad en "El Protector". Algo he aprendido.. ;)

baltasarq escribió:
¿Cómo sabes cuántas necesitas? O bien las cuentas o bien tiras por lo alto (cuidado, no te pases que la máquina Z no es grande) y haces una rutinilla que te indique cuantos objetos sobran, tal y como está hecho en el trono. Después, ajustas.

Bájate el código y lo miras.


Lo miraré (no he acabado de entenderlo aquí).

Gracias, una vez más, Balta, por código concedido...

_________________
[Incanus]
El Escritorio - Blog Aventurero y Literario


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 08 Mar 2006 14:58 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 10 Sep 2004 00:17
Mensajes: 3069
Ubicación: Chile
Bueno, usando la primera alternativa, he creado lo siguiente:

Código:
Object ObjLocalidadReboteExaminar
with
   nombre '<nombre localidad 1>'  '<otro nombre localidad 1>' '<nombre localidad 2>' ... '<nombre localidad n>',
   descripcion [;
      np = 2;
      switch (SiguientePalabra()) {
         '<nombre localidad 1>' : if (localizacion == '<localidad 1>') {;<<Mirar>>;} else "No veo eso que dices.";
         '<otro nombre localidad 1>' : if (localizacion == '<localidad 1>') {;<<Mirar>>;} else "No veo eso que dices.";
         '<nombre localidad 2>' : if (localizacion == '<localidad 2>') {;<<Mirar>>;} else "No veo eso que dices.";
         ...
         '<nombre localidad n>' : if (localizacion == '<localidad 1>') {;<<Mirar>>;} else "No veo eso que dices.";
         default : "No veo eso que dices.";
      };
   ],
   esta_en [;
   rtrue;
   ],
has escenario;


Es un poco más eficiente que crear n objetos-escenario (1 x cada localidad) y tiene la virtud de que se pueden usar sinónimos para una misma localidad o para varias localidades.

Por ejemplo, reconzoco of class <clase de localidad> en vez de == <localidad> y tengo la misma respuesta para localidades de nombre semejante.

Bueno, es una idea. ¿Alguien tiene una mejor, por favor? :oops:

Se despide,

_________________
[Incanus]
El Escritorio - Blog Aventurero y Literario


Última edición por Incanus el 08 Mar 2006 15:07, editado 1 vez en total

Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 08 Mar 2006 14:59 
Desconectado
Implementador
Implementador
Avatar de Usuario

Registrado: 10 Mar 2004 21:40
Mensajes: 1444
Ubicación: Nímgar, Ciudad Lunar
Creo que con lo que ya se ha dicho las alternativas quedan bastante claras, pero por si te ayuda puedes echarle un vistazo al código de este viejo proyecto abortado:

http://www.terra.es/personal/mel-hyth/anillo3.zip


Arriba
 Perfil  
 
NotaPublicado: 08 Mar 2006 17:45 
Desconectado
Grafista
Grafista

Registrado: 09 Mar 2004 17:20
Mensajes: 504
Incanus escribió:
Las partes a) y b) las entiendo perfecto, pero para c) sólo se me ocurre (apurado) la ridiculez de ponerle a este objeto la propiedad nombre con sinónimos para todos los nombres de localidades...


Bueno... XDDD eso exactamente hice en la versión Inform de "La Pelotita" (que me he acordado de ella por motivos que cuento en otra parte XDDD) y no veas si funcionaba bien... teniendo en cuenta que era una nano de 4 habitaciones que se llamaban "habitación", "estancia", "salón" y "cámara"... como una seda, vamos :P

Inca escribió:
Bueno, es una idea. ¿Alguien tiene una mejor, por favor? :oops:


Bueno, yo no me atrevería a llamarla mejor, pero... ¡alternativa es!

El problema es que la localidad en la que está situado el jugador no está, por definición, "al alcance" de este, así que cualquier verbo aplicado a ella responderá con el temido "No veo eso que dices"... salvo que el todopoderoso autor, que para eso es el que manda, de instrucciones concretas de lo contrario :wink:

Para el ejemplo vamos a dar (alegremente) por supuesto que:

-Todas las localidades tendrán definida la propiedad "nombre" (si no, el parser como que no se va a aclarar nada de nada)

-El objeto "parent" del jugador va a ser siempre la localidad en la que esté situado. Es lo que suele suceder en la mayoría de las ocasiones, aunque habría que estar alerta por si acaso pudiera darse el caso de que no.

Ahora hay que hacer que las localidades estén siempre al alcance del jugador para la acción "examinar". Para ello nos bastará con una linea adicional de gramática y una función (la llamaremos "alcance_habitacion" creada expresamente para la ocasión. O sea, por un lado esto:

Código:
Include "Gramatica";

Extend 'examina'
*   scope=alcance_habitacion   ->   Examinar;


...y por otro esto otro:

Código:
[alcance_habitacion;
   switch (estadio_alcance)
   {
      1:
         rfalse;
      2:
         PonerAlAlcance (parent(jugador));
         rfalse;
      3:
         "No puedes examinar eso.";
   }
];


La mecánica de esta función se explica en los capítulos del manual sobre los tokens de la gramática y el sobre todo en el del alcance... (el 32 del original en inglés, aún sin traducir :roll: aunque es el que he enlazado ahí arriba)

Es posible que haya una manera más elegante o, sobre todo, segura de determinar la localidad en que se haya el jugador que asumir que sea su objeto "parent", pero no se me ocurre en este momento :oops:

Un ejemplo ilustrativo completo:

Código:
Include "EParser";
Include "Acciones";
Include "Mensajes";

Class Habitacion
has luz;
Class Objeto;

Habitacion aldea "Aldea"
with
nombre 'aldea',
descripcion "Estás en una aldea.",
al_s bosque;

Habitacion bosque "Bosque"
with
nombre 'bosque',
descripcion "Estás en un bosque.",
al_n aldea;

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

[alcance_habitacion;
   switch (estadio_alcance)
   {
      1:
         rfalse;
      2:
         PonerAlAlcance (parent(jugador));
         rfalse;
      3:
         "No puedes examinar eso.";
   }
];

Include "Gramatica";

Extend 'examina'
*   scope=alcance_habitacion   ->   Examinar;


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 08 Mar 2006 19:07 
Desconectado
Implementador
Implementador
Avatar de Usuario

Registrado: 10 Mar 2004 21:40
Mensajes: 1444
Ubicación: Nímgar, Ciudad Lunar
Uhm.... ahora que lo ha explicado RML creo que lo he entendido, lo que quieres es que al poner:

>> examina camino

salga lo mismo que con:

>> mirar

¿es eso?

¿Y cómo sabe el jugador que la habitación se llama 'camino'? ¿Por la barra de arriba que suele aparece en el intérprete?

:)

Yo es que como es lo primero que anulo, siempre, siempre... me parece tannnnn feísima....

Yo es que supongo siempre que 'mirar' da un texto, y lo que me gusta es que las posibles referencias del texto sean lo examinable, eso me lleva necesariamente al uso de Decorados.h.


Arriba
 Perfil  
 
NotaPublicado: 08 Mar 2006 21:55 
Desconectado
Grafista
Grafista

Registrado: 09 Mar 2004 17:20
Mensajes: 504
Radio Marte Libre escribió:
Es posible que haya una manera más elegante o, sobre todo, segura de determinar la localidad en que se haya el jugador que asumir que sea su objeto "parent", pero no se me ocurre en este momento :oops:


RML, que está un poco capullete hoy :lol: :lol: :lol: se recuerda a sí mismo que no debe postear en momentos, como la hora de la siesta, en los que el riego sanguineo al cerebro no está en su mejor momento , y que la manera más corta de poner al acance la localización es, ejeeeem:

Código:
PonerAlAlcance (localizacion)


Y luego ya preocuparse de posibles situaciones excepcionales, como que el sujeto jugador esté en la oscuridad, o le estén transportando en una jaula transparente, y posibilidades de esas que pasan en la vida por si acaso pudiera haber algún lío con ellas :o


Arriba
 Perfil  
 
Mostrar mensajes previos:  Ordenar por  
Nuevo tema Responder al tema  [ 11 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 2 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