CAAD

Comunidad de Aventuras Conversacionales y Relatos Interactivos
Fecha actual 12 Dic 2017 21:00

Todos los horarios son UTC + 1 hora




Nuevo tema Responder al tema  [ 7 mensajes ] 
Autor Mensaje
NotaPublicado: 27 Sep 2014 21:59 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 09 Feb 2012 20:33
Mensajes: 855
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.

_________________
Te quiero... lo siento Yoda sólo tenemos café.


Arriba
 Perfil  
 
NotaPublicado: 27 Sep 2014 22:56 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 09 Feb 2012 20:33
Mensajes: 855
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.

_________________
Te quiero... lo siento Yoda sólo tenemos café.


Arriba
 Perfil  
 
NotaPublicado: 29 Sep 2014 09:35 
Desconectado
Semimomio
Semimomio
Avatar de Usuario

Registrado: 23 Abr 2004 08:49
Mensajes: 2890
Ubicación: España (Galicia)
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.

_________________
-- Baltasar, el arquero


Arriba
 Perfil  
 
NotaPublicado: 29 Sep 2014 11:52 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 09 Feb 2012 20:33
Mensajes: 855
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,

_________________
Te quiero... lo siento Yoda sólo tenemos café.


Arriba
 Perfil  
 
NotaPublicado: 29 Sep 2014 12:03 
Desconectado
Implementador
Implementador

Registrado: 13 Feb 2005 18:57
Mensajes: 1855
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() {


Arriba
 Perfil  
 
NotaPublicado: 29 Sep 2014 12:57 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 09 Feb 2012 20:33
Mensajes: 855
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....

_________________
Te quiero... lo siento Yoda sólo tenemos café.


Arriba
 Perfil  
 
NotaPublicado: 30 Sep 2014 09:21 
Desconectado
Semimomio
Semimomio
Avatar de Usuario

Registrado: 23 Abr 2004 08:49
Mensajes: 2890
Ubicación: España (Galicia)
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ú.

_________________
-- Baltasar, el arquero


Arriba
 Perfil  
 
Mostrar mensajes previos:  Ordenar por  
Nuevo tema Responder al tema  [ 7 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 2 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:  
Desarrollado por phpBB® Forum Software © phpBB Group
Traducción al español por Huan Manwë para phpBB-Es.COM