CAAD

Comunidad de Aventuras Conversacionales y Relatos Interactivos
Fecha actual 11 Jul 2020 06:01

Todos los horarios son UTC + 1 hora




Nuevo tema Responder al tema  [ 20 mensajes ]  Ir a página 1, 2  Siguiente
Autor Mensaje
NotaPublicado: 18 Ene 2007 01:23 
Desconectado
Momio
Momio
Avatar de Usuario

Registrado: 09 Mar 2004 16:14
Mensajes: 4651
Despues de repasar un poco los condactos de Superglus he visto que es convertible a Inform (cuidado, a Inform sin librería, no a InformATE).

Sin embargo me quedan algunas dudas que no se muy bien como hacer:

1) RAMSAVE/RAMLOAD. ¿Hay alguna orden Inform que grabe en memoria el estado de la partida y permita restaurarlo? En su defecto... hay alguna orden que permita grabar la partida en disco *sin preguntar el fichero*. Bueno, esto último es todavia mas dificil en sistemas sin sistema de ficheros, asi que me da que va a ser que no.

2) TRANSCRIPT: en superglus se hace con llamadas GLK, no se si habra una forma más sencilla de hacerlo en inform.




NOTA: Se compilará para glulx.


Arriba
 Perfil  
 
NotaPublicado: 18 Ene 2007 10:34 
Desconectado
Elfito
Elfito
Avatar de Usuario

Registrado: 09 Sep 2004 14:41
Mensajes: 14
Uto escribió:
Despues de repasar un poco los condactos de Superglus he visto que es convertible a Inform (cuidado, a Inform sin librería, no a InformATE).


Mira que te insistí yo en esto... :-)

Uto escribió:
Sin embargo me quedan algunas dudas que no se muy bien como hacer:

1) RAMSAVE/RAMLOAD. ¿Hay alguna orden Inform que grabe en memoria el estado de la partida y permita restaurarlo?


Pues no, que yo sepa. Pero seguramente puedes hacerlo de una forma mucho más simple. A fin de cuentas el estado de una partida PAWS seguramente se compondrá de unas pocas variables. Sospecho que harás uso de las relaciones de "estar contenido en" que tiene los objetos glulx, sino que seguramente habrás reimplementado todo a base de arrays, al estilo paws. Si esto es así, bastaría que declararas otras tantas variables de backup y te limitaras a copiar unos en otros.

Uto escribió:
En su defecto... hay alguna orden que permita grabar la partida en disco *sin preguntar el fichero*. Bueno, esto último es todavia mas dificil en sistemas sin sistema de ficheros, asi que me da que va a ser que no.


En Inform, cuando compilas para Glulx, toda la entrada/salida se hace por Glk. Así que sí, puedes crear un fichero sin preguntarle al usuario haciendo uso de glk_fileref_create_by_name en lugar de glk_fileref_create_by_prompt.

Uto escribió:
2) TRANSCRIPT: en superglus se hace con llamadas GLK, no se si habra una forma más sencilla de hacerlo en inform.


No creo que la haya, porque la librería estándar de Graham Nelson también lo hace con llamadas a glk.

Puede resultarte interesante echar un vistazo al fichero verblibm.h de la librería estándar Inform (o InformATE) para ver cómo implementa las funciones ScriptOnSub/ScritpOffSub (activar y desactivar transcript), o SaveSub/RestoreSub (guardar/recuperar en disco). Observa que de cada una de estas funciones hay dos versiones: una para Z y otra para Glulx. A tí te interesa la segunda, fácilmente reconocible por estar llena de llamadas a glk(). Ten en cuenta también que serán algo más complejas de lo que tú necesitas, porque hacen uso de otras variables globales de la librería.

|Z|


Arriba
 Perfil  
 
NotaPublicado: 18 Ene 2007 14:42 
Desconectado
Momio
Momio
Avatar de Usuario

Registrado: 09 Mar 2004 16:14
Mensajes: 4651
Zak escribió:
Uto escribió:
Despues de repasar un poco los condactos de Superglus he visto que es convertible a Inform (cuidado, a Inform sin librería, no a InformATE).


Mira que te insistí yo en esto... :-)


No digo yo que no, pero entonces no era el momento, mas que nada porque tendria que haber partido de cero, mientras que partir de paguaglus era mas facil y daba un tiempo de desarrollo asumible. Ahora, con la experiencia adquirida, me resulta más facil convertirlo a Inform. De hecho pense en reutilizar AttoPAWs, pero no me vale porque los flags no son los mismos, el sistema no es igual, etc., y lo que menos querría es tener que rehacer la documentacion, ni alejarme demasiado de PAW.

No obstante te tengo que pillar yo un dia para que me expliques lo de los ganchos y su implementación, sería más que razonable que lo colara de alguna manera en este proyecto si lo hago.

Citar:
Uto escribió:

1) RAMSAVE/RAMLOAD. ¿Hay alguna orden Inform que grabe en memoria el estado de la partida y permita restaurarlo?



Pues no, que yo sepa. Pero seguramente puedes hacerlo de una forma mucho más simple. A fin de cuentas el estado de una partida PAWS seguramente se compondrá de unas pocas variables.
....
Si esto es así, bastaría que declararas otras tantas variables de backup y te limitaras a copiar unos en otros.

Es precisamente eso lo que quiero evitar, porque si me hago mi propia rutina de grabación, que es lo que tiene ahora mismo Superglus (con llamadas a glk claro) los condactos plugin se ven obligados a 'engancharse' a la rutina de grabación, y si bien deje una puerta abierta para ese 'enganche' lo cierto es que no es sencillo. Por eso basicamente lo que busco es algo que haga como el 'save' de Inform pero no pida nombre de fichero, sino que lo grabe en RAM o en un fichero predefinido. Si no existe prefiero prescindir del RAMSAVE y del RAMLOAD, que tenían su cierta logica en el entorno 8bits pero hoy en dia la verdad es que son innecesarios.

Uto escribió:
2) TRANSCRIPT: en superglus se hace con llamadas GLK, no se si habra una forma más sencilla de hacerlo en inform.

Citar:
No creo que la haya, porque la librería estándar de Graham Nelson también lo hace con llamadas a glk.

Entonces copio las llamadas glk del asm de Superglus y andando, era por si habia una orden interna igual que hay el save y el load :)


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 18 Ene 2007 14:51 
Desconectado
Momio
Momio
Avatar de Usuario

Registrado: 09 Mar 2004 16:14
Mensajes: 4651
Otra pregunta:

¿hay algo parecido al "eval" de javascript?. Supongo que no porque es complilado, no interpretado. En caso contrario, a ver que se os ocurre para esto:

El compilador creará una funcion por cada proceso, algo como:
Código:
[PROCESS_0;

....
];

[PROCESS_1;
....
];



Ahora, para el condacto PROCESS, que llama a un proceso recibiendo su numero como parámetro lo unico que se me ocurre es que el compilador tambien genere algo como (sintaxis del switch inventada, ya mirare como se hace en Inform):

Código:
[RunProcess procno;

switch procno
{
case 0: PROCESS_0();
case 1: PROCESS_1()
....
else "Bad Process".
}
];


Bien, el compilador puede hacer esto, claro, pero la verdad es que estaría mucho más limpio si pudiera hacer algo como
Código:
[RunProcess procno;

eval("PROCESS_" + procno) 
];

Como digo yo que eso no existirá, se me ocurre tirar por la calle de en medio y aprovechar que en Inform todo son numeros, pero no se como hacerlo, me refiero a tener un array de procedimientos, de modo que el compilador lo que haga sea un

Código:
ProcList-->0 = PROCESS_0;  ! ¿Se puede hacer esto?
ProcList-->1 = PROCESS_1
ProcList-->2 = PROCESS_2

y luego

Código:
[RunProcess procno;
  Proclist-->procno; ! He aqui mi duda, si esta sintaxis es aceptable.
]


Arriba
 Perfil  
 
 Asunto: Y otra
NotaPublicado: 18 Ene 2007 15:10 
Desconectado
Momio
Momio
Avatar de Usuario

Registrado: 09 Mar 2004 16:14
Mensajes: 4651
Y otra...

Necesito hacer funciones que comprueben el valor de un bit de una variable, y que lo activen y lo desactiven, para ello habitualmente se usan los operadores bitwise y los desplazamientos (SHL,SHR, <<, >>, segun lenguaje) de esta manera:

[BitTest value bitno;
return (value & (1 SHL bitno) ~= 0);
];

El caso, es que mirando la documentacion de Inform no encuentro un SHL, asi que no se si es que no existe o que yo no lo encuentro.

Sí, ya se que puedo hacerlo elevando 2 a lo que sea, pero la pregunta es si existen o no existen SHL y SHR, y en su defecto, si existe un operador de "potencia de" o me tengo que hacer la funcion a base de multiplicaciones.


Arriba
 Perfil  
 
 Asunto: Re: Y otra
NotaPublicado: 18 Ene 2007 15:30 
Desconectado
Semimomio
Semimomio
Avatar de Usuario

Registrado: 15 Dic 2004 21:28
Mensajes: 2302
Uto escribió:
El caso, es que mirando la documentacion de Inform no encuentro un SHL, asi que no se si es que no existe o que yo no lo encuentro.


Yo tampoco lo veo, en el Designers Manual 4 solo aparecen las operaciones a nivel de bit: and, or y not.

Uto escribió:
Sí, ya se que puedo hacerlo elevando 2 a lo que sea, pero la pregunta es si existen o no existen SHL y SHR, y en su defecto, si existe un operador de "potencia de" o me tengo que hacer la funcion a base de multiplicaciones.


Tampoco existe el operador de potencia, que yo sepa, lo que sí hay son librerías matemáticas, igual puedes aprovechar alguna y no reinventar la rueda.


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 18 Ene 2007 15:55 
Desconectado
Elfito
Elfito
Avatar de Usuario

Registrado: 09 Sep 2004 14:41
Mensajes: 14
Uto escribió:
Otra pregunta:

¿hay algo parecido al "eval" de javascript?. Supongo que no porque es complilado, no interpretado.


Tú lo has dicho.

Uto escribió:
En caso contrario, a ver que se os ocurre para esto:
[...]
Ahora, para el condacto PROCESS, que llama a un proceso recibiendo su numero como parámetro lo unico que se me ocurre es que el compilador tambien genere algo como (sintaxis del switch inventada, ya mirare como se hace en Inform):

Código:
[RunProcess procno;

switch procno
{
case 0: PROCESS_0();
case 1: PROCESS_1()
....
else "Bad Process".
}
];



El switch de Inform, si mal no recuerdo, tiene la misma sintaxis que el de C. Pero no necesitas hacer algo tan feo. Según te leía, se me estaba ocurriendo que pasaras el propio nombre de la función a ejecutar como argumento. Algo asi:

Código:
[RunProcess p;
 p();
];


Pero después me di cuenta de que era absurdo, porque para eso ya llamas directamente a la función por su nombre en lugar de hacerlo a través de RunProcess. Imagino que la gracia es ejecutarla cuando se tiene el número de la función, pero no su nombre. Entonces se me ocurrió otra cosa, pero ya vi que a ti también:

Uto escribió:
Como digo yo que eso no existirá, se me ocurre tirar por la calle de en medio y aprovechar que en Inform todo son numeros, pero no se como hacerlo, me refiero a tener un array de procedimientos, de modo que el compilador lo que haga sea un

Código:
ProcList-->0 = PROCESS_0;  ! ¿Se puede hacer esto?
ProcList-->1 = PROCESS_1
ProcList-->2 = PROCESS_2

y luego

Código:
[RunProcess procno;
  Proclist-->procno; ! He aqui mi duda, si esta sintaxis es aceptable.
]


Casi. La inicialización del array es correcta (faltan puntos y coma, pero me los supongo). A la llamada dentro de RunProcess le faltan los paréntesis que indican que es una llamada. Yo lo pondría así:

Código:
[RunProcess procno;
  (Proclist-->procno)();
];


Arriba
 Perfil  
 
 Asunto: Re: Y otra
NotaPublicado: 18 Ene 2007 16:02 
Desconectado
Elfito
Elfito
Avatar de Usuario

Registrado: 09 Sep 2004 14:41
Mensajes: 14
Uto escribió:
El caso, es que mirando la documentacion de Inform no encuentro un SHL, asi que no se si es que no existe o que yo no lo encuentro.

No me suena que lo haya. ¿La maquina glulx lo tiene?, porque entonces podría mirarse cómo se mete asm nativo de glulx en inform.

Uto escribió:
Sí, ya se que puedo hacerlo elevando 2 a lo que sea, pero la pregunta es si existen o no existen SHL y SHR, y en su defecto, si existe un operador de "potencia de" o me tengo que hacer la funcion a base de multiplicaciones.


Puedes hacerlo más fácil a base de sumas. Partiendo de 1, y sumando a si mismo el registro, cada vez que lo haces lo multiplicas por dos.

Otra solución más simple aún (aunque pueda parecer chapucera) es preparar un array con las potencias de dos, y así para obtener el bit i-ésimo simplemente usas Potencias_de_dos-->i

[Actualización] Después de escribir lo anterior, me ha dado por mirar en la librería estándar (fichero parserm.h) y mira lo que he encontrado!

Código:
Array PowersOfTwo_TB                ! Used in converting case numbers to case bitmaps
  --> $$100000000000
      $$010000000000
      $$001000000000
      $$000100000000
      $$000010000000
      $$000001000000
      $$000000100000
      $$000000010000
      $$000000001000
      $$000000000100
      $$000000000010
      $$000000000001;


|Z|


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 18 Ene 2007 19:32 
Desconectado
Guionista
Guionista
Avatar de Usuario

Registrado: 09 Oct 2006 13:51
Mensajes: 385
Ubicación: mundo
Inform no tiene operadores de bit-shit como << y >> como tienen C o Java...??? que raro!


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 18 Ene 2007 20:42 
Desconectado
Momio
Momio
Avatar de Usuario

Registrado: 09 Mar 2004 16:14
Mensajes: 4651
betopica escribió:
Inform no tiene operadores de bit-shit como << y >> como tienen C o Java...??? que raro!


Si ademas de comerte la f de shift te equivocas y cambias la t de bit por una g de habría quedado de órdago XDDD


Arriba
 Perfil  
 
 Asunto: Re: Y otra
NotaPublicado: 18 Ene 2007 20:51 
Desconectado
Momio
Momio
Avatar de Usuario

Registrado: 09 Mar 2004 16:14
Mensajes: 4651
presi escribió:
Tampoco existe el operador de potencia, que yo sepa, lo que sí hay son librerías matemáticas, igual puedes aprovechar alguna y no reinventar la rueda.


Bueno, echare un ojo a la librería mas que nada por si en el futuro me hacen falta mas cosas, pero la verdad, para hacer la potencia de 2 no necesito una libreria, se hace la función en menos de 30 segundos :)

La cuestion era mas que nada no hacer la funcion si hay un operador SHL o si hay un operador potencia ;)


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 18 Ene 2007 21:01 
Desconectado
Guionista
Guionista
Avatar de Usuario

Registrado: 03 Nov 2004 17:15
Mensajes: 300
Ubicación: ... muy lejos de todo lo que se hace llamar social...
betopica escribió:
Inform no tiene operadores de bit-shit como << y >> como tienen C o Java...??? que raro!


No tiene nada de raro... inform no es un lenguaje de programación sino un lenguaje para fastidiar a los programadores... a los no programadores les parece ok.

_________________
Slds,

/\+++++/\
< agnas >
\/+++++\/
http://www.micronosis.com/


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 18 Ene 2007 21:02 
Desconectado
Momio
Momio
Avatar de Usuario

Registrado: 09 Mar 2004 16:14
Mensajes: 4651
Zak escribió:

Casi. La inicialización del array es correcta (faltan puntos y coma, pero me los supongo). A la llamada dentro de RunProcess le faltan los paréntesis que indican que es una llamada. Yo lo pondría así:

Código:
[RunProcess procno;
  (Proclist-->procno)();
];


Ok, me lo imaginé después de mandar el mensaje.

Y ahora ahondando en lo de los ganchos: digamos que yo tengo un procedimiento idle/fake...
Código:

[DoNothing;
];


Y luego tengo una variable global

Código:
Global Hook = DoNothing;


y luego en un sitio determinado hago:

Código:
....
Hook();
....


Ahora pongamos que el prolífico Menganito hace un 'addon' y decide que tiene que engancharse. Mr. Menganito haría por tanto:
Código:
Global MenganitoHook = 0;

[MenganitoHookInit;
   MenganitoHook = Hook();
  Hook=MenganitoAction();
];

[MenganitoAction;
  MenganitoHook();  ! Llamar antiguo Hook
  ...
  ...
  ...
];


¿Es esta la idea y sintaxis correctas para 'colarse' por medio?


Arriba
 Perfil  
 
 Asunto: Re: Y otra
NotaPublicado: 18 Ene 2007 21:06 
Desconectado
Momio
Momio
Avatar de Usuario

Registrado: 09 Mar 2004 16:14
Mensajes: 4651
Zak escribió:
No me suena que lo haya. ¿La maquina glulx lo tiene?, porque entonces podría mirarse cómo se mete asm nativo de glulx en inform.


Pues sí, glulx tiene SHL, en concreto se llama SHIFTL.

Zak escribió:
Puedes hacerlo más fácil a base de sumas. Partiendo de 1, y sumando a si mismo el registro, cada vez que lo haces lo multiplicas por dos.

Otra solución más simple aún (aunque pueda parecer chapucera) es preparar un array con las potencias de dos, y así para obtener el bit i-ésimo simplemente usas Potencias_de_dos-->i


Bueno, chapucera no es, es una clásica tabla lookup de las que se usan para acelerar el proceso, cosa que no creo que sea el problem, pero vamos, que la verdad es que es una solución bastante adecuada, me da que voy a ir por ahí en lugar de por las sumas (que tambien eran un avance claro, a no ser que el compilador de inform optimice las multiplicaciones por dos convirtiendolas en sumas el solito en cuyo caso da igual). Ademas ya tengo la tabla casi hecha, me basta con copiar la de la libreria y ampliarla hasta los 32 bits ;)


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 18 Ene 2007 21:38 
Desconectado
Grafista
Grafista
Avatar de Usuario

Registrado: 15 Ene 2005 22:26
Mensajes: 780
betopica escribió:
Inform no tiene operadores de bit-shit como << y >> como tienen C o Java...??? que raro!


Porque en realidad es raro su uso a ese nivel, aunque el micro (en este caso virtual: ZMachine o GMachine) si traen esa posibilidad, a traves de assembler.

_________________
INFSP7 - Canal de Noticias INFSP

Porque donde está tu tesoro, allí también estará tu corazón.


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