CAAD
http://foro.caad.es/

Saber si me he movido o no
http://foro.caad.es/viewtopic.php?f=12&t=3373
Página 1 de 1

Autor:  baltasarq [ 01 Nov 2009 14:27 ]
Asunto:  Saber si me he movido o no

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?

Autor:  baltasarq [ 01 Nov 2009 14:46 ]
Asunto:  Re: Saber si me he movido o no

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.

Autor:  DrVanHalenFan [ 01 Nov 2009 21:28 ]
Asunto:  Re: Saber si me he movido o no

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.^";
   }
],


--

Autor:  baltasarq [ 02 Nov 2009 12:26 ]
Asunto:  Re: Saber si me he movido o no

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.

Autor:  jarel [ 02 Nov 2009 17:33 ]
Asunto:  Re: Saber si me he movido o no

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

Autor:  baltasarq [ 02 Nov 2009 17:38 ]
Asunto:  Re: Saber si me he movido o no

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.

Página 1 de 1 Todos los horarios son UTC + 1 hora
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/