'Sesión no iniciada']); exit; } $idPartida = intval($_POST['idPartida'] ?? 0); $orden = $_POST['orden'] ?? ''; if ($idPartida <= 0) { echo json_encode(['error' => 'Partida no válida']); exit; } $conexion = conexionBD(); if (is_array($conexion)) { echo json_encode($conexion); exit; } switch ($orden) { case 'comprobarEstado': try { // Contar jugadores totales apuntados en los equipos de esta partida $stmt = $conexion->prepare(" SELECT COUNT(exu.idUsuario) AS total_jugadores FROM equipoxpartida exp INNER JOIN equipoxusuario exu ON exp.idEquipo = exu.idEquipo WHERE exp.idPartida = :idPartida "); $stmt->execute([':idPartida' => $idPartida]); $totalJugadores = (int)$stmt->fetchColumn(); $preguntasTotalesEsperadas = $totalJugadores * 10; // Contar respuestas dadas en la partida $stmtRespuestas = $conexion->prepare(" SELECT COUNT(*) FROM respuestaalmacenada ra INNER JOIN partidaxpregunta pxp ON ra.idPartidaxPregunta = pxp.idPartidaxPregunta WHERE pxp.idPartida = :idPartida "); $stmtRespuestas->execute([':idPartida' => $idPartida]); $respuestasRespondidas = (int)$stmtRespuestas->fetchColumn(); $terminada = ($respuestasRespondidas >= $preguntasTotalesEsperadas && $preguntasTotalesEsperadas > 0); // Cuando la partida finaliza, se actualizan los históricos if ($terminada && !isset($_SESSION['partidas_procesadas'][$idPartida])) { $conexion->beginTransaction(); // CÁLCULO DE VELOCIDAD PREGUNTA A PREGUNTA EN SESIÓN if (!isset($_SESSION['primeros_en_acertar'][$idPartida])) { $_SESSION['primeros_en_acertar'][$idPartida] = []; } // Vemos quién fue el primero $stmtVelocidad = $conexion->prepare(" SELECT ra.idPartidaxPregunta, ra.idUsuario FROM respuestaalmacenada ra INNER JOIN respuesta r ON ra.idRespuesta = r.idRespuesta INNER JOIN partidaxpregunta pxp ON ra.idPartidaxPregunta = pxp.idPartidaxPregunta WHERE pxp.idPartida = :idPartida AND r.correcta = 1 ORDER BY ra.idRespuestaAlmacenada ASC "); $stmtVelocidad->execute([':idPartida' => $idPartida]); $todosLosAciertos = $stmtVelocidad->fetchAll(PDO::FETCH_ASSOC); foreach ($todosLosAciertos as $acierto) { $idPxp = $acierto['idPartidaxPregunta']; $idU = $acierto['idUsuario']; if (!isset($_SESSION['primeros_en_acertar'][$idPartida][$idPxp])) { $_SESSION['primeros_en_acertar'][$idPartida][$idPxp] = $idU; } } // Actualizamos la base de datos // Buscamos los aciertos de cada jugador en la partida actual $stmtAciertos = $conexion->prepare(" SELECT ra.idUsuario, exu.idEquipo, COUNT(*) as aciertos_partida FROM respuestaalmacenada ra INNER JOIN partidaxpregunta pxp ON ra.idPartidaxPregunta = pxp.idPartidaxPregunta INNER JOIN respuesta r ON ra.idRespuesta = r.idRespuesta INNER JOIN equipoxusuario exu ON ra.idUsuario = exu.idUsuario WHERE pxp.idPartida = :idPartida AND r.correcta = 1 GROUP BY ra.idUsuario "); $stmtAciertos->execute([':idPartida' => $idPartida]); $jugadoresPartida = $stmtAciertos->fetchAll(PDO::FETCH_ASSOC); $updateAciertosGlobales = $conexion->prepare(" UPDATE usuario SET aciertos = aciertos + :nuevos_aciertos WHERE idUsuario = :idUsuario "); $puntosEquipos = []; foreach ($jugadoresPartida as $jp) { $idU = (int)$jp['idUsuario']; $idE = (int)$jp['idEquipo']; $nuevosAciertos = (int)$jp['aciertos_partida']; // Sumamos los aciertos al perfil del usuario $updateAciertos->execute([ ':nuevos_aciertos' => $nuevosAciertos, ':idUsuario' => $idU ]); if (!isset($puntosEquipos[$idE])) { $puntosEquipos[$idE] = 0; } $puntosEquipos[$idE] += $nuevosAciertos; } // Determinamos qué equipo ha obtenido más aciertos en la partida arsort($puntosEquipos); $idEquipoGanador = key($puntosEquipos); // Obtenemos todos los usuarios de la partida para asignar victorias/derrotas $stmtMiembros = $conexion->prepare(" SELECT exu.idUsuario, exu.idEquipo FROM equipoxpartida exp INNER JOIN equipoxusuario exu ON exp.idEquipo = exu.idEquipo WHERE exp.idPartida = :idPartida "); $stmtMiembros->execute([':idPartida' => $idPartida]); $todosLosMiembros = $stmtMiembros->fetchAll(PDO::FETCH_ASSOC); $updateVictoria = $conexion->prepare("UPDATE usuario SET victorias = victorias + 1 WHERE idUsuario = :idUsuario"); $updateDerrota = $conexion->prepare("UPDATE usuario SET derrotas = derrotas + 1 WHERE idUsuario = :idUsuario"); foreach ($todosLosMiembros as $miembro) { $idU = (int)$miembro['idUsuario']; $idE = (int)$miembro['idEquipo']; if ($idE === $idEquipoGanador) { $updateVictoria->execute([':idUsuario' => $idU]); } else { $updateDerrota->execute([':idUsuario' => $idU]); } } $conexion->commit(); $_SESSION['partidas_procesadas'][$idPartida] = true; } echo json_encode(['terminada' => $terminada]); } catch (PDOException $e) { if ($conexion->inTransaction()) { $conexion->rollBack(); } echo json_encode(['error' => $e->getMessage()]); } break; default: echo json_encode(['error' => 'Acción no permitida']); break; }