class AsignacionJugador { final String jugadorId; final String nombre; final String clientId; final String? endpointId; const AsignacionJugador({ required this.jugadorId, required this.nombre, required this.clientId, required this.endpointId, }); } class JugadorInicioPartida { final String jugadorId; final String nombre; final bool esImpostor; final String? palabra; const JugadorInicioPartida({ required this.jugadorId, required this.nombre, required this.esImpostor, required this.palabra, }); Map toJson() => { 'jugadorId': jugadorId, 'nombre': nombre, 'esImpostor': esImpostor, if (palabra != null) 'palabra': palabra, }; factory JugadorInicioPartida.fromJson(Map json) { return JugadorInicioPartida( jugadorId: json['jugadorId'] as String, nombre: json['nombre'] as String, esImpostor: json['esImpostor'] as bool? ?? false, palabra: json['palabra'] as String?, ); } } class InicioPartidaCliente { final String clientId; final String? endpointId; final String categoria; final List jugadores; const InicioPartidaCliente({ required this.clientId, required this.endpointId, required this.categoria, required this.jugadores, }); Map toJson() => { 'clientId': clientId, if (endpointId != null) 'endpointId': endpointId, 'categoria': categoria, 'jugadores': jugadores.map((jugador) => jugador.toJson()).toList(), }; factory InicioPartidaCliente.fromJson(Map json) { return InicioPartidaCliente( clientId: json['clientId'] as String, endpointId: json['endpointId'] as String?, categoria: json['categoria'] as String, jugadores: (json['jugadores'] as List? ?? []) .map((jugadorJson) => JugadorInicioPartida.fromJson( jugadorJson as Map, )) .toList(), ); } } class InicioPartidaMultijugador { static Map crearPayloadsPorCliente({ required List asignaciones, required String palabraSecreta, required String categoria, required Map impostoresPorJugadorId, }) { final payloads = {}; for (final asignacion in asignaciones) { final esImpostor = impostoresPorJugadorId[asignacion.jugadorId] ?? false; final payloadActual = payloads[asignacion.clientId]; final jugador = JugadorInicioPartida( jugadorId: asignacion.jugadorId, nombre: asignacion.nombre, esImpostor: esImpostor, palabra: esImpostor ? null : palabraSecreta, ); if (payloadActual == null) { payloads[asignacion.clientId] = InicioPartidaCliente( clientId: asignacion.clientId, endpointId: asignacion.endpointId, categoria: categoria, jugadores: [jugador], ); } else { payloads[asignacion.clientId] = InicioPartidaCliente( clientId: payloadActual.clientId, endpointId: payloadActual.endpointId, categoria: payloadActual.categoria, jugadores: [...payloadActual.jugadores, jugador], ); } } return payloads; } }