CAAD

Comunidad de Aventuras Conversacionales y Relatos Interactivos
Fecha actual 17 Oct 2019 07:01

Todos los horarios son UTC + 1 hora




Nuevo tema Responder al tema  [ 24 mensajes ]  Ir a página 1, 2  Siguiente
Autor Mensaje
NotaPublicado: 20 Dic 2011 13:40 
Desconectado
Semimomio
Semimomio
Avatar de Usuario

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

En mi aventura tengo un objeto tal que así:

Código:
Thing objGafasDeVisionNocturna "gafas de visión nocturna" limbo
with
   name_f 'gafas' 'vision' 'nocturna',
   name_m 'visor' 'nocturno',
   description "Equipo estándar GEO. Permiten ver en la oscuridad.",
   after [;
      SwitchOn, Wear:
         give self light;
         give self worn;
         "Las gafas se activan con un pitido contínuo.
          Al principio, todo se ve verde, hasta que se distinguen todos los bordes y formas.";
      SwitchOff, Disrobe:
         give self ~light;
         give self ~worn;
         "Las gafas se han desactivado con un pitido corto.";
   ],
has female pluralname clothing switchable;


La clase Thing es apenas nada:

Código:
class Thing;


Al principio del juego, en initialise(), las gafas se mueven al jugador, es decir, forman parte del inventario inicial.
El caso es que se pueden apagar y encender, o ponérselas o quitárselas, que va a ser lo mismo. Todo funciona perfectamente bien... hasta que haces un inventario

Citar:
> ponte las gafas.
Las gafas se activan...
> i
Gafas de visión nocturna (alumbrando y puest

** Programming error: tried has or hasn't on Nothing **

** Programming error: tried has or hasn't on Nothing **

** Programming error: tried has or hasn't on Nothing **

o)


No es urgente porque me hice mi propia rutina sencillita de inventario, y fuera, pero... ¿por qué pasa esto? ¿es un bug? ¿o es alguna combinación rara de atributos?

_________________
-- Baltasar, el arquero


Arriba
 Perfil  
 
NotaPublicado: 20 Dic 2011 13:42 
Desconectado
Semimomio
Semimomio
Avatar de Usuario

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

Por cierto, ya me estoy dando cuenta de un error.... ¿será esto?

En la línea:

Código:
name_f 'gafas' 'vision' 'nocturna',


debería ser:

Código:
name_fp 'gafas' 'vision' 'nocturna',

_________________
-- Baltasar, el arquero


Arriba
 Perfil  
 
NotaPublicado: 20 Dic 2011 21:40 
Desconectado
Semimomio
Semimomio
Avatar de Usuario

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

Pues no es eso. Sigue dándome ese error.

En cualquier caso, el inventario es muy fácil de hacer. Basta capturar la acción en el jugador:

Código:
object jugador
with
! ... muchas cosas ...
react_before [;
    Inv: return doInv();
],
;


Y la función inventario:

Código:
[ doInv x;
    if ( children( jugador ) == 0 ) {
        print "No llevas nada.";
        rtrue;
    } else {
        print "Llevas contigo:^";
    }

    x = child( jugador );

    while( x ~= Nothing ) {
        print "- ", (_The) x, "^";

        x = sibling( x );
    }

    print "^";
    rtrue;
];


Por supuesto, se pierde funcionalidad (Inform lista si un objeto está abierto o cerrado, si es contenedor, qué objetos hay en él, etc.), pero bueno, por lo menos funciona sin errores.

Al margen de esto... ¿a alguien se le ocurre qué puede estar pasando?

_________________
-- Baltasar, el arquero


Arriba
 Perfil  
 
NotaPublicado: 20 Dic 2011 21:56 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 23 Mar 2010 20:11
Mensajes: 1141
Ubicación: Valencia
Debe ser un problema de tu librería de Spanish... has trapicheado con ella??

Mi resultado con tu código:

Código:
PROBANDO
(c)2011 Joruiru.
Release 1 / Serial number 111111 / Inform v6.31 Library 6/11 D

Esto es un infierno
Una habitación triste y sin decoración.
Salidas visibles: ninguna.

Puedes ver unas gafas de visión nocturna.

>coge gafas
Cogidas.

>i
Llevas:
  unas gafas de visión nocturna

>ponte gafas
Las gafas se activan con un pitido contínuo. Al principio, todo se ve verde, hasta que se distinguen todos los bordes y formas.

>i
Llevas:
  unas gafas de visión nocturna (alumbrando y que llevas puesto)

>


Con este código fuente:
Código:
!% -~SD
!% +language_name=Spanish
!%

Constant Story "PROBANDO";
Constant Headline "^(c)2011 Joruiru.^";

Release 1;
Serial "111111";

! Queremos usar el comando 'salidas'
Constant ADMITIR_COMANDO_SALIDAS;

Include "Parser";

Include "VerbLib";

[ Initialise ;
! Lugar de comienzo.
location = limbo;

!Se cambia el objeto jugador
!player = mySelfObj;

! Activamos esta variable para que la descripción de los lugares
! se repita siempre, incluso si el jugador ya ha estado alli.
lookmode = 2;

! Mensaje de Bienvenida
"Esto no tiene ni pies ni cabeza.";

];

Include "SpanishG";

Class Localidad
with describe [;
print (string) self.description;
print "^";
<<Salidas>>;
],
has light;

Localidad limbo "Esto es un infierno"
with
description "Una habitación triste y sin decoración.",
;

class Thing;

Thing objGafasDeVisionNocturna "gafas de visión nocturna" limbo
with
   name_f 'gafas' 'vision' 'nocturna',
   name_m 'visor' 'nocturno',
   description "Equipo estándar GEO. Permiten ver en la oscuridad.",
   after [;
      SwitchOn, Wear:
         give self light;
         give self worn;
         "Las gafas se activan con un pitido contínuo.
          Al principio, todo se ve verde, hasta que se distinguen todos los bordes y formas.";
      SwitchOff, Disrobe:
         give self ~light;
         give self ~worn;
         "Las gafas se han desactivado con un pitido corto.";
   ],
has female pluralname clothing switchable;

_________________
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: 21 Dic 2011 19:38 
Desconectado
Semimomio
Semimomio
Avatar de Usuario

Registrado: 23 Abr 2004 08:49
Mensajes: 2918
Ubicación: España (Galicia)
Pues no, no es probable. Únicamente que la lib que uso sea "vieja". Tengo que mirármelo.

Código:
INFSP Task Team
!       Version: 0.9
!      Released: 8 - Junio - 2008
! Serial Number: 806.8


Código:

! INFSP (Spanish Inform Library)
! =====================================================================
!        Author: INFSP Task Team
!       Version: 0.9
!      Released: 8 - Junio - 2008
! Serial Number: 806.8
!          Note: For use with Inform 6. (Tested with Inform compiler
!                version 6.31 and Inform library 6/11).
!   Description: "An Inform library to write Interactive Fiction in
!                Spanish. Grammar Spanish File."
! =====================================================================
!  SpanishG.h -(Gramatica.h) GRAMATICA: Gramática española
!  INFSP 0.8 traduccion al ingles de informATE .: by Sarganar :.
!  InformATE es (c) de Zak
!  Re-edicion INFSP by Sarganar
!  caad.es/informate/infsp/
! ----------------------------------------------------------------------------


Código:
! =====================================================================
! INFSP (Spanish Inform Library)
! =====================================================================
!        Author: INFSP Task Team
!       Version: 0.9
!      Released: 8 - Junio - 2008
! Serial Number: 806.8
!          Note: For use with Inform 6. (Tested with Inform compiler
!                version 6.31 and Inform library 6/11).
!   Description: "An Inform library to write Interactive Fiction in
!                Spanish. Language Spanish File."
!================================================================
! Spanish.h
! INFSP 0.9 libreria española para inform, basada en informATE de Zak
!                         .: by Sarganar :.

_________________
-- Baltasar, el arquero


Arriba
 Perfil  
 
NotaPublicado: 21 Dic 2011 19:42 
Desconectado
Semimomio
Semimomio
Avatar de Usuario

Registrado: 23 Abr 2004 08:49
Mensajes: 2918
Ubicación: España (Galicia)
He actualizado las librerías a las últimas disponibles (Enero de 2009), pero el problema sigue. En cualquier caso, parece que el problema es mío. Seguiré investigando...

_________________
-- Baltasar, el arquero


Arriba
 Perfil  
 
NotaPublicado: 22 Dic 2011 09:39 
Desconectado
Implementador
Implementador
Avatar de Usuario

Registrado: 10 Mar 2004 11:58
Mensajes: 1817
Ubicación: Madrid
Lo único que parece claro es que el error salta en esta línea de Spanish.h
Código:
 8: print " (alumbrando y que llevaba puest", (o) x1;
    ! El objeto tiene "luz" y "puesto"


Así que a comprobar que la función o(); no ha sido modificada, o qué le pasa a x1 para que no reciba ningún objeto.

_________________
_/ /\ R e \_


Arriba
 Perfil  
 
NotaPublicado: 22 Dic 2011 10:35 
Desconectado
Semimomio
Semimomio
Avatar de Usuario

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

jarel escribió:
Lo único que parece claro es que el error salta en esta línea de Spanish.h
Código:
 8: print " (alumbrando y que llevaba puest", (o) x1;
    ! El objeto tiene "luz" y "puesto"


Así que a comprobar que la función o(); no ha sido modificada, o qué le pasa a x1 para que no reciba ningún objeto.


Que no, que no. Yo NUNCA modifico las librerías. ¿Se me ocurre que pueda ser también a raiz de haber cambiado al jugador? Tendré que probarlo, así como el código de Joriuru.

_________________
-- Baltasar, el arquero


Arriba
 Perfil  
 
NotaPublicado: 23 Dic 2011 04:00 
Desconectado
Semimomio
Semimomio
Avatar de Usuario

Registrado: 24 Ago 2007 00:41
Mensajes: 2023
Ubicación: Chile
Yo te recomiendo encarecidamente programar tu versión del inventario usando la rutina prefabricada para ello que ya trae Inform6 [ya que toman todas las precauciones del caso].

La rutina es configurable y genera listas de objetos dentro de objetos de muchas formas diferentes.

EscribirListaDesde() - WriteListFrom()

http://www.caad.es/informate/docs/html/ ... jetos.html

Saludos. :)

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


Arriba
 Perfil  
 
NotaPublicado: 23 Dic 2011 10:56 
Desconectado
Semimomio
Semimomio
Avatar de Usuario

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

Ya, Eliuk, también tendría que probarlo, pero me temo que es precisamente esa rutina la que está cascando, ¿no?

Si es la rutina que usa la librería...

_________________
-- Baltasar, el arquero


Arriba
 Perfil  
 
NotaPublicado: 23 Dic 2011 17:50 
Desconectado
Semimomio
Semimomio
Avatar de Usuario

Registrado: 24 Ago 2007 00:41
Mensajes: 2023
Ubicación: Chile
baltasarq escribió:
Hola !

Ya, Eliuk, también tendría que probarlo, pero me temo que es precisamente esa rutina la que está cascando, ¿no?

Si es la rutina que usa la librería...


No, porque tú estás usando tu doInv() para realizar el listado. InvSub() [que es la de la librería, ante la acción ##Inv] debería internamente llamar a WriteListFrom(). [Basicamente, cualquier parte en que se deban listar objetos (por ejemplo, los contenedores transparentes) la librería usa la rutina estandar WriteListFrom()].

Intenta modificar tu código de doInv() para que llame a WriteListFrom() para la generación de la lista. Esta rutina simplemente imprime una lista de objetos contenidos en otro, usando formateos especiales y unas cuantas comprobaciones para (idealmente) no cascar. Fuera de eso, no hace nada más extraordinario. :)

Suerte!

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


Arriba
 Perfil  
 
NotaPublicado: 23 Dic 2011 20:58 
Desconectado
Semimomio
Semimomio
Avatar de Usuario

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

Eliuk Blau escribió:
baltasarq escribió:
Ya, Eliuk, también tendría que probarlo, pero me temo que es precisamente esa rutina la que está cascando, ¿no?

Si es la rutina que usa la librería...


No, porque tú estás usando tu doInv() para realizar el listado. InvSub() [que es la de la librería, ante la acción ##Inv] debería internamente llamar a WriteListFrom(). [Basicamente, cualquier parte en que se deban listar objetos (por ejemplo, los contenedores transparentes) la librería usa la rutina estandar WriteListFrom()].

Intenta modificar tu código de doInv() para que llame a WriteListFrom() para la generación de la lista. Esta rutina simplemente imprime una lista de objetos contenidos en otro, usando formateos especiales y unas cuantas comprobaciones para (idealmente) no cascar. Fuera de eso, no hace nada más extraordinario. :)


A ver, yo no sé si nos entendemos: si hago mi doInv() es porque el inventario normal no me funciona, que es el que usa la función writeListFrom().

En cualquier caso, como no me costaba nada probar, lo he hecho, y los resultados son un poco los esperados:

Código:
writeListFrom( child( player ), ENGLISH_BIT );


Funciona correctamente, porque no entra en ningún detalle.

Código:
writeListFrom( child( player ), ENGLISH_BIT | PARTINV_BIT);



Funciona correctamente, pero sospecho que es así porque sólo indica entre paréntesis, de las gafas, que están alumbrando.

Código:
writeListFrom( child( player ), ENGLISH_BIT | FULLINV_BIT);


Funciona incorrectamente, supongo que debe ser el inventario por defecto.

Aún así, he modificado mi función doInv() para utilizar el segundo formato de writeListFrom(), ya que oye, si nos da esta función la librería, pues queda mejor así. Quizás era esto a lo que te referías, Eliuk, a que quedaría mejor con esta función.

Es una pena que el inventario por defecto no es parametrizable, es decir, que estés obligado a crearte una rutina para llamar a writeListFrom con los parámetros que tu quieres. La verdad es que me gusta mucho más como queda con ENGLISH_BIT (es decir, formando una frase) que la lista de siempre.

_________________
-- Baltasar, el arquero


Arriba
 Perfil  
 
NotaPublicado: 23 Dic 2011 21:01 
Desconectado
Semimomio
Semimomio
Avatar de Usuario

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

He probado el código que posteó joruiru y... ¡funciona! La única diferencia con tu código es que mi juego es un poco más grande...

He actualizado las librerías, y compilo la prueba de joruiru con el mismo compilador y la misma configuración que mi juego... esto es un misterio...

_________________
-- Baltasar, el arquero


Arriba
 Perfil  
 
NotaPublicado: 23 Dic 2011 21:20 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 23 Mar 2010 20:11
Mensajes: 1141
Ubicación: Valencia
Pues...

¿No estarás usando alguna librería que esté sobreescribiendo la función GetGNAOfObject(obj)? O tú mismo en tu código que la has modificado o modificas algo que use esa función...

Código:
Según el error que te da, imprime esto:

     8: print " (alumbrando y que llevas puest", (o) x1;

Luego llama a o():

[ o obj gna;

    gna=GetGNAOfObject(obj);
    switch(gna)
    {
     0,6: print "o";
     1,7: print "a";
     3,9: print "os";
     4,10: print "as";
    }
]; 

Y luego imprime "o)"


Así, entre las 2 cadenas que imprime, sólo está la función GetGNAOfObject(obj).

Código:
[ GetGNAOfObject obj case gender;
    if (obj hasnt animate) case = 6;
    if (obj has male) gender = male;
    if (obj has female) gender = female;
    if (obj has neuter) gender = neuter;
    if (gender == 0) {
        if (case == 0) gender = LanguageAnimateGender;
        else gender = LanguageInanimateGender;
    }
    if (gender == female)   case = case + 1;
    if (gender == neuter)   case = case + 2;
    if (obj has pluralname) case = case + 3;
    return case;
];


Es un misterio... no se me ocurre nada... prueba a ir añadiendo los includes y todo eso en el código que funciona a ver cuándo se estropea...

_________________
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: 23 Dic 2011 23:04 
Desconectado
Semimomio
Semimomio
Avatar de Usuario

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

joruiru escribió:
Pues...

¿No estarás usando alguna librería que esté sobreescribiendo la función GetGNAOfObject(obj)? O tú mismo en tu código que la has modificado o modificas algo que use esa función...


Nopes. En cuanto a haber modificado esa función, no sabía ni que existía. Nunca me he metido en el lenguaje hasta ese nivel.

Bueno, lo he encontrado. Se trata de esta línea (la primera), única y en exclusiva (eso también lo he comprobado):

Código:
!% -~SD


Así funciona. Le quitas la virgulilla, y no funciona:

Código:
!% -SD


Esto es: la D es depuración (activada), y la S (que no está activada) es la que da el problema cuando se activa.

DM4 escribió:
-S on/off compile strict error-checking at run-time (on by default)


Esto quiere decir que inform mete algún código para ser más estricto en tiempo de ejecución. Y es precisamente ese código que introduce el que está interfiriendo en la función que comentáis, o() o GetGNAOfObject(). Vamos que ese código tiene un bug.

Ains, hay que ver.

_________________
-- Baltasar, el arquero


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