CAAD

Comunidad de Aventuras Conversacionales y Relatos Interactivos
Fecha actual 16 Oct 2019 15:59

Todos los horarios son UTC + 1 hora




Nuevo tema Responder al tema  [ 6 mensajes ] 
Autor Mensaje
NotaPublicado: 01 Nov 2009 14:27 
Desconectado
Semimomio
Semimomio
Avatar de Usuario

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

Necesitaría saber en Inform 6 si el jugador se ha movido o no. Tengo en un objeto un Daemon (activado):

Código:
object pnjAmbrosio
with
! más cosas...
daemon [;
if ( action == ##Go ) {
print "Ambrosio te sigue^";
move self to location;
}
]
;


Y tengo una localidad donde puedo saber si ha habido movimiento o no:

Código:
Room HOGAR_DE_AMBROSIO
with
! más cosas
e_to CRUCE_DE_CAMINOS,
cant_go [;
print "No puedes ir por ahí.^";
action = Nothing;
],
;


Y entonces se visualiza:

Código:
> o
No puedes ir por ahí.
Ambrosio te sigue.


Es decir, cambio la vble global "action" para que no se ejecute lo del daemon; pero se ejecuta igualmente. Lo he arreglado de esta manera:

Código:
Room HOGAR_DE_AMBROSIO
with
! más cosas
e_to [;
pnjAmbrosio.movimiento = true;
playerTo( CRUCE_DE_CAMINOS, 2 );
rtrue;
],
cant_go [;
pnjAmbrosio.movimiento = false;
print "No puedes ir por ahí.^";
],
;


Y, claro, entonces...

Código:
object pnjAmbrosio
with
movimiento true,

! más cosas...
daemon [;
if ( action == ##Go
&& self.movimiento )
{
print "Ambrosio te sigue^";
move self to location;
}
]
;


Y ahora funciona:

Código:
> o
No puedes ir por ahí.


Sin embargo, me parece una solución trabajosa de más... ¿a alguien se le ocurre otra manera?

_________________
-- Baltasar, el arquero


Arriba
 Perfil  
 
NotaPublicado: 01 Nov 2009 14:46 
Desconectado
Semimomio
Semimomio
Avatar de Usuario

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

Lo he solucionado un poco, dejándolo en algo mucho más cómodo:

Código:
Room HOGAR_DE_AMBROSIO
with
    ! más cosas
    e_to CRUCE_DE_CAMINOS,
    cant_go [;
        pnjAmbrosio.movimiento = false;
        print "No puedes ir por ahí.^";
    ],
;

object pnjAmbrosio
with
    movimiento true,

    ! más cosas...
    daemon [;
        if ( action == ##Go
       && self.movimiento )
        {
            print "Ambrosio te sigue^";
            move self to location;
        }
        self.movimiento = true;
     ]
;


Y ahora funciona, y el código ya no es tan dependiente. Estoy bastante satisfecho con el resultado, sin embargo, me gustaría saber si hay alguna forma de detectar si la acción de movimiento ha tenido o no éxito.
También me gustaría saber cómo es que en la primera intentona modificaba la vble global action, y, sin embargo, el daemon se ejecutaba igualmente.

_________________
-- Baltasar, el arquero


Arriba
 Perfil  
 
NotaPublicado: 01 Nov 2009 21:28 
Desconectado
Archivero
Archivero

Registrado: 08 Sep 2008 22:04
Mensajes: 274
baltasarq escribió:
Y ahora funciona, y el código ya no es tan dependiente. Estoy bastante satisfecho con el resultado, sin embargo, me gustaría saber si hay alguna forma de detectar si la acción de movimiento ha tenido o no éxito.
También me gustaría saber cómo es que en la primera intentona modificaba la vble global action, y, sin embargo, el daemon se ejecutaba igualmente.


No sé cómo o dónde lo hace, pero Inform recupera, por las pruebas que he hecho, el valor de Action por mucho que lo cambies (prueba añadiendo lineas de debug que impriman su valor cuando lo cambias y luego dentro del daemon).

En cualquier caso, para cuando llega el turno de ejecutarse el daemon la acción ya ha terminado, con éxito o sin él, luego en el caso de la acción ##Go el valor de location ya será el de la nueva localidad (éxito) o el mismo de antes (fracaso). Eso hace que tu comprobación se haga mucho más sencilla y, sobre todo, autocontenida en el código del pnj, ya que su daemon se limitará a comprobar que su contenedor coincida o no con la localidad del jugador y moverle sólo en caso negativo. Parecido a esto:

Código:
daemon
[;
   if (parent(self) ~= location)
   {
      move self to location;
      print "Ambrosio te sigue.^";
   }
],


--


Arriba
 Perfil  
 
NotaPublicado: 02 Nov 2009 12:26 
Desconectado
Semimomio
Semimomio
Avatar de Usuario

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

DrVanHalenFan escribió:
baltasarq escribió:
En cualquier caso, para cuando llega el turno de ejecutarse el daemon la acción ya ha terminado, con éxito o sin él, luego en el caso de la acción ##Go el valor de location ya será el de la nueva localidad (éxito) o el mismo de antes (fracaso). Eso hace que tu comprobación se haga mucho más sencilla y, sobre todo, autocontenida en el código del pnj, ya que su daemon se limitará a comprobar que su contenedor coincida o no con la localidad del jugador y moverle sólo en caso negativo. Parecido a esto:


Ya, pero es que el código que puse era muy simplificado, y esa comprobación ya la hago para cuándo el protagonista vuelve a la "zona de influencia" del protagonista. Así que, comprobarlo así creo que no me vale. Lo comprobaré. Muchas gracias por el interés, de todas formas.

¡Ah! y gracias también por la confirmación de lo de la variable action, desde luego, algunas cosas de Inform son sorprendentes, aunque supongo que también tendrán su lógica.

_________________
-- Baltasar, el arquero


Arriba
 Perfil  
 
NotaPublicado: 02 Nov 2009 17:33 
Desconectado
Implementador
Implementador
Avatar de Usuario

Registrado: 10 Mar 2004 11:58
Mensajes: 1817
Ubicación: Madrid
Una solución alternativa, sería resolverlo todo desde la función de la librería "Newroom", invocada cada vez que cambias efectivamente de localidad. Así:

Código:
[NewRoom;
 if(Ambrosio_te_esta_siguiendo==true)Ambrosio_te_sigue_a(location);
];


La única pega sería si hay movimiento entre localidades oscuras, ya que en este caso me temo que realmente te mueves todo el rato por la misma localidad (La Oscuridad) luego Newroom no es invocada.

Saludos

_________________
_/ /\ R e \_


Arriba
 Perfil  
 
NotaPublicado: 02 Nov 2009 17:38 
Desconectado
Semimomio
Semimomio
Avatar de Usuario

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

jarel escribió:
Una solución alternativa, sería resolverlo todo desde la función de la librería "Newroom", invocada cada vez que cambias efectivamente de localidad. Así:


¡Ajá!, algo así era lo que estaba buscando. ¡Gracias, Jarel!
Me suena esta función, pero desde luego, nunca la he utilizado.

_________________
-- Baltasar, el arquero


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