189 lines
5.8 KiB
Dart
189 lines
5.8 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:farolero/l10n/generated/app_localizations.dart';
|
|
import 'package:provider/provider.dart';
|
|
import '../estado/estado_juego.dart';
|
|
import '../tema/componentes_farolero.dart';
|
|
import '../tema/tema_app.dart';
|
|
import 'pantalla_debate.dart';
|
|
import 'pantalla_fin_partida.dart';
|
|
|
|
class PantallaAdivinanza extends StatefulWidget {
|
|
const PantallaAdivinanza({super.key});
|
|
|
|
@override
|
|
State<PantallaAdivinanza> createState() => _PantallaAdivinanzaState();
|
|
}
|
|
|
|
class _PantallaAdivinanzaState extends State<PantallaAdivinanza> {
|
|
final _controlador = TextEditingController();
|
|
bool? _acierto;
|
|
|
|
@override
|
|
void dispose() {
|
|
_controlador.dispose();
|
|
super.dispose();
|
|
}
|
|
|
|
void _intentarAdivinar() {
|
|
final estado = context.read<EstadoJuego>();
|
|
final resultado = estado.intentarAdivinar(_controlador.text);
|
|
setState(() => _acierto = resultado);
|
|
}
|
|
|
|
void _continuarTrasNoAdivinar(EstadoJuego estado) {
|
|
final fin = estado.comprobarFinPartida();
|
|
if (fin) {
|
|
Navigator.pushReplacement(
|
|
context,
|
|
MaterialPageRoute(builder: (_) => const PantallaFinPartida()),
|
|
);
|
|
} else {
|
|
estado.siguienteRonda();
|
|
Navigator.pushReplacement(
|
|
context,
|
|
MaterialPageRoute(builder: (_) => const PantallaDebate()),
|
|
);
|
|
}
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final l10n = AppLocalizations.of(context)!;
|
|
final estado = context.watch<EstadoJuego>();
|
|
final partida = estado.partida;
|
|
if (partida == null) return const SizedBox.shrink();
|
|
|
|
return Scaffold(
|
|
appBar: AppBar(
|
|
title: Text(l10n.impostorGuessTitle),
|
|
automaticallyImplyLeading: false,
|
|
),
|
|
body: FondoFarolero(
|
|
intenso: true,
|
|
child: SafeArea(
|
|
child: Center(
|
|
child: SingleChildScrollView(
|
|
padding: const EdgeInsets.all(24),
|
|
child: Column(
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
children: [
|
|
const ArteGameplayFarolero.fase(height: 132),
|
|
const SizedBox(height: 12),
|
|
TarjetaFaseFarolero(
|
|
icono: Icons.theater_comedy,
|
|
titulo: l10n.impostorCanGuess,
|
|
subtitulo: l10n.ifCorrectImpostorsWin,
|
|
color: TemaApp.colorAcento,
|
|
child: _buildContenido(context, l10n, estado, partida.palabraSecreta),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
);
|
|
}
|
|
|
|
Widget _buildContenido(
|
|
BuildContext context,
|
|
AppLocalizations l10n,
|
|
EstadoJuego estado,
|
|
String palabraSecreta,
|
|
) {
|
|
if (_acierto == null) {
|
|
return Column(
|
|
children: [
|
|
TextField(
|
|
controller: _controlador,
|
|
decoration: InputDecoration(
|
|
hintText: l10n.guessWordHint,
|
|
prefixIcon: const Icon(Icons.search),
|
|
),
|
|
textCapitalization: TextCapitalization.sentences,
|
|
textAlign: TextAlign.center,
|
|
style: const TextStyle(fontSize: 20),
|
|
onChanged: (value) => setState(() {}),
|
|
onSubmitted: (value) => _intentarAdivinar(),
|
|
),
|
|
const SizedBox(height: 24),
|
|
Row(
|
|
children: [
|
|
Expanded(
|
|
child: BotonFarolero.oscuro(
|
|
texto: l10n.dontGuess,
|
|
icono: Icons.skip_next,
|
|
onPressed: () => _continuarTrasNoAdivinar(estado),
|
|
),
|
|
),
|
|
const SizedBox(width: 12),
|
|
Expanded(
|
|
flex: 2,
|
|
child: BotonFarolero(
|
|
texto: l10n.guess,
|
|
icono: Icons.send,
|
|
onPressed: _controlador.text.trim().isNotEmpty ? _intentarAdivinar : null,
|
|
),
|
|
),
|
|
],
|
|
),
|
|
],
|
|
);
|
|
}
|
|
|
|
final acierto = _acierto == true;
|
|
final color = acierto ? TemaApp.colorAcento : TemaApp.colorVerde;
|
|
return Column(
|
|
children: [
|
|
PanelFarolero(
|
|
padding: const EdgeInsets.all(24),
|
|
borderColor: color,
|
|
color: color.withValues(alpha: 0.18),
|
|
child: Column(
|
|
children: [
|
|
Icon(
|
|
acierto ? Icons.celebration : Icons.cancel,
|
|
color: color,
|
|
size: 52,
|
|
),
|
|
const SizedBox(height: 12),
|
|
Text(
|
|
acierto ? l10n.correctGuess : l10n.wrongGuess,
|
|
textAlign: TextAlign.center,
|
|
style: Theme.of(context).textTheme.headlineMedium?.copyWith(color: color),
|
|
),
|
|
const SizedBox(height: 8),
|
|
Text(
|
|
acierto ? l10n.theWordWas(palabraSecreta) : l10n.gameContinues,
|
|
textAlign: TextAlign.center,
|
|
style: Theme.of(context).textTheme.titleLarge,
|
|
),
|
|
if (acierto) ...[
|
|
const SizedBox(height: 8),
|
|
Text(
|
|
l10n.impostorsWin,
|
|
textAlign: TextAlign.center,
|
|
style: Theme.of(context).textTheme.bodyLarge?.copyWith(color: TemaApp.colorNaranja),
|
|
),
|
|
],
|
|
],
|
|
),
|
|
),
|
|
const SizedBox(height: 24),
|
|
BotonFarolero(
|
|
texto: acierto ? l10n.seeEndResult : l10n.nextRound,
|
|
icono: acierto ? Icons.emoji_events : Icons.skip_next,
|
|
onPressed: acierto
|
|
? () {
|
|
Navigator.pushReplacement(
|
|
context,
|
|
MaterialPageRoute(builder: (_) => const PantallaFinPartida()),
|
|
);
|
|
}
|
|
: () => _continuarTrasNoAdivinar(estado),
|
|
),
|
|
],
|
|
);
|
|
}
|
|
}
|