CAAD

Comunidad de Aventuras Conversacionales y Relatos Interactivos
Fecha actual 20 Nov 2019 14:32

Todos los horarios son UTC + 1 hora




Nuevo tema Responder al tema  [ 18 mensajes ]  Ir a página 1, 2  Siguiente
Autor Mensaje
NotaPublicado: 12 Jul 2015 07:58 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 22 May 2004 10:50
Mensajes: 890
¿Hay un límite en el número de parámetros en un plugin?.

Por ejemplo:

Código:
quipson Scapitan 0 1

//CND QUIPSON A 2 2 2 0

function ACCquipson(setnum, value1, value2)
{
}



Compila sin problema, pero sin embargo este:


Código:

quipson Scapitan 0 1 2

//CND QUIPSON A 2 2 2 2 0

function ACCquipson(setnum, value1, value2, value3)
{
}


Al compilar da error: Semantic error "2" is not a verb in the vocabulary

_________________
---
KMBR! http://www.aliensuavito.com @lecambre


Arriba
 Perfil  
 
NotaPublicado: 12 Jul 2015 12:46 
Desconectado
Momio
Momio
Avatar de Usuario

Registrado: 09 Mar 2004 16:14
Mensajes: 4647
saimazoom escribió:
¿Hay un límite en el número de parámetros en un plugin?.


Sí, ngPAWS y Superglús admiten un máximo de 3 parámetros en general, los plugins también.

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


Arriba
 Perfil  
 
NotaPublicado: 12 Jul 2015 14:49 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 22 May 2004 10:50
Mensajes: 890
¿Y se puede ampliar fácilmente?. Estoy pasando a javascript/ngpaws la librería Gtalk.

¿Cómo puedo incluir un fichero javascript en la aventura?. Lo hago a mano en el index.html (creo que se machaca con cada compilación) o si lo meto en la carpeta jsl ¿Cómo lo enchufo luego?. ¡Gracias!

_________________
---
KMBR! http://www.aliensuavito.com @lecambre


Arriba
 Perfil  
 
NotaPublicado: 12 Jul 2015 15:09 
Desconectado
Momio
Momio
Avatar de Usuario

Registrado: 09 Mar 2004 16:14
Mensajes: 4647
saimazoom escribió:
¿Y se puede ampliar fácilmente?. Estoy pasando a javascript/ngpaws la librería Gtalk.

¿Cómo puedo incluir un fichero javascript en la aventura?. Lo hago a mano en el index.html (creo que se machaca con cada compilación) o si lo meto en la carpeta jsl ¿Cómo lo enchufo luego?. ¡Gracias!



Pues se puede hacer, porque ya lo hice de 2 a 3, pero sencillo sencillo no es, hay que tocar el compilador y luego hay que modificar todos los contactos plugin que ya hay. En fin ¿es realmente necesario?

Respecto a añadir un javascript a la aventura puedes hacer lo que dices de ponerlo en el index (que no se machaca), o cambiarle la extensión a .jsp, meterlo en la carpeta jsl y modificar el fichero para que en la primera linea ponga

Código:
//LIB aqui_el_texto_que_quieras_es_una_simple_etiqueta

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


Arriba
 Perfil  
 
NotaPublicado: 12 Jul 2015 15:42 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 22 May 2004 10:50
Mensajes: 890
Uto escribió:

Pues se puede hacer, porque ya lo hice de 2 a 3, pero sencillo sencillo no es, hay que tocar el compilador y luego hay que modificar todos los contactos plugin que ya hay. En fin ¿es realmente necesario?

Respecto a añadir un javascript a la aventura puedes hacer lo que dices de ponerlo en el index (que no se machaca), o cambiarle la extensión a .jsp, meterlo en la carpeta jsl y modificar el fichero para que en la primera linea ponga

Código:
//LIB aqui_el_texto_que_quieras_es_una_simple_etiqueta


Muchas gracias. Si es complicado no lo amplies, me las arreglo con la limitación actual.

_________________
---
KMBR! http://www.aliensuavito.com @lecambre


Arriba
 Perfil  
 
NotaPublicado: 18 Jul 2015 16:12 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 22 May 2004 10:50
Mensajes: 890
¿Se puede acceder de forma fácil a las constantes en javascript?.

_________________
---
KMBR! http://www.aliensuavito.com @lecambre


Arriba
 Perfil  
 
NotaPublicado: 19 Jul 2015 15:41 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 22 May 2004 10:50
Mensajes: 890
Otra preguntilla. Desde mi rutina en javascript quiero acceder a la espera de una tecla usando las rutinas de ngpaws ¿Se puede hacer?. Es lo último que me falta para terminar con Gtalk.

_________________
---
KMBR! http://www.aliensuavito.com @lecambre


Arriba
 Perfil  
 
NotaPublicado: 19 Jul 2015 16:48 
Desconectado
Momio
Momio
Avatar de Usuario

Registrado: 09 Mar 2004 16:14
Mensajes: 4647
saimazoom escribió:
¿Se puede acceder de forma fácil a las constantes en javascript?.


Ehhmm... ¿de que constantes hablamos?

Si te refieres a los identificadores de ngPAWS no se puede ni de forma fácil ni difícil, porque son parte del preprocesador. Bueno, quizá se pueda de una forma *muy difícil* porque si no recuerdo mal txtpaws genera una tabla de simbolos en XML, por lo que el javascript es posible que pueda leerla, aunque eso implicaría incluir ese fichero con la aventura.

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


Arriba
 Perfil  
 
NotaPublicado: 19 Jul 2015 17:40 
Desconectado
Momio
Momio
Avatar de Usuario

Registrado: 09 Mar 2004 16:14
Mensajes: 4647
saimazoom escribió:
Otra preguntilla. Desde mi rutina en javascript quiero acceder a la espera de una tecla usando las rutinas de ngpaws ¿Se puede hacer?. Es lo último que me falta para terminar con Gtalk.


Sí , se puede con el gancho h_keydown.
https://github.com/Utodev/ngPAWS/wiki/Hooks

Engacharte a ese gancho te permitirá capturar cualquier pulsación de tecla. Eso sí, captura hasta las pulsaciones del input, asi que tu librería tendrá que tener algún tipo de variable global a true para saber que estás esperando una pulsación, y tu gancho solo ejecutarse cuando esa variable está a true.

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


Arriba
 Perfil  
 
NotaPublicado: 19 Jul 2015 21:11 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 22 May 2004 10:50
Mensajes: 890
He programado el gancho y puedo ver las teclas capturadas. Lo que sucede es que no se para a esperar la tecla. Habilito el flag para
tomar la tecla en la conversación pero el código sigue adelante. Desde mi rutina de conversación he probado también a llamar ACCanykey(), y veo el mensaje de "Pulsar..." ; también he probado con un ACCgetkey() y ninguna de las dos se detienen. ¿Me falta algún flag extra para que se quede a la espera de la tecla?

_________________
---
KMBR! http://www.aliensuavito.com @lecambre


Última edición por saimazoom el 19 Jul 2015 21:43, editado 4 veces en total

Arriba
 Perfil  
 
NotaPublicado: 19 Jul 2015 21:11 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 22 May 2004 10:50
Mensajes: 890
Uto escribió:
saimazoom escribió:
¿Se puede acceder de forma fácil a las constantes en javascript?.


Ehhmm... ¿de que constantes hablamos?

Si te refieres a los identificadores de ngPAWS no se puede ni de forma fácil ni difícil, porque son parte del preprocesador. Bueno, quizá se pueda de una forma *muy difícil* porque si no recuerdo mal txtpaws genera una tabla de simbolos en XML, por lo que el javascript es posible que pueda leerla, aunque eso implicaría incluir ese fichero con la aventura.


Ouch.... Supongo que tendré que llevar dos ficheros de definición de constantes en paralelo.

_________________
---
KMBR! http://www.aliensuavito.com @lecambre


Arriba
 Perfil  
 
NotaPublicado: 20 Jul 2015 01:15 
Desconectado
Momio
Momio
Avatar de Usuario

Registrado: 09 Mar 2004 16:14
Mensajes: 4647
saimazoom escribió:
He programado el gancho y puedo ver las teclas capturadas. Lo que sucede es que no se para a esperar la tecla. Habilito el flag para
tomar la tecla en la conversación pero el código sigue adelante. Desde mi rutina de conversación he probado también a llamar ACCanykey(), y veo el mensaje de "Pulsar..." ; también he probado con un ACCgetkey() y ninguna de las dos se detienen. ¿Me falta algún flag extra para que se quede a la espera de la tecla?


Todo el tema de las pulsaciones de tecla son muy complicados en ngPAWS, debido a que Javascript es mono hilo, por lo que no es posible hacer, como en otros lenguajes, algo parecido a esto:

Código:
var keycode;
function onKeyPress(event)
{
 keycode = e.code;
}

keycode = 0;
while (keycode==0) {};


Por una sencilla razón, el bucle infinito que en otros lenguajes saldríamos de él porque una interrupción o algo similar modificaría el valor de "keycode", no ocurre nunca en javascript, porque al ser monohilo el bucle es realmente infinito, y el evento onKeypress solo sería atendido si salieramos del hilo.

Por eso para implementar cosas como anykey, getkey e incluso pause, ngPAWS hace una cosa rara, y digo rara porque no compila esos condactos com los demás:


Por ejemplo, fijate en estas dos entradas de ejemplo:

Código:
; Obsoleto

_ _
 AT 10
 LET 100 20
 CARRIED 4
 LET 100 21
 DONE

_ _
 AT 20
  SYSMESS 9
  ANYKEY
  LET 100 30
  LET 100 40
  ANYKEY
  CLS
  DESC   




ngPAWS las compila así:

Código:
// _ _
   p008e0000:
   {
       if (skipdoall('p008e0000')) break p008e0000;
      if (!CNDat(10)) break p008e0000;
       ACClet(100,20);
      if (!CNDcarried(4)) break p008e0000;
       ACClet(100,21);
       ACCdone();
      break pro008_restart;
      {}

   }

   // _ _
   p008e0001:
   {
       if (skipdoall('p008e0001')) break p008e0001;
      if (!CNDat(20)) break p008e0001;
       ACCsysmess(9);
       ACCanykey();
       function anykey00023()
      {
       ACCcls();
       ACCdesc();
      return;
      }
       function anykey00022()
      {
       ACClet(100,30);
       ACClet(100,40);
       ACCanykey();
       waitKey(anykey00023);
      }
       waitKey(anykey00022);
      done_flag=true;
      break pro008_restart;
      {}

   }


Como puedes ver la primera entrada es muy directa, es decir, hay practicamente una línea por condacto.

Sin embargo la segunda entrada es realmente enrevesada, y se enrevesa más a cada anykey que aparece. Esto es así porque los condactos de tipo "waitkey" en realidad producen un "DONE" después de ejecutarse, aunque previamente crean una función con todo lo que va detrás, y esconden el input, pero luego terminan.

¿Y que produce eso?

Pues sencillo, si no hay caja de input y se produce un DONE, el juego se para, y la única manera de salir de ahí es por una pulsación de tecla. El fichero runtime.js tiene los eventos onKeyDown y onClick que en un momento dado, y dependiendo las condiciones adecuadas, hacen que un ANYKEY llame a esa función que ha dejado con todo lo que va detrás. En el ejemplo aún es más complicado porque en esa función que va detrás hay otro ANYKEY y por tanto se crea otra función más.

Los condactos "de serie" ya tienen toda la lógica creada, pero un condacto plugin (por ejemplo el nuevo condacto ASK que me pidieron que adoptara de SINTAC) tiene que gestionarlo todo.

Este es el código de 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);
}



Como ves lo que es el condacto en sí, lo único que hace es marcar como true la variable inAsk, escribir un mensaje e inicializarlo todo. Posteriormente, al ser un condacto "waitkey" (fijate en la cabecera que pone W en lugar de A o C) se produce un done y se esconde el input.

De ahí solo salimos porque tenemos enganchado el gancho h_keydown, en el cual verás que solo se hace algo si estamos "inAsk", y en ese apartado, si las condiciones son correctas para salir de la espera de tecla, se hacen algunas acciones correspondientes al condacto, seguido de un preventDefault para que la pulsación no afecte a otras cosas (me quedo esa pulsación para mi), marco que ya no estoy en un ASK, muestro el input y le hago foco, quito la capa que me impide acceder al juego (es una capa transparente que no se ve pero no me deja interactuar, para que solo pueda pulsar teclas) y lo más importante, llamo al waitkeyCallback, que basicamente mira a que función tenía que llamar y llama a lo que hubiera detrás del ASK.

Esto funciona bien, a pesar de lo enrevesado, aunque tiene limitaciones, fundamentalmente que al provocar el ASK un DONE implícito, no se pueden ejecutar entradas posteriores a la del ASK en el mismo proceso, si el proceso llega a ese ASK (sino llega, no problem). Esto, si no recuerdo mal, es la razón principal por la que mi ejemplo de conversaciones por menús (https://github.com/Utodev/ngPAWS/wiki/E ... men%C3%BAs) hacía uso de dos procesos y no solo uno, porque detrás del GETKEY no puede haber más entradas.

No se muy bien como estás implementando la librería, pero te tendrás que enfrentar a este problema igualmente si vas a esperar pulsaciones de teclas, y creo que la implementación del condacto ASK te puede ayudar, así como la el ejemplo indicado (https://github.com/Utodev/ngPAWS/wiki/E ... men%C3%BAs)

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


Arriba
 Perfil  
 
NotaPublicado: 20 Jul 2015 01:20 
Desconectado
Momio
Momio
Avatar de Usuario

Registrado: 09 Mar 2004 16:14
Mensajes: 4647
Un último apunte, fijate que aunque el compilador genera el código así porque es como le viene mejor, este código:

Código:
// _ _
   p008e0001:
   {
       if (skipdoall('p008e0001')) break p008e0001;
      if (!CNDat(20)) break p008e0001;
       ACCsysmess(9);
       ACCanykey();
       function anykey00023()
      {
       ACCcls();
       ACCdesc();
      return;
      }
       function anykey00022()
      {
       ACClet(100,30);
       ACClet(100,40);
       ACCanykey();
       waitKey(anykey00023);
      }
       waitKey(anykey00022);
      done_flag=true;
      break pro008_restart;
      {}

   }


Es similar a este, que ese entiende mejor:

Código:

// _ _
   p008e0001:
   {
       if (skipdoall('p008e0001')) break p008e0001;
       if (!CNDat(20)) break p008e0001;
       ACCsysmess(9);
       ACCanykey();
       waitKey(anykey00022);   // indica al sistema que si hay que hacer un callback de un anykey, la funcion a llamar es anykey00022
       done_flag=true;
       break pro008_restart;
   }

       function anykey00022()
       {
       ACClet(100,30);
       ACClet(100,40);
       ACCanykey();
       waitKey(anykey00023);  // indica al sistema que si hay que hacer un callback de un anykey, la funcion a llamar es anykey00023
       }


      function anykey00023()
      {
       ACCcls();
       ACCdesc();
      return;
      }

   


Es decir, ejecutamos el primer ANYKEY y si en el envento onKeyDown vemos que estamos inAnykey (que es lo que hace el condacto accANYKEY()) entonces hacemos el callback al anykey00022() y en ese mismo volvemos a hacer lo mismo pero esta vez marcando el anykey00023 como funcion de callback, que se ejecuta a la siguiente pulsación. Esa función waitKey() precisamente lo que hace es guardar el nombre de la función de callback, poner la capa transparente de bloque y esconder el input.

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


Arriba
 Perfil  
 
NotaPublicado: 21 Jul 2015 22:06 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 22 May 2004 10:50
Mensajes: 890
Gracias por las respuestas, ya lo tengo funcionando :).

_________________
---
KMBR! http://www.aliensuavito.com @lecambre


Arriba
 Perfil  
 
NotaPublicado: 22 Jul 2015 10:32 
Desconectado
Momio
Momio
Avatar de Usuario

Registrado: 09 Mar 2004 16:14
Mensajes: 4647
saimazoom escribió:
Gracias por las respuestas, ya lo tengo funcionando :).


Me alegro, si has conseguido entenderme es que los condactos tipo waitkey, que son de lejos lo más complicado que se puede hacer como plugin para ngPAWS, al final no son indescifrables XD

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


Arriba
 Perfil  
 
Mostrar mensajes previos:  Ordenar por  
Nuevo tema Responder al tema  [ 18 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 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:  
Desarrollado por phpBB® Forum Software © phpBB Group
Traducción al español por Huan Manwë para phpBB-Es.COM