Gamificación

This commit is contained in:
2026-05-09 17:24:46 +02:00
parent dcecee805b
commit e2cebafdbb
29 changed files with 877 additions and 58 deletions

View File

@@ -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,
);
}
}