@@ -12,6 +12,7 @@ part 'game_event.dart';
1212part 'game_state.dart' ;
1313
1414class GameBloc extends Bloc <GameEvent , GameState > {
15+ // ... existing constructor and fields ...
1516 GameBloc ({
1617 required PlayerRepository playerRepository,
1718 required FirebaseDatabaseRepository database,
@@ -26,6 +27,7 @@ class GameBloc extends Bloc<GameEvent, GameState> {
2627 on < GameFinishEvent > (_onGameFinish);
2728 on < GameUpdateTimerEvent > (_onUpdateTimer);
2829 on < PlayerRepositoryUpdateEvent > (_repositoryUpdated);
30+ on < GameRestoreRequested > (_onGameRestoreRequested);
2931
3032 // Subscribe to player updates and emit them immediately
3133 _playerRepository.players.listen ((players) {
@@ -189,24 +191,36 @@ class GameBloc extends Bloc<GameEvent, GameState> {
189191 emit (state.copyWith (elapsedSeconds: event.gameLength));
190192 }
191193
194+ Future <void > _onGameRestoreRequested (
195+ GameRestoreRequested event,
196+ Emitter <GameState > emit,
197+ ) async {
198+ final restored = _playerRepository.restorePreviousGameState ();
199+ if (restored) {
200+ // Emit restored state as running, clear winner/error
201+ emit (state.copyWith (
202+ status: GameStatus .running,
203+ playerList: _playerRepository.getPlayers (),
204+ winner: null ,
205+ error: null ,
206+ ));
207+ // Dispatch TimerStartEvent to TimerBloc
208+ // (Assumes context or a callback is available; see note below)
209+ // context.read<TimerBloc>().add(const TimerStartEvent());
210+ // If context is not available here, trigger from UI after BlocListener
211+ }
212+ // else do nothing if no snapshot
213+ }
214+
192215 Future <void > _onGameFinish (
193216 GameFinishEvent event,
194217 Emitter <GameState > emit,
195218 ) async {
196219 emit (state.copyWith (status: GameStatus .finished));
197220
198- final updateWinner = event.winner.copyWith (
199- placement: const Value (1 ),
200- lifePoints: 0 ,
201- state: PlayerModelState .eliminated,
202- timeOfDeath: Value (DateTime .now ().millisecondsSinceEpoch),
203- );
204-
205- _playerRepository.updatePlayer (updateWinner);
206-
207221 final gameModel = GameModel (
208222 roomId: await generateShortGameId (),
209- winnerId: updateWinner .id,
223+ winnerId: event.winner .id,
210224 players: state.playerList,
211225 startTime: state.startTime ?? DateTime .now (),
212226 endTime: DateTime .now (),
@@ -228,8 +242,9 @@ class GameBloc extends Bloc<GameEvent, GameState> {
228242 // Then check for game-ending condition
229243 final alivePlayers =
230244 event.players.where ((p) => p.state == PlayerModelState .active).toList ();
231- if (alivePlayers.length <= 1 && state.status == GameStatus .running) {
232- add (GameFinishEvent (winner: alivePlayers.first));
245+ if (alivePlayers.isEmpty && state.status == GameStatus .running) {
246+ add (GameFinishEvent (
247+ winner: event.players.firstWhere ((p) => p.placement == 1 )));
233248 }
234249 }
235250
0 commit comments