diff --git a/src/GestorJuegos.kt b/src/GestorJuegos.kt index 26c0ddc..eaadff7 100644 --- a/src/GestorJuegos.kt +++ b/src/GestorJuegos.kt @@ -2,7 +2,6 @@ package dev.araozu import dev.araozu.juego.Juego import io.ktor.http.cio.websocket.* -import kotlinx.coroutines.isActive object GestorJuegos { @@ -84,7 +83,7 @@ object GestorJuegos { suspend fun manejarIgnorarOportunidad(idJuego: String, idUsuario: String) { val juego = juegos[idJuego]!! - juego.ignorarOportunidadSeq(idUsuario) + juego.ignorarOportunidades(idUsuario) } suspend fun manejarLlamarSeq(idJuego: String, idUsuario: String, cartaDescartada: Int, combinacion: Pair) { diff --git a/src/juego/Juego.kt b/src/juego/Juego.kt index 15c61d8..98e1265 100644 --- a/src/juego/Juego.kt +++ b/src/juego/Juego.kt @@ -49,7 +49,7 @@ class Juego(val usuarios: ArrayList>) { ordenJugadores = Array(4) { jugadores[it].idUsuario } } - private fun obtenerDatosJuegoActuales(): DatosJuego { + fun obtenerDatosJuegoActuales(): DatosJuego { val idJugadorTurnoActual = jugadores[posJugadorActual].idUsuario return DatosJuego( dora = arrayListOf(), @@ -126,42 +126,34 @@ class Juego(val usuarios: ArrayList>) { val cantidadOportunidades = jugadores[posJugadorActual].descartarCarta(cartaDescartada) - if (cantidadOportunidades > 0) { - // Enviar datos - enviarDatosATodos() - } else { - cambiarTurnoSigJugadorConsecutivo() + when { + cantidadOportunidades > 0 -> { + // Enviar datos + enviarDatosATodos() + } + cantidadOportunidades == 0 -> { + cambiarTurnoSigJugadorConsecutivo() - // Actualizar dora - gestorDora.actualizarDora() + // Actualizar dora + gestorDora.actualizarDora() - // Enviar datos - enviarDatosATodos() + // Enviar datos + enviarDatosATodos() + } + else -> { + System.err.println("Se intento descartar en un estado invalido.") + } } } - // TODO: Usar diferente metodo para ignorar oportunidad Tsumo - suspend fun ignorarOportunidadSeq(idUsuario: String) { - - var aunHayOportunidades = false - oportunidadesRestantes-- - - for ((id, mano) in manos) { - // Eliminar oportunidad del usuario - if (id == idUsuario) { - mano.oportunidades = arrayListOf() - enviarDatos(id, conexiones[id]!!) - continue - } - - // Si algun otro jugador tiene una oportunidad - if (mano.oportunidades.isNotEmpty()) { - aunHayOportunidades = true - } - } + suspend fun ignorarOportunidades(idUsuario: String) { + val jugador = jugadores.find { it.idUsuario == idUsuario } ?: return + val aunHayOportunidades = jugador.ignorarOportunidades() // Si no quedan oportunidades cambiar el turno al sig jugador - if (!aunHayOportunidades) { + if (aunHayOportunidades) { + jugador.enviarDatos(obtenerDatosJuegoActuales()) + } else { cambiarTurnoSigJugadorConsecutivo() // Actualizar dora diff --git a/src/juego/Jugador.kt b/src/juego/Jugador.kt index 515d5e9..82aa61a 100644 --- a/src/juego/Jugador.kt +++ b/src/juego/Jugador.kt @@ -80,6 +80,18 @@ sealed class Jugador(val juego: Juego, val idUsuario: String) { return oportunidadesRestantes } + /** + * Limpia las oportunidades del jugador y verifica si algun otro jugador tiene alguna oportunidad + * @return Si otro jugador tiene alguna oportunidad + */ + fun ignorarOportunidades(): Boolean { + mano.oportunidades.clear() + + return null != juego.jugadores.find { + it !== this && it.mano.oportunidades.size > 0 + } + } + abstract fun verificarTsumo() }