diff --git a/administradorDeEnemigos.wlk b/administradorDeEnemigos.wlk index 7d00de2..4e777e8 100644 --- a/administradorDeEnemigos.wlk +++ b/administradorDeEnemigos.wlk @@ -16,26 +16,26 @@ object administradorDeEnemigos { const property cantDeEnemigosPorLinea= [linea1,linea2,linea3,linea4,linea5] // Métodos de Consulta method enemigos() = enemigos -// method columnaOcupada() = enemigos.filter({ enemigo => enemigo.position().x() == 14 }).size() == 5 // Verifica si la columna de posición x=14 está ocupada por 5 enemigos method nombre() = nombreEnemigo - method pocosEnemigosEnPantalla() = administradorDeOleadas.enemigosVivos() < maxEnemigosEnPantalla + method pocosEnemigosEnPantalla() = cantDeEnemigosPorLinea.sum({linea => linea.cantEnemigos()}) < maxEnemigosEnPantalla // Genera un nuevo nombre para los enemigos method sumarEnemigo() { nombreEnemigo += 1 } // Genera un nuevo enemigo del tipo especificado, si hay espacio en la columna method generarEnemigo(tipo) { - if (/* not self.columnaOcupada() && */ self.pocosEnemigosEnPantalla()) { - const y = 0.randomUpTo(5).truncate(0) + if (self.pocosEnemigosEnPantalla()) { + + const y = 0.randomUpTo(4.9999).truncate(0) + const posicionTemporal = new MutablePosition(x = 14, y=y) + var nombreParaEnemigo = self.nombre() /* Solo genera el enemigo si la posición temporal está vacía */ if (game.getObjectsIn(posicionTemporal).isEmpty()) { - nombreParaEnemigo = new Slime(position = posicionTemporal, tipo = tipo) enemigos.add(nombreParaEnemigo) /* Añade el nuevo enemigo a la colección de enemigos activos */ - y.toString().printString() self.sumarEnemigo() /* Incrementa el contador de enemigos en el administrador */ administradorDeOleadas.sumarEnemigo() /* Notifica al administrador de oleadas */ self.aumentarLinea(y) diff --git a/administradorDeJuego.wlk b/administradorDeJuego.wlk index d70979c..7434507 100644 --- a/administradorDeJuego.wlk +++ b/administradorDeJuego.wlk @@ -197,7 +197,7 @@ object configuracion { const tiemposProyectiles = 600 const tiempoDisparo = 3000 const tiempoDinero = 750 - const tiempoMoverEnemigo = 1000 + const tiempoMoverEnemigo = 960 //ticks que usa el juego const tickParaMoverEnemigos = game.tick(tiempoMoverEnemigo,{administradorDeEnemigos.moverEnemigos()},false) @@ -205,8 +205,8 @@ object configuracion { const tickParaDisparar= game.tick(tiempoDisparo, { administradorDeMagos.disparar()},false) const tickParaMoverYColisionarDisparos= game.tick(tiemposProyectiles, { administradorDeProyectiles.moverProyectiles() administradorDeProyectiles.impactarProyectiles() },false) - const tickParaCambiarFrames= game.tick((tiemposProyectiles/3)-5, {administradorDeProyectiles.cambiarFrame()},false) - const tickParaCambiarFramesEnemigos= game.tick((tiempoMoverEnemigo/3)-5, {administradorDeEnemigos.cambiarFrame()},false) + const tickParaCambiarFrames= game.tick((tiemposProyectiles/3), {administradorDeProyectiles.cambiarFrame()},false) + const tickParaCambiarFramesEnemigos= game.tick((tiempoMoverEnemigo/3), {administradorDeEnemigos.cambiarFrame()},false) // El reproductor de música es constante; solo cambia el archivo de sonido method iniciarMusica() {sonidoPartida.iniciarMusica()} diff --git a/casa.wlk b/casa.wlk index 5f30ee8..d0d85d7 100644 --- a/casa.wlk +++ b/casa.wlk @@ -23,9 +23,9 @@ object casa { method recibirDanio(fila) { vida -= 1 - administradorDeEnemigos.enemigos().filter( - { enemigo => enemigo.position().y() == fila } - ).forEach({ enemigo => enemigo.matarSlime() }) + if (administradorDeEnemigos.hayEnemigoFila(fila)){ + administradorDeEnemigos.enemigos().filter( { enemigo => enemigo.position().y() == fila } ).forEach({ enemigo => enemigo.matarSlime() }) + } // elimina enemigos de la misma fila self.sonidoDanio().volume(0.3) if (vida <= 0) { diff --git a/slime.wlk b/slime.wlk index 52f3c96..4fde4af 100644 --- a/slime.wlk +++ b/slime.wlk @@ -16,51 +16,61 @@ class Slime { var property enMovimiento = true // Indica si el slime puede moverse var property vida = tipo.vida() const property danio = tipo.danio() - var imagen = tipo.imagenesNormales().get(0) - var frame=0 + var imagen = tipo.imagenesNormales().get(0) + var frame = 0 + // Métodos de cambio de imagen method cambiarFrame() { imagen = tipo.imagenesNormales().get(frame) - if(frame<2) {frame+=1} + if (frame < 2) { frame += 1 } } + // Métodos de visualización y estado method frenarEnemigo() = true method position() = position method image() = imagen method sePuedeSuperponer() = false - var accion=tipo.moverse() - method cambiarAccion(accionNueva){ - accion=accionNueva + var accion = tipo.moverse() + + method cambiarAccion(accionNueva) { + accion = accionNueva } + // Movimiento del Slime - method movete() {imagen=tipo.imagenesNormales().get(0) + method movete() { + imagen = tipo.imagenesNormales().get(0) self.estaMuerto() - frame=1 - accion.apply(self)} + frame = 1 + accion.apply(self) + } + // Lógica para frenar el movimiento - method meFreno(){ + method meFreno() { const posicionEnFrente = new MutablePosition(x = self.position().x() - 1, y = self.position().y()) const objetoEnCeldaEnFrente = game.getObjectsIn(posicionEnFrente) - objetoEnCeldaEnFrente.forEach({objeto => objeto.recibeDanioMago(danio,self)}) + objetoEnCeldaEnFrente.forEach({ objeto => objeto.recibeDanioMago(danio, self) }) } - method meFreno(estado) {self.enMovimiento(estado) return true} + method meFreno(estado) { self.enMovimiento(estado); return true } // Métodos para recibir daño - method recibeDanioMago(_danio,enemigo){enemigo.cambiarAccion(enemigo.tipo().esperar()) return false} + method recibeDanioMago(_danio, enemigo) { + enemigo.cambiarAccion(enemigo.tipo().esperar()) + return false + } - method recibeDanioEnemigo(_danio,proyectil) { - imagen=tipo.imagenesRecibeDanio().get(frame) + method recibeDanioEnemigo(_danio, proyectil) { + imagen = tipo.imagenesRecibeDanio().get(frame) self.vida(self.vida() - _danio) tipo.accionAlRecibirDanio().apply(self) proyectil.destruirse() return true } - method combinarProyectil(_tipo){return false} + method combinarProyectil(_tipo) { return false } // Comprobación de estado de vida y eliminación - method estaMuerto() {tipo.estaMuerto().apply(self)} + method estaMuerto() { tipo.estaMuerto().apply(self) } method sinVida() = vida <= 0 method llegoACasa() = self.position().x() == 0 @@ -71,92 +81,102 @@ class Slime { game.removeVisual(self) administradorDeEnemigos.eliminarEnemigo(self) } - method tipoProyectil()=false - + method tipoProyectil() = false } // =============================== // Tipos de Slime: Variantes // =============================== class Tipo{ - const property danio + const property danio const property vida method desplazamiento() = 1 const property imagenesNormales const property imagenesRecibeDanio const property imagen - method esperar()={slime=> - const posicionEnFrente = new MutablePosition(x = slime.position().x()-1, y = slime.position().y()) - const objetoEnCeldaSiguiente2 = game.getObjectsIn(posicionEnFrente) - if(!objetoEnCeldaSiguiente2.any({objeto=>objeto.frenarEnemigo()})) slime.cambiarAccion(self.moverse()) + + + method esperar()={ + slime=> + const posicionEnFrente = new MutablePosition(x = slime.position().x()-1, y = slime.position().y()) + const objetoEnCeldaSiguiente = game.getObjectsIn(posicionEnFrente) + if(!objetoEnCeldaSiguiente.any({objeto=>objeto.frenarEnemigo()})) slime.cambiarAccion(self.moverse()) } - method moverse()={slime => - slime.position().goLeft(slime.tipo().desplazamiento()) - slime.meFreno() - } - method atacar()={slime=> - const posicionEnFrente = new MutablePosition(x = slime.position().x()-1, y = slime.position().y()) - const objetoEnCeldaSiguiente = game.getObjectsIn(posicionEnFrente) - objetoEnCeldaSiguiente.forEach({objeto=>objeto.recibeDanioMago(danio,slime)}) - const objetoEnCeldaSiguiente2 = game.getObjectsIn(posicionEnFrente) - if(!objetoEnCeldaSiguiente2.any({objeto=>objeto.frenarEnemigo()})) slime.cambiarAccion(self.moverse()) + + method moverse()={ + slime => + slime.position().goLeft(slime.tipo().desplazamiento()) + slime.meFreno() } - method estaMuerto()= {slime=> - if (slime.llegoACasa()||slime.position().y()>4||slime.position().y()<0) { - casa.recibirDanio(slime.position().y()) - slime.eliminar() - } else if (slime.sinVida()) { - slime.eliminar() - } - return slime.sinVida() || slime.llegoACasa() + + method atacar()={ + slime=> + const posicionEnFrente = new MutablePosition(x = slime.position().x()-1, y = slime.position().y()) + const objetoEnCeldaSiguiente = game.getObjectsIn(posicionEnFrente) + if(!objetoEnCeldaSiguiente.any({objeto=>objeto.frenarEnemigo()})) slime.cambiarAccion(self.moverse()) + objetoEnCeldaSiguiente.forEach({objeto=>objeto.recibeDanioMago(danio,slime)}) + + } + + method estaMuerto()= { + slime=> + + if (slime.sinVida() || slime.llegoACasa()) { + if (slime.llegoACasa()) { + casa.recibirDanio(slime.position().y()) + } + slime.eliminar() + } + return slime.sinVida() || slime.llegoACasa() } - method accionAlRecibirDanio() ={slime => return } + + method accionAlRecibirDanio() ={slime => return } } - object slimeBasico inherits Tipo(danio= 25, vida=120, imagen="s.slimeBase_01.png", imagenesNormales=["s.slimeBase_01.png","s.slimeBase_02.png","s.slimeBase_03.png"],imagenesRecibeDanio=["s.slimeBaseDanio_01.png","s.slimeBaseDanio_02.png","s.slimeBaseDanio_03.png"]) { - } +// =============================== +// Definición de los Slimes Específicos +// =============================== - object slimeGuerrero inherits Tipo(danio= 25, vida=250, imagen="s.slimeGuerrero_01.png",imagenesNormales=["s.slimeGuerrero_01.png","s.slimeGuerrero_02.png","s.slimeGuerrero_03.png"],imagenesRecibeDanio=["s.slimeGuerreroDanio_01.png","s.slimeGuerreroDanio_02.png","s.slimeGuerreroDanio_03.png"]){ - } +object slimeBasico inherits Tipo(danio = 25, vida = 120, imagen = "s.slimeBase_01.png", + imagenesNormales = ["s.slimeBase_01.png", "s.slimeBase_02.png", "s.slimeBase_03.png"], + imagenesRecibeDanio = ["s.slimeBaseDanio_01.png", "s.slimeBaseDanio_02.png", "s.slimeBaseDanio_03.png"]) {} - object slimeNinja inherits Tipo(danio= 200, vida=120, imagen="s.slimeNinja_01.png",imagenesNormales=["s.slimeNinja_01.png","s.slimeNinja_02.png","s.slimeNinja_03.png"],imagenesRecibeDanio=["s.slimeNinjaDanio_01.png","s.slimeNinjaDanio_02.png","s.slimeNinjaDanio_03.png"]) { - override method desplazamiento() = 2 - } +object slimeGuerrero inherits Tipo(danio = 25, vida = 250, imagen = "s.slimeGuerrero_01.png", + imagenesNormales = ["s.slimeGuerrero_01.png", "s.slimeGuerrero_02.png", "s.slimeGuerrero_03.png"], + imagenesRecibeDanio = ["s.slimeGuerreroDanio_01.png", "s.slimeGuerreroDanio_02.png", "s.slimeGuerreroDanio_03.png"]) {} - object slimeBlessed inherits Tipo(danio= 200, vida=300, imagen="s.slimeBlessed_01.png",imagenesNormales=["s.slimeBlessed_01.png","s.slimeBlessed_02.png","s.slimeBlessed_03.png"],imagenesRecibeDanio=["s.slimeBlessedDanio_01.png","s.slimeBlessedDanio_02.png","s.slimeBlessedDanio_03.png"]){ - } +object slimeNinja inherits Tipo(danio = 200, vida = 120, imagen = "s.slimeNinja_01.png", + imagenesNormales = ["s.slimeNinja_01.png", "s.slimeNinja_02.png", "s.slimeNinja_03.png"], + imagenesRecibeDanio = ["s.slimeNinjaDanio_01.png", "s.slimeNinjaDanio_02.png", "s.slimeNinjaDanio_03.png"]) { + override method desplazamiento() = 2 +} + +object slimeBlessed inherits Tipo(danio = 200, vida = 300, imagen = "s.slimeBlessed_01.png", + imagenesNormales = ["s.slimeBlessed_01.png", "s.slimeBlessed_02.png", "s.slimeBlessed_03.png"], + imagenesRecibeDanio = ["s.slimeBlessedDanio_01.png", "s.slimeBlessedDanio_02.png", "s.slimeBlessedDanio_03.png"]) {} object slimeLadron inherits Tipo(danio= 25, vida=120, imagen="s.slimeLadron_01.png",imagenesNormales=["s.slimeLadron_01.png","s.slimeLadron_02.png","s.slimeLadron_03.png"],imagenesRecibeDanio=["s.slimeLadronDanio_01.png","s.slimeLadronDanio_02.png","s.slimeLadronDanio_03.png"]) { - override method atacar()={slime=> - const posicionEnFrente = new MutablePosition(x = slime.position().x() - 1, y = slime.position().y()) - const objetoEnCeldaEnFrente = game.getObjectsIn(posicionEnFrente) - puntaje.restarPuntos(200) - objetoEnCeldaEnFrente.forEach({ objeto => objeto.recibeDanioMago(danio,slime)}) - const objetoEnCeldaSiguiente2 = game.getObjectsIn(posicionEnFrente) - if(!objetoEnCeldaSiguiente2.any({objeto=>objeto.frenarEnemigo()})) slime.cambiarAccion(self.moverse()) - } - /* override method meFreno()={slime=> - const posicionEnFrente = new MutablePosition(x = slime.position().x() - 1, y = slime.position().y()) - const objetoEnCeldaEnFrente = game.getObjectsIn(posicionEnFrente) - if (objetoEnCeldaEnFrente.any({ objeto => objeto.frenarEnemigo() })) { - slime.enMovimiento(false) + + override method atacar()={ + slime=> + const posicionEnFrente = new MutablePosition(x = slime.position().x() - 1, y = slime.position().y()) + const objetoEnCeldaEnFrente = game.getObjectsIn(posicionEnFrente) puntaje.restarPuntos(200) - objetoEnCeldaEnFrente.forEach({ objeto => objeto.recibeDanioMago(danio) }) - } else { - slime.enMovimiento(true) - } - } */ - + if(!objetoEnCeldaEnFrente.any({objeto=>objeto.frenarEnemigo()})) slime.cambiarAccion(self.moverse()) + objetoEnCeldaEnFrente.forEach({ objeto => objeto.recibeDanioMago(danio,slime)}) + } + } object slimeDorado inherits Tipo(danio=0, vida=175, imagen="s.slimeDorado_01.png",imagenesNormales=["s.slimeDorado_01.png","s.slimeDorado_02.png","s.slimeDorado_03.png"],imagenesRecibeDanio=["s.slimeDoradoDanio_01.png","s.slimeDoradoDanio_02.png","s.slimeDoradoDanio_03.png"]){ override method desplazamiento() = 2 - /* override method meFreno()={slime=>slime.enMovimiento(true)} */ + override method moverse()={ slime => slime.position().goLeft(slime.tipo().desplazamiento()) } + override method estaMuerto()={slime=> if (slime.sinVida()) { puntaje.puntos(puntaje.puntos()+1000) @@ -165,44 +185,33 @@ object slimeDorado inherits Tipo(danio=0, vida=175, imagen="s.slimeDorado_01.png if(slime.llegoACasa()){slime.eliminar()} return slime.sinVida() || slime.llegoACasa() } + } object slimeBomba inherits Tipo(danio=250, vida=180, imagen="s.slimeMedioOriente_01.png",imagenesNormales=["s.slimeMedioOriente_01.png","s.slimeMedioOriente_02.png","s.slimeMedioOriente_03.png"],imagenesRecibeDanio=["s.slimeMedioOrienteDanio_01.png","s.slimeMedioOrienteDanio_02.png","s.slimeMedioOrienteDanio_03.png"]){ - override method atacar()={slime=> - const posicionEnFrente = new MutablePosition(x = slime.position().x()-1, y = slime.position().y()) - const objetoEnCeldaSiguiente = game.getObjectsIn(posicionEnFrente) - const posicionArriba = new MutablePosition(x = slime.position().x()-1, y = slime.position().y()+1) - const posicionAbajo = new MutablePosition(x = slime.position().x()-1, y = slime.position().y()-1) - const objetosAmatar= game.getObjectsIn(posicionArriba)+game.getObjectsIn(posicionAbajo)+objetoEnCeldaSiguiente - objetosAmatar.forEach({ objeto => objeto.recibeDanioMago(danio,slime) }) - slime.eliminar() - } - - /* override method meFreno()={slime=> - const posicionEnFrente = new MutablePosition(x = slime.position().x(), y = slime.position().y()) - const objetoEnCeldaSiguiente = game.getObjectsIn(posicionEnFrente) - - if (objetoEnCeldaSiguiente.any({ objeto => objeto.frenarEnemigo() && objeto.recibeDanioMago(0)})) { - slime.enMovimiento(false) - const posicionArriba = new MutablePosition(x = slime.position().x(), y = slime.position().y()+1) - const posicionAbajo = new MutablePosition(x = slime.position().x(), y = slime.position().y()-1) - const objetosAmatar= game.getObjectsIn(posicionArriba)+game.getObjectsIn(posicionAbajo)+objetoEnCeldaSiguiente - objetosAmatar.forEach({ objeto => objeto.recibeDanioMago(danio) }) + + override method atacar()={ + slime=> + const posicionEnFrente = new MutablePosition(x = slime.position().x()-1, y = slime.position().y()) + const posicionArriba = new MutablePosition(x = slime.position().x()-1, y = slime.position().y()+1) + const posicionAbajo = new MutablePosition(x = slime.position().x()-1, y = slime.position().y()-1) + const objetosAmatar= game.getObjectsIn(posicionArriba)+game.getObjectsIn(posicionAbajo)+game.getObjectsIn(posicionEnFrente) + objetosAmatar.forEach({ objeto => objeto.recibeDanioMago(danio,slime) }) slime.eliminar() - } else { - slime.enMovimiento(true) - }} */ + } } object slimeAgil inherits Tipo(danio=50, vida=200, imagen="s.slimeAgil_01.png",imagenesNormales=["s.slimeAgil_01.png","s.slimeAgil_02.png","s.slimeAgil_03.png"],imagenesRecibeDanio=["s.slimeAgilDanio_01.png","s.slimeAgilDanio_02.png","s.slimeAgilDanio_03.png"]){ override method accionAlRecibirDanio() = {slime=>self.cambiarDeCarril().apply(slime)} - method cambiarDeCarril()={slime=> - const newPosicion= new MutablePosition(x = slime.position().x(), y = (slime.position().y()+((-1).randomUpTo(2))).max(0).min(4)) // - if(game.getObjectsIn(newPosicion).isEmpty()){ - administradorDeEnemigos.decrementarLinea(slime.position().y()) - slime.position(newPosicion) - administradorDeEnemigos.aumentarLinea(newPosicion.y()) - } + + method cambiarDeCarril()={ + slime=> + const newPosicion= new MutablePosition(x = slime.position().x(), y = (slime.position().y()+((-1).randomUpTo(11.999999))).max(0).min(4)) // + if(game.getObjectsIn(newPosicion).isEmpty()){ + administradorDeEnemigos.decrementarLinea(slime.position().y()) + slime.position(newPosicion) + administradorDeEnemigos.aumentarLinea(newPosicion.y()) + } } } \ No newline at end of file