CAAD
http://foro.caad.es/

[fi.js] Habitación sin luz
http://foro.caad.es/viewtopic.php?f=18&t=5692
Página 1 de 1

Autor:  edlobez [ 27 Sep 2014 21:59 ]
Asunto:  [fi.js] Habitación sin luz

Buenas,

¿Cómo podría crear una habitación oscura?, de tal forma que cuando "apaguemos la linterna" no se vea ningún objeto de los que haya en la habitación.
Por ahora tengo esto, que me permite mostrar o no la descripción según haya luz o no;
Código:
////////////////////////////////////////////////////
// El desvan
////////////////////////////////////////////////////
var locDesvan = ctrl.lugares.creaLoc ("Desván",
                   ["sala", "habitacion", "desvan", "desván"],
                   "Aquí no se ve nada."
               );

locDesvan.modificaDesc = function () {
      // Si está la linterna encendida
      if ( objLinterna.encendida) {
         locDesvan.desc = "La sala está totalmente vacía, no tienes ni idea de para que se ideó en su principio \
andaban sobrados de presupuesto en su momento.";      
      }
      else {
         locDesvan.desc = "Aquí no se ve nada, no hay luz.";      
      }
      
};


Pero no sé como podría ocultar todos los objetos que haya en esa habitación. Teniendo en cuenta que si tenemos algo en el inventario y lo soltamos en la sala oscura dejaremos de verlo.

Autor:  edlobez [ 27 Sep 2014 22:56 ]
Asunto:  Re: [fi.js] Habitación sin luz

Bueno he conseguido algo más, he creado una habitación paralela al desván, llamado desván oscuro, al que mando todos los objetos que están en esa habitación;

Código:
////////////////////////////////////////////////////
// El desvan
////////////////////////////////////////////////////
var locDesvan = ctrl.lugares.creaLoc ("Desván",
                   ["sala", "habitacion", "desvan", "desván"],
                   "Aquí no se ve nada."
               );

locDesvan.modificaDesc = function () {
      // Si está la linterna encendida
      if ( objLinterna.encendida) {
         locDesvan.desc = "La sala está totalmente vacía, no tienes ni idea de para que se ideó en su principio andaban sobrados de presupuesto en su momento.";
         if ( locDesvanOscuro.objs.length > 0 ) {
            // Movemos todos los objetos al desvan
            for(var i = 0; i < locDesvanOscuro.objs.length; i++ ) {
               locDesvan.objs[i].mueveA ( locDesvan );            
            }                     
         }       
      }
      else {
         locDesvan.desc = "Aquí no se ve nada, no hay luz.";// + " numero de objetos" + locDesvan.objs[0].id;         
         if ( locDesvan.objs.length > 0 ) {
            // Movemos todos los objetos al desván oscuro
            for(var i = 0; i < locDesvan.objs.length; i++ ) {
               locDesvan.objs[i].mueveA ( locDesvanOscuro );            
            }                     
         }       
      }
      
};


Siempre que apague o encienda la linterna llamaré a la función locDesvan.modificaDesc para ocultar o no los objetos, pero me falta ocultar los objetos que suelte el jugador cuando la habitación está oscura.

Autor:  baltasarq [ 29 Sep 2014 09:35 ]
Asunto:  Re: [fi.js] Habitación sin luz

Hola,

El problema es que eso solamente te funcionará cuando el jugador haga mirar. Creo que debes usar la reacción preAction() del jugador. Supongo que tendrás tu propio jugador, solo tienes que añadirle un preAction, que se ejecutará antes de cualquier acción. Si devuelve algo, se visualiza ese algo y punto.

Código:
var jugador = personas.creaPersona(...

jugador.preAction() = function() {
    var toret = "";

    if ( ctrl.lugares.devLocActual() == locDesvan
        && ( !ctrl.isPresent( objLinterna )
            || !objLinterna.encendida ) )
    {
        toret = "Está muy oscuro y no puedes ver nada. Retrocedes a las escaleras.";
        ctrl.goto( locEscaleras );
    }

    return toret;
}


Con un código como este, siempre que no tengas la linterna o no esté encendida en el desván, bajas las escaleras.

Autor:  edlobez [ 29 Sep 2014 11:52 ]
Asunto:  Re: [fi.js] Habitación sin luz

baltasarq escribió:
Hola,

El problema es que eso solamente te funcionará cuando el jugador haga mirar. Creo que debes usar la reacción preAction() del jugador. Supongo que tendrás tu propio jugador, solo tienes que añadirle un preAction, que se ejecutará antes de cualquier acción. Si devuelve algo, se visualiza ese algo y punto.

Código:
var jugador = personas.creaPersona(...

jugador.preAction() = function() {
    var toret = "";

    if ( ctrl.lugares.devLocActual() == locDesvan
          && ( !ctrl.isPresent( objLinterna )
            || !objLinterna.encendida ) )
    {
        toret = "Está muy oscuro y no puedes ver nada. Retrocedes a las escaleras.";
        ctrl.goto( locEscaleras );
    }

    return toret;
}


Con un código como este, siempre que no tengas la linterna o no esté encendida en el desván, bajas las escaleras.



Hola, llevo un rato probando el código, pero me falla. He probado de varios puntos del código, después de crear los objetos linterna, las estancias, justo después de crear al jugador... y nada.
He comentado diferentes líneas, a ver si alguna estaba incorrecta, y sólo puedo ejecutar la aventura si comento toda la función entera. Te pego como lo tengo actualmente;
Código:

// Creamos un preAction para el jugador, de tal forma que en el desván sólo puede
// ... entrar con la linterna encendida
var jugador = ctrl.personas.creaPersona ("Arturo", ["jugador"],
            "Encerrado en la oficina, como no espabiles pasarás toda la noche en ella.",
            locVestibulo
);

jugador.preAction() = function() {
    var toret = "";

    if ( ctrl.lugares.devlocActual() == locDesvan
   && ( !ctrl.isPresent( objLinterna ) || !objLinterna.encendida ) )
    {
        toret = "Está muy oscuro y no puedes ver nada. Retrocedes a la sala superior.";
        ctrl.goto( locSalaSuperior  );
    }
    return toret;
   
};


Hice una prueba del tipo:

Código:
jugador.preAction() = function() {
       
    return "Vas a realizar una acción.";
};


Y se me queda planchao. mmm :roll: ya no se que más mirar,

Autor:  dddddd [ 29 Sep 2014 12:03 ]
Asunto:  Re: [fi.js] Habitación sin luz

Sin mirar más a fondo, lo primero que salta a la vista es que
Código:
jugador.preAction() = function() {
debería ser
Código:
jugador.preAction = function() {

Autor:  edlobez [ 29 Sep 2014 12:57 ]
Asunto:  Re: [fi.js] Habitación sin luz

dddddd escribió:
Sin mirar más a fondo, lo primero que salta a la vista es que
Código:
jugador.preAction() = function() {
debería ser
Código:
jugador.preAction = function() {


Gracias, con esta modificación ya he conseguido hacerlo funcionar. Lo que pasa es que sólo es efectivo cuando ya estoy dentro de la habitación, así que he tenido que tener en cuenta las condiciones en el preGo de la sala anterior:

Código:
// Al salir hacia el desvan debemos tener si tenemos linterna o no
locSalaSuperior.preGo = function() {
   var s = parser.sentencia;
   var dest = locSalaSuperior.devSalida ( s.term1 );
   var jugador = ctrl.personas.devJugador();   
   var toret = "";
   
   if ( dest !== null) {
      if ( dest === locDesvan ) {
         //ctrl.print ("El destino: " + dest.id + " s.term1: " + s.term1);
         if ( !jugador.tiene( objLinterna )
            || !objLinterna.encendida) { // Si no tenemos la linterna y no está encendida            
            toret = "Al entrar en el desván ves que está muy oscuro y no puedes ver nada. Retrocedes a la sala superior.";      
         }
         else {
            // Vamos al desván
            ctrl.goto(locDesvan);      
         }   
      }
      else {
         // Debo coger la dirección solicitada   
         ctrl.goto ( dest );
      }
   }
   else {
      toret = "Por ahí no hay salida.";   
   }   

   return toret;

};

...
...

// Creamos un preAction para el jugador, de tal forma que en el desván sólo puede
// ... entrar con la linterna encendida

jugador.preAction = function() {
    var toret = "";

    if ( ctrl.lugares.devLocActual() == locDesvan
      && ( !ctrl.isPresent( objLinterna ) || !objLinterna.encendida ) )
    {
        toret = "Está muy oscuro y no puedes ver nada. Retrocedes a la sala superior.";
        ctrl.goto( locSalaSuperior );
    }
    return toret;
       
};


mmm y ahora que me doy cuenta, creo que no he previsto el caso de entrar en el desvan, soltar la linterna y salir fuera....

Autor:  baltasarq [ 30 Sep 2014 09:21 ]
Asunto:  Re: [fi.js] Habitación sin luz

Hola,

Joé, vaya metedura de pata, efectivamente, no tiene sentido preAction() = function()..., tiene que ser sin el primer par de paréntesis. Ainnnsss... Desgraciadamente, estos días estoy sin internet en casa.

edblopez escribió:
mmm y ahora que me doy cuenta, creo que no he previsto el caso de entrar en el desvan, soltar la linterna y salir fuera....


Efectivamente, por eso yo te diría que movieras el código del preGo() de locSalaSuperior al preExamine() de locDesvan. Otra mejora es no utilizar jugador.tiene(), sino ctrl.isPresent(), que controla si el jugador lleva la linterna, o si esta está en la localidad actual (un atajo conveniente de objLintera.owner === ctrl.lugares.devLocActual() || objLinterna.owner === ctrl.personas.devJugador()).

Por otra parte, todo eso ya lo haces en el preAction() del jugador. Y la alternativa es repetir el código. Podemos invocar dicha función, y ver si devuelve algo. En ese caso, se ha llegado con la linterna o algo así.

Código:
locDesvan.preExamine = function() {
    var toret = ctrl.personas.devJugador().preAction();

    if ( toret === "" ) {
        toret = locDesvan.desc;
    }

    return toret;
}


Por otra parte, tendríamos un problema en el caso de que el jugador apagase la linterna estando en el desván, porque en ese caso se le llevaría a locSalaSuperior y no podría volver para encenderla.

Código:
objLinterna.preApaga = function() {
    var toret = "La has apagado.";

    if ( ctrl.lugares.devLocActual() === locDesvan ) {
        toret = "¿Con lo oscuro que está?¡Ni de broma!";
    } else {
        objLinterna.encendida = false;
    }

    return toret;
}


Bueno, enciende y apaga no son acciones que "traiga" la librería, supongo que las habrás creado tú.

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