CAAD

Comunidad de Aventuras Conversacionales y Relatos Interactivos
Fecha actual 29 Mar 2020 19:48

Todos los horarios son UTC + 1 hora




Nuevo tema Responder al tema  [ 12 mensajes ] 
Autor Mensaje
NotaPublicado: 05 Jun 2007 16:54 
Desconectado
Enano Maluva
Enano Maluva

Registrado: 10 Sep 2004 14:08
Mensajes: 33
Ubicación: Madrid
Estoy intentado que el jugador pueda tener una cantidad variable de unidades de un objeto ( XXX monedas ) pero sin tener que crear copias del objeto. El efecto que pretendo obtener sería algo así como las monedas de oro que existen en World of Witchcraft.
He intentado guardar el número de monedas en jugador.cantidad y lo hace bien, pero el problema me surge al tratar de capturar acciones con las monedas. He probado creando un "objeto falso" para capturar esas acciones y que las monedas se listen en el inventario y alguno de los problemas se resuelven, pero si el jugador trata de "dejar x monedas", el programa responde que no hay tantas disponibles.
¿ Se os ocurre como solucionar ésto o bien si hay alguna otra manera de hacer lo que pretendo ?

Muchas gracias.


Arriba
 Perfil  
 
NotaPublicado: 05 Jun 2007 16:59 
Desconectado
Implementador
Implementador
Avatar de Usuario

Registrado: 10 Mar 2004 21:40
Mensajes: 1444
Ubicación: Nímgar, Ciudad Lunar
Raul escribió:
Estoy intentado que el jugador pueda tener una cantidad variable de unidades de un objeto ( XXX monedas ) pero sin tener que crear copias del objeto. El efecto que pretendo obtener sería algo así como las monedas de oro que existen en World of Witchcraft.
He intentado guardar el número de monedas en jugador.cantidad y lo hace bien, pero el problema me surge al tratar de capturar acciones con las monedas. He probado creando un "objeto falso" para capturar esas acciones y que las monedas se listen en el inventario y alguno de los problemas se resuelven, pero si el jugador trata de "dejar x monedas", el programa responde que no hay tantas disponibles.
¿ Se os ocurre como solucionar ésto o bien si hay alguna otra manera de hacer lo que pretendo ?

Muchas gracias.


Inform 6 supongo, no?

Puedes crear un número determinado de monedas igualitas y el Inform trata con valores.

No estoy del todo seguro, pero creo que en Abalánzate de Dhan hay un ejemplo de código de eso.

Editado: pues sí, se usó en ese juego, pero parece que no están publicados los fuentes, ¿Dhan?

_________________
Mel Hython
------------------
http://mel-hython.blogspot.com/


Arriba
 Perfil  
 
NotaPublicado: 05 Jun 2007 17:48 
Desconectado
Enano Maluva
Enano Maluva

Registrado: 10 Sep 2004 14:08
Mensajes: 33
Ubicación: Madrid
Mel Hython escribió:


Inform 6 supongo, no?

Puedes crear un número determinado de monedas igualitas y el Inform trata con valores.

No estoy del todo seguro, pero creo que en Abalánzate de Dhan hay un ejemplo de código de eso.

Editado: pues sí, se usó en ese juego, pero parece que no están publicados los fuentes, ¿Dhan?


Sí, perdón, es Inform6.

El número de monedas que pretendía manejar es bastante alto, por eso quería llevar la cantidad en una variable. No me parece viable tener que crear miles de copias de un objeto, pero por el momento no soy capaz de encontrar la manera de hacerlo.


Arriba
 Perfil  
 
NotaPublicado: 05 Jun 2007 18:30 
Desconectado
Implementador
Implementador
Avatar de Usuario

Registrado: 10 Mar 2004 21:40
Mensajes: 1444
Ubicación: Nímgar, Ciudad Lunar
Raul escribió:
Mel Hython escribió:


Inform 6 supongo, no?

Puedes crear un número determinado de monedas igualitas y el Inform trata con valores.

No estoy del todo seguro, pero creo que en Abalánzate de Dhan hay un ejemplo de código de eso.

Editado: pues sí, se usó en ese juego, pero parece que no están publicados los fuentes, ¿Dhan?


Sí, perdón, es Inform6.

El número de monedas que pretendía manejar es bastante alto, por eso quería llevar la cantidad en una variable. No me parece viable tener que crear miles de copias de un objeto, pero por el momento no soy capaz de encontrar la manera de hacerlo.


Seguro que se puede hacer manejando adecuadamente las gramáticas, que es lo que creo que te falla ahora. Pero harían falta pedazos de código para hacerse una idea de cómo estás manejando el objeto falso.

_________________
Mel Hython
------------------
http://mel-hython.blogspot.com/


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 05 Jun 2007 23:42 
Desconectado
Implementador
Implementador
Avatar de Usuario

Registrado: 07 Sep 2004 21:52
Mensajes: 1897
Yo te recomiendo que programes un objeto llamado 'monedas' y 'moneda'. Dentro de él mete la cantidad, y ya está, controla cuando pages las sumas y las restas, con eso te irá bien. Si alguien te paga, pues sumas más monedas a tu objeto monedas.

Chao inténtalo y pega código si no te rula.

_________________
Ruber "Urbatain" Eaglenest.
------------------------
http://www.indieorama.com/author/rubereaglenest/


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 06 Jun 2007 08:53 
Desconectado
Enano Maluva
Enano Maluva

Registrado: 10 Sep 2004 14:08
Mensajes: 33
Ubicación: Madrid
El objeto está creado de ésta manera:

object monedas "moneda"
with nombre 'moneda' 'monedas',
descripcion "La modeda de curso legal en todo el pais.",
cantidad 20,
listarse[;
print self.cantidad, " monedas.";
rtrue;
],
antes[;
dejar: "Necesitas muchas para conseguir saldar la deuda, e irlas dejando por ahí tiradas no parece la mejor forma de obtenerlas.";
],
has femenino oculto;


... y el problema que tengo es cuando intento "dejar" mas de una moneda, ya que realmente sólo tengo un objeto moneda. Lo que pretendo es evitar el mensaje de "Aquí solo hay uno disponible".

Saludos.


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 06 Jun 2007 09:12 
Desconectado
Guionista
Guionista
Avatar de Usuario

Registrado: 09 Abr 2005 15:21
Mensajes: 423
Raul escribió:
... y el problema que tengo es cuando intento "dejar" mas de una moneda, ya que realmente sólo tengo un objeto moneda. Lo que pretendo es evitar el mensaje de "Aquí solo hay uno disponible".


Buff... lo que intentas hacer es una cosa bastante complicada, Raul. A ver, tal y como lo entiendo, quieres lo siguiente:

Código:
Camino
Estás en un camino de norte a sur.

>INVENTARIO

Llevas una espada y una bolsa llena de monedas.

>EXAMINA BOLSA

Dentro de la bolsa hay 182 monedas

>DEJAR 54 MONEDAS

Dejadas.

>MIRAR

Camino
Estás en un camino de norte a sur.

Además ves, 54 monedas de oro.

>EXAMINAR BOLSA

Dentro de la bolsa hay 128 monedas de oro.


Problemas:

* Aunque no quieras muchos objetos, lo cierto es que potencialmente, si el jugador va "dejando alegremente" objetos por ahí, hay 182 potenciales objetos "desperdigables". (en el ejemplo. Si hay 50000 monedas en tu juego... imagina).

* Si dos "objetos moneda" están en el mismo "nivel" (es decir, encima de la misma mesa, o en el suelo de la misma localidad, o en el inventario del mismo personaje) el código del programa debería "fundirlos" en un sólo objeto. Ejemplo:

Código:
Camino
Estás en un camino de norte a sur.

Además ves, 54 monedas de oro.

>DEJAR 12 MONEDAS DE ORO

Dejadas.

>MIRAR

Camino
Estás en un camino de norte a sur.

Además ves, 66 monedas de oro.


No te digo que no se pueda hacer. Lo que sí te puedo decir es que: 1) yo llevo ya algún tiempo programando en Inform, y personalmente no sabría cómo hacer eso. 2) desde luego, no es un problema "trivial". Requeriría programación bastante compleja.

Si me equivoco, que me corrija alguien.[/code]


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 06 Jun 2007 09:20 
Desconectado
Enano Maluva
Enano Maluva

Registrado: 10 Sep 2004 14:08
Mensajes: 33
Ubicación: Madrid
Citar:
Buff... lo que intentas hacer es una cosa bastante complicada, Raul. A ver, tal y como lo entiendo, quieres lo siguiente:
Problemas:

* Aunque no quieras muchos objetos, lo cierto es que potencialmente, si el jugador va "dejando alegremente" objetos por ahí, hay 182 potenciales objetos "desperdigables". (en el ejemplo. Si hay 50000 monedas en tu juego... imagina).

* Si dos "objetos moneda" están en el mismo "nivel" (es decir, encima de la misma mesa, o en el suelo de la misma localidad, o en el inventario del mismo personaje) el código del programa debería "fundirlos" en un sólo objeto...

Si me equivoco, que me corrija alguien.[/code]


No, no es eso. Lo que pretendo es mucho más simple: Evitar que me de el error al tratar más de una moneda, tan sólo eso. De echo en el código de la moneda capturo la acción "dejar" para evitar los problemas a los que te refieres.


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 06 Jun 2007 09:54 
Desconectado
Implementador
Implementador
Avatar de Usuario

Registrado: 10 Mar 2004 21:40
Mensajes: 1444
Ubicación: Nímgar, Ciudad Lunar
Si lo único que quieres es lo que dices lo puedes conseguir añadiendo lo siguiente:

Código:
!
! Antes de la sección de gramática incluir una nueva
! acción
!
[ DejarMonedasSub;

   "Necesitas muchas para conseguir saldar la deuda, e
   irlas dejando por ahí tiradas no parece la mejor forma de obtenerlas.";    
];


Y luego más abajo:

Código:
!
! Esta entrada en gramática
!
Extend 'deja' first
    * number 'monedas'          -> DejarMonedas
    * number 'moneda'         -> DejarMonedas;


Con estos dos añadidos sin tocar nada más consigues evitar los problemas que te da el 'multiheld'.

Si quisieras hacer lo que te decían de dejar montoncitos de monedas también se puede hacer, aunque es algo más complicado:

- Tienes que añadir un atributo en TODAS las localidades indicando la cantidad de monedas que hay en ella.
- Tienes que crear un 'objeto flotante' que esté en todas las localidades cuya cantidad de monedas sea mayor que cero.
- Tienes que captuar las acciones 'coger X monedas' y 'dejar X monedas' con gramáticas similares a la anterior y 'echando las cuentas' sobre la cantidad de monedas de cada localidad.

_________________
Mel Hython
------------------
http://mel-hython.blogspot.com/


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 06 Jun 2007 11:24 
Desconectado
Enano Maluva
Enano Maluva

Registrado: 10 Sep 2004 14:08
Mensajes: 33
Ubicación: Madrid
Citar:
[ DejarMonedasSub;

"Necesitas muchas para conseguir saldar la deuda, e
irlas dejando por ahí tiradas no parece la mejor forma de obtenerlas.";
];[/code]

Y luego más abajo:

Código:
!
! Esta entrada en gramática
!
Extend 'deja' first
    * number 'monedas'          -> DejarMonedas
    * number 'moneda'         -> DejarMonedas;


Con estos dos añadidos sin tocar nada más consigues evitar los problemas que te da el 'multiheld'.
...


Muchas gracias. Por el momento esto soluciona mi problema... aunque la idea que has dado para ir dejando montones de monedas abre otras posibilidades que ni me había planteado por considerarlas casi imposibles.

El cambio que he hecho sobre el código que adjuntas ( para tratar directamente sobre el objeto y no sobre una palabra concreta) ha sido crear la línea de gramática de la siguiente manera:


Código:
extend 'deja' first
*  number noun = rutinamonedas  -> tratarpasta;


... y en la rutina comprobar si el objeto al qué se refiere el jugador es la moneda...

... y después de dar unas cuantas vueltas y conseguir una serie curiosa de errores, me da la sensación de que he encontrado un error en la traducción de la sección acerca de los tokens.

En la traducción pone lo siguiente:


Citar:
|noun = {Rutina}| "Cualquier único objeto al alcance que satisfaga alguna
condición". Cuando determina lo que sea que un objeto pasas ese test, el parser
pone la variable "noun" al objeto en cuestión y llama a la rutina. Si retorna
true, el parser acepta el objeto, en otro caso lo rechaza. Por ejemplo, lo
siguiente sólo se aplicará a animales que se mantienen en una jaula:

[ CriaturaEnjaulada ;
if (noun in jaula_mimbre)
rtrue;
rfalse;
];

Verb 'liberar'
* noun=CriaturaEnjaulada -> LiberarAnimal;

Así que sólo los nombres que pasen el test de CriaturaEnjaulada serán permitidos.
La rutina CriaturaEnjaulada puede aparecer en cualquier lugar del código, pero es
mejor mantenerla cerca.


... qué es la traducción literal extraida de "Designers manual". Sin embargo eso no funciona correctamente en InformATE.

Realmente la variable 'noun' nunca llega a valer el objeto, con lo que la rutina así escrita jamás devolverá 'true'. La manera correcta ( al menos la que he aplicado para que a mi me funcionase ) es:

Código:
[ CriaturaEnjaulada ;
      if (uno in jaula_mimbre)
         rtrue;
      rfalse;
   ];


Un saludo.


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 06 Jun 2007 15:47 
Desconectado
Guionista
Guionista
Avatar de Usuario

Registrado: 09 Abr 2005 15:21
Mensajes: 423
Mel Hython escribió:
- Tienes que añadir un atributo en TODAS las localidades indicando la cantidad de monedas que hay en ella.
- Tienes que crear un 'objeto flotante' que esté en todas las localidades cuya cantidad de monedas sea mayor que cero.
- Tienes que captuar las acciones 'coger X monedas' y 'dejar X monedas' con gramáticas similares a la anterior y 'echando las cuentas' sobre la cantidad de monedas de cada localidad.


Eso solucionaría el problema de dejar monedas en cualquier localidad. Pero... ¿y sí probamos con...?

METER 12 MONEDAS EN EL CAJÓN

PONER 72 MONEDAS SOBRE LA MESA (el juego debería distinguir entre las 50 monedas que hay en el suelo y las 72 que hay en la mesa, problema dos)

DAR 13 MONEDAS A JAIME (si hay personajes, y si éstos tienen inventario)

¿Qué haríamos? ¿Poner una variable no sólo a las localidades sino a todos los objetos contenedor o soporte y PNJs que haya en el juego?

Vamos, que sería una currada de espanto :D


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 06 Jun 2007 16:15 
Desconectado
Implementador
Implementador
Avatar de Usuario

Registrado: 10 Mar 2004 21:40
Mensajes: 1444
Ubicación: Nímgar, Ciudad Lunar
Depresiv escribió:
Mel Hython escribió:
- Tienes que añadir un atributo en TODAS las localidades indicando la cantidad de monedas que hay en ella.
- Tienes que crear un 'objeto flotante' que esté en todas las localidades cuya cantidad de monedas sea mayor que cero.
- Tienes que captuar las acciones 'coger X monedas' y 'dejar X monedas' con gramáticas similares a la anterior y 'echando las cuentas' sobre la cantidad de monedas de cada localidad.


Eso solucionaría el problema de dejar monedas en cualquier localidad. Pero... ¿y sí probamos con...?

METER 12 MONEDAS EN EL CAJÓN

PONER 72 MONEDAS SOBRE LA MESA (el juego debería distinguir entre las 50 monedas que hay en el suelo y las 72 que hay en la mesa, problema dos)

DAR 13 MONEDAS A JAIME (si hay personajes, y si éstos tienen inventario)

¿Qué haríamos? ¿Poner una variable no sólo a las localidades sino a todos los objetos contenedor o soporte y PNJs que haya en el juego?

Vamos, que sería una currada de espanto :D


En realidad no, usando adecuadamente las clases. Ya que lo que es absurdo es que los objetos sean 'object' y no haya una jerarquía de clases de soporte.

En cualquier caso, no en todos los juegos tienes contenedores o soportes y no sé si él tiene o no.

_________________
Mel Hython
------------------
http://mel-hython.blogspot.com/


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