diff --git a/ProximosPasos.md b/ProximosPasos.md
index b8be20f..3bef964 100644
--- a/ProximosPasos.md
+++ b/ProximosPasos.md
@@ -1,17 +1,15 @@
-- [X] Cambiar background por una mejor cancha.
-- [X] Agregar más consumibles (objetos distintos).
-- [X] Agregar la pelota.
-- [X] MODELAR COLISION BASICA!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-- [ ] Modelar interacción con la pelota (que la patee en una direccion).
-- [ ] Revisar colisión con consumibles (que el consumible desaparezca (y cómo vuelve a aparecer otro?)). 
-- [ ] Modelar colisión con jugador rival? (que lo empuje).
-- [ ] Definir bordes de la cancha.
-- [X] Agregar sonido de ambiente.
-- [ ] Agregar sonidos de colisiones.
-- [ ] Modelar mecánica de goles............y de fin de partida.
-- [ ] Agregar menú?
-- [X] Agregar ¿tarjetas? para afectar al otro jugador (tarjeta roja lo deja quieto por ej.).
-- DELEGAR Y MODULARIZAR CON OBJETOS Y METODOS, ELIMINAR ALGORITMIA PROCEDURAL DE C.
-- EN COLISION, NO PREGUNTAR SI CHOCA CON BANANA. USAR MENSAJES: CUANDO ALGO CHOCA CON UNA BANANA, MANDARLE UN MENSAJE
-  A ESE ALGO (MOVETE).
-- SOBRE EL REMOVE VISUAL: EL OBJETO SIGUE ESTANDO PORQUE ESTÁ LA REFERENCIA (CONSTANTE). HAY QUE MODIFICAR ESO.
\ No newline at end of file
+- [X] Arreglar mecánica para llevar la pelota.
+- [X] Agregar mecánica para patear la pelota en una dirección.
+- [ ] Agregar mecánica para colisiones con borde de la cancha.
+- [ ] Agregar sonidos colisiones.
+- [ ] Agregar mecánica de goles: sonido, contador y reinicio posiciones.
+- [ ] Agregar mecánica para fin de partida: que imprima un cartelito y envíe al menú principal.
+- [ ] Agregar menú principal.
+- [ ] Agregar banana maestra que invoque un montón de bananas.
+
+Observaciones
+- Tal vez la evaluacion de si alguien está cerca de algo podría delegarse en el programa en vez de tenerla en 800 ifs.
+- El mute del sonido funciona una sola vez.
+- Los cuadros de diálogo no siempre se muestran (?).
+- EL ONTICK AL AGARRAR UN CONSUMIBLE SE COMPARTE: DEL TOTAL SIEMPRE QUEDA UNO SOLO.
+
diff --git a/assets/comida.png b/assets/comida.png
new file mode 100644
index 0000000..0861e36
Binary files /dev/null and b/assets/comida.png differ
diff --git a/assets/cornerFlag.png b/assets/cornerFlag.png
new file mode 100644
index 0000000..6f7f650
Binary files /dev/null and b/assets/cornerFlag.png differ
diff --git a/assets/food.png b/assets/food.png
deleted file mode 100644
index 78a4ed5..0000000
Binary files a/assets/food.png and /dev/null differ
diff --git a/main.wpgm b/main.wpgm
index f75d8ee..a4d85e3 100644
--- a/main.wpgm
+++ b/main.wpgm
@@ -9,11 +9,10 @@ program FulbotGame {
     game.cellSize(10) // tenemos celdas de 10x10 pixeles.
 
 // SONIDO DE FONDO
-
     const sonidoAmbiente = game.sound("sonidoAmbiente.mp3")
     sonidoAmbiente.shouldLoop(true)
-    game.schedule(500, {sonidoAmbiente.play()})
-
+    sonidoAmbiente.play()
+    
     var sonidoAmbienteIsOn = true
     keyboard.m().onPressDo({
         if (sonidoAmbienteIsOn) {
@@ -24,262 +23,119 @@ program FulbotGame {
             sonidoAmbienteIsOn = true
         }
     })
-    //keyboard.m().onPressDo({sonidoAmbiente.volume(0)})
-
-// TECLAS DE MOVIMIENTO
 
+// TECLAS DE ACCIÓN
     keyboard.w().onPressDo({ jugador1.moverseArriba(5) })
     keyboard.a().onPressDo({ jugador1.moverseIzquierda(5) })
     keyboard.s().onPressDo({ jugador1.moverseAbajo(5) })
     keyboard.d().onPressDo({ jugador1.moverseDerecha(5) })
+    keyboard.space().onPressDo({ jugador1.patearPelota(pelota) })
 
     keyboard.up().onPressDo({ jugador2.moverseArriba(5) })
     keyboard.left().onPressDo({ jugador2.moverseIzquierda(5) })
     keyboard.down().onPressDo({ jugador2.moverseAbajo(5) })
     keyboard.right().onPressDo({ jugador2.moverseDerecha(5) })
+    keyboard.enter().onPressDo({ jugador2.patearPelota(pelota) })
 
 // OBJETOS Y REFERENCIAS
+    // Coordenadas esquinas
+    const xBordeIzq = 11
+    const xBordeDer = 209
+    const yBordeInf = 1
+    const yBordeSup = 97
+
+    // Corner flags
+    const bandera1 = new Item (image = "cornerFlag.png", position = game.at(xBordeIzq, yBordeInf))
+    const bandera2 = new Item (image = "cornerFlag.png", position = game.at(xBordeIzq, yBordeSup))
+    const bandera3 = new Item (image = "cornerFlag.png", position = game.at(xBordeDer, yBordeInf))
+    const bandera4 = new Item (image = "cornerFlag.png", position = game.at(xBordeDer, yBordeSup))
+
+    // Coordenadas arcos
+    const xLineaArco1 = 10
+    const xLineaArco2 = 208
+    const yInfAmbosArcos = 42
+    const ySupAmbosArcos = 56
+
+    // Coordenadas jugadores
+    const xiJugador1 = 97
+    const xiJugador2 = 120
+    const yiAmbosJugadores = 50
 
     // Jugadores
-    const jugador1 = new Jugador( cansancio = 0, imagen = "argentino.png", position = new MutablePosition(x=122, y=50))
-    const jugador2 = new Jugador( cansancio = 0, imagen = "brasilero.png", position = new MutablePosition(x=95, y=50))
-
-    // Items
-  const pelota = new Item( imagen = "pelota.png", position = game.at(110, 50), frase = "")
-    const bananaPeel1 = new CascaraBanana( imagen = "bananaPeel.png", frase = "Noooooooo")
-    const bananaPeel2 = new CascaraBanana( imagen = "bananaPeel.png", frase = "Noooooooo")
-    const bananaPeel3 = new CascaraBanana( imagen = "bananaPeel.png", frase = "Noooooooo")
-    const cono1 = new Item( imagen = "cono.png", position = game.at(10, 56), frase = "")
-    const cono2 = new Item( imagen = "cono.png", position = game.at(10, 42), frase = "")
-    const cono3 = new Item( imagen = "cono.png", position = game.at(208, 56), frase = "")
-    const cono4 = new Item( imagen = "cono.png", position = game.at(208, 42), frase = "")
-
-
-    // Tarjetas
-    const tarjetaAmarilla = new Tarjetas( imagen = "yellowCard.png", frase = "Toma amarilla", cantidad = 20)
-    const tarjetaRoja = new Tarjetas( imagen = "redCard.png", frase = "Toma roja", cantidad = 100)
-
-    // Consumibles
-	const gaseosa1 = new Consumible( energia = 30, imagen = "coke2.png", frase = "rica gaseosa")
-    const gaseosa2 = new Consumible( energia = 30, imagen = "coke2.png", frase = "rica gaseosa")
-    const comida = new Consumible( energia = 80, imagen = "food.png", frase = "Gracias por la comida")
-    const banana1 = new Consumible( energia = 40, imagen = "bananas.png", frase = "Gracias por la fruta")
-    const banana2 = new Consumible( energia = 40, imagen = "bananas.png", frase = "Gracias por la fruta")
-    const agua1 = new Consumible( energia = 20, imagen = "agua.png", frase = "Rica agua!")
-    const agua2 = new Consumible( energia = 20, imagen = "agua.png", frase = "Rica agua!")
-
-    // Arcos
-    const arco1X = 208 // Coordenada x de la portería 1 (izquierda)
-    const arco1Y = 50 // Coordenada y de la portería 1
-    const arco1Ancho = 5 // Ancho de la portería 1
-    const arco1Alto = 10 // Alto de la portería 1
-
-    const arco2X = 10 // Coordenada x de la portería 2 (derecha)
-    const arco2Y = 50 // Coordenada y de la portería 2
-    const arco2Ancho = 5 // Ancho de la portería 2
-    const arco2Alto = 10 // Alto de la portería 2
-
-    // Marcadores de goles
+    const jugador1 = new Jugador (image = "argentino.png", position = new MutablePosition(x=xiJugador1, y=yiAmbosJugadores))
+    const jugador2 = new Jugador (image = "brasilero.png", position = new MutablePosition(x=xiJugador2, y=yiAmbosJugadores))
+
+    // Consumibles y Tarjetas
+	const agua1 = new Agua() const agua2 = new Agua() const agua3 = new Agua() const agua4 = new Agua()
+    const gaseosa1 = new Gaseosa() const gaseosa2 = new Gaseosa()
+    const comida = new Comida()
+    const banana1 = new Banana() const banana2 = new Banana()
+    const bananaPeel1 = new BananaPeelDer() const bananaPeel2 = new BananaPeelIzq()
+    const amarilla1 = new TarjetaAmarilla() const amarilla2 = new TarjetaAmarilla()
+    const roja = new TarjetaRoja()
+
+    const consumibles = [agua1, agua2, agua3, agua4, gaseosa1, gaseosa2, comida, banana1, banana2, bananaPeel1, bananaPeel2]
+    const tarjetas = [amarilla1, amarilla2, roja]
+
+    // Otros
+    const pelota = new Item (image = "pelota.png", position = game.at(110, 50))
     var golesJugador1 = 0
-    var golesJugador2 = 0 // Comprobar si la pelota entra en el arco del jugador 1
-    const proximidad = 5
-
- // EVENTOS PROGRAMADOS
-
-    game.schedule(100, {
-        game.addVisual(jugador1)
-        game.addVisual(jugador2)
-        game.addVisual(pelota)
-        game.addVisual(bananaPeel1)
-        game.addVisual(bananaPeel2)
-        game.addVisual(bananaPeel3)
-        game.addVisual(tarjetaAmarilla)
-        game.addVisual(tarjetaRoja)
-        game.addVisual(gaseosa1)
-        game.addVisual(gaseosa2)
-        game.addVisual(comida)
-        game.addVisual(banana1)
-        game.addVisual(banana2)
-        game.addVisual(agua1)
-        game.addVisual(agua2)
-        game.say(jugador1, jugador1.decir("Muchaaaaachoooooos"))
-        game.say(jugador2, jugador2.decir("Eu nao falo portugues"))
-    })
+    var golesJugador2 = 0
+
+ // VISUALS
+    game.addVisual(jugador1) game.addVisual(jugador2)
+    game.addVisual(pelota)
+    game.addVisual(bandera1) game.addVisual(bandera2) game.addVisual(bandera3) game.addVisual(bandera4)
+    game.addVisual(agua1) game.addVisual(agua2) game.addVisual(agua3) game.addVisual(agua4)
+    game.addVisual(gaseosa1) game.addVisual(gaseosa2)
+    game.addVisual(comida)
+    game.addVisual(banana1) game.addVisual(banana2)
+    game.addVisual(bananaPeel1) game.addVisual(bananaPeel2)
+    game.addVisual(amarilla1) game.addVisual(amarilla2)
+    game.addVisual(roja)
+    game.say(jugador1, "Muchaaaaachoooooos") 
+    game.say(jugador2, "Eu nao falo portugues...")
+
+// EVENTOS DE INICIO
+    game.schedule (1000, { agua1.moverseAlAzar() agua2.moverseAlAzar() })
+    game.schedule (2000, { agua3.moverseAlAzar() agua4.moverseAlAzar() })
+    game.schedule (3000, { banana1.moverseAlAzar() bananaPeel1.moverseAlAzar() })
+    game.schedule (4000, { gaseosa1.moverseAlAzar() gaseosa2.moverseAlAzar()})
+    game.schedule (6000, { banana2.moverseAlAzar() bananaPeel2.moverseAlAzar() })
+    game.schedule (8000, { comida.moverseAlAzar() })
+    game.schedule (10000, { amarilla1.moverseAlAzar() amarilla2.moverseAlAzar() })
+    game.schedule (20000, { roja.moverseAlAzar() })
 
 // EVENTOS AUTOMATICOS
-
-    game.onTick(1000, "recupera energia", { jugador1.recuperarEnergia(20) })
-    game.onTick(1000, "recupera energia", { jugador2.recuperarEnergia(20) })
-    game.onTick(2000, "se mueve", { tarjetaRoja.moverseAlAzar() })
-    game.onTick(5000, "se mueve", { tarjetaAmarilla.moverseAlAzar() })
-    //game.onTick(8000, "se mueve", { bananaPeel1.moverseAlAzar() })
-    //game.onTick(8000, "se mueve", { bananaPeel2.moverseAlAzar() })
-    //game.onTick(8000, "se mueve", { bananaPeel3.moverseAlAzar() })
-    game.onTick(5000, "se mueve", { comida.moverseAlAzar() })
-    game.onTick(5000, "se mueve", { banana1.moverseAlAzar() })
-    game.onTick(5000, "se mueve", { banana2.moverseAlAzar() })
-    game.onTick(8000, "se mueve", { gaseosa1.moverseAlAzar() })
-    game.onTick(8000, "se mueve", { gaseosa2.moverseAlAzar() })
-    game.onTick(10000, "se mueve", { agua1.moverseAlAzar() })
-    game.onTick(10000, "se mueve", { agua2.moverseAlAzar() })
-
-// COLISIONES
-     /*
-    game.whenCollideDo(jugador2, {
-    game.say(jugador2,jugador2.decir("Me choque con algo!!"))
+    game.onTick (1000, "jugador1 recupera energia", { jugador1.ganarEnergia(10) })
+    game.onTick (1000, "jugador2 recupera energia", { jugador2.ganarEnergia(10) })
+    game.onTick (100, "chequeo de colisiones", {
+        [jugador1, jugador2].forEach({ jugador =>
+            jugador.agarrarConsumible (consumibles)
+            jugador.llevarPelota (pelota)
+        })
+        jugador1.agarrarTarjeta (tarjetas, jugador2)
+        jugador2.agarrarTarjeta (tarjetas, jugador1)
     })
-    */
-
-    /*game.onTick(100, "chequeo de colisiones", {
-    // CON CONSUMIBLES
     /*
-    if ((jugador1.position().x() - gaseosa1.position().x()).abs() < 5 and 
-        (jugador1.position().y() - gaseosa1.position().y()).abs() < 5) {
-        jugador1.consumir(gaseosa1)
-        game.say(jugador1, jugador1.decir("Rica gaseosa!"))
-        game.removeVisual(gaseosa1)
-    }
-    if ((jugador1.position().x() - gaseosa2.position().x()).abs() < 5 and 
-        (jugador1.position().y() - gaseosa2.position().y()).abs() < 5) {
-        jugador1.consumir(gaseosa2)
-        game.say(jugador1, jugador1.decir("Rica gaseosa!"))
-        game.removeVisual(gaseosa2)
-    }
-    if ((jugador1.position().x() - agua1.position().x()).abs() < 5 and 
-        (jugador1.position().y() - agua1.position().y()).abs() < 5) {
-        jugador1.consumir(agua1)
-        game.say(jugador1, jugador1.decir("Rica agua!"))
-        game.removeVisual(agua1)
-    }
-    if ((jugador1.position().x() - agua2.position().x()).abs() < 5 and 
-        (jugador1.position().y() - agua2.position().y()).abs() < 5) {
-        jugador1.consumir(agua2)
-        game.say(jugador1, jugador1.decir("Rica agua!"))
-        game.removeVisual(agua2)
-    }
-    if ((jugador1.position().x() - banana1.position().x()).abs() < 5 and 
-        (jugador1.position().y() - banana1.position().y()).abs() < 5) {
-        jugador1.consumir(banana1)
-        game.say(jugador1, jugador1.decir("Gracias por la fruta"))
-        game.removeVisual(banana1)
-    }
-    if ((jugador1.position().x() - banana2.position().x()).abs() < 5 and 
-        (jugador1.position().y() - banana2.position().y()).abs() < 5) {
-        jugador1.consumir(banana2)
-        game.say(jugador1, jugador1.decir("Gracias por la fruta"))
-        game.removeVisual(banana2)
-    }
-    if ((jugador1.position().x() - comida.position().x()).abs() < 5 and 
-        (jugador1.position().y() - comida.position().y()).abs() < 5) {
-        jugador1.consumir(comida)
-        game.say(jugador1, jugador1.decir("Gracias por la comida"))
-        game.removeVisual(comida)
-    }
-    if ((jugador1.position().x() - bananaPeel1.position().x()).abs() < 5 and 
-        (jugador1.position().y() - bananaPeel1.position().y()).abs() < 5) {
-        jugador1.moverseArriba(5)
-        jugador1.moverseDerecha(10)
-        game.say(jugador1, jugador1.decir("Noooooooo"))
-        //bananaPeel1.moverse(0,0)
-        game.removeVisual(bananaPeel1)
-    }
-    if ((jugador1.position().x() - bananaPeel2.position().x()).abs() < 5 and 
-        (jugador1.position().y() - bananaPeel2.position().y()).abs() < 5) {
-        jugador1.moverseArriba(5)
-        jugador1.moverseDerecha(10)
-        game.say(jugador1, jugador1.decir("Noooooooo"))
-        //bananaPeel2.moverse(0,0)
-        game.removeVisual(bananaPeel2)
-    }
-    if ((jugador1.position().x() - bananaPeel3.position().x()).abs() < 5 and 
-        (jugador1.position().y() - bananaPeel3.position().y()).abs() < 5) {
-        jugador1.moverseArriba(5)
-        jugador1.moverseDerecha(10)
-        game.say(jugador1, jugador1.decir("Noooooooo"))
-        //bananaPeel3.moverse(0,0)
-        game.removeVisual(bananaPeel3)
-    }
-    if ((jugador1.position().x() - cerveza.position().x()).abs() < 5 and 
-        (jugador1.position().y() - cerveza.position().y()).abs() < 5) {
-        jugador1.decir("ESTOY MAREADO")
-        game.schedule(10000, jugador1.efectoAlReves(jugador1))
-        game.removeVisual(cerveza)
-        jugador1.decir("NO TOMO MAS")
-        keyboard.w().onPressDo({ jugador1.moverseArriba(5) })
-        keyboard.a().onPressDo({ jugador1.moverseIzquierda(5) })
-        keyboard.s().onPressDo({ jugador1.moverseAbajo(5) })
-        keyboard.d().onPressDo({ jugador1.moverseDerecha(5) })
-    }
-
-    // CON TARJETAS
-    if ((jugador1.position().x() - tarjetaAmarilla.position().x()).abs() < 5 and 
-        (jugador1.position().y() - tarjetaAmarilla.position().y()).abs() < 5) {
-        tarjetaAmarilla.aplicar(jugador2)
-        game.say(jugador1, jugador1.decir("Toma amarilla"))
-        game.removeVisual(tarjetaAmarilla)
-    }
-    if ((jugador1.position().x() - tarjetaRoja.position().x()).abs() < 5 and 
-        (jugador1.position().y() - tarjetaRoja.position().y()).abs() < 5) {
-        tarjetaRoja.aplicar(jugador2)
-        game.say(jugador1, jugador1.decir("Toma roja"))
-        game.removeVisual(tarjetaRoja)
-    }
-    if ((jugador2.position().x() - tarjetaAmarilla.position().x()).abs() < 5 and 
-        (jugador2.position().y() - tarjetaAmarilla.position().y()).abs() < 5) {
-        tarjetaAmarilla.aplicar(jugador1)
-        game.say(jugador2, jugador2.decir("Amarelo para voce"))
-        game.removeVisual(tarjetaAmarilla)
-    }
-    if ((jugador2.position().x() - tarjetaRoja.position().x()).abs() < 5 and 
-        (jugador2.position().y() - tarjetaRoja.position().y()).abs() < 5) {
-        tarjetaRoja.aplicar(jugador1)
-        game.say(jugador2, jugador2.decir("Vermelho para voce"))
-        game.removeVisual(tarjetaRoja)
-    }
-
-    // CON PELOTA: DRIBBLING
-    if ((jugador1.position().x() - pelota.position().x()).abs() < proximidad &&
-        (jugador1.position().y() - pelota.position().y()).abs() < proximidad) {
-        // Empuja la pelota en la dirección de movimiento del jugador
-        if (jugador1.position().x() < pelota.position().x()) {
-            pelota.moverse(pelota.position().x() + 5, pelota.position().y())
-        } else if (jugador1.position().x() > pelota.position().x()) {
-            pelota.moverse(pelota.position().x() - 5, pelota.position().y())
-        }
-        if (jugador1.position().y() < pelota.position().y()) {
-            pelota.moverse(pelota.position().x(), pelota.position().y() + 5)
-        } else if (jugador1.position().y() > pelota.position().y()) {
-            pelota.moverse(pelota.position().x(), pelota.position().y() - 5)
-        }
-    }
-    if ((jugador2.position().x() - pelota.position().x()).abs() < proximidad &&
-        (jugador2.position().y() - pelota.position().y()).abs() < proximidad) {
-        // Empuja la pelota en la dirección de movimiento del jugador
-        if (jugador2.position().x() < pelota.position().x()) {
-            pelota.moverse(pelota.position().x() + 5, pelota.position().y())
-        } else if (jugador2.position().x() > pelota.position().x()) {
-            pelota.moverse(pelota.position().x() - 5, pelota.position().y())
-        }
-        if (jugador2.position().y() < pelota.position().y()) {
-            pelota.moverse(pelota.position().x(), pelota.position().y() + 5)
-        } else if (jugador2.position().y() > pelota.position().y()) {
-            pelota.moverse(pelota.position().x(), pelota.position().y() - 5)
-        }
-    }
-    / CON PELOTA: GOLES
     if (pelota.position().x() >= arco1X && pelota.position().x() <= (arco1X + arco1Ancho) &&
         pelota.position().y() >= arco1Y && pelota.position().y() <= (arco1Y + arco1Alto)) {
         golesJugador2 += 1
         game.say(jugador2, "¡Gol para el Jugador 2! Total: " + golesJugador2)
-        pelota.moverse(110, 50) // Reiniciar la posición de la pelota
+        // Reiniciamos posiciones
+        pelota.moverse(110, 50)
+        jugador1.moverse(xiJugador1, yiAmbosJugadores)
+        jugador2.moverse(xiJugador2, yiAmbosJugadores)
     }
     if (pelota.position().x() >= arco2X && pelota.position().x() <= (arco2X + arco2Ancho) &&
         pelota.position().y() >= arco2Y && pelota.position().y() <= (arco2Y + arco2Alto)) {
         golesJugador1 += 1
         game.say(jugador1, "¡Gol para el Jugador 1! Total: " + golesJugador1)
-        pelota.moverse(110, 50) // Reiniciar la posición de la pelota
+        // Reiniciamos posiciones
+        pelota.moverse(110, 50)
+        jugador1.moverse(xiJugador1, yiAmbosJugadores)
+        jugador2.moverse(xiJugador2, yiAmbosJugadores)
     }
-    })*/
-    
+    */
     game.start()
 }
diff --git a/objects.wlk b/objects.wlk
index 309bf87..3f2d27e 100644
--- a/objects.wlk
+++ b/objects.wlk
@@ -1,169 +1,251 @@
 class Jugador {
-  var goles = 0
-  const imagen 
-  const position = game.center()
-  var cansancio = 0
-
-  method image() = imagen
-  method position() = position
-  method cansancio() = cansancio
-  method goles() = goles
-  method consumir(consumible) {
-    cansancio = 0.max(cansancio - consumible.energia())
+  const property image
+  var property x = 105
+  var property y = 50
+  var property position = game.at(x, y)
+  var property ultimaDireccion = "ninguna"
+  var property energia = 100
+  var property potencia = 0
+  const rangoProximidad = 4
+
+  method ganarPotencia(input) {
+    potencia = 30.min(potencia + input)
   }
-
-  method efectoAlReves(jugador) {
-  keyboard.s().onPressDo({ jugador.moverseArriba(5) })
-    keyboard.d().onPressDo({ jugador.moverseIzquierda(5) })
-    keyboard.w().onPressDo({ jugador.moverseAbajo(5) })
-    keyboard.a().onPressDo({ jugador.moverseDerecha(5) })
+  method perderPotencia(input) {
+    potencia = 0.max(potencia - input)
   }
-
-  method recuperarEnergia(energia) {
-    cansancio = 0.max(cansancio - energia)cansancio = 0.max(cansancio - energia)
+  method ganarEnergia(input) {
+    energia = 100.min(energia + input)
   }
-
-  method cansarse(pos) {
-    cansancio += pos
+  method perderEnergia(input) {
+    energia = 0.max(energia - input)
   }
-
-  method moverseArriba(pos) {
-    if (pos-(cansancio/100) <= 0){position.goUp(0)} 
-    else {
-    self.cansarse(pos) 
-    position.goUp(pos-(cansancio/100))
-    }
+  method ajustarPorEnergia(cantidad) {
+    if (energia >= 80) return cantidad
+    else if (energia >= 60) return 0.8* cantidad
+    else if (energia >= 40) return 0.6* cantidad
+    else if (energia >= 20) return 0.4* cantidad
+    else if (energia > 0) return 0.2* cantidad
+    else return 0
   }
-
-  method moverseAbajo(pos) {
-    if (pos-(cansancio/100) <= 0){position.goDown(0)} 
-    else {
-    self.cansarse(pos) 
-    position.goDown(pos-(cansancio/100))
-    }
+  method moverseArriba(cantCeldas) { 
+    position.goUp(self.ajustarPorEnergia(cantCeldas)) 
+    self.perderEnergia(2) 
+    ultimaDireccion = "arriba" 
   }
-
-  method moverseDerecha(pos) {
-    if (pos-(cansancio/100) <= 0){position.goRight(0)} 
-    else {
-    self.cansarse(pos) 
-    position.goRight(pos-(cansancio/100))
-    }
+  method moverseAbajo(cantCeldas) { 
+    position.goDown(self.ajustarPorEnergia(cantCeldas)) 
+    self.perderEnergia(2) 
+    ultimaDireccion = "abajo" 
   }
-
-  method moverseIzquierda(pos) {
-    if (pos-(cansancio/100) <= 0){position.goLeft(0)} 
-    else {
-    self.cansarse(pos) 
-    position.goLeft(pos-(cansancio/100))
-    }
+  method moverseDerecha(cantCeldas) { 
+    position.goRight(self.ajustarPorEnergia(cantCeldas)) 
+    self.perderEnergia(2) 
+    ultimaDireccion = "derecha" 
   }
-
-  method decir(texto) = texto
-
-  method colision(item,jugador, numero) =
-    (jugador.position().x() - item.position().x()).abs() < numero and 
-        (jugador.position().y() - item.position().y()).abs() < numero
-  
-  method efectoColision(jugador,item) {
-    if (jugador.colision(item,jugador,5)) {
-      jugador.aplicar(item)
-      game.say(jugador, jugador.decir(item.frase()))
-      game.removeVisual(item)
+  method moverseIzquierda(cantCeldas) { 
+    position.goLeft(self.ajustarPorEnergia(cantCeldas)) 
+    self.perderEnergia(2) 
+    ultimaDireccion = "izquierda" 
+  }
+  method seMueveDerecha() = ultimaDireccion == "derecha"
+  method seMueveIzquierda() = ultimaDireccion == "izquierda"
+  method seMueveArriba() = ultimaDireccion == "arriba"
+  method seMueveAbajo() = ultimaDireccion == "abajo"
+
+  method moverse(xNueva, yNueva) { // por ahora este método no lo usamos.
+    x = xNueva
+    y = yNueva
+  }
+  method estaCercaDe(algo) = 
+    (self.position().x() - algo.position().x()).abs() < rangoProximidad and 
+    (self.position().y() - algo.position().y()).abs() < rangoProximidad 
+
+  method llevarPelota(pelota) {
+    if (self.estaCercaDe(pelota)) {
+      if (self.seMueveDerecha()) {
+        pelota.moverse(pelota.position().x() + (rangoProximidad + 1), pelota.position().y())
+        self.perderEnergia(1) 
+      } 
+      else if (self.seMueveIzquierda()) {
+        pelota.moverse(pelota.position().x() - (rangoProximidad + 1), pelota.position().y())
+        self.perderEnergia(1) 
+      }
+      else if (self.seMueveArriba()) {
+        pelota.moverse(pelota.position().x(), pelota.position().y() + (rangoProximidad + 1))
+        self.perderEnergia(1) 
+      } 
+      else if (self.seMueveAbajo()) {
+        pelota.moverse(pelota.position().x(), pelota.position().y() - (rangoProximidad + 1))
+        self.perderEnergia(1)
+      }
     }
- 
   }
-
-
- method hacerGol(pelota,jugador){
-      if(pelota.estaEnAreaDeGol(pelota)){
-        goles += 1
-        game.say(jugador, "¡Gol para el Jugador 1! Total: " + goles)
-        pelota.moverse(110, 50)
+  method patearPelota(pelota){
+    if (self.estaCercaDe(pelota)) {
+      if (self.seMueveDerecha()) {
+        pelota.moverse(pelota.position().x() + self.ajustarPorEnergia(potencia), pelota.position().y())
+        self.perderEnergia(25)
+      } 
+      else if (self.seMueveIzquierda()) {
+        pelota.moverse(pelota.position().x() - self.ajustarPorEnergia(potencia), pelota.position().y())
+        self.perderEnergia(25)
+      }
+      else if (self.seMueveArriba()) {
+        pelota.moverse(pelota.position().x(), pelota.position().y() + self.ajustarPorEnergia(potencia))
+        self.perderEnergia(25)
+      } 
+      else if (self.seMueveAbajo()) {
+        pelota.moverse(pelota.position().x(), pelota.position().y() - self.ajustarPorEnergia(potencia))
+        self.perderEnergia(25)
       }
     }
-
+  }
+  method agarrarConsumible(consumibles) {
+    consumibles.forEach({ consumible =>
+      if (self.estaCercaDe(consumible)) {
+        consumible.aplicarSobre(self)
+        consumible.desaparecer() } 
+    })
+  }
+  method agarrarTarjeta(tarjetas, otroJugador) {
+    tarjetas.forEach({ tarjeta =>
+      if (self.estaCercaDe(tarjeta)) {
+        tarjeta.aplicarTarjeta(self, otroJugador)
+        tarjeta.desaparecer() } 
+    })
+  }
+  method decir(texto) = texto
 }
 
 class Item {
-  const imagen
-  var frase 
-  const x = 0.randomUpTo(game.width()).truncate(0)
-  const y = 0.randomUpTo(game.height()).truncate(0)
-  var position = game.at(x, y)
+  const property image
+  var property position = game.at(-100, -100)
 
-  method image() = imagen
-  method position() = position
-  method moverse(nuevo_x, nuevo_y) {
-    position = game.at(nuevo_x, nuevo_y)
+  method moverse(xf, yf) {
+    position = game.at(xf, yf)
   }
   method moverseAlAzar() {
-    const x_random = 0.randomUpTo(game.width()).truncate(0)
-    const y_random = 0.randomUpTo(game.height()).truncate(0)
-    position = game.at(x_random,y_random)
+    position = game.at(12.randomUpTo(208).truncate(0), 2.randomUpTo(96).truncate(0))
   }
-
-  method frase() = frase
 }
-
+// Consumibles
 class Consumible inherits Item {
-  const energia
-  method energia() = energia
-  method aplicar(jugador,consumible) {
-    jugador.recuperarEnergia(energia)
+  const property energia = 0
+  const property potencia = 0
+  method aplicarSobre (jugador) {}
+  method desaparecer() {}
+}
+class Agua inherits Consumible (energia = 20, potencia = 5, image = "agua.png") {
+	override method aplicarSobre(jugador) {
+		jugador.ganarEnergia(energia) // permite 10 pasos más.
+    jugador.ganarPotencia(potencia) // llena 1/6 de la potencia máxima.
+    game.say(jugador, jugador.decir("Rica agua"))
+	}
+  override method desaparecer() {
+    self.moverse(-100, -100)
+    game.schedule(1000, {
+      self.moverseAlAzar() // reaparece luego de 1 seg.
+      game.onTick (8000, "el agua se empieza a mover", {self.moverseAlAzar()}) })
   }
 }
-
-class Tarjetas inherits Item {
-  var cantidad
-  method aplicar(jugador) {
-    jugador.cansarse(cantidad) // cuál es la diferencia entre esto y hardcodearle el efecto desde main?
+class Gaseosa inherits Consumible (energia = 30, potencia = 5, image = "coke2.png") {
+	override method aplicarSobre(jugador) {
+		jugador.ganarEnergia(energia) // permite 15 pasos más.
+    jugador.ganarPotencia(potencia) // llena 1/6 de la potencia máxima.
+    game.say(jugador, jugador.decir("Rica gaseosa"))
+	}
+  override method desaparecer() {
+    self.moverse(-100, -100)
+    game.schedule(2000, { 
+      self.moverseAlAzar() // reaparece luego de 2 seg.
+      game.onTick (8000, "la gaseosa se empieza a mover", {self.moverseAlAzar()}) })
   }
 }
-
-class CascaraBanana inherits Item {
-  method aplicar(jugador) {
-    jugador.moverseArriba(5)
-    jugador.moverseDerecha(10)
+class Banana inherits Consumible (energia = 40, potencia = 10, image = "bananas.png") {
+	override method aplicarSobre(jugador) {
+		jugador.ganarEnergia(energia) // permite 20 pasos más.
+    jugador.ganarPotencia(potencia) // llena 1/3 de la potencia máxima.
+    game.say(jugador, jugador.decir("Rica fruta"))
+	}
+  override method desaparecer() {
+    self.moverse(-100, -100)
+    game.schedule(3000, { 
+      self.moverseAlAzar() // reaparece luego de 3 seg.
+      game.onTick (6000, "la banana se empieza a mover", {self.moverseAlAzar()}) })
   }
 }
-
-class Pelota inherits Item{
-  const arco1X = game.width() / 2 - 5 // Coordenada x de la portería 1 (izquierda)
-    const arco1Y = 0 // Coordenada y de la portería 1
-    const arco1Ancho = 10 // Ancho de la portería 1
-    const arco1Alto = 5 // Alto de la portería 1
-
-    const arco2X = game.width() / 2 - 5 // Coordenada x de la portería 2 (derecha)
-    const arco2Y = game.height() - 10 // Coordenada y de la portería 2
-    const arco2Ancho = 10 // Ancho de la portería 2
-    const arco2Alto = 5 // Alto de la portería 2
-
-    // Marcadores de goles
-    const proximidad = 4
-
-    method golpearPelota(jugador, pelota){
-      if (jugador.colision(pelota,jugador,4)){
-        pelota.direccionarPelota(jugador,pelota)
-      }
-    }
-
-    method direccionarPelota(jugador,pelota){
-       if (jugador.position().x() < pelota.position().x()) {
-            pelota.moverse(pelota.position().x() + 3, pelota.position().y())
-        } else if (jugador.position().x() > pelota.position().x()) {
-            pelota.moverse(pelota.position().x() - 3, pelota.position().y())
-        }
-        if (jugador.position().y() < pelota.position().y()) {
-            pelota.moverse(pelota.position().x(), pelota.position().y() + 3)
-        } else if (jugador.position().y() > pelota.position().y()) {
-            pelota.moverse(pelota.position().x(), pelota.position().y() - 3)
-        }
-    }
-
-    method estaEnAreaDeGol(pelota) = pelota.position().x() >= arco1X && pelota.position().x() <= (arco1X + arco1Ancho) &&
-        pelota.position().y() >= arco1Y && pelota.position().y() <= (arco1Y + arco1Alto)
-   
-
+class Comida inherits Consumible (energia = 80, potencia = 20, image = "comida.png") {
+	override method aplicarSobre(jugador) {
+		jugador.ganarEnergia(energia) // permite 30 pasos más.
+    jugador.ganarPotencia(potencia) // llena 2/3 de la potencia máxima.
+    game.say(jugador, jugador.decir("Rica comida"))
+	}
+  override method desaparecer() {
+    self.moverse(-100, -100)
+    game.schedule(5000, { 
+      self.moverseAlAzar() // reaparece luego de 5 seg.
+      game.onTick (5000, "la comida se empieza a mover", {self.moverseAlAzar()}) })
+  }
+}
+class BananaPeelDer inherits Consumible (energia = 20, image = "bananaPeel.png") {
+	override method aplicarSobre(jugador) {
+		jugador.perderEnergia(energia) // permite 10 pasos menos.
+    jugador.moverseArriba(5.randomUpTo(15).truncate(0))
+    jugador.moverseDerecha(5.randomUpTo(15).truncate(0))
+    game.say(jugador, jugador.decir("Noooooooo"))
+	}
+  override method desaparecer() {
+    self.moverse(-100, -100)
+    game.schedule(100, { 
+      self.moverseAlAzar() // reaparece casi instantáneamente.
+      game.onTick (2000, "la bananaPeelDer se empieza a mover", {self.moverseAlAzar()}) })
+  }
 }
-  
+class BananaPeelIzq inherits Consumible (energia = 20, image = "bananaPeel.png") {
+	override method aplicarSobre(jugador) {
+		jugador.perderEnergia(energia) // permite 10 pasos menos.
+    jugador.moverseAbajo(5.randomUpTo(15).truncate(0))
+    jugador.moverseIzquierda(5.randomUpTo(15).truncate(0))
+    game.say(jugador, jugador.decir("Noooooooo"))
+	}
+  override method desaparecer() {
+    self.moverse(-100, -100)
+    game.schedule(100, { 
+      self.moverseAlAzar() // reaparece casi instantáneamente.
+      game.onTick (4000, "la bananaPeelIzq se empieza a mover", {self.moverseAlAzar()}) })
+  }
+}
+// Tarjetas
+class Tarjeta inherits Item {
+  const property energia
+  const property potencia
+  method aplicarTarjeta (jugador, jugadorAplicado) {}
+  method desaparecer() {}
+}
+class TarjetaAmarilla inherits Tarjeta (energia = 50, potencia = 10, image = "yellowCard.png") {
+	override method aplicarTarjeta(jugador, jugadorAplicado) {
+		jugadorAplicado.perderEnergia(energia) // permite 25 pasos menos.
+    jugadorAplicado.perderPotencia(potencia) // quita 1/3 de la potencia máxima.
+    game.say(jugador, jugador.decir("Toma amarilla"))
+	}
+  override method desaparecer() {
+    self.moverse(-100, -100)
+    game.schedule(5000, { 
+      self.moverseAlAzar() // reaparece luego de 5 seg.
+      game.onTick (4000, "la tarjAmarilla se empieza a mover", {self.moverseAlAzar()}) })
+  }
+}
+class TarjetaRoja inherits Tarjeta (energia = 100, potencia = 20, image = "redCard.png") {
+	override method aplicarTarjeta(jugador, jugadorAplicado) {
+	  jugadorAplicado.perderEnergia(energia) // permite 50 pasos menos (inmobiliza).
+    jugadorAplicado.perderPotencia(potencia)  // quita 2/3 de la potencia máxima.
+    game.say(jugador, jugador.decir("Toma roja!"))
+	}
+  override method desaparecer() {
+    self.moverse(-100, -100)
+    game.schedule(10000, { 
+      self.moverseAlAzar() // reaparece luego de 10 seg.
+      game.onTick (2000, "la tarjRoja se empieza a mover", {self.moverseAlAzar()}) })
+  }
+}
\ No newline at end of file