CAAD

Comunidad de Aventuras Conversacionales y Relatos Interactivos
Fecha actual 22 Oct 2017 05:56

Todos los horarios son UTC + 1 hora




Nuevo tema Responder al tema  [ 9 mensajes ] 
Autor Mensaje
 Asunto: Tercer nombre
NotaPublicado: 08 Jul 2016 16:47 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 09 Feb 2012 20:33
Mensajes: 855
Tengo dos contenedores, una botella y una cantimplora, llenos de agua. Un fuego que apagar.
Tengo respuestas para:

- vaciar botella en fuego
- apagar fuego con botella
- vaciar cantimplora en fuego
- apagar fuego con cantimplora.

Pero para el caso de la entradas:

- apagar fuego con agua de la botella.
- apagar fuego con agua de la cantimplora.

o incluso:

- vaciar en fuego el agua de la botella/cantimplora.

El fuego sólo se puede apagar con el agua de la cantimplora por XX***XX motivos. Aunque llevemos encima los dos contenedores y los dos llenos de agua;
Código:
> apagar fuego con botella
El fuego ni se inmuta.
> apagar fuego con cantimplora
El fuego desaparece.


Le estoy dando vueltas y no hago más que enrevesar el código, incluso me he planteado crear dos adjetivos "cantimplora" y "botella" y jugar con eso. Pero ¿cuál sería la mejor solución?
Si tuviera acceso a un tercer nombre: "fuego" + "agua" + "botella ó cantimplora" podría solucionarlo, pero creo que ngPaws no guarda tercer nombre o "resto" de la entrada.

_________________
Te quiero... lo siento Yoda sólo tenemos café.


Arriba
 Perfil  
 
NotaPublicado: 08 Jul 2016 18:52 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 09 Feb 2012 20:33
Mensajes: 855
Creo que por ahora lo he resuelto;

Spoiler: Mostrar
Llevas:
una botella
una cantimplora
> ex botella
Una botella de cristal. Está llena de agua.
> ex cantimplora
Una cantimplora de explorador. Está llena de agua.
> ex fuego
Un fuego calienta la olla.
> apagar fuego con agua
¿El agua de dónde?
> apagar fuego con el agua de la botella
Vacias todo el agua de la botella en el fuego que caliente la olla.
Pero el fuego de la olla ni se inmuta'.
> apagar el fuego con el agua de la cantimplora
Vacias la cantimplora en el fuego de la olla, la olla se apaga.
> ex fuego
El fuego que calentaba la olla ya se apagó.


Con un condacto propio;

Código:
//CND AUXILIAR C 1 0

function CNDauxiliar ( id_word ) {

    // Función para saber si el word representado con su id_word
    // ... está presente en la frase actual
     
    var words = player_order.split(' ');
   for ( var i = 0; i<words.length; i++ ) {
       var result = findIdVocabulary( words[i].toLowerCase() );
         if (  result == id_word )
              return true;     
   }
   return false;   
}

// Pequeñas modificaciones de la función creada por UTO findVocabulary (word) definida en runtime.js
// Busca la palabra de entrada en el vocabulario y retorna su ID
function findIdVocabulary(word)  // Pending: sort the vocabulary at the beginning so search may be binary at least
{
   for (var j=0;j<vocabulary.length;j++)
      if (vocabulary[j][VOCABULARY_WORD].toLowerCase() == word)
          return vocabulary[j][VOCABULARY_ID];
   return null;
}




Y la tabla de respuestas:

Código:
; entrada "apagar el fuego" a secas
apagar fuego
 present oOlla
 onotzero oOlla aOn
 eq 44 255
 writeln "¿Y cómo quieres apagar el fuego?"
 done

; apagar fuego con agua de (algún contenedor)...
apagar fuego
 present oOlla
 onotzero oOlla aOn
 noteq 44 255
 eq 44 &&_voc_AGUA
 let 44 255 ; limpiamos el segundo nombre
 auxiliar# &&_voc_BOTELLA
 {
     let 44 &&_voc_BOTELLA
 }
 auxiliar# &&_voc_CANTIMPLORA
 {
     let 44 &&_voc_CANTIMPLORA
 }
 eq# 44 255 ; si el segunDo nombre ha llegado limpio no es contenedor correcto
 {
     writeln "¿El agua de dónde?"
     done
 }           


Por ahora me funciona ok, pero seguramente exista una solución más fácil sin necesidad de condactos inventados...

_________________
Te quiero... lo siento Yoda sólo tenemos café.


Arriba
 Perfil  
 
NotaPublicado: 08 Jul 2016 19:24 
Desconectado
Momio
Momio
Avatar de Usuario

Registrado: 09 Mar 2004 16:14
Mensajes: 4614
No, ngPAWS no guarda tercer nombre, cuando llega al segundo el resto los ignora. Y la verdad es que no tiene fácil solución sin bajar al nivel de javascript.

Tu solución es buena, porque básicamente te iba a plantear lo mismo, aunque también te iba a decir que has creado un puzzle de palabra exacta, y que lo mismo la mejor solución es no tener ese puzzle :-D

En general, toda solución pasa por "bajar" a Javascript, y en ese sentido la tuya es buena.

- Otra solución habría sido usar el hook h_playerOrder para retocar la frase del usuario antes de que se parsee (y que convierta textos como "agua de cantimplora", "agua de la cantinplora", o "agua cantimplora" en "cantimplora" a secas.
- Otra habría sido crear un plugin librería que redefine la función getLogicSentence() añadiendo la lectura de un tercer nombre, es decir, redefinir el parser de ngPAWS (que tampoco es tanto, es copiar la funcion que hay en otra, y meterle lo del tercer nombre, que visto como va el primero y el segundo seguramente es trivial).

Solucion puramente ngPAWS sin plugins, creo que quizá podrías quitar la palabra agua del vocabulario, y dejar que no haga falta decir con qué apagas el fuego, que el juego si llevas las cantimplora llena la vacíe y punto. Pero eso es simplificar el puzzle (lo cual en mi opinión sería bueno, pero eso es una opinión).

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


Arriba
 Perfil  
 
NotaPublicado: 08 Jul 2016 22:17 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 09 Feb 2012 20:33
Mensajes: 855
Uto escribió:
Solucion puramente ngPAWS sin plugins, creo que quizá podrías quitar la palabra agua del vocabulario, y dejar que no haga falta decir con qué apagas el fuego, que el juego si llevas las cantimplora llena la vacíe y punto. Pero eso es simplificar el puzzle (lo cual en mi opinión sería bueno, pero eso es una opinión).


Claro es una de las primeras opciones que manejaba, pero ante el caso de tener en el inventario la botella llena de agua;

>apagar fuego
No puedes apagar el fuego no tienes agua.

ó

>apagar fuego (con agua de la botella) la parte entre paréntesis ngPaws la ignora
No puedes apagar el fuego.

O alguna respuesta parecida el jugador se va frustrar un poco, "¡¡¡Si tengo agua!!!"

ó una respuesta del tipo:
"No puedes apagar el fuego con ese agua"

De todas formas, tengo varias respuestas válidas.
- apagar fuego con cantimplora
- vaciar cantimplora en fuego
y alguna más que no me acuerdo ahora...

Edito:
O bien, si tenemos la botella con agua y la cantimplora sin agua:

>apagar fuego
No hay agua en la cantimplora

Liamos al jugador, ¡Si tengo agua en la botella! o bien le estamos dando la pista de que el único agua que vale es el de la cantimplora.

_________________
Te quiero... lo siento Yoda sólo tenemos café.


Arriba
 Perfil  
 
NotaPublicado: 08 Jul 2016 23:10 
Desconectado
Momio
Momio
Avatar de Usuario

Registrado: 09 Mar 2004 16:14
Mensajes: 4614
edlobez escribió:
>apagar fuego
No hay agua en la cantimplora

Liamos al jugador, ¡Si tengo agua en la botella! o bien le estamos dando la pista de que el único agua que vale es el de la cantimplora.


Puedes controlar todas las opciones, las 4 (cada recipiente con o sin agua), pero igualmente darás pistas. En cualquier caso para mi es muy difícil ver por qué este puzzle es tan importante, porque imagino que el puzzle de verdad no será con agua y no será con cantimploras y botellas, y debe haber una buena razón para no poder usar un agua y la otra sí.

En definitiva tres nombres es un problema para ngPAWS, pero es bastante fácil hacer una librería plugin, que no un condacto, que sustituya ese getLogicSentence()

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


Arriba
 Perfil  
 
NotaPublicado: 09 Jul 2016 13:24 
Desconectado
Momio
Momio
Avatar de Usuario

Registrado: 09 Mar 2004 16:14
Mensajes: 4614
Echando un ojo a la opción de redefinir getLogicSentence(), y así por encima, creo que bastaría con:

1) Hacer un plugin de tipo librería que redefina getLogicSentence() así:

getLogicSentence = function()
{
.... aquí copiar el código de getLogicSentence() original
}


2) Añadir una variable local más

Código:
aux_noun3 = -1;


3) La línea

Código:
case WORDTYPE_NOUN: if (aux_noun1 == -1) aux_noun1 = word_id; else if (aux_noun2 == -1) aux_noun2 = word_id;


cambiarla a

Código:
case WORDTYPE_NOUN: if (aux_noun1 == -1) aux_noun1 = word_id; else if (aux_noun2 == -1) aux_noun2 = word_id; else if (aux_noun3 == -1) aux_noun3 = word_id;



4) Añadir una línea:

Código:
if (aux_noun3 != -1) setFlag(XXX, aux_noun3);


debajo de la línea:
Código:
if (aux_noun2 != -1) setFlag(FLAG_NOUN2, aux_noun2);


Donde XXX es el flag donde queremos que se guarde el código de la palabra identificada como "noun 3".

A partir de ahí basta con hacer esto para saber si el noun3 es uno concreto:

Código:
EQ XXX _voc_AGUA


Aunque también se puede hacer un condacto NOUN3 claro, que básicamente es lo mismo que el NOUN2 pero usando el flag XXX.

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


Arriba
 Perfil  
 
NotaPublicado: 09 Jul 2016 15:42 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 09 Feb 2012 20:33
Mensajes: 855
Hecho,

Código:
> apagar fuego con agua de la botella
Tercer nombre:
64
No veo que lleves la botella.


64 es el ID del objeto botella.

Voy a ponerlo más en práctica a ver que tal.

Gracias

_________________
Te quiero... lo siento Yoda sólo tenemos café.


Arriba
 Perfil  
 
NotaPublicado: 09 Jul 2016 16:50 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 09 Feb 2012 20:33
Mensajes: 855
Creo que posibilidades hay y bastantes:

Spoiler: Mostrar
> apagar el fuego
¿Y cómo quieres apagar el fuego?
> apagar el fuego con agua
¿El agua de dónde la saco?
> echar agua al fuego
¿El agua de dónde la saco?
> i
Llevas:
una botella
> apagar el fuego con el agua de la botella
Podrías intentar apagar el fuego con agua de la botella. Pero la botella está vacía.
> echar agua de la botella al fuego
Podrías intentar apagar el fuego con agua de la botella. Pero la botella está vacía.
> vaciar la botella en el fuego
La botella está vacía.
> apagar el fuego con la botella
Podrías intentar apagar el fuego con agua de la botella. Pero la botella está vacía.
> soplar al fuego
Tienes demasiada fe en tus pulmones, así no apagarás el fuego.

_________________
Te quiero... lo siento Yoda sólo tenemos café.


Arriba
 Perfil  
 
NotaPublicado: 09 Jul 2016 19:13 
Desconectado
Momio
Momio
Avatar de Usuario

Registrado: 09 Mar 2004 16:14
Mensajes: 4614
edlobez escribió:
Creo que posibilidades hay y bastantes:

Genial, es una prueba interesante de las posibilidades para ampliar ngPAWS con plugins, llegando al punto de modificar funciones del núcleo más interno :-)

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


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