Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
…hmeestancodeando into concurso
  • Loading branch information
NahuelMarek committed Dec 1, 2024
2 parents 3db0bbb + 0409903 commit 0fc1795
Show file tree
Hide file tree
Showing 22 changed files with 91 additions and 112 deletions.
72 changes: 41 additions & 31 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,55 +2,49 @@
UTN - Facultad Regional Buenos Aires - Materia Paradigmas de Programación

![portada](Cosas_juego/portada/title1.jpg)
Link al Trailer: https://youtu.be/0D9ru_qJyPM?si=un1xRSzEtPHEvkAe



## Equipo de desarrollo:

- Echeverría, Manuel
- Marek, Nahuel
- Marzocca, Damián
- Schkurko, Nicolas
- Vallone, Matías


## Capturas
![1](https://github.com/user-attachments/assets/1297f5c8-e4a1-44d0-8f46-1c002f1cb82f)


![3](https://github.com/user-attachments/assets/78192b7f-5ce0-4f2e-b012-98eb4f4dc90a)


Magos Vs Slimes es un videojuego de estrategia y defensa. El juego consiste en defender su la Base (Utopía de las Tierras de Nortfernand) de oleadas de diversos Slimes utilizando una variedad de Magos con poderes y funcionalidades únicas. Estos Magos deberán evitar que los Slimes lleguen a la base, en caso de que tres o más lo logren el juego finalizará y la humanidad perecerá.

## Magos

Cada Mago tiene una función específica, como disparar proyectiles, bloquear el avance de los zombis, explotar causando daño, entre otros. Los Magos requieren Dinero para poder ser contratados, este dinero se genera automaticamente a lo largo de la partida.

![mago fuego](assets/magoFuego.png) ![mago hielo](assets/magoHielo.png) ![mago irlandes](assets/magoHealer.png) ![mago piedra](assets/magoPiedra.png) ![papajhon](assets/magoExplosivo.png) ![magoStop](https://github.com/user-attachments/assets/34b94b1a-0d7a-4699-b59f-6ffa31435b26)

![mago fuego](assets/magoFuego.png) ![mago hielo](assets/magoHielo.png) ![mago irlandes](assets/magoHealer.png) ![mago piedra](assets/magoPiedra.png) ![papajhon](assets/magoExplosivo.png)

<pre>Daño:🔥 Daño:❄️❄️ Daño:🤑 Daño:☮️ Daño:💣💣💣 </pre>
<pre>Daño:🔥🔥 Daño:❄️❄️❄️ Daño:🤑 Daño:☮️ Daño:💣💣💣 Daño:🤚 </pre>

<pre>Vida:❤️ Vida:💙 Vida:💚 Vida:🗿🗿🗿 Vida:☠️☠️☠️ </pre>
<pre>Vida:❤️ Vida:💙 Vida:💚 Vida:🗿🗿🗿 Vida:☠️☠️☠️ Vida:❤️</pre>
<pre>Dispara Dispara Genera Dinero Proteccion Inmola Dispara </pre>

## Proyectiles
Cada Tipo de Proyectil tiene daño o efecto propio. Los proyectiles se pueden fusionar dando lugar a mas poderosos.

![proyectil Normal](assets/p.proyectilFuego.png) ![New Project](https://github.com/user-attachments/assets/a2b4ae40-e0c8-4044-80df-21fa467d5997) ![proyectil Penetrante](assets/p.proyectilHielo.png) ![New Project](https://github.com/user-attachments/assets/a2b4ae40-e0c8-4044-80df-21fa467d5997) ![superProyectil](assets/p.superProyectil-1.png)
<pre>Daño:🔥🔥 Daño:❄️❄️❄️ Daño:🟣🟣🟣🟣 </pre>

![proyectil Normal](assets/p.proyectilFuego.png) ![New Project](https://github.com/user-attachments/assets/a2b4ae40-e0c8-4044-80df-21fa467d5997) ![proyectil Penetrante](assets/p.proyectilHielo.png) ![New Project](https://github.com/user-attachments/assets/a2b4ae40-e0c8-4044-80df-21fa467d5997) ![superProyectil](assets/p.superProyectil-1.png)

![p proyectilDeStop-frame2](https://github.com/user-attachments/assets/38334d9e-e0ff-4882-8ff3-f81947c6a376)
<pre>Daño:🤚 Relentiza Enemigos</pre>


## Slimes
Los Distintos Slimes tienen características propias, más vida, más daño, movimientos especiales, entre otras cosas. Estos atacarán en oleadas (desde el extremo derecho del tablero), e intentarán llegar a la base de los magos(extremo izquierdo del tablero).

![slimeBasico](Cosas_juego/slime_base.png) ![slimeGuerrero](assets/s.slimeGuerrero.png) ![slimeNinja](assets/s.slimeNinja.png) ![slimeBlessed](assets/s.slimeBlessed.png)
![slimeBasico](Cosas_juego/slime_base.png) ![slimeGuerrero](assets/s.slimeGuerrero.png) ![slimeNinja](assets/s.slimeNinja.png) ![slimeBlessed](assets/s.slimeBlessed.png) ![s slimeDorado_02](https://github.com/user-attachments/assets/65e5c8fd-9dc5-4521-91e0-4547c03e1083) ![s slimeLadron_02](https://github.com/user-attachments/assets/dae18dc6-c56f-421f-8046-fc2dc5907276) ![s slimeMedioOriente_02](https://github.com/user-attachments/assets/ef79d131-4a1d-4cab-96e6-e77b6ae8272d)![s slimeAgil_02](https://github.com/user-attachments/assets/1c587d66-a342-4dd7-bf61-71f2ed4d2fd1)

<pre>Daño:🟢 Daño:🟢 Daño:🥷🥷🥷 Daño:🛐🛐🛐 </pre>

<pre>Vida:💚💚 Vida:💚💚💚 Vida:💚 Vida:🛐🛐🛐 </pre>

<pre>
Daño:🟢 | Daño:🟢 | Daño:🥷🥷🥷| Daño:🛐🛐🛐| Daño: - | Daño:🟢 | Daño:💣💣💣| Daño:🟢
Vida:💚💚| Vida:💚💚💚| Vida:💚💚| Vida:🛐🛐🛐| Vida:💚💚💚| Vida:💚💚| Vida:💚💚💚| Vida:💚💚💚
Ataque Melee|Ataque Melee|Salta Magos| Ataque Melee| Da Dinero | Quita Dinero| Daño en Area| Salta entre Lineas
</pre>

## Reglas de Juego / Instrucciones
En Nuestra mision es defender la EL ULTIMO FARO DE LA HUMANIDAD, la ciudad de "Utopía de las Tierras de Nortfernand (UTN)", de los slimes, evitando que lleguen 3 o más de ellos a nuestras puertas. Para protegernos, contaremos con la ayuda de magos, cada uno con habilidades únicas, que se unirán en la defensa de la aldea a cambio de plata.
## Modos de Juego
<h3>Historia:</h3> Enfrentar diversos niveles con cambios en tipos y dificultad de Oleadas.
<h3>Eterno:</h3> Modo desafiante en el que se enfrentan oleadas interminables y aleatorias de Slimes, con dificultad Creciente.

El objetivo del Juegos es Defender la Ciudad de oleadas de Diversos Slimes. Después de varias oleadas, alcanzaremos la ronda final, si logramos superar esta ronda sin morir, ganaremos la partida.
Podremos seleccionar, utilizar y eliminar a los distintos tipos de magos estratégicamente para enfrentar las oleadas de enemigos que amenzas la ciudad.

## Controles:

Expand All @@ -64,8 +58,24 @@ Podremos seleccionar, utilizar y eliminar a los distintos tipos de magos estrat
- `P` para reiniciar juego
- `I` termina el juego
- `O` para pausar juego
- `X` Ir al Menú Principal


## Equipo de desarrollo:

- Echeverría, Manuel
- Marek, Nahuel
- Marzocca, Damián
- Schkurko, Nicolas
- Vallone, Matías


## Capturas
![1](https://github.com/user-attachments/assets/1297f5c8-e4a1-44d0-8f46-1c002f1cb82f)

![portada3](https://github.com/user-attachments/assets/fef46cef-605c-4468-923a-923fea237f71)

![3](https://github.com/user-attachments/assets/78192b7f-5ce0-4f2e-b012-98eb4f4dc90a)

Link al Lore: https://docs.google.com/document/d/1lBfEKnoyl5uwRfzc_BIOiNtRY3-iJxHwnHqUtpygSzU/edit?tab=t.0

Link al Trailer: https://youtu.be/0D9ru_qJyPM?si=un1xRSzEtPHEvkAe
3 changes: 2 additions & 1 deletion Teorica.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,5 +34,6 @@ Además, se utiliza ampliamente la comunicación entre los distintos objetos, co
Se utilizan clases para, por ejemplo, instanciar slimes, ya que tendremos varios objetos slime similares, variando su tipo, que serán generados en el transcurso del juego. El generadorDeEnemigos los instanciará cada cierto tiempo asignandoles que tipo son a los slime.

Diagrama de clases:
![diagrama](https://github.com/user-attachments/assets/b51d1c70-d72a-4ee7-844f-f957f91a0d3d)
![diagrama](https://github.com/user-attachments/assets/f98b45cf-0f3e-408f-a662-3a588bf05337)


17 changes: 7 additions & 10 deletions administradorDeJuego.wlk
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,6 @@ object administradorDeJuego {
puntaje.reset()
administradorDeOleadas.reset()
configuracion.quitarVisuals()
//pantalla.reproducirSonido()
// configuracion.iniciarMusica() // Iniciar música (opcional)
}

method pausar(){
Expand All @@ -72,7 +70,7 @@ object administradorDeJuego {
catch e "no hay ticks"
game.schedule(1000, {usuarioEnMenu=true})
menuInicial.quitarBotones()
menuInicial.imagen("MenuInicial2.png")
menuInicial.imagen("MenuInicial.png")
menuInicial.botones(menuInicial.botonesIniciales())
try game.addVisual(menuInicial) catch e "ya se esta mostrando el menu"
menuInicial.iniciarMenu()
Expand All @@ -84,18 +82,18 @@ object administradorDeJuego {
// =======================================
object derrota {
method position() = new MutablePosition(x = 0, y = 0)
method imagen() = "fin3.jpg"
method imagen() = "fin.jpg"
method sonido() = game.sound("m.deathScreen.mp3")

}
object victoria {
method position() = new MutablePosition(x = 0, y = 0)
method imagen() = "Victoria3.png"
method imagen() = "victoria.png"
method sonido() = game.sound("m.deathScreen.mp3")
}
object portada {
method position() = new MutablePosition(x = 0, y = 0)
method imagen() = "portada3.png"
method imagen() = "portada.png"
method sonido() = game.sound("m.inicio.mp3")
}
object finDeNivel {
Expand Down Expand Up @@ -271,7 +269,6 @@ object configuracion {

// Método para programar eventos de actualización periódicos (ticks)
method crearTicks() {
//game.schedule(4000, { administradorDeOleadas.iniciarOleada() }) // Inicia la primera oleada tras 4 segundos
tickParaAumentarDinero.start()
tickParaCambiarFrames.start()
tickParaDisparar.start()
Expand Down Expand Up @@ -301,7 +298,7 @@ object configuracion {


object menuInicial{
var property imagen="MenuInicial2.png"
var property imagen="MenuInicial.png"
method position()=new MutablePosition(x=0,y=0)
method image() = imagen
var botonSeleccionado = 0
Expand Down Expand Up @@ -352,7 +349,7 @@ object botonDeInicio{
method accion(){
configuracion.agregarVisuals()
configuracion.crearTicks()
administradorDeOleadas.modoNiveles(false)
administradorDeOleadas.modoInfinito(false)
administradorDeOleadas.actualizarOleada()
administradorDeOleadas.iniciarOleada()

Expand Down Expand Up @@ -457,7 +454,7 @@ class BotonDeNivel{
configuracion.agregarVisuals()
configuracion.crearTicks()
administradorDeOleadas.numNivel(numNivel)
administradorDeOleadas.modoNiveles(true)
administradorDeOleadas.modoInfinito(true)
administradorDeOleadas.actualizarOleada()
administradorDeOleadas.iniciarOleada()

Expand Down
4 changes: 0 additions & 4 deletions administradorDeMagos.wlk
Original file line number Diff line number Diff line change
Expand Up @@ -46,9 +46,5 @@ object administradorDeMagos {
magos.forEach({ mago => mago.eliminar() })
nombreMago = 0
}

method reiniciarVisuals(){
game.schedule(150, {magos.forEach({ mago => mago.reiniciarVisual()})})
}

}
53 changes: 22 additions & 31 deletions administradorDeOleadas.wlk
Original file line number Diff line number Diff line change
Expand Up @@ -11,22 +11,26 @@ import puntaje.puntaje
object administradorDeOleadas {
var nivelActual = nivelInfinito
var property numeroOleada = 1
var property modoInfinito = false

const property oleadaInicial = game.tick(5000, {self.frenarTickInicial() self.iniciarOleada()},false)

method frenarTickInicial()=oleadaInicial.stop()
var property modoNiveles = false


//cosas para funcionamiento con niveles
const niveles = botonNiveles.niveles()
var property numNivel = 1
const niveles = botonNiveles.niveles()

method nivel() = niveles.get(numNivel-1).nivel()
method actualizarOleada(){
if(modoNiveles) nivelActual = self.nivel()
if(modoInfinito) nivelActual = self.nivel()
else nivelActual = nivelInfinito
}

// Métodos de visualización y sonido
method position() = new MutablePosition(x = 9, y = 5)
method text() = "Oleada: " + numeroOleada.toString() +" Nivel: " + nivelActual.nombre().toString() + " " + "Slimes Restantes: " + nivelActual.enemigosRestantes().toString()
method text() = "Oleada: " + numeroOleada.toString() + " Nivel: " + nivelActual.nombre().toString() + " " + "Slimes Restantes: " + nivelActual.enemigosRestantes().toString()
method textColor() = "#FA0770"
method enemigosVivos() = nivelActual.enemigosVivos()

Expand All @@ -37,17 +41,18 @@ object administradorDeOleadas {
if (nivelActual.ejecutando()) {
if(!nivelActual.seGeneraronSuficientes())administradorDeEnemigos.generarEnemigo(nivelActual.enemigos().anyOne())
} else if(nivelActual.finalizo()){
self.siguienteOleadaNivel()
self.siguienteOleada()
tickParaGenerarEnemigos.stop()
}
} }

// Inicia la oleada y gestiona enemigos
method iniciarOleada() {
nivelActual.iniciarOleada()
tickParaGenerarEnemigos.start()
}

method siguienteOleadaNivel(){
method siguienteOleada(){
if(nivelActual.noTerminoNivel()){
nivelActual.siguienteOleada()
numeroOleada += 1
Expand Down Expand Up @@ -82,8 +87,7 @@ object administradorDeOleadas {
method sumarEnemigo() { nivelActual.seGeneroEnemigo() }

// Selecciona un tipo de slime aleatorio en función de la oleada
//method agregarTipo(numero) { return posiblesTipos.get(0.randomUpTo(numero + 4).round())}


// Resetea el administrador de oleadas
method reset() {
self.frenarTickInicial()
Expand All @@ -94,15 +98,9 @@ object administradorDeOleadas {
niveles.forEach({botonNivel=>botonNivel.nivel().resetearOleadas()})
numeroOleada = 1
self.actualizarOleada()
//game.schedule(4000, { self.iniciarOleada() })
}
method recibeDanioMago(danio){}
method frenarEnemigo()= true

method reiniciarVisual(){
game.removeVisual(self)
game.addVisual(self)
}
}


Expand All @@ -111,16 +109,12 @@ class Nivel{
var property cantidadEnemigos // var para modificar en nivel Infinito
var property enemigosRestantes = cantidadEnemigos
var property enemigosGenerados = 0
var property indiceOleada=0
const property tiempoSpawn
const nombre
/*method numeroOleada(){
if (indiceOleada+1<oleadas.size()) return (indiceOleada + 1).toString()
else return "oleada final"
}
*/
method nombre()=nombre
const property nombre

method enemigos()=oleadas.get(indiceOleada)
var property indiceOleada=0

method oleadaActual()= oleadas.get(indiceOleada)
method noTerminoNivel()= indiceOleada < oleadas.size()-1
method siguienteOleada(){indiceOleada +=1
Expand All @@ -134,6 +128,7 @@ class Nivel{

method inicioOleada() = game.sound("m.iOleada.mp3")
method finOleada() = game.sound("m.fOleada.mp3")

// Verifica si la oleada final está en ejecución
method ejecutando() = cantidadEnemigos >= enemigosGenerados && enemigosRestantes > 0

Expand All @@ -147,19 +142,17 @@ class Nivel{
method terminarOleada() {
self.finOleada().volume(0.1)
self.finOleada().play()

}

method iniciarOleada(){
self.inicioOleada().volume(0)
//self.inicioOleada().play()
enemigosRestantes = cantidadEnemigos
}


method cargarSlimesRestantes () {enemigosRestantes = cantidadEnemigos }
// Verifica si la oleada final ha finalizado
method finalizo() = enemigosRestantes <= 0 || enemigosGenerados >= cantidadEnemigos

method seGeneraronSuficientes() = cantidadEnemigos == self.enemigosVivos() || self.enemigosVivos() == enemigosRestantes
// Resetea la oleada final
method reset() {
Expand Down Expand Up @@ -245,15 +238,15 @@ object nivelInfinito inherits Nivel(oleadas = [slimeBasico],tiempoSpawn=4000,can
}

method cambiarTipoOleada(nuevoTipo){ posiblesEnemigos = nuevoTipo }
//override method oleada() = (indiceOleada+1).toString()

override method siguienteOleada(){
if (administradorDeOleadas.numeroOleada() == 2) self.cambiarTipoOleada(enemigosMolestos) {cantidadAgregarALaLista += 1}
if (administradorDeOleadas.numeroOleada() == 3){
if (administradorDeOleadas.numeroOleada() == 3) self.cambiarTipoOleada(enemigosMolestos) {cantidadAgregarALaLista += 1}
if (administradorDeOleadas.numeroOleada() == 9){
self.cambiarTipoOleada(enemigosJodidos)
cantidadAgregarALaLista += 1
fondo.cambiarFondo("fondo2.jpg")
}
if (administradorDeOleadas.numeroOleada() == 4){
if (administradorDeOleadas.numeroOleada() == 19){
self.cambiarTipoOleada(enemigosAyuda)
cantidadAgregarALaLista += 1
fondo.cambiarFondo("fondo3.jpg")
Expand All @@ -275,5 +268,3 @@ object nivelInfinito inherits Nivel(oleadas = [slimeBasico],tiempoSpawn=4000,can
}

}
//algo asi deberia ser nive Infinito
// nivel = new Nivel(enemigos=[[basico, basico, gerrero], [guerrero, ladron]])
Binary file modified assets/MenuInicial.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file removed assets/MenuInicial2.png
Binary file not shown.
Binary file removed assets/Portada1.jpg
Binary file not shown.
Binary file removed assets/Victoria2.png
Binary file not shown.
Binary file modified assets/fin.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file removed assets/fin3.jpg
Binary file not shown.
Binary file removed assets/final.png
Binary file not shown.
Binary file removed assets/finalSeleccionado.png
Binary file not shown.
File renamed without changes
Binary file removed assets/portada2.png
Binary file not shown.
Binary file removed assets/victoria.jpg
Binary file not shown.
File renamed without changes
Loading

0 comments on commit 0fc1795

Please sign in to comment.