Puertas
=======

Sencilla librera para hacer ms cmoda la programacin de puertas
bidireccionales (es decir, que unen dos localidades y permiten
pasar de una a otra en ambos sentidos).

Si necesitas usar PNJMovil para tener personajes que caminan por
el mapa del juego, y necesitas que estos personajes sean capaces
de abrir las puertas, te recomiendo que uses PNJPuertas en lugar
de la presente librera. (Puedes encontrar PNJPuertas en
http://www.geocities.com/spinf_2000/informate#modulos).


Utilizacion
===========

Include "Puertas" despues de "EParser" (o despues de "Acciones")

Una puerta (de las que se implementan en esta libreria) solo
puede unir dos localidades si ambas son de la clase Habitacion.
Debes por tanto declarar la clase Habitacion antes de incluir
"Puertas". Basta una linea que diga "Class Habitacion;" pero
probablemente quieras aprovechar para dotar de luz a todas
tus habitaciones de una sola vez, poniendo:

  Class Habitacion has luz;

Si usas otras librerias (Facilitar, por ejemplo) esta clase
ya estar declarada y no necesitars la lnea anterior.

    Conexiones
    ----------
    
    Las puertas que se implementan en esta libreria son de la clase
    Conexion. No necesitas declarar apenas propiedades ni atributos en
    un objeto de tipo Conexion.  En particular, no necesitas escribir
    nada de puerta_a ni direcc_puerta. Tampoco necesitas darle el
    atributo "puerta", ni "abrible". Todas las puertas creadas con
    esta clase son abribles. De todas formas, es probable que quieras,
    al menos darle una descripcin y un nombre (sin nombre el jugador
    no podra referirse a ella y no podra abrirla!). Por tanto, un
    ejemplo sera:
    
      Conexion granVerja "gran verja"
      with nombre 'gran' 'verja' 'hierro',
    	 descripcion "Es una gran verja de hierro.",
      has femenino;
    
    Si lo deseas, puedes darle el atributo escenario para que el juego
    no la mencione. Por defecto, las Conexiones tienen activados los
    atributos "puerta", "abrible" y "estatico" (esta ltima implica
    que el jugador no puede coger la puerta y llevrsela). Si
    necesitas que alguna puerta concreta de tu juego no sea abrible
    (qu sentido tendra?) o no sea esttica, debers desactivar
    estos atributos en la declaracin del objeto, mediante algo como:
    "has femenino ~estatico;" (el ~ delante de un atributo lo
    desactiva).
    
    NOTA: nunca des a una puerta el atributo "oculto" o el jugador no
    podr pasar por ella ni siquiera si est abierta.

    Habitaciones
    ------------
    
    Te preguntars "Si no le pongo puerta_a, ni direcc_puerta, ni
    siquiera incluyo el objeto dentro de una localidad... cmo
    demonios va a saber el juego dnde debe aparecer esta puerta?"
    
    La respuesta es que una conexin existe para conectar Habitaciones
    por tanto deber haber dos Habitaciones en el juego cuyas salidas
    lleven hacia esta verja. Por ejemplo:
    
      Habitacion Cementerio "Cementerio"
      with descripcion "Ttrico.",
    	   al_s granVerja;
    
      Habitacion Carretera "Carretera General"
      with descripcion "Al norte est el cementerio.",
    	   al_n granVerja;
    
    Y esto es todo. 
    
    Inicializacion
    --------------
    
    En tu rutina Inicializar debes incluir una linea que diga:
    
      InicializarConexiones();
    
    o de lo contrario las puertas no aparecern en los lugares
    adecuados.
    
    Como funciona
    -------------
    
    Cuando llamas a InicializarConexiones(), esta rutina rastrea todas
    las Habitaciones de tu juego, comprobando si sus salidas llevan a
    un objeto de tipo Conexion. Si es as, almacenarn en unas
    propiedades de la conexin qu lugares conecta y en qu
    direcciones.
    
    El objeto Conexion tiene unas propiedades esta_en, puerta_a y
    direcc_puerta ya pre-programadas de modo que usa los valores que
    InicializarConexiones() ha cargado para hacer que la puerta
    responda "normalmente" a la libreria.
    
    InicializarConexiones hace una pequea comprobacin final,
    rastreando todos los objetos de tipo Conexion de tu juego y
    comprobando que todos ellos conectan dos Habitaciones. Si
    encuentra alguno que no conecta nada o que solo conecta una
    Habitacion, o que conecta ms de dos, mostrar un mensaje de
    error. Este mensaje no aparece al compilar el juego, sino cuando
    lo ejecutas (ya que el mensaje se produce cuando
    InicializarConexiones es ejecutada).
    
    Comprueba al iniciar el juego si aparecen estos errores. Si es
    as, debes corregirlos pues de lo contrario, aunque puedes seguir
    jugando, es muy probable que al atravesar una de esas puertas
    defectuosas aparezcas en lugares inesperados.

    Detalles avanzados
    ------------------
  
    Una vez inicializada cada conexin, tendr en las propiedades
    "lado1" y "lado2" las localidades que conecta, y en las
    propiedades "direcc1" y "direcc2", las direcciones en las que la
    puerta puede verse desde "lado1" y "lado2", respectivamente.

    Puedes usar estas propiedades dentro de las rutinas de la puerta,
    para conseguir, algunos efectos, como por ejemplo:

    Conexion verja "verja"
    with nombre 'verja',
         descripcion [;
            print "La verja parece conducir ";
            if (localizacion == self.lado1)
               print (al) self.lado2;
            else print (al) self.lado1;
            ".";
         ],
    has femenino;

    Advertencia! No intentes imprimir (name) direcc1, o (al) direcc1
    tratando de obtener algo como "al norte", porque las direcciones
    no son objetos, sino propiedades. Es decir, direcc1 contendr algo
    como al_n, en lugar de obj_n, y al_n no tiene nombre qu mostrar,
    mientras que obj_n si tiene nombre ("norte").

    No obstante, puedes usar print (IdiomaDirecciones) direcc1; que
    que escribir "norte" si el parmetro es al_n, etc...

Mira la demo. Modificala en los lugares donde aparecen comentarios
para probar configuraciones de puertas erroneas y comprobar cmo
aparecen los mensajes de error al iniciar el juego.

 (c) 2001 Zak