5º- Abriendo puertas:

Tocando resortes:

Sin abandonar el editor 'World Editor' vamos a ver como podemos hacer para que una de las puertas que hayamos creado (porque se supone que ya sabemos crear puertas) sólo se abra en ciertas condiciones y no como hasta ahora hemos visto en el tutorial de 'World Editor' que se abrían siempre que alguien se acercaba a ellas, incluido los enemigos.


Para comenzar con algo sencillo vamos a hacer que la puerta se abra siempre y cuando el personaje haya tocado cierto punto del escenario previamente, punto que no tenemos porque poner al lado de la puerta, sino que puede estar en la otra punta del escenario, de la habitación o donde quieras.

El objetivo no es que se abra la puerta al tocar este punto, sino que una vez tocado este punto, cuando el jugador se acerque a la puerta, esta se abrirá siempre.

Para comenzar podemos crear alguna especie de resorte que representará nuestro punto, si quieres puedes hacer un pequeño cubo que sobresalga de una pared sin animación y sin más complicaciones.




Ahora vamos a crear nuestro primer sistema de comandos de Entidad 3D para controlar si el jugador ha tocado o no el resorte y en función de eso, que la puerta se abra o no. Para ello añadimos la entidad 'Command' y la colocaremos en la posición donde hemos colocado el resorte. Si editas las propiedades de esta entidad 'Command' (seguramente se llamará 'Command1') verás un parámetro llamado 'CommandsFile' que rellenaremos con un nombre cualquiera, pero que tenga algún sentido con lo que estamos haciendo, por ejemplo 'tocaresorte.ini' (sin las comillas). Este nombre hará referencia a un fichero llamado 'tocaresorte.ini' que construiremos nosotros mismos con algún editor de textos ANSI tipo Notepad o similar.







Este fichero con extensión .ini lo crearemos en la carpeta 'Comandos' de Entidad 3D.



¿ Que hay que poner dentro de este fichero ?... pues todos los comandos y condiciones que queramos que se procesen cuando el jugador alcance la posición donde hemos colocado la entidad 'Command1'. Existen numerosos comandos que se describen con detalle más adelante, pero de momento vamos a centrarnos sólo en los que nos interesan para lo que queremos realizar.

Pues bien, editamos nuestro aún vacío fichero 'tocaresorte.ini' y lo rellenamos con lo siguiente:


ACCI PONE tocoresorte=1

... y salvamos el fichero. Así de simple. En esta ocasión estamos utilizando el comando 'PONE' para establecer la variable 'tocoresorte' (nombre que nos hemos inventado) a 1 ya que en Entidad 3D cualquier variable está 0 al comenzar el juego. El 'ACCI' siempre hay que ponerlo antes de un comando.

De esta forma cuando el jugador alcance la posición de nuestra entidad 'Command1' se procesará el fichero de comandos 'tocaresorte.ini' con lo que llevará siempre a ponerse a 1 la variable 'tocoresorte'.

¿Y ahora cómo hacemos para que la puerta se abra si el jugador se acerca a ella pero siempre y cuando la variable 'tocoresorte' valga 1?. Pues no nos queda más remedio que hacer otro fichero .ini y asociarlo a la entidad 'Door' que tengamos para esta puerta en cuestión. Editamos esta entidad, que en mi ejemplo se llama 'Door2', y en la casilla del parámetro llamado 'CommandsFile' ponemos por ejemplo 'abre_puerta2.ini'.







Ahora sólo nos queda crear un fichero llamado 'abre_puerta2.ini' en la carpeta 'Comandos' de Entidad 3D. Dentro de este fichero pondremos lo siguiente:


    IF COND tocoresorte=1
      ACCI TEXT Abriendo puerta
    ELSE
      ACCI TEXT No has tocado el resorte
    ENDIF

Como ves he comenzado estableciendo una condición con 'IF COND tocoresorte=1', por lo que todo lo que vaya detrás de esta linea y hasta el indicativo 'ENDIF' afecta a esta condición. En este caso también he utilizado el indicativo 'ELSE' para presentar un mensaje en el caso de que el jugador no haya tocado el resorte.

O sea, que si se cumple la condición se procesarán los comandos entre el 'IF COND' y el 'ELSE', mientras que si no se cumple la condición se procesarán los comandos entre 'ELSE' y 'ENDIF'.

Los comandos 'TEXT' que he puesto son para poner un mensaje en la parte superior de la pantalla. No te olvides nunca de poner un 'ACCI' delante de cada comando.

En nuestro ejemplo la condición se cumplirá siempre y cuando la variable 'tocoresorte' valga 1, además al ser la primera condición de esta fichero .ini, Entidad 3D también lo tomará para decidir abrir la puerta o no.

En resumen, cuando el jugador se acerque a la puerta y la variable 'tocoresorte' valga 1, se abrirá la puerta al mismo tiempo que se verá el mensaje 'Abriendo puerta'. Pero cuando el jugador se acerque a la puerta y la variable 'tocoresorte' no valga 1, pues se presentará el mensaje 'No has tocado el resorte' y la puerta no se abrirá.


Quizás te asalte una cuestión: ¿ Como afectan estos sistemas de comandos a los enemigos ?, ¿ Podría un enemigo llegar a tocar el resorte y luego dirigirse a la puerta y abrirla ?. Pues no, el caso es que los comandos de Entidad 3D no tienen efecto si un enemigo alcanza la posición de una entidad con comandos asociados.

Ya, pero y si el jugador toca el resorte (por lo tanto la variable 'tocoresorte' ya vale 1) y después un enemigo se acerca a la puerta... ¿ la abriría ? ... pues tampoco. La única forma que tendría un enemigo de abrir una puerta es que esa puerta no tenga ningún fichero de comandos .ini asociado.


El funcionamiento de los ascensores o plataformas móviles (entidades 'MovigPlat') es exactamente igual que el de las puertas, sólo que toman el resultado de la primera condición del fichero .ini asociado para mover la plataforma o no.





Utilizando llaves:

Ahora vamos a ver como podemos hacer para que una puerta sólo se abra si el jugador posee la llave correcta.


Para ello vamos a utilizar el objeto tarjeta, que hemos definido en el anterior capítulo de este tutorial, como llave de acceso a una puerta.

También vamos a utilizar la misma puerta que hemos utilizado con el ejemplo del resorte, ya que lo que vamos a hacer es simplemente cambiar los comandos que tenemos en el fichero 'abre_puerta2.ini' que como recordarás esta asociado a la entidad 'Door' de esta puerta.

Abrimos el fichero 'abre_puerta2.ini' con un editor, borramos todo lo que hay e introducimos lo siguiente:


    IF COND 2_tarjeta.act=1
      ACCI TEXT Abriendo puerta
    ELSE
      ACCI TEXT No tienes la tarjeta
    ENDIF

Con la condición '2_tarjeta.act=1' lo que estamos preguntando es si el jugador lleva en su inventario de objetos un objeto llamado '2_tarjeta.act', si lleva uno, pues la condición se cumple, si no, pues no se cumple.

Pero piensa una cosa, si el jugador lleva más de una de estas tarjetas, la condición no se cumplirá y la puerta no se abrirá, para solucionar esto tendrías que cambiar la linea del 'IF' anterior por esta:


    IF COND 2_tarjeta.act>0


Diversas variaciones:

A continuación vamos a ver diferentes variaciones de lo que hemos visto en este capítulo para que te hagas una idea de la cantidad de combinaciones que puedes realizar con Entidad 3D si utilizas de forma correcta e ingeniosa diversos comandos y condiciones.


La puerta sólo se abre con la llave pero si previamente se ha tocado el resorte:

    IF COND tocoresorte=1 COND 2_tarjeta.act=1
      ACCI TEXT Abriendo puerta
    ELSE
      ACCI TEXT Acceso denegado
    ENDIF

Igual a lo anterior pero además quiero hacer sonar un fichero de audio .MP3 cuando no se abra la puerta:

    IF COND tocoresorte=1 COND 2_tarjeta.act=1
      ACCI TEXT Abriendo puerta
    ELSE
      ACCI TEXT Acceso denegado
      ACCI SONIDO_FX alarma.wav 90
    ENDIF
Para este ejemplo has de tener en la carpeta 'Wav' de Entidad 3D un fichero de sonido llamado 'alarma.mp3'.

De hecho si tienes un fichero llamado 'alarma.wav' también funcionará, o si es 'alarma.mod' también, ya que si te has fijado el comando 'SONI' no necesita la extensión del fichero de sonido, Entidad 3D busca cualquier fichero de sonido 'alarma.' en la carpeta 'Wav' y lo hace sonar.


La puerta sólo se abre con una llave de un solo uso, cuando se abra la puerta, la llave ha de desaparecer del inventario del jugador:

    IF COND 5_llave.act=1
      ACCI TEXT Llave correcta
      ACCI QINV 5_llave.act
    ELSE
      ACCI TEXT No llevas la llave
    ENDIF
Si el jugador lleva por ejemplo 5 llaves, sólo le desaparecerá una cada vez que abra la puerta.


Un ascensor sólo se mueve si el jugador lleva tres bolas de energía, bolas que han de desaparecer del inventario del jugador al utilizar el ascensor:

    IF COND 4_bola.act=3
      ACCI TEXT Subiendo planta
      ACCI QTIN 4_bola.act
    ELSE
      ACCI TEXT No tienes las 3 bolas
    ENDIF
Si se abre la puerta, al jugador le desaparecen todas las bolas que pueda llevar en el inventario.


El tema del ascensor y las bolas quiero complicarlo más diciendo al jugador la cantidad de bolas que le faltan en el caso de que no tenga las tres bolas:

    IF COND 4_bola.act=3
      ACCI TEXT Subiendo planta
      ACCI QTIN 4_bola.act
    ELSE
      IF COND 4_bola.act=0
        ACCI TEXT Te faltan 3 bolas
      ENDIF
      IF COND 4_bola.act=1
        ACCI TEXT Te faltan 2 bolas
      ENDIF
      IF COND 4_bola.act=2
        ACCI TEXT Solo te falta una bola
      ENDIF
    ENDIF

Quiero realizar dos condiciones distintas, además de controlar lo de la puerta con la tarjeta, quiero advertir al jugador de la necesidad de un objeto en la habitación que quiere entrar:

    IF COND 2_tarjeta.act=1
      ACCI TEXT Abriendo puerta
    ELSE
      ACCI TEXT No tienes la tarjeta roja
    ENDIF

    IF COND 7_cristal.act=0
      ACCI TEXT Sin el cristal no podras sobrevivir
    ENDIF
Estas dos condiciones 'IF COND', y las que quieras, pueden ir en el mismo fichero .ini sin problemas.