rimajon-ktor/src/Juego.kt

108 lines
3.3 KiB
Kotlin
Raw Normal View History

2020-09-21 21:25:21 +00:00
package dev.araozu
2020-09-23 01:20:23 +00:00
import io.ktor.http.cio.websocket.*
2020-09-21 21:25:21 +00:00
2020-09-23 01:20:23 +00:00
class Juego(val usuarios: ArrayList<Pair<String, Boolean>>) {
2020-09-21 21:25:21 +00:00
2020-09-23 01:20:23 +00:00
private val cartas: Array<Int> = GestorJuegos.generarCartas()
val conexiones: HashMap<String, WebSocketSession> = HashMap()
private val ordenJugadores = Array(4) {""}
2020-09-23 01:20:23 +00:00
private val manos: HashMap<String, Mano> = HashMap()
private val dora: ArrayList<Int> = arrayListOf()
private val doraPublico = Array(5) {0}
private val doraOculto = Array(5) {0}
2020-09-25 15:10:08 +00:00
private var estadoJuego = EstadoJuego.Espera
private var posCartaActual = 0
private var cartasRestantes = 58
private val turnoActual = 0
2020-09-21 21:25:21 +00:00
suspend fun iniciarJuego(ws: WebSocketSession) {
2020-09-23 01:20:23 +00:00
if (estadoJuego != EstadoJuego.Espera) return
2020-09-21 21:25:21 +00:00
if (conexiones.size < 4) {
ws.send(Frame.Text("{\"operacion\": \"error\", \"razon\": \"Usuarios insuficientes\"}"))
return
}
2020-09-23 01:20:23 +00:00
estadoJuego = EstadoJuego.Iniciado
for (i in posCartaActual until (posCartaActual + 10)) {
dora.add(cartas[i])
2020-09-21 21:25:21 +00:00
}
2020-09-23 01:20:23 +00:00
posCartaActual += 10
doraPublico[0] = dora[0]
doraOculto[0] = dora[4]
2020-09-21 21:25:21 +00:00
2020-09-25 15:10:08 +00:00
// Asignar orden de jugadores
var i = 0
var idJugadorInicial = ""
conexiones.forEach { (idUsuario, _) ->
if (i == 0) idJugadorInicial = idUsuario
ordenJugadores[i] = idUsuario
i++
val cartasL = arrayListOf<Int>()
2020-09-21 21:25:21 +00:00
2020-09-25 15:10:08 +00:00
for (j in posCartaActual until (posCartaActual + 10)) {
cartasL.add(cartas[j])
2020-09-23 01:20:23 +00:00
}
posCartaActual += 10
2020-09-21 21:25:21 +00:00
2020-09-25 15:10:08 +00:00
val mano = if (idJugadorInicial == idUsuario) {
val sigCarta = cartas[posCartaActual]
posCartaActual++
Mano(cartasL, sigCarta = sigCarta)
} else {
Mano(cartasL)
}
2020-09-23 01:20:23 +00:00
manos[idUsuario] = mano
2020-09-21 21:25:21 +00:00
}
2020-09-25 15:10:08 +00:00
conexiones.forEach { (_, socket) ->
2020-09-23 01:20:23 +00:00
socket.send(Frame.Text("{\"operacion\": \"juego_iniciado\"}"))
2020-09-21 21:25:21 +00:00
}
2020-09-25 15:10:08 +00:00
2020-09-23 01:20:23 +00:00
conexiones.clear()
}
private suspend fun enviarDatos(idUsuario: String, ws: WebSocketSession) {
var doraOcultoS = Array(5) {0}
val manosS = HashMap<String, Mano>()
for ((idUsuarioAct, mano) in manos) {
if (idUsuarioAct == idUsuario) {
if (mano.allIn) {
doraOcultoS = doraOculto
}
manosS[idUsuarioAct] = mano
} else {
manosS[idUsuarioAct] = mano.obtenerManoPrivada()
}
}
2020-09-25 15:10:08 +00:00
val idJugadorTurnoActual = ordenJugadores[turnoActual]
val datosJuego = DatosJuego(
doraPublico,
doraOcultoS,
manosS,
cartasRestantes,
ordenJugadores,
idJugadorTurnoActual
)
ws.send(Frame.Text("{\"operacion\": \"actualizar_datos\", \"datos\": ${gson.toJson(datosJuego)}}"))
}
suspend fun agregarConexion(idUsuario: String, conexion: WebSocketSession) {
conexiones[idUsuario] = conexion
if (estadoJuego == EstadoJuego.Iniciado) {
enviarDatos(idUsuario, conexion)
}
2020-09-23 01:20:23 +00:00
}
fun agregarUsuario(idUsuario: String) {
if (estadoJuego == EstadoJuego.Espera) usuarios.add(Pair(idUsuario, true))
2020-09-21 21:25:21 +00:00
}
}