CAAD

Comunidad de Aventuras Conversacionales y Relatos Interactivos
Fecha actual 18 Oct 2017 01:02

Todos los horarios son UTC + 1 hora




Nuevo tema Responder al tema  [ 44 mensajes ]  Ir a página Anterior  1, 2, 3
Autor Mensaje
 Asunto: Re: Más dudas
NotaPublicado: 12 Ago 2015 11:27 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 22 May 2004 10:50
Mensajes: 884
Es un placer usar el autocompletar con el tabulador, funciona bastante bien. Sin embargo creo que voy a desactivar el interno, porque parece que encuentra coincidencias con demasiada facilidad:

> ex paredes
El ventanal da a popa, el resto de paredes están cubiertas de estanterías.
> ex ventanal
Me obliga a encorvarme un poco.
> ex techo
Me obliga a encorvarme un poco.
> ex popa
Me obliga a encorvarme un poco.
> ex kaka
Me obliga a encorvarme un poco.


Yo creo que le falta afinar un poco más, y aclarar al jugador contra qué se ha hecho la coincidencia para que no dar respuestas raras como en el ejemplo anterior. Es decir:


> ex ventanal
Quizá quisiste decir: ex techo
Me obliga a encorvarme un poco.

_________________
---
# S a i m a z o o m # http://www.aliensuavito.com manoparlante.blogspot.com @lecambre ALIENsoft (KNO&KMBR&DLA)


Arriba
 Perfil  
 
 Asunto: Re: Más dudas
NotaPublicado: 12 Ago 2015 12:06 
Desconectado
Momio
Momio
Avatar de Usuario

Registrado: 09 Mar 2004 16:14
Mensajes: 4614
saimazoom escribió:

> ex ventanal
Quizá quisiste decir: ex techo
Me obliga a encorvarme un poco.


He estado mirando el por qué de todo esto, es muy extraño que ventanal acabe considerando que es "techo". Tras analizar un poco el problema, he observado que en realidad no lo hace. El problema es otro: la palabra techo tiene como número el 255, y eso no puede ser. Como comenté ayer por lo de extender el vocabulario el 255 significa "no hay palabra". Así, cuando pones "EX VENTANAL" los flags 33 y 34 quedan con 30 (examinar) y 255 (no había nombre reconocible). Pero como la palabra techo es el 255, el parser después entra en la entrada "ex techo".

Esa es la verdadera causa de que tengas "demasiados falsos matches" y no el tema de la distancia de palabras.

Resumiendo, ponle cualquier otro número a la palabra techo y no vuelvas a usar el 255 :-)

En cuanto a poner un "quizá quisiste decir" le voy a dar una vuelta, creo que podría ponerlo así:

Código:
>ex ventanal (quizá quisiste decir "examinar techo")
Me obliga a encorvarme un poco.


Por otro lado, puede ser que no debiera "adivinar" palabras que no tengan una longitud mínima, porque claro, en palabras de 4 letras por ejemplo, 2 letras son la mitad, es decir "peto" y "cepa" son asimilables. Lo mismo para palabras de hasta 5 letras no debería admitir más que distancia 1, y a partir de 6, de 1 o 2. Voy a hacer una prueba primero a ponerlo así a ver que pasa.


¡Ah! Otra cosa que te puede estar dando problemas con el tema de la distancia es que el vocabulario está recortado en casi todos los casos a las 5 letras que soportaba NMP, por ejemplo veo por ahí "edifi", "puent", "despe", "basur", etc.. Es absolutamente necesario corregir todo el vocabulario ampliando las palabras a su longitud real, porque sino puedes tener falsos match. Por ejemplo "examinar baul" podría inferir "basur" y contestar "No ves nada en la basura" (es un ejemplo, creo que baul y basur tienen distancia 3, pero ya me entiendes, con palabras cortas es más fácil. De hecho el sistema de adivinar palabras no lo hace para palabras de 4 letras o menos, como poco deben ser 5, pero en esas 5 y con ese vocabulario "roto" hay muchas posibilidades.

Te dejo otro fichero en el que he hecho los siguientes cambios:

1) Ahora se puede deshabilitar el "adivinado" de palabras poniendo a 1 el bit 8 del flag 12 ( BSET 12 8 )
2) Solo adivinará palabras con distancia 2 si la palabra tiene al menos 7 letras. Así queda la cosa: 1-4 --> no adivina, 5-6: adivina solo distancia 1, 7+: adivina distancia 1, sino distancia 2

Lo del "querias decir..." lo dejo para ver si al final es necesario, que tu caso no era por eso, y me obligaría a añadir un mensaje del sistema más.

_________________
Sígueme en twitter: @uto_dev
http://www.ngpaws.com


Arriba
 Perfil  
 
 Asunto: Re: Más dudas
NotaPublicado: 12 Ago 2015 12:13 
Desconectado
Archivero
Archivero

Registrado: 05 Abr 2014 17:40
Mensajes: 264
saimazoom escribió:
Te quería preguntar si es posible evitar la típica situación PAWSiana en que el mensaje de 'no puedes examinar eso' cambie en función de si el objeto existe
en el mundo del juego. Es decir, si estoy en el camarote y escribo examinar papeles, sin que el capitán me haya hablado de ellos, el parser suelta un "No
veo los papeles importantes por aquí". ¿Cómo puedo eliminar/modificar ese comportamiento?.

Justo como lo dijo el amigo Uto, yo desde que inicié a aprender a utilizar Superglús, modifiqué esos mensajes del estilo EX quitando la _ y colocando: No ves eso.

De esa manera impido que el jugador curioso se ponga a teclear:
EX PISTOLA
y que el sistema te imprima:
No ves una pistola Beretta por aquí.

Ahora como lo dejé sale:
EX PISTOLA
y el sistema te imprime:
No ves eso.

De esa manera no se daña con antelación el conocimiento de qué objetos podrás coger por el camino. En este caso, una pistola.

Así el jugador no tiene idea la primera vez de que encontrará una pistola más adelante.

OJO, ese EX responde al objeto físico definido ausente. Ahora bien, el mismo EX que responde a solo el nombre del vocabulario, también lo cambié igual: No ves eso.

De esa manera si EXAMINAS bien sea un nombre de objeto físico o el nombre de un objeto descripción, te dirá: No ves eso.
Así el jugador curioso no sabrá si una pistola es objeto cogible o solo es una descripción en una sala de armería y al verla no se pueda coger.


Arriba
 Perfil  
 
 Asunto: Re: Más dudas
NotaPublicado: 12 Ago 2015 14:21 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 22 May 2004 10:50
Mensajes: 884
Mirando la estructura de los directorios me he dado cuenta que Isla ha pasado por NMP, Superglús y unas cuentas Beta de NgPAWS. Debe ser un caso casi único de portabilidad hacia adelante.

Gracias a ambos por los comentarios (siento lo de la pared a 255), y seguimos puliendo...

_________________
---
# S a i m a z o o m # http://www.aliensuavito.com manoparlante.blogspot.com @lecambre ALIENsoft (KNO&KMBR&DLA)


Arriba
 Perfil  
 
 Asunto: Re: Más dudas
NotaPublicado: 12 Ago 2015 15:15 
Desconectado
Momio
Momio
Avatar de Usuario

Registrado: 09 Mar 2004 16:14
Mensajes: 4614
saimazoom escribió:
Mirando la estructura de los directorios me he dado cuenta que Isla ha pasado por NMP, Superglús y unas cuentas Beta de NgPAWS. Debe ser un caso casi único de portabilidad hacia adelante.


Lo duro es el salto NMP->Superglús, porque aunque se parecen en aspecto, por dentro las tripas son muy diferentes :-)

Por cierto, lo de ampliar las palabras es importante, no solo por los matches falsos, sino porque el jugador puede no ser entendido. Por ejemplo, si una palabra figura como "basur" y el jugador escribe "basura" se va salvar porque la distancia es 1, pero si el vocabulario pone "edifi" y el jugador escribe "edificio" (que es lo más normal) simplemente no lo entenderá. De hecho, es posible que ahora te funcionen cosas que antes no, simplemente porque las palabras reales y las del vocabulario están a 2 o menos de distancia de las palabras reales, pero es una mala práctica dejarlo así :D

_________________
Sígueme en twitter: @uto_dev
http://www.ngpaws.com


Arriba
 Perfil  
 
 Asunto: Re: Más dudas
NotaPublicado: 13 Ago 2015 06:32 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 22 May 2004 10:50
Mensajes: 884
Tengo el siguiente código:

Código:
hablar capitan
 at 1
 zero 50  ; Hemos hablado ya con el capi?
 talk Scapitan 1;  ; Menú 1
 message 53
 let 50 1 ; Ya hemos hablado con el capitán
 create Opapeles ; Pone los papeles en la localidad
 done


Y lo que observo es que sin haber terminado la conversación se ejecuta todo el código posterior. ¿Cómo puedo hacer para que no siga hasta que termine el talk?.

_________________
---
# S a i m a z o o m # http://www.aliensuavito.com manoparlante.blogspot.com @lecambre ALIENsoft (KNO&KMBR&DLA)


Arriba
 Perfil  
 
 Asunto: Re: Más dudas
NotaPublicado: 13 Ago 2015 10:22 
Desconectado
Momio
Momio
Avatar de Usuario

Registrado: 09 Mar 2004 16:14
Mensajes: 4614
saimazoom escribió:
Y lo que observo es que sin haber terminado la conversación se ejecuta todo el código posterior. ¿Cómo puedo hacer para que no siga hasta que termine el talk?.


La verdad es que me cuesta un poco seguir tu librería GTalk, no se muy bien como funciona en Inform así que me pierdo, pero voy a tratar de explicar el condacto plugin ASK, que espera la pulsación de una tecla, para intentar que entendiendolo bien puedas hacer TALK.

Este es el condacto ASK:


Código:
//CND ASK W 14 14 1 0

// Global vars for ASK


var inAsk = false;
var ask_responses = null;
var ask_flagno = null;



function ACCask(writeno, writenoOptions, flagno)
{
   inAsk = true;
   writeWriteMessage(writeno);
   ask_responses = getWriteMessageText(writenoOptions);
   ask_flagno = flagno;
}



// hook replacement
var old_ask_h_keydown  = h_keydown;
h_keydown  = function (event)
{
   if (inAsk)
   {
      var keyCodeAsChar = String.fromCharCode(event.keyCode).toLowerCase();
      if (ask_responses.indexOf(keyCodeAsChar)!= -1)
      {
         setFlag(ask_flagno, ask_responses.indexOf(keyCodeAsChar));
         inAsk = false;
         event.preventDefault();
            $('.input').show();
          $('.input').focus();
          hideBlock();
         waitKeyCallback();
      };
      return false; // if we are in ASK condact, no keypress should be considered other than ASK response
   } else return old_ask_h_keydown(event);
}


Empiezo por arriba, la primera linea le dice al compilador que tipo de condacto es y que parámetros tiene. Hay una importante diferencia entre tu TALK y este, y es que ASK está marcado como tipo "W" (waitkey) y TALK no, y si un condacto no es de tipo waitkey, no espera tecla. El hecho de ser tipo waitkey hace algunas acciones importantes como por ejemplo hacer que los condactos que hay por detras de ese condacto en una entrada en lugar de generarse directamente, se haga dentro de una funcion, y además la guarda en un sitio para que el interprete sepa a donde saltar cuando se recibe la orden de "continuar".

Por ejemplo con tu modelo, esto código:

Código:
AT 7
TALK 1 1
SET 100


se compila así:

Código:
if (!CNDat(7)) break p000e0000;
ACCtalk(1,1);
ACCset(100);


Pero si el condacto es tipo waitkey, se compila así:

Código:
      if (!CNDat(7)) break p000e0000;
       ACCtalk(1,1);
       function anykey00000()
      {
       ACCset(100);
      }
       waitKey(anykey00000);
      done_flag=true;


La diferencia es que lo que va detrás del talk no aparece directamente, y por tanto es ejecutado, sino que queda dentro de una función, a la que se llamará más tarde. Además, esa llamada waitKey(anykey00000) hace que se guarde el nombre de la función a llamar"anykey00000" en un sitio que permitirá que más tarde, llamando a la función waitKeyCallback() se llame precisamente a esa anykey00000(). La función waitkey, además de guardar el nombre de la función, se encarga de esconder la caja de input y mostrar una capa transparente sobre todo el navegador que impide que se haga click en nada hasta que se pulse la tecla. Mirando tu código veo que haces cosas como esconder el input, que son totalmente innecesarias si haces las cosas bien, porque el compilador ya se encarga.

Parece que con solo arreglar eso ya estaría solucionado, pero probablemente no, por lo que sigo.

Después vienen las variables globales, de ellas la más importante es inAsk, que en tu caso sería inGTalkkey, que es la variable que marca de manera global que estamos esperando que se pulse una tecla para el condacto ASK (o TALK en tu caso), esto es importante porque luego en gancho que metemos en la pulsación de tecla solo hace algo si estamos en "inAsk==true" (en tu caso sería en inGTalkkey==true). Las otras dos variables son necesarias para ASK, una guarda el flag donde se meterá el número de la respuesta y otra guarda el el listado de respuestas posibles. En tu caso lo más adecuado sería que tuvieras un sitio donde guardar el flag usado, aunque mirando tu código me da la impresión de que el flag usado va a capón en la librería. Es una opción pero la más limpia sería tener ese flag en una variable y que el condacto TALK tuviera un tercer parámetro con el flag (o sea, TALK Scapitan 1 fKey), además tendrías una variable global gtalk_flagno

Tras las variables viene el condacto en si, y lo que hace es lo siguiente:

- Marca que estamos en espera de una respuesta de ASK (inAsk=true, en tu caso debería haber un inGTalkkey=true). Esto hace que luego el gancho "atienda" las pulsaciones.
- Escribe el mensaje que corresponde al ASK, en tu caso supongo que tendrías que hacer que se muestren las opciones del menú que toque
- Inicializa las dos variables globales, para que luego en el gancho puedan utilizarse (en tu caso, si añades ese tercer parámetro tendrías que asignar el flag a una variable global gtalk_flagno)

Y no hace nada más, es decir, no espera la pulsación de tecla, ni hace un done ni nada. El sistema se encarga solo de que cualquier cosa que haya en la entrada detrás de ese ASK (o TALK) no se ejecute hasta que el gancho lo haga.

Debajo del condacto está el gancho, que en tu caso lo tienes puesto en la librería, pero da igual. Lo que hace el gancho es, si estamos en inAsk==true (en tu caso sería inGTalk==true) ejecuta las acciones pertinentes a ese gancho, y sino, como dijimos ayer, llama al gancho original old_ask_h_keydown.

Si resulta que sí que estamos esperando una tecla, pues la tratamos. En el caso de ASK espera la pulsación de una tecla entre varias que vienen en un mensaje, por ejemplo "SN" esperaría la pulsación de S o N. Por tanto si el jugador pulsa una de las opciones válidas hacemos lo siguiente: primero marcamos que inAsk=false, es decir, damos por recibida la tecla y ya no esperamos más. A tu gancho creo que le falta marcar el inGTalk=false ahí. Después el necesario event.preventDefault() para que javascript ya de por tratada la pulsación también. Después como ves, se muestra el input, se le hace foco y se llama a hideBlock(), que oculta esa capa transparente que te decía. Finalmente, lo más importante: llamamos a la funcion de callback, que ejecutará lo que hubiera en la entrada detrás del ASK (o del TALK en tu caso). Además devuelve false en cualquier caso, sea una pulsación válida o no (una no válida sería que tuvieramos las opciones SN y pulsen A) porque si estamos en medio de un ASK, las pulsaciones no las tiene que tratar ningún otro gancho. Esto permite que esperamos SN y pulsan A, no pase nada y sigamos esperando, sin hacer que esa "A" acabe en algún otro sitio tratada por otro método.

Un detalle más es que a tu condacto TALK le falta un 0 en la cabecera, son 4 números, uno por cada parámetro y uno final que marca la terminación, que para casi todos los plugin debe ser un 0. El compilador lo echa en falta y pone el valor por defecto 0, pero por corrección debería ser:

Código:
//CND TALK W 2 2 0 0



Resumiendo, que veo que hay que hacer para TALK:

1) Cambiarle el tipo al condacto a waitkey y asegurarse de que inicializa correctamente el inGTalkkey a true, además de preparar lo necesario (mostrar los textos, y si hay que guardar alguna variable global con las posibles respuestas hacerlo)

2) Asegurarnos de que el gancho hace las acciones pertinentes en caso de estar en estado de inGTalkkey, que incluye realizar lo que sea necesario según la tecla pulsada (grabar el dato en el flag o lo que sea), y pone el inGTalkkey a false, escribe la frase de respuesta, hace foco en el input, lo muestra, hace el hideblock() y finalmente llama al callback, además de retornar false en cualquier caso (incluso si la tecla pulsada no pertenecía al menú)

Con eso tendremos un condacto TALK operativo, que luego hay que ver como usar, porque a diferencia del TALK de NMP, que una vez que entrabas en la conversación no salias de ella salvo que eligieras una frase de las llamadas "de salida", en este caso simplemente se presentaría un menú, y al pulsar una tecla nos saldríamos de la conversacion. Para evitar eso es para lo que se monta "el lío" que puedes ver en este artículo https://github.com/Utodev/ngPAWS/wiki/E ... men%C3%BAs, donde se hace todo con GETKEY. En el fondo tendrás que hacer lo mismo con TALK.

Veo que en tu gancho estás trantando que tras la pulsación de la tecla se lance de nuevo otro menú. No digo que eso no sea posible, pero en ese caso tienes que gestionar tú todo el sistema de callback, incluyendo el final que hace hace el waitkeyCallback() al que tendrías que llamar tu mismo... en fin mucho "trabajo manual". Quizá sea mejor que TALK simplemente presente el menú que toque y espere a la pulsación de la tecla para grabar su valor en un flag y "salga", y ya sea trabajo a nivel PAWs mantener la conversación activa. Así:

Respuestas:

Código:
HABLAR CAPITAN
 PRESENT oCapitan
 TALK Scapitan 1 fConversacionCapitan
 PROCESS 9
 DONE



Process 9:
Código:
_ _
 EQ fConversacionCapitan 0 // Condicion de salida
 NOTDONE

_ _
 TALK Scapitan 1 fConversacionCapitan
 PROCESS 9


Ese process 9 hace el bucle "infinito" que te mete una y otra vez en la conversación hasta que el flag vale 0 (o cualquier otra condición de salida que veamos)

_________________
Sígueme en twitter: @uto_dev
http://www.ngpaws.com


Arriba
 Perfil  
 
 Asunto: Re: Más dudas
NotaPublicado: 14 Ago 2015 10:10 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 22 May 2004 10:50
Mensajes: 884
Ya lo he solucionado, lo que hecho es marcar el condacto como 'W' para que almacenase en la función el resto del código de la entrada y luego llamar a waitKeyCallback() al salir de la conversación en GTALK.

_________________
---
# S a i m a z o o m # http://www.aliensuavito.com manoparlante.blogspot.com @lecambre ALIENsoft (KNO&KMBR&DLA)


Arriba
 Perfil  
 
 Asunto: Re: Más dudas
NotaPublicado: 14 Ago 2015 12:58 
Desconectado
Momio
Momio
Avatar de Usuario

Registrado: 09 Mar 2004 16:14
Mensajes: 4614
saimazoom escribió:
Ya lo he solucionado, lo que hecho es marcar el condacto como 'W' para que almacenase en la función el resto del código de la entrada y luego llamar a waitKeyCallback() al salir de la conversación en GTALK.



Pues sí, más o menos es eso :D

Es que yo a veces me enrollo, pero espero que haya sido de ayuda XD

_________________
Sígueme en twitter: @uto_dev
http://www.ngpaws.com


Arriba
 Perfil  
 
 Asunto: Re: Más dudas
NotaPublicado: 14 Ago 2015 13:01 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 22 May 2004 10:50
Mensajes: 884
Ha venido bien, poco a poco me voy enterando de las tripas de NgPaws. Los bloqueos grandes ya están solucionados, ahora ya son las ganas que tenga de complicarme la vida. Lo siguiente que quiero hacer es inyectar secuencias de test, agiliza bastante el testeo.

_________________
---
# S a i m a z o o m # http://www.aliensuavito.com manoparlante.blogspot.com @lecambre ALIENsoft (KNO&KMBR&DLA)


Arriba
 Perfil  
 
 Asunto: Re: Más dudas
NotaPublicado: 29 Dic 2015 21:38 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 22 May 2004 10:50
Mensajes: 884
Uto, ¿se te ocurre como podría empezar con esto?. Ya voy necesitando meter ristras de comandos, a poder ser desde dentro del juego para poder comprobar condiciones. No hace falta que me des la solución, tan sólo dame alguna idea de donde podría engancharme.

_________________
---
# S a i m a z o o m # http://www.aliensuavito.com manoparlante.blogspot.com @lecambre ALIENsoft (KNO&KMBR&DLA)


Arriba
 Perfil  
 
 Asunto: Re: Más dudas
NotaPublicado: 29 Dic 2015 22:06 
Desconectado
Momio
Momio
Avatar de Usuario

Registrado: 09 Mar 2004 16:14
Mensajes: 4614
saimazoom escribió:
Uto, ¿se te ocurre como podría empezar con esto?. Ya voy necesitando meter ristras de comandos, a poder ser desde dentro del juego para poder comprobar condiciones. No hace falta que me des la solución, tan sólo dame alguna idea de donde podría engancharme.


Hmm.. ¿esto qué? Este hilo tiene muchas preguntas dentro XD

_________________
Sígueme en twitter: @uto_dev
http://www.ngpaws.com


Arriba
 Perfil  
 
 Asunto: Re: Más dudas
NotaPublicado: 29 Dic 2015 22:21 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 22 May 2004 10:50
Mensajes: 884
Lo de inyectar comandos dentro del juego para no tener que teclear. La intención es crear unidades de prueba, como hice en TC que la aventura se jugaba sola.

_________________
---
# S a i m a z o o m # http://www.aliensuavito.com manoparlante.blogspot.com @lecambre ALIENsoft (KNO&KMBR&DLA)


Arriba
 Perfil  
 
 Asunto: Re: Más dudas
NotaPublicado: 29 Dic 2015 22:41 
Desconectado
Momio
Momio
Avatar de Usuario

Registrado: 09 Mar 2004 16:14
Mensajes: 4614
saimazoom escribió:
Lo de inyectar comandos dentro del juego para no tener que teclear. La intención es crear unidades de prueba, como hice en TC que la aventura se jugaba sola.


La función

Código:
orderEnteredLoop(player_order)


te permite añadir una entrada como si fueran escritas por el jugador, con lo cual si haces

Código:
orderEnteredLoop('ABRIR PUERTA.N.E.COGER TODO. SACAR LLAVE DE BARRIL')


será como si el jugador lo hubiera escrito.

Para meterlo para las pruebas lo mejor es ponerlo en un plugin tipo lib, que se enganche al hook h_post y lo lance.

_________________
Sígueme en twitter: @uto_dev
http://www.ngpaws.com


Arriba
 Perfil  
 
Mostrar mensajes previos:  Ordenar por  
Nuevo tema Responder al tema  [ 44 mensajes ]  Ir a página Anterior  1, 2, 3

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:  
Desarrollado por phpBB® Forum Software © phpBB Group
Traducción al español por Huan Manwë para phpBB-Es.COM