CAAD

Comunidad de Aventuras Conversacionales y Relatos Interactivos
Fecha actual 20 Oct 2019 23:15

Todos los horarios son UTC + 1 hora




Nuevo tema Responder al tema  [ 25 mensajes ]  Ir a página 1, 2  Siguiente
Autor Mensaje
NotaPublicado: 15 Ene 2005 20:24 
Desconectado
Archivero
Archivero
Avatar de Usuario

Registrado: 10 Mar 2004 11:40
Mensajes: 190
Ubicación: Donde quepa
¡Problema!
Tengo una conversación por menús en mi próxima aventura (como a estas alturas sabréis todos) y la estoy programando con fhablaoo.
Quitando esos primeros problemillas que os consulté hace unos dí­as, todo iba como la seda.
Pero acabo de descubrir que, invariablemente, cuando el jugador lleva 9 temas hablados con el PSI, la ejecución se interrumpe y me sale un error de desbordamiento de pila. En winfrotzE:
"Fatal: desbordamiento de pila" y en Frotz:
"Fatal error: stack overflow".

¿Es problema mí­o o de la librerí­a? ¿Cómo solucionarlo?

Gracias otra vez


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 15 Ene 2005 20:53 
Desconectado
Archivero
Archivero
Avatar de Usuario

Registrado: 10 Mar 2004 11:40
Mensajes: 190
Ubicación: Donde quepa
Mmm
Acabo de descubrir otra cosa, me explico:

Con fhablaoo no es posible mantener una conversación seguida, sino que a cada respuestas del personaje, el jugador debe volver a teclear la orden. Ejemplo:

>habla con pedro

1-Hola, Pedro
2-¿Qué estás haciendo?
3-¿Sabes quién soy?

(el jugador elige la opción 1 y ...)
Pedro dice: "Hola, qué tal"

Ahora, si el jugador quiere seguir hablando con Pedro, tendrá que volver a escribir "habla con pedro".

Aquello no me gustaba nada, así­ que lo solucioné añadiendo la acción <<HablaCon Pedro>> al final del código que contiene las respuestas de Pedro. De esa forma, cada vez que Pedro terminaba de hablar, el juego ejecutaba la acción HablarCon automáticamente y el jugador sólo tení­a que seguir eligiendo opciones.

Bien. Pues resulta que esa solución es la que provoca el desbordamiento de la pila.
Así­ que me gustarí­a saber de qué otra manera harí­ais vosotros que la conversación no se interrumpiera a cada respuesta de Pedro.

Saludos desbordados


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 15 Ene 2005 22:32 
Hola !

Citar:
Aquello no me gustaba nada, así­ que lo solucioné añadiendo la acción <<HablaCon Pedro>> al final del código que contiene las respuestas de Pedro. De esa forma, cada vez que Pedro terminaba de hablar, el juego ejecutaba la acción HablarCon automáticamente y el jugador sólo tení­a que seguir eligiendo opciones.


Cuando dijiste que habí­as solucionado el tema así­, una pequeña alarma se encendió en mi cabeza, pensando que eso podrí­a causar problemas ... pero nada concreto, claro ...

El problema que tienes es irresoluble, no hay nada que puedas hacer desde tu programa para evitar que reviente.

Lo que tendrás que hacer es modificar la librerí­a, me temo. Yo no sé cómo funciona (no sé ni de quién es), pero si quieres te echo una mano. Mándame un e.mail por privado si no te aclaras la librerí­a.

El caso es que la librerí­a sólo hace una iteración cada vez que se ejecuta la acción "HablarCon" ... en lugar de ello, lo que hay que hacer es un bucle que englobe todo eso, y que acabe cuando el usuario teclee un "0" como respuesta a lo que quiere decir.

Salud !
[/quote]


Arriba
  
 
 Asunto:
NotaPublicado: 15 Ene 2005 22:47 
Aventurero_krac escribió:
Así­ que me gustarí­a saber de qué otra manera harí­ais vosotros que la conversación no se interrumpiera a cada respuesta de Pedro.
Saludos desbordados


Ciertamente, se tratarí­a de que la propiedad "antes" de los objetos de la clase "personaje" no haga un "rtrue" por defecto cada vez que se ejecuta una respuesta, sino de que repita el proceso hasta que tu le indiques lo contrario.

Obviamente, no hay, en principio, más narices que modificar la librerí­a.

Lo que yo harí­a (idea loca improvisada en una tarde de sabado y sin testear :-) ) :

Copia TODO el contenido de la sección "HablarCon" de la propiedad "antes" de la clase personaje en otra propiedad (dentro de la misma clase), llamala como tu quieras, por ejemplo, "HablarConBis"

Y en el "antes" original deja tan sólo un bucle que llame una y otra vez a esta nueva rutina copiada hasta que alguna de las respuestas active una condición que interrumpa el proceso... algo así­ como:

Código:
Class personaje
with
mi_condicion=false;
antes
[
HablarCon:
mi_condicion=false;
do
self.HablarConBis();
until mi_condicion==true;
],

HablarConBis [x z ok eleccion;

!Aquí­ viene TODO el código copiado del "antes"

],


He definido una propiedad local de los objetos personaje llamada "mi_condicion" que por defecto estrá a "false"

Ahora la reacción de los personajes ante la acción "HablarCon", si todo fuera bien, serí­a llamar indefinidamente a la rutina que maneja la conversación hasta que "mi_condicion" pase a ser "true"

Cómo y cuándo sucederí­a esto ya queda a la voluntad y albedrí­o del programador. En principio ocurrirí­a en alguna de las respuestas, y por supuesto deberí­a ocurrir también cuando el jugador decide salir de la conversación pulsando cero... lo que implicarí­a necesariamente cambiar la linea que dice:

Código:
"No se te ocurre nada que decir.";


por el siguiente bloque

Código:
mi_condicion=true;
"No se te ocurre nada que decir.";


Todo muy pulible y mejorable y optimizable y... ya sabéis XDD, e insisto en que no lo he probado, así­ que algún detalle (y seguro que más de uno, se me habrá escapado por ahí­)

Y todo esto a su vez asumiendo que no habrí­a ningún inconveniente en modificar la librerí­a, si lo hubiera, por cuestiones de licencia o lo que fuera, pues olvidate ^_^''


Arriba
  
 
 Asunto:
NotaPublicado: 16 Ene 2005 10:25 
buenas, digo yo...
¿no serí­a más fácil programar un menú sin librerí­as para las conversaciones antes que retocar la librerí­a????
total por lo que veo compila para máquina z ¿no?
en caso de que quiera hacerlo para glulx podrí­a buscarse la manera de hacerlo

a propósito del tema

alguien sabe porqué ocurre lo mismo (un desbordamiento de pila) cuando unapropiedad vale más de 4000
ejemplo:
jugador.experiencia 4200,
simple curiosidad xd
porque haciendo experimentos con informate (nada que ver con juegos) me ha ocurrido aun que supongo que habrán otras maneras de conseguir operar con números mayores de 4000, como el uso de arrays o la chapuza de sumar 2 propiedades ... (que si funciona)
jugador.experiencia+jugador.experiencia2;
graciassss!!


Arriba
  
 
NotaPublicado: 16 Ene 2005 13:03 
Desconectado
Implementador
Implementador
Avatar de Usuario

Registrado: 07 Sep 2004 21:52
Mensajes: 1897
Aventurero_krac escribió:
¡Problema!

"Fatal: desbordamiento de pila" y en Frotz:
"Fatal error: stack overflow".

¿Es problema mí­o o de la librerí­a? ¿Cómo solucionarlo?

Gracias otra vez


Claro que es problema tuyo, has hecho recursividad y al cabo del rato al pobre inform se le acaba la pila. Y claro que tiene solución!!! ¿Me enseñas el código que hiciste para crear esa caracterí­stica?

Chao.

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


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 16 Ene 2005 16:09 
Desconectado
Archivero
Archivero
Avatar de Usuario

Registrado: 10 Mar 2004 11:40
Mensajes: 190
Ubicación: Donde quepa
Citar:
Claro que es problema tuyo, has hecho recursividad y al cabo del rato al pobre inform se le acaba la pila. Y claro que tiene solución!!! ¿Me enseñas el código que hiciste para crear esa caracterí­stica?


Ahí­ va, es simplemente igual que el ejemplo que viene con fhablaoo, excepto una linea añadida:

[spoiler]
Personaje -> PSI "PSI"
with nombre 'psi',
descripcion "la descripcion del psi",
Enunciado [linea;
@set_colour 9 2;
switch (linea) {
0: "blablabla";
1: "blablabla";
2: "blablabla";
3: "blablabla";
4: "blablabla";
5: "blablabla";
6: "blablabla";
7: "blablabla";
8: "blablabla";
9: "blablabla";
10: "blablabla";
11: "blablabla";
12: "blablabla";
13: "blablabla";
14: "blablabla";
15: "blablabla";
16: "blablabla";
}
],
Respuesta [linea;
@set_colour 7 2;
switch (linea) {
0: self.QuipOff(0); ! Desactivamos esta frase
self.QuipsOn(1, 1); ! Activamos 1
print "blablabla";
1: self.QuipOff(1); ! Desactivamos esta
self.QuipsOn(1, 2); ! Activamos 2
print "blablabla";
2: self.QuipOff(2); ! Desactivamos esta
self.QuipsOn(2, 3,4); ! Activamos 3 y 4
print "blablabla";
3: self.QuipOff(3); ! Desactivamos esta
print "blablabla";
4: self.QuipOff(4); ! Desactivamos esta
self.QuipsOn(2, 5,7); ! Activamos 5 y 6
print "blablabla.^^";
5: self.QuipOff(5); ! Desactivamos esta
self.QuipsOn(1, 6); ! Activamos 7
print "blablabla";
6: self.QuipOff(6); ! Desactivamos esta
print "blablabla";
7: self.QuipOff(7); ! Desactivamos esta
print "blablabla";
8: self.QuipOff(8); ! Desactivamos esta
self.QuipsOn(4, 9,13,14,15); ! Activamos 9, 13, 14 y 15
print "blablabla";
9: self.QuipOff(9); ! Desactivamos esta
self.QuipsOn(3, 10,11,12); ! Activamos 10, 11 y 12
print "blablabla";
10: self.QuipOff(10); ! Desactivamos esta
print "blablabla";
11: self.QuipOff(11); ! Desactivamos esta
print "blablabla";
12: self.QuipOff(12); ! Desactivamos esta
print "blablabla";
13: self.QuipOff(13); ! Desactivamos esta
self.QuipsOn(1, 16); ! Activamos 16
print "blablabla";
14: self.QuipOff(14); ! Desactivamos esta
print "blablabla";
15: self.QuipOff(15); ! Desactivamos esta
print "blablabla";
16: self.QuipOff(16); ! Desactivamos esta
print "blablabla";

}
! ###################################
! Aquí­ está la linea que he añadido
<<HablarCon PSI>>;
],
InicializarQuips [;
self.QuipsOn(2, 0, 8);
! Inicialmente las únicas frases activas son 0 y 8
],
has masculino propio;[/spoiler]


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 16 Ene 2005 22:47 
gerish escribió:
alguien sabe porqué ocurre lo mismo (un desbordamiento de pila) cuando unapropiedad vale más de 4000
ejemplo:
jugador.experiencia 4200


Ni idea, por más que lo intento, no consigo reproducir ese error
¿Más detalles de lo que estás haciendo exactamente cuando se produce? :?:


Arriba
  
 
 Asunto:
NotaPublicado: 17 Ene 2005 08:05 
es que lo gracioso, es que si pones jugador.experiencia = a 6000 al inicializar no da error al compilar
solo al arrancar el juego
pero me ha pasado al hacer una propiedad
del tipo experiencia 100,
y a medida le vas sumando (o restando) al llegar a -4000 o 4000 se cuelga ...
gracIaS!s


Arriba
  
 
 Asunto:
NotaPublicado: 18 Ene 2005 20:19 
Desconectado
Implementador
Implementador
Avatar de Usuario

Registrado: 07 Sep 2004 21:52
Mensajes: 1897
Aventurero_krac escribió:
Citar:
Claro que es problema tuyo, has hecho recursividad y al cabo del rato al pobre inform se le acaba la pila. Y claro que tiene solución!!! ¿Me enseñas el código que hiciste para crear esa caracterí­stica?


Ahí­ va, es simplemente igual que el ejemplo que viene con fhablaoo, excepto una linea añadida:



Ahá... he mirado el código de fhablaoo y no tiene la constante system definida, por tanto no puedes reemplazar código, además que el sistema está metido dentro de la clase Personaje.

Mi recomendación es que copy and paste todo el archivo de fhablaoo y que lo modifiques... vamos que modifiques la librerí­a y la añadas al zip del código fuente de tu juego en plan fhablaoomijuego.inf

Para que funcione como tu quieres debes hacer lo siguiente:

En la clase personaje modifica esto:

[spoiler]

antes [x z ok eleccion;
HablarCon:
for (x=0 : x <= self.MAXQUIP : x++) {
if (self.TestQuip(x)) { ok++; }
}

! LA SIGUIENTE LINEA ESTA MODIFICADA:
! if (ok > 0) {
! SE CONVIERTE EN ESTA:
while (ok>0) {
! Esto hace que sea un bucle continuo que no parará de hablar hasta que no queden opciones.

print "^[Elige una opción para hablar:]^^";
! Listar las posibles opciones
for (x=0: x <= self.MAXQUIP: x++) {
if (self.TestQuip(x)) {
z++;
print "[", z, "] ";
self.Enunciado(x);
}
}

! Leer la opción elegida y responderla
new_line;
do {

! AQUI TB MODIFICAMOS LO SIGUIENTE: :))))
! print "Selecciona una opción (0 para no decir
nada) >> ";
print "Selecciona una opcion. >> ";
! Bien, nos acercamos a conseguir que no se pueda decir nada :)

#ifdef TARGET_ZCODE;
read buffer parse DibujarLineaEstado;
#ifnot;
KeyboardPrimitive(buffer, parse);
#endif;
eleccion = IntentarNumero(1);

! AQUI MODIFICAMOS ESTA LINEA:
! } until ((eleccion >= 0) && (eleccion <= z));

! Y ESTAS DOS SE ELIMINAN!!!!
! if (eleccion == 0)
! print "^Al final decides no decir nada.^";

} until ((eleccion > 0) && (eleccion <= z));

! Esta a continuación, aunque considera la opción 0, no nos afecta para nada al cambio hecho.
if (eleccion ~= 0) {
ok = 0; new_line;
for (x=0: x <= self.MAXQUIP: x++) {
if (self.TestQuip(x)) {
ok++;
if (ok == eleccion) {
self.Respuesta(x);
} ! Acabamos si es la correcta
} ! pasamos a la siguiente
} ! Acabamos todos los quips activos
} ! acabamos si queremos alguna respuesta

! EL RETURN TRUE ESTE DEBE ELIMINARSE!!!!!!!!
! rtrue;
} ! Acabamos si habí­a algún quip

"No se te ocurre nada que decir.";
],
[/spoiler]

Bueno, ahí­ lo llevas, debes sustituir la propiedad original de la librerí­a por esta. Te deberí­a funcionar correctamente sin problemas, si te da alguno quizás es que el foro pone retornos de carro donde no debe, así­ que revisa las lineas de los comentarios luego en tu editor favorito...

Ahora lo suyo serí­a poner estas opciones con constantes opcionales configurables y actualizar la librerí­a. ¿Que opinais?.

Chao.

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


Última edición por Urbatain el 19 Ene 2005 03:57, editado 1 vez en total

Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 18 Ene 2005 23:55 
La idea no es del todo mala, pero, si funcionase como pretende (que jurarí­a, a riesgo de meter la pata, que no es el caso XDD) lo que consigue es, por un lado, impedir materialmente al jugador salir de una conversación por su propia iniciativa (¿realmente es eso lo que querí­a Krac?) y por otro, complicarle sobremanera al programador la posibilidad de interrumpir una conversación como consecuencia de una respuesta. Me explico, para hacerlo el programador deberí­a eliminar de un plumazo todos los quips activos, ya que si no no sale del bucle, y además si quere contemplar la posibilidad de futuras conversaciones tendrí­a que volver a activarlos todos a mano...

En cualquier caso, pudiera ser que me haya trastabillado la vista con los parentesis y los corchetes, pero a mí­ me da que el flujo del programa va a pasar por el último de los "rtrue" de todas todas, el cual lo va a echar sin contemplaciones del "antes" sin más consideraciones.

Ese último rtrue deberí­a dar un pequeño salto y colocarse no justo antes, sino justo después del corchete del bucle "while", donde, al fin y al cabo, ya hay una linea que efectua un return true, con lo que bastarí­a con eliminarlo y así­, cuando no hubiese quips activos, saltarí­a automáticamente al "No se te ocurre nada que decir.".
Poco versatil, pero al menos funcionarí­a según lo previsto por Urbatain.

Hey, pero no os fiéis mucho de mí­, que no he hecho la prueba :)


Arriba
  
 
 Asunto:
NotaPublicado: 19 Ene 2005 00:31 
gerish escribió:
es que lo gracioso, es que si pones jugador.experiencia = a 6000 al inicializar no da error al compilar
solo al arrancar el juego
pero me ha pasado al hacer una propiedad
del tipo experiencia 100,
y a medida le vas sumando (o restando) al llegar a -4000 o 4000 se cuelga ...
gracIaS!s


Y... ¿eso le pasa sólo al objeto "jugador" o a cualquier otro? Piensa que el objeto jugador viene predefinido en la libreria y no puedes añadirle propiedades por las buenas (suponiendo que ese sea el problema)

Prueba a utilizar la rutina "CambiarJugador" (ver su uso en el manual de referencia) sobre un objeto que tenga debidamente definida esa propiedad "experiencia" y mira a ver si se repite el problema.

¡Todo es cuestión de ir eliminando sospechosos para aislar la causa!


Arriba
  
 
 Asunto:
NotaPublicado: 19 Ene 2005 03:56 
Desconectado
Implementador
Implementador
Avatar de Usuario

Registrado: 07 Sep 2004 21:52
Mensajes: 1897
Anonymous escribió:
La idea no es del todo mala, pero, si funcionase como pretende (que jurarí­a, a riesgo de meter la pata, que no es el caso XDD) lo que consigue es, por un lado, impedir materialmente al jugador salir de una conversación por su propia iniciativa (¿realmente es eso lo que querí­a Krac?) y por otro,

Exacto, eso es lo que quiere, que se agoten todas las posibilidades de conversación forzosamente, de todas fomas eso es fácil de volver a poner :)

Citar:

complicarle sobremanera al programador la posibilidad de interrumpir una conversación como consecuencia de una respuesta. Me explico, para hacerlo el programador deberí­a eliminar de un plumazo todos los quips activos, ya que si no no sale del bucle, y además si quere contemplar la posibilidad de futuras conversaciones tendrí­a que volver a activarlos todos a mano...



Y actualmente, ¿como fuerzas la salida de la conversación?

Citar:

En cualquier caso, pudiera ser que me haya trastabillado la vista con los parentesis y los corchetes, pero a mí­ me da que el flujo del programa va a pasar por el último de los "rtrue" de todas todas, el cual lo va a echar sin contemplaciones del "antes" sin más consideraciones.


Tienes toda la razón, el rtrue rompe el bucle, por tanto lo mejor es eliminarlo... ya he editado mi mensaje.

Citar:

Poco versatil, pero al menos funcionarí­a según lo previsto por Urbatain.

Hey, pero no os fiéis mucho de mí­, que no he hecho la prueba :)


Es lo que querí­a Krac :)

Chao.
[/quote]

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


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 19 Ene 2005 14:00 
no, ocurre con cualquier objeto
...
tengo entendido que es por winfrotce
¿puede ser?
...
saludos!


Arriba
  
 
 Asunto:
NotaPublicado: 21 Ene 2005 14:54 
Desconectado
Archivero
Archivero
Avatar de Usuario

Registrado: 10 Mar 2004 11:40
Mensajes: 190
Ubicación: Donde quepa
Hola, chicos, muchí­simas gracias por las soluciones que proponéis.
He estado algo ausente estos últimos dí­as y aún no he tenido tiempo de poner en práctica lo que decí­s.
Este fin de semana sacaré algo de tiempo para ponerme a ello y os diré qué tal me va

Citar:
(¿realmente es eso lo que querí­a Krac?)


He leido vuestros mensajes apresuradamente así­ que no sé exactamente lo que dicen, esta tarde voy a leerlos con más calma.
De todas formas, os diré lo que quiero.
Quiero cambiar el sistema de conversación de manera que ésta no se interrumpa *a no ser* que el jugador seleccione la opción "Bueno, me aburro, no quiero seguir hablando contigo" (o que alguna opción tenga como consecuencia el fin de la conversación, por ejemplo, si amenazamos de muerte al PSI, y éste nos mate, o algo así­)
Pero si no, que siga hasta que se acaben las opciones.
Es decir, lo tí­pico de las aventuras gráficas.


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