CAAD

Comunidad de Aventuras Conversacionales y Relatos Interactivos
Fecha actual 22 Oct 2019 12:39

Todos los horarios son UTC + 1 hora




Nuevo tema Responder al tema  [ 17 mensajes ]  Ir a página 1, 2  Siguiente
Autor Mensaje
NotaPublicado: 10 Abr 2011 23:18 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 23 Mar 2010 20:11
Mensajes: 1141
Ubicación: Valencia
Buenas,

¿Hay alguna manera de hacer que vayan ocurriendo cosas mientras el jugador no hace nada?

Es decir, según leo en el DM4, los daemons y los each_turn se ejecutan al final de cada turno y los timers se decrementan también al final de cada turno.

Mi idea es que planteada una escena durante la aventura, que vayan saliendo mensajes para ir metiendo presión al jugador, intentando reflejar la situación angustiosa en la que está el personaje.

Sería algo así como el laberinto que se va inundando en El espíritu de la sidra, que aún recuerdo que lo dejé en marcha mientras me iba a cenar pensando que no avanzaba la historia y al volver me había ahogado :D

Igual con la librería de Cortos de Mel se podría hacer lo que quiero... no lo he pensado, pero una rutina que mostrase un mensaje al azar y luego se reprogramase para ejecutarse otra vez... pero si ya hay alguna libreria que lo haga o alguien lo ha hecho ya, pues eso que me ahorro...

Gracias por adelantado.

_________________
El humor existe para recordarnos que por muy alto que sea el trono en el que uno se siente, todo el mundo usa su culo para sentarse.


Arriba
 Perfil  
 
NotaPublicado: 10 Abr 2011 23:33 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 24 Dic 2010 14:37
Mensajes: 929
Lo digo otra vez... la librería de Cortos es de Zak (al menos la de I6), yo sólo la documenté. Entiendo que lo que necesitas es código que gestione los eventos en tiempo real, si no recuerdo mal en el caso de Cortos lo que se pone es un temporizador a la entrada del usuario. Con Glulx tendrás muchas más opciones, Jarel o Eliuk te pueden decir cómo gestionar eventos de tiempo en Glulx. En I7 hay algunas cosas:

http://inform7.com/extensions/Sarah%20M ... doc_0.html
http://inform7.com/extensions/Erik%20Te ... doc_0.html


Arriba
 Perfil  
 
NotaPublicado: 10 Abr 2011 23:38 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 23 Mar 2010 20:11
Mensajes: 1141
Ubicación: Valencia
Sí, se me olvidaba... la idea es que compile para Glulx

_________________
El humor existe para recordarnos que por muy alto que sea el trono en el que uno se siente, todo el mundo usa su culo para sentarse.


Arriba
 Perfil  
 
NotaPublicado: 11 Abr 2011 00:38 
Desconectado
Implementador
Implementador

Registrado: 09 Jun 2010 14:50
Mensajes: 1655
Ubicación: Argentina
Para InformATE existía una librería que me parece que se llama Rtimex. No sé si ya fue reconvertida para INFSP 6, pero en caso de no haberse reconvertido se puede convertir con Cinform.
Esta librería (que traía como ejemplo un ascensor) es capaz de mostrar mensajes sin interrumpir el imput del usuario, con lo que para que quieres creo que es mejor que usar Cortos.


Arriba
 Perfil  
 
NotaPublicado: 11 Abr 2011 00:39 
Desconectado
Semimomio
Semimomio
Avatar de Usuario

Registrado: 24 Ago 2007 00:41
Mensajes: 2023
Ubicación: Chile
Puede hacerse. Yo escribí una librería que maneja tiempo real. Aún no está publicada, pero podríamos conversar el que pueda facilitártela.

Como te digo, puede hacerse. Pero no es seguro que el resultado sea muy bonito. Imagina que el jugador está a mitad de escribir un comando, y salta el mensaje. El comando queda trunco. Por supuesto, esto puede "vadearse" diciéndole a Glulx que mantenda el buffer de entrada, cosa que sí se puede hacer, pero en fin... tendrás que ver si queda estético.

Por cierto, mi librería te permite utilizar múltiples eventos de tiempo, pero no es necesario que debas recurrir a ella necesariamente, por cierto. Manejar el timer de Glulx es muy fácil y sólo requiere algo de "orden", es todo.

Mañana te pego con tiempo algún código, o si gustas lo hablamos por mensajes privados.

Saludos! :)

_________________
Eliuk Blau
eliukblau (AT) gmail.com
http://www.caad.es/eliukblau/


Arriba
 Perfil  
 
NotaPublicado: 11 Abr 2011 00:40 
Desconectado
Semimomio
Semimomio
Avatar de Usuario

Registrado: 24 Ago 2007 00:41
Mensajes: 2023
Ubicación: Chile
Fernando Gregoire escribió:
Para InformATE existía una librería que me parece que se llama Rtimex. No sé si ya fue reconvertida para INFSP 6, pero en caso de no haberse reconvertido se puede convertir con Cinform.
Esta librería (que traía como ejemplo un ascensor) es capaz de mostrar mensajes sin interrumpir el imput del usuario, con lo que para que quieres creo que es mejor que usar Cortos.


La verdad es que RTimex está bastante vieja... y es muy probable que incluso ya incompatible. Y la forma que tiene de no interrumpir el prompt es bastante invasiva, por lo demás. Realmente, yo no la recomendaría como una opción.

Saludos. :)

_________________
Eliuk Blau
eliukblau (AT) gmail.com
http://www.caad.es/eliukblau/


Arriba
 Perfil  
 
NotaPublicado: 11 Abr 2011 00:43 
Desconectado
Implementador
Implementador

Registrado: 09 Jun 2010 14:50
Mensajes: 1655
Ubicación: Argentina
Eliuk Blau escribió:
Fernando Gregoire escribió:
Para InformATE existía una librería que me parece que se llama Rtimex. No sé si ya fue reconvertida para INFSP 6, pero en caso de no haberse reconvertido se puede convertir con Cinform.
Esta librería (que traía como ejemplo un ascensor) es capaz de mostrar mensajes sin interrumpir el imput del usuario, con lo que para que quieres creo que es mejor que usar Cortos.


La verdad es que RTimex está bastante vieja... y es muy probable que incluso ya incompatible. Y la forma que tiene de no interrumpir el prompt es bastante invasiva, por lo demás. Realmente, yo no la recomendaría como una opción.

Saludos. :)


En cuanto a funcionalidad para mí está muy bien para lo que quiere Joruiru. Con la máquina Z obviamente sigue siendo compatible pues ésta no sufre cambios como hace 10 años; sólo quedaría probar qué tal para Glulx compilando el ejemplo que trae y ejecutar el archivo resultante en una versión de ahora de algún intérprete como Windows Glulxe que utilice la nueva especificación Glulx.


Arriba
 Perfil  
 
NotaPublicado: 11 Abr 2011 01:35 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 10 Sep 2004 00:17
Mensajes: 3039
Ubicación: Chile
En "Afuera" y especialmente en "Goteras" (ambos descargables incluyendo fuentes) hay manejo de tiempo real y eventos sin librerías extra.

Es en InformATE pero seguro que se pasa a INFSP6 sin problemas... pero lo cierto es que lo hice para Máquina Z y no sé como irá en Glulx.

_________________
[Incanus]
El Escritorio - Blog Aventurero y Literario


Arriba
 Perfil  
 
NotaPublicado: 11 Abr 2011 02:28 
Desconectado
Implementador
Implementador

Registrado: 09 Jun 2010 14:50
Mensajes: 1655
Ubicación: Argentina
Incanus escribió:
En "Afuera" y especialmente en "Goteras" (ambos descargables incluyendo fuentes) hay manejo de tiempo real y eventos sin librerías extra.

Es en InformATE pero seguro que se pasa a INFSP6 sin problemas... pero lo cierto es que lo hice para Máquina Z y no sé como irá en Glulx.


Sí, el tiempo real de Goteras es digno de ser imitado. Si dices que lo hiciste sin librerías y además es posible utilizarlo para imprimir mensajes sin afectar al prompt y a la entrada del usuario, está bueno para lo que desea Joruiru.
Lo que habría que ver, como dices, más allá de convertir ese código a I 6 original y que por tanto funcione con I 6+INFSP, hay que ver qué pasa con ese código en el caso de Glulx y, en caso de no servir, cómo se puede lograr resultados equivalentes. Pero esto se lo dejo a los experimentados, que conocen Inform, la máquina Z, Glulx y GLK.


Arriba
 Perfil  
 
NotaPublicado: 11 Abr 2011 15:42 
Desconectado
Semimomio
Semimomio
Avatar de Usuario

Registrado: 24 Ago 2007 00:41
Mensajes: 2023
Ubicación: Chile
Sólo quiero hacer constar que no se está considerando que Z y Glulx tienen un manejo de I/O radicalmente diferente entre ambos.

RTimex es sólo compatible para Z, si se quisiera para Glulx, debería ser adaptada al I/O de Glulx, lo cual, en vista del código interior de la librería, supongo que es mucho más sencillo escribir un marco de trabajo propio desde cero.

Pido disculpas si voy a decir a continuación una tontería, pero no recuerdo en ningún momento que Goteras hiciera uso del "tiempo real", propiamente tal. Recuerdo que habían eventos animados... pero no recuerdo ninguna parte en que se imprimieran mensajes automáticamente, mientras el usuario no escribiera nada... en la espera de comandos.

Tal vez es que deba jugarla de nuevo.

Saludos :)

EDITO: Acabo de pillar esto en los fuentes de Goteras... supongo que es para el funcionamiento de algún tipo de reloj en el juego, que se pudiera consultar. Debo, nuevamente, indicar que este código es netamente máquina Z y es inaplicable a Glulx, donde para reproducirlo habría que hacer lo que yo indicaba en mensajes anteriores, escribirlo "a pelo" (o usar alguna librería).

Spoiler: Mostrar
Código:
! Para funcionamiento del Reloj
[ KeyboardPrimitive b p k;

   b ->1=0; !esto es un salvavidas, no preguntes :-)
   p ->1=0; !Idem que el anterior

   @aread b p 10 tiempo ->k;

   !la sentencia anterior lee un input del teclado,
   !llamando a la función "tiempo" cada 10 décimas
   !de segundo, o sea, un segundo   8)
];

[ tiempo;

    !un contador bastante burdo de segundos
    !Puedes hacer que la rutina retorne sin actualizar
    !los valores si se da alguna condición, en cuyo caso, recuerda
    !volver con rfalse (¡es importante!)

    ! Chequeo de puzzles críticos del juego
    if (
    (Agujeros hasnt general)||
    (Antena hasnt general)||
    (CompuertaCabina hasnt general)||
    (PanelNavegacion hasnt general))
        reloj.segundos --;

    ! Fin del Juego por Time Out
    if (reloj.segundos==0) {
        TimeOut.proyeccion();
        banderafin = 3;
    }

    !el rfalse es vital, prueba a quitarlo y verás
    rfalse;

];


La reaplicación de este código a Glulx es radicalmente distinto:

1) En Z, se ha reimplementado la rutina KeyboardPrimitive() para indicar que llame a un callback llamado tiempo() cada 1 segundo;
2) En Glulx, no hay que reimplementar la rutina de entrada de teclado (que, por cierto, también es mucho más diferente que escribir sólo un @aread, como sale en el código Z), sino que se debe implementar el punto de entrada HandleGlkEvent() para que ejecute un código X cuando se produzca un evento de temporización Glk. La temporización debe ser activada en otra parte apropiada del código del juego.

Vamos, que lo que intento decir es que, si es para Glulx, mejor hacerse el código uno mismo (que no es difícil) o recurrir a alguna librería. Aquellos argumentos de que "funciona bien en Z" son totalmente inaplicables a Glulx, en donde las cosas se hacen con una filosofía muy diferente.

En Glulx (sin probarlo), debería quedar más o menos así:

Spoiler: Mostrar
Código:
! LIBRERIA ABSOLUTAMENTE NECESARIA (para el trabajo con Glk)
Include "infglk";

[ HandleGlkEvent ev contexto abortres;
      if (ev-->0 == evtype_Timer) { ! si es un 'tick' del Timer
        tiempo(); ! ejecutamos la rutina de tiempo
      }
];


[ tiempo;   
    !un contador bastante burdo de segundos
    !Puedes hacer que la rutina retorne sin actualizar
    !los valores si se da alguna condición, en cuyo caso, recuerda
    !volver con rfalse (¡es importante!)

    ! Chequeo de puzzles críticos del juego
    if (
    (Agujeros hasnt general)||
    (Antena hasnt general)||
    (CompuertaCabina hasnt general)||
    (PanelNavegacion hasnt general))
        reloj.segundos --;

    ! Fin del Juego por Time Out
    if (reloj.segundos==0) {
        glk_request_timer_events(0); ! detenemos los 'ticks' del Timer...
        TimeOut.proyeccion();
        banderafin = 3;
    }
];

! Aquí empieza el juego. Este es el punto para imprimir el mensaje
! inicial de bienvenida y puesta en situación

[Inicializar tecla;
    ! TODAS LAS ADAPTACIONES DE CODIGO PARA EL BOX DE Z
    ! Y PARA LOS @read_char QUE EN GLULX SE CODIFICAN DE
    ! OTRA MANERA (MAS LARGA), O USANDO LIBRERIAS/COPYPASTA
   
    ! Iniciar ambientador universal
    ArrancarDaemon(ambientador_universal);
   
    ! ARRANCAMOS EL TEMPORIZADOR DE GLK
    ! el interprete puede manejar el Timer?
    if (glk_gestalt(gestalt_Timer,0) == 1) {
        glk_request_timer_events(1000); ! ticks cada 1 segundo
    }
];


Saludo! :)

_________________
Eliuk Blau
eliukblau (AT) gmail.com
http://www.caad.es/eliukblau/


Arriba
 Perfil  
 
NotaPublicado: 11 Abr 2011 16:41 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 10 Sep 2004 00:17
Mensajes: 3039
Ubicación: Chile
¡¡Maestroooo!!! :shock: 8) :D

_________________
[Incanus]
El Escritorio - Blog Aventurero y Literario


Arriba
 Perfil  
 
NotaPublicado: 11 Abr 2011 17:54 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 23 Mar 2010 20:11
Mensajes: 1141
Ubicación: Valencia
Gracias a todos!!

Inspirado por el código de Eliuk, he encontrado este ¿tutorial? en google: http://adamcadre.ac/gull/gull-2p.html y su traducción en el caad: http://www.caad.es/informate/docs/gull/gull_6.html.

Con la explicación y el ejemplo de Eliuk creo que me queda bastante claro como hacerlo. Cuando llegue a casa lo intentaré a ver qué sale de esto...

_________________
El humor existe para recordarnos que por muy alto que sea el trono en el que uno se siente, todo el mundo usa su culo para sentarse.


Arriba
 Perfil  
 
NotaPublicado: 11 Abr 2011 18:52 
Desconectado
Semimomio
Semimomio
Avatar de Usuario

Registrado: 24 Ago 2007 00:41
Mensajes: 2023
Ubicación: Chile
joruiru escribió:
Gracias a todos!!

Inspirado por el código de Eliuk, he encontrado este ¿tutorial? en google: http://adamcadre.ac/gull/gull-2p.html y su traducción en el caad: http://www.caad.es/informate/docs/gull/gull_6.html.

Con la explicación y el ejemplo de Eliuk creo que me queda bastante claro como hacerlo. Cuando llegue a casa lo intentaré a ver qué sale de esto...


Si vas a mostrar mensajes que interrumpan el prompt, considera la posibilidad de utilizar la llamada Glk para la interrupción de la entrada de texto, y la llamada para su posterior reposición. De esta manera, lo que el jugador pudiera estar escribiendo, y sea interrumpido por la llegada de un mensaje temporizado, cuando el prompt sea vuelto a mostrar, volverá a aparecer automáticamente lo que el jugador haya alcanzado a escribir justo antes de la interrupción, porque se guarda en un buffer.

Deberás investigar sobre esto, porque yo no sé hacerlo. Nunca he tratado con ello, así que no sé como orientarte. Sin embargo, doy fe de la existencia de esta funcionalidad.

Saludos. :)

_________________
Eliuk Blau
eliukblau (AT) gmail.com
http://www.caad.es/eliukblau/


Arriba
 Perfil  
 
NotaPublicado: 12 Abr 2011 01:13 
Desconectado
Implementador
Implementador

Registrado: 09 Jun 2010 14:50
Mensajes: 1655
Ubicación: Argentina
Muy buena la explicación de Eliuk, y no me deja lugar a dudas de que efectivamente la librería Rtimex no serviría.
el mismo se utiliza para contar regresivamente. Si se lee el panel que aparece al levantarse de la cama una de las cosas dice "punto de no retorno en hh:mm:ss". Al examinar el reloj el protagonista se asombra de que la hora va para atrás.
A efectos extradecorativos, si se va leyendo el panel o examinando el reloj cuando va pasando el tiempo será menos el tiempo que queda. Ese tiempo corresponde al tiempo que se tiene para resolver el juego.


Arriba
 Perfil  
 
NotaPublicado: 12 Abr 2011 14:33 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 23 Mar 2010 20:11
Mensajes: 1141
Ubicación: Valencia
Bueno, pues si alguien tiene interés aquí está el código de cómo lo he hecho:

Spoiler: Mostrar
Código:
Include "infglk";

[ HandleGlkEvent  ev contexto;
   ! HandleGlkEvent de libreria SGW
   SGW_HandleGlk(ev);

   if (ev-->0 == evtype_Timer) {
     glk_cancel_line_event(gg_mainwin, gg_event); !Cancelamos la entrada de usuario
     buffer-->0 = gg_event-->2;

      if (oArboles hasnt cortado) {
        mensaleatorios;
      } else {
          glk_request_timer_events(0); ! desactivamos el timer
      };
     
    !Se escribe el prompt y se restaura el input del jugador
    print "^>> ";
    glk_request_line_event(gg_mainwin, buffer + WORDSIZE, INPUT_BUFFER_LEN - WORDSIZE, buffer-->0);
  }
  return 2;
];

Include "sgw+dmx";           ! Incluir la extension SGW+DMX


Y en el intialise:
Código:
    if (glk_gestalt(gestalt_Timer,0) == 1) {
        glk_request_timer_events(30000); ! ticks cada 30 segundos
    }

_________________
El humor existe para recordarnos que por muy alto que sea el trono en el que uno se siente, todo el mundo usa su culo para sentarse.


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