CAAD

Comunidad de Aventuras Conversacionales y Relatos Interactivos
Fecha actual 23 Jul 2017 17:53

Todos los horarios son UTC + 1 hora




Nuevo tema Responder al tema  [ 4 mensajes ] 
Autor Mensaje
NotaPublicado: 24 Oct 2014 17:31 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 09 Feb 2012 20:33
Mensajes: 855
Hola, la vedad es que no sabía como titular el hilo para identificarlo... creo que he puesto uno más o menos correcto.

El asunto es que tengo una caja fuerte, que para abrirla hay que teclear una clave numérica. He creado la acción teclear, pero sólo me acepta el comando;
"teclear en caja 1234"

Pego el código;

Spoiler: Mostrar
Código:
/// La contaseña de la caja fuerte
objCajaFuerte.preTeclear = function () {
        var s = parser.sentencia;
        var toret = "Debes escribir: " + "<p style=\"color: white; font-size: 120%\"> " +
        "teclear en 'DEST' 'XXXX', siendo 'DEST' donde quieres teclear 'XXXX', que son los cuatro dígitos de la clave." + "</p>";

        //ctrl.print ( "s: " + s);
        //ctrl.print ( "s.term1: " + s.term1);
        //ctrl.print ( "s.prep: " + s.prep );
        //ctrl.print ( "s.term2: " + s.term2);

   if ( s.term2 == "1234" )  {
            if ( objCajaFuerte.cerradoConLlave ) {
                //ctrl.print ("¡Clave correcta!");
                toret = "¡Clave correcta!";
                objCajaFuerte.cerradoConLlave = false;
            }
            else {
                //ctrl.print ("La caja fuerte ya está desbloqueada.");
                toret = "La caja fuerte ya está desbloqueada.";
            }
        }

        return toret;
};

// --- Acciones --------------------------------------------------------
var teclearAction = acciones.crea( "teclear",
        [ "teclea", "teclear", "tecleo"]
);

teclearAction.exe = function(s) {
    var toret = "Debes escribir: " + "<p style=\"color: white; font-size: 120%\"> " +
    "teclear en 'DEST' 'XXXX', siendo 'DEST' donde quieres teclear 'XXXX', que son los cuatro dígitos de la clave." + "</p>";
   
    if ( s.term1 === null ) {
        toret = "Deber&iacute;as especificar qu&eacute;.";
    }
    else
    if ( s.obj1 !== null ) {
        toret = "¿Qué quieres teclear?";
   }
   
    return toret;
};
...
...
teclearAction.doIt = function(s) {
    var toret = "Debes escribir: " + "<p style=\"color: white; font-size: 120%\"> " +
    "teclear en 'DEST' 'XXXX', siendo 'DEST' donde quieres teclear 'XXXX', que son los cuatro dígitos de la clave." + "</p>";
   
    if ( s.term1 === null ) {
        toret = "Deber&iacute;as especificar qu&eacute;.";
    }
    else
    if ( s.obj1 != null ) {
        if ( typeof( s.obj1.preTeclear ) === "function" ) {
            toret = s.obj1.preTeclear();
        } else {
            toret = this.exe( s );
        }

        if ( typeof( s.obj1.postTeclear ) === "function" ) {
            s.obj1.postSharpen();
        }
    }

    return toret;
};


En el código para avisar al jugador del comando ha introducir he puesto para cualquier comando incorrecto el mensaje:
Código:
Debes escribir:
teclear en 'DEST' 'XXXX', siendo 'DEST' donde quieres teclear 'XXXX', que son los cuatro dígitos de la clave.


No se si hay alguna forma de que me aceptara las variantes:
teclear 1234 en caja
teclear 1234 en caja fuerte
...

o si es la forma más adecuada de hacer lo que pretendo, ya que la acción nueva que he creado y según el mensaje que muestra sólo vale para teclear cosas en una caja fuerte.

¡Gracias!

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


Arriba
 Perfil  
 
NotaPublicado: 24 Oct 2014 20:10 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 09 Feb 2012 20:33
Mensajes: 855
Hola de nuevo,

Tras las sabios consejos de dddddd por IRC, hemos conseguido que me acepten las órdenes:

>> teclear 1234 en caja
>> teclear en caja 1234

Para ello, creando un objeto "invisible" clave,

Código:
var objClave = ctrl.creaObj ( "clave",
                                   ["1234"],
                                   "No veo nada de eso.",
                                   ctrl.lugares.limbo, Ent.Escenario
);

objClave.preTeclear = function(){
                      var s = parser.sentencia;
                 
                      //ctrl.print ("EN LA CLAVE");
                      if ( s.obj2 == objCajaFuerte )
                        return objCajaFuerte.preTeclear();
                      else
                        return "¿Dónde lo quieres teclear?";
};


En un principio este objeto está en el limbo y cuando el protagonista la descubra la moveré a la localidad donde está la caja fuerte.

Luego el objeto caja quedaría:

Código:
/// La contaseña de la caja fuerte
objCajaFuerte.preTeclear = function () {
   var s = parser.sentencia;
        var toret = "Debes escribir: " + "<p style=\"color: white; font-size: 120%\"> " +
        "teclear en 'DEST' 'XXXX', siendo 'DEST' donde quieres teclear 'XXXX', que son los cuatro dígitos de la clave." + "</p>";       

   //ctrl.print ("s.term1: " + s.term1);
        //ctrl.print ("s.term2: " + s.term2);

        // si s.obj2 = objClave, se ha tecleado "teclear en caja 1234"
        // si s.obj1 = objClave, se ha tecleado "teclear 1234 en caja"  y viene re-dirigido del objeto clave
   if ( s.obj2 == objClave || s.obj1 == objClave )  {
            if ( objCajaFuerte.cerradoConLlave ) {
                //ctrl.print ("¡Clave correcta!");
                toret = "¡Clave correcta!";
                objCajaFuerte.cerradoConLlave = false;
            }
            else {
                //ctrl.print ("La caja fuerte ya está desbloqueada.");
                toret = "La caja fuerte ya está desbloqueada.";
            }
        }

        return toret;
};


Funciona para las combinaciones de comando que he comentado, "teclear 1234 en caja" ó "teclear en caja 1234"
Pero para las combinaciones de "teclear en caja fuerte 1234" o "teclear el maldito 1234 en la caja"... no funciona, no sé si esto podría solucionarlo de alguna manera, que de toda la frase sólo me seleccionara los objetos que se mencionan.

Gracias!
y ya queda menos ;)

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


Arriba
 Perfil  
 
NotaPublicado: 25 Oct 2014 09:36 
Desconectado
Semimomio
Semimomio
Avatar de Usuario

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

Hay varios temas aquí. Lo primero, el parser.
http://fi-js.wikidot.com/acciones-y-reacciones

Si tecleamos "mete la caja fuerte", y hemos puesto "fuerte" como sinónimo de "caja", entonces el parser interpreta:

Código:
DROP objCajaFuerte objCajaFuerte


El parser solamente coge aquellas parte de la frase que tienen sentido para él. En general, los nombres compuestos no reaccionan demasiado bien para un esquema tan sencillo.

¿Como solucionar esto? La mejor forma sería agregar a los objetos la propiedad "adjetivos", e ignorarlos/ayudar con el adjetivo a identificar el objeto (por si hay varios objetos con el mismo nombre). Este es el esquema que seguía PAWS. En este momento, fi.js ni siquiera incorpora este sistema, con lo que no se pueden incluir dos objetos de mismo nombre (p.ej. "llave roja" y "llave azul").

Con esto, que es posible que lo implemente, identificaría correctamente "teclea en caja fuerte 1234"

La segunda cuestión es más peliaguda. "teclea 1234 en caja fuerte". Lo que trata de identificar el parser siempre es verbo y nombre, que se interpretará como el objeto directo u objeto1. No hay duda en cuanto al verbo, pero el problema es que el objeto 1... ¡no existe! Si el term1 no identifica un objeto existente, malo, porque significa que no se podrá determinar el objeto directo de la oración, y eso es realmente crítico (a no ser que el verbo no incorpore objetos directos ni indirectos, como en la oración "escucha").

Es decir, al margen de crear un objeto falso (es como los llamo yo) no existe solución para este problema. La única forma sería hacer como en inform, poder indicar que el objeto directo va al final (reverse en las acciones de inform), pero eso sí estoy seguro de que no lo voy a implementar.

Eso sí, mejor que crees una variable global con la clave en lugar de repetirla en varios sitios, por si decidieras cambiarla (si bien 1234 es claramente una clave segura y robusta). :lol:

_________________
-- Baltasar, el arquero


Arriba
 Perfil  
 
NotaPublicado: 25 Oct 2014 11:21 
Desconectado
Implementador
Implementador

Registrado: 13 Feb 2005 18:57
Mensajes: 1854
baltasarq escribió:
Es decir, al margen de crear un objeto falso (es como los llamo yo) no existe solución para este problema. La única forma sería hacer como en inform, poder indicar que el objeto directo va al final (reverse en las acciones de inform), pero eso sí estoy seguro de que no lo voy a implementar.

Eso sí, mejor que crees una variable global con la clave en lugar de repetirla en varios sitios, por si decidieras cambiarla (si bien 1234 es claramente una clave segura y robusta). :lol:

Como puedes ver en el segundo mensaje, hemos utilizado la técnica de crear un objeto para la clave, sin usar variables globales y sin repetir la clave.

Algo similar al reverse lo hemos hecho a mano haciendo un poco más genérico el proceso pre y redirigiendo ambos a una única función. Un tanto de andar por casa, pero funciona.

Hay otra cuestión sobre el parser, pero creo que tengo que mirar un poco más a fondo el código de fi.js (sólo traté el tema con edlobez de pasada) antes de llegar a una conclusión y hablar con propiedad, aunque me temo que es una característica de su diseño. Si tal abriré otro hilo.


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