Gamificación
This commit is contained in:
@@ -85,6 +85,8 @@ class ServicioNearby extends ChangeNotifier {
|
||||
String? _miNombre;
|
||||
String? _miNick;
|
||||
String? _miAvatar;
|
||||
int _miFuego = 0;
|
||||
List<String> _miMedallas = const [];
|
||||
|
||||
final Map<String, JugadorConectado> _jugadores = {};
|
||||
final List<OnMensajeCallback> _listeners = [];
|
||||
@@ -213,6 +215,8 @@ class ServicioNearby extends ChangeNotifier {
|
||||
String miNombre, {
|
||||
String? miNick,
|
||||
String? miAvatar,
|
||||
int miFuego = 0,
|
||||
List<String> miMedallas = const [],
|
||||
}) async {
|
||||
if (_conectado ||
|
||||
_anunciando ||
|
||||
@@ -245,6 +249,8 @@ class ServicioNearby extends ChangeNotifier {
|
||||
foto: miAvatar,
|
||||
creadoPorClienteId: _hostClientId,
|
||||
clienteIdSeleccionado: _hostClientId,
|
||||
fuego: miFuego,
|
||||
medallas: miMedallas,
|
||||
);
|
||||
_estadoSala!.crearUsuario(usuarioHost);
|
||||
_sincronizarPoolDesdeSala();
|
||||
@@ -281,10 +287,14 @@ class ServicioNearby extends ChangeNotifier {
|
||||
String miNombre, {
|
||||
String? miNick,
|
||||
String? miAvatar,
|
||||
int miFuego = 0,
|
||||
List<String> miMedallas = const [],
|
||||
}) async {
|
||||
_miNombre = miNombre;
|
||||
_miNick = miNick;
|
||||
_miAvatar = miAvatar;
|
||||
_miFuego = miFuego;
|
||||
_miMedallas = miMedallas;
|
||||
|
||||
try {
|
||||
final resultado = await Nearby().startDiscovery(
|
||||
@@ -312,10 +322,14 @@ class ServicioNearby extends ChangeNotifier {
|
||||
String miNombre, {
|
||||
String? miNick,
|
||||
String? miAvatar,
|
||||
int miFuego = 0,
|
||||
List<String> miMedallas = const [],
|
||||
}) async {
|
||||
_miNombre = miNombre;
|
||||
_miNick = miNick;
|
||||
_miAvatar = miAvatar;
|
||||
_miFuego = miFuego;
|
||||
_miMedallas = miMedallas;
|
||||
try {
|
||||
await Nearby().requestConnection(
|
||||
miNombre,
|
||||
@@ -359,6 +373,8 @@ class ServicioNearby extends ChangeNotifier {
|
||||
'nombre': _miNombre ?? 'Jugador',
|
||||
if (_miNick != null) 'nick': _miNick,
|
||||
if (_miAvatar != null) 'avatar': _miAvatar,
|
||||
'fuego': _miFuego,
|
||||
'medallas': _miMedallas,
|
||||
},
|
||||
),
|
||||
);
|
||||
@@ -515,6 +531,10 @@ class ServicioNearby extends ChangeNotifier {
|
||||
final nombre = mensaje.datos['nombre'] as String? ?? 'Jugador';
|
||||
final nick = mensaje.datos['nick'] as String?;
|
||||
final avatar = mensaje.datos['avatar'] as String?;
|
||||
final fuego = (mensaje.datos['fuego'] as num?)?.toInt() ?? 0;
|
||||
final medallas = (mensaje.datos['medallas'] as List<dynamic>? ?? const [])
|
||||
.map((valor) => valor.toString())
|
||||
.toList();
|
||||
final clientId = endpointId;
|
||||
_jugadores[endpointId] = JugadorConectado(
|
||||
endpointId: endpointId,
|
||||
@@ -528,6 +548,8 @@ class ServicioNearby extends ChangeNotifier {
|
||||
nombre: nombre,
|
||||
nick: nick,
|
||||
avatar: avatar,
|
||||
fuego: fuego,
|
||||
medallas: medallas,
|
||||
);
|
||||
|
||||
enviarMensaje(
|
||||
@@ -555,6 +577,8 @@ class ServicioNearby extends ChangeNotifier {
|
||||
required String nombre,
|
||||
String? nick,
|
||||
String? avatar,
|
||||
int fuego = 0,
|
||||
List<String> medallas = const [],
|
||||
}) {
|
||||
final sala = _estadoSala;
|
||||
if (sala == null || sala.fase != FaseSalaMultijugador.lobby) return;
|
||||
@@ -579,6 +603,8 @@ class ServicioNearby extends ChangeNotifier {
|
||||
avatar: avatar,
|
||||
foto: avatar,
|
||||
creadoPorClienteId: clientId,
|
||||
fuego: fuego,
|
||||
medallas: medallas,
|
||||
);
|
||||
final resultadoCrear = sala.crearUsuario(usuario);
|
||||
if (!resultadoCrear.exitoso) return;
|
||||
@@ -769,6 +795,8 @@ class ServicioNearby extends ChangeNotifier {
|
||||
bool seleccionar = true,
|
||||
String? nick,
|
||||
String? avatar,
|
||||
int fuego = 0,
|
||||
List<String> medallas = const [],
|
||||
}) async {
|
||||
final nombreLimpio = nombre.trim();
|
||||
if (nombreLimpio.isEmpty) return;
|
||||
@@ -780,6 +808,8 @@ class ServicioNearby extends ChangeNotifier {
|
||||
avatar: avatar,
|
||||
foto: avatar,
|
||||
creadoPorClienteId: clientId,
|
||||
fuego: fuego,
|
||||
medallas: medallas,
|
||||
);
|
||||
if (_esHost && _estadoSala != null && clientId != null) {
|
||||
final resultado = _estadoSala!.crearUsuario(usuario);
|
||||
@@ -979,6 +1009,8 @@ class ServicioNearby extends ChangeNotifier {
|
||||
_miNombre = null;
|
||||
_miNick = null;
|
||||
_miAvatar = null;
|
||||
_miFuego = 0;
|
||||
_miMedallas = const [];
|
||||
_palabraRecibida = null;
|
||||
_soyImpostor = null;
|
||||
_faseActual = null;
|
||||
|
||||
@@ -1,6 +1,10 @@
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
|
||||
import '../modelos/gamificacion_usuario.dart';
|
||||
|
||||
class PerfilUsuario {
|
||||
final String nombre;
|
||||
final String nick;
|
||||
@@ -25,6 +29,7 @@ class ServicioPerfilUsuario extends ChangeNotifier {
|
||||
static const _claveNombre = 'perfil.nombre';
|
||||
static const _claveNick = 'perfil.nick';
|
||||
static const _claveAvatar = 'perfil.avatar';
|
||||
static const _claveEstadisticas = 'perfil.estadisticas';
|
||||
|
||||
static const avatares = [
|
||||
'assets/avatars/avatar_01.png',
|
||||
@@ -57,6 +62,18 @@ class ServicioPerfilUsuario extends ChangeNotifier {
|
||||
'assets/avatars/avatar_28.png',
|
||||
'assets/avatars/avatar_29.png',
|
||||
'assets/avatars/avatar_30.png',
|
||||
'assets/avatars/capybara_01.png',
|
||||
'assets/avatars/capybara_02.png',
|
||||
'assets/avatars/capybara_03.png',
|
||||
'assets/avatars/capybara_04.png',
|
||||
'assets/avatars/capybara_05.png',
|
||||
'assets/avatars/capybara_06.png',
|
||||
'assets/avatars/capybara_07.png',
|
||||
'assets/avatars/capybara_08.png',
|
||||
'assets/avatars/capybara_09.png',
|
||||
'assets/avatars/capybara_10.png',
|
||||
'assets/avatars/capybara_11.png',
|
||||
'assets/avatars/capybara_12.png',
|
||||
];
|
||||
|
||||
PerfilUsuario _perfil = const PerfilUsuario(
|
||||
@@ -64,9 +81,13 @@ class ServicioPerfilUsuario extends ChangeNotifier {
|
||||
nick: 'farolero',
|
||||
avatarAsset: 'assets/avatars/avatar_01.png',
|
||||
);
|
||||
EstadisticasPerfilUsuario _estadisticas =
|
||||
const EstadisticasPerfilUsuario();
|
||||
bool _cargado = false;
|
||||
|
||||
PerfilUsuario get perfil => _perfil;
|
||||
EstadisticasPerfilUsuario get estadisticas => _estadisticas;
|
||||
ResumenGamificacionUsuario get resumenGamificacion => _estadisticas.resumen;
|
||||
bool get cargado => _cargado;
|
||||
|
||||
Future<void> cargar() async {
|
||||
@@ -76,6 +97,16 @@ class ServicioPerfilUsuario extends ChangeNotifier {
|
||||
nick: prefs.getString(_claveNick) ?? _perfil.nick,
|
||||
avatarAsset: prefs.getString(_claveAvatar) ?? _perfil.avatarAsset,
|
||||
);
|
||||
final estadisticasJson = prefs.getString(_claveEstadisticas);
|
||||
if (estadisticasJson != null) {
|
||||
try {
|
||||
_estadisticas = EstadisticasPerfilUsuario.fromJson(
|
||||
json.decode(estadisticasJson) as Map<String, dynamic>,
|
||||
);
|
||||
} catch (_) {
|
||||
_estadisticas = const EstadisticasPerfilUsuario();
|
||||
}
|
||||
}
|
||||
_cargado = true;
|
||||
notifyListeners();
|
||||
}
|
||||
@@ -101,4 +132,34 @@ class ServicioPerfilUsuario extends ChangeNotifier {
|
||||
await prefs.setString(_claveAvatar, _perfil.avatarAsset);
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
Future<ProgresoGamificacionUsuario> registrarPartidaCompletada({
|
||||
required bool victoria,
|
||||
bool comoImpostor = false,
|
||||
bool victoriaComoImpostor = false,
|
||||
DateTime? fecha,
|
||||
}) async {
|
||||
final antes = _estadisticas;
|
||||
final despues = antes.registrarPartida(
|
||||
victoria: victoria,
|
||||
comoImpostor: comoImpostor,
|
||||
victoriaComoImpostor: victoriaComoImpostor,
|
||||
fecha: fecha,
|
||||
);
|
||||
final medallasPrevias = antes.medallas.toSet();
|
||||
final nuevasMedallas = despues.medallas
|
||||
.where((id) => !medallasPrevias.contains(id))
|
||||
.toList(growable: false);
|
||||
|
||||
_estadisticas = despues;
|
||||
final prefs = await SharedPreferences.getInstance();
|
||||
await prefs.setString(_claveEstadisticas, json.encode(despues.toJson()));
|
||||
notifyListeners();
|
||||
|
||||
return ProgresoGamificacionUsuario(
|
||||
antes: antes,
|
||||
despues: despues,
|
||||
nuevasMedallas: nuevasMedallas,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user