99 lines
3.3 KiB
Dart
99 lines
3.3 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:latlong2/latlong.dart';
|
|
import 'package:rogapp/features/data/checkpoint.dart';
|
|
import 'package:rogapp/features/data/user_location.dart';
|
|
|
|
enum GameStatus {
|
|
notStarted,
|
|
started,
|
|
inProgress,
|
|
atCheckpoint,
|
|
gameCompleted,
|
|
}
|
|
|
|
enum PendingAction {
|
|
none,
|
|
checkInPhoto,
|
|
receiptPhoto,
|
|
endGamePhoto,
|
|
}
|
|
|
|
@immutable
|
|
class GameState {
|
|
final GameStatus status;
|
|
final List<Feature> markers;
|
|
final UserLocation? currentLocation;
|
|
final Set<Feature> visitedMarkers;
|
|
final bool isWithinStartRadius;
|
|
final bool hasLeftStartArea;
|
|
final bool hasVisitedCheckpoint;
|
|
final Feature? currentCheckpoint;
|
|
final bool checkpointPhotoTaken;
|
|
final bool receiptPhotoTaken;
|
|
final PendingAction pendingAction;
|
|
|
|
const GameState({
|
|
this.status = GameStatus.notStarted,
|
|
this.markers = const [],
|
|
this.currentLocation,
|
|
this.visitedMarkers = const {},
|
|
this.isWithinStartRadius = false,
|
|
this.hasLeftStartArea = false,
|
|
this.hasVisitedCheckpoint = false,
|
|
this.currentCheckpoint,
|
|
this.checkpointPhotoTaken = false,
|
|
this.receiptPhotoTaken = false,
|
|
this.pendingAction = PendingAction.none,
|
|
});
|
|
|
|
LatLng? getUserLatLng() {
|
|
return currentLocation != null
|
|
? LatLng(currentLocation!.latitude, currentLocation!.longitude)
|
|
: null;
|
|
}
|
|
|
|
GameState.fromMap(Map<String, dynamic> map)
|
|
: status = GameStatus.values[map['status']],
|
|
markers =
|
|
List<Feature>.from(map['markers'].map((x) => Feature.fromMap(x))),
|
|
currentLocation = UserLocation.fromMap(map['currentLocation']),
|
|
visitedMarkers = Set<Feature>.from(
|
|
map['visitedMarkers'].map((x) => Feature.fromMap(x))),
|
|
isWithinStartRadius = map['isWithinStartRadius'],
|
|
hasLeftStartArea = map['hasLeftStartArea'],
|
|
hasVisitedCheckpoint = map['hasVisitedCheckpoint'],
|
|
currentCheckpoint = map['currentCheckpoint'] != null
|
|
? Feature.fromMap(map['currentCheckpoint'])
|
|
: null,
|
|
checkpointPhotoTaken = map['checkpointPhotoTaken'],
|
|
receiptPhotoTaken = map['receiptPhotoTaken'],
|
|
pendingAction = PendingAction.values[map['pendingAction']];
|
|
|
|
GameState copyWith({
|
|
GameStatus? status,
|
|
List<Feature>? markers,
|
|
UserLocation? currentLocation,
|
|
Set<Feature>? visitedMarkers,
|
|
bool? isWithinStartRadius,
|
|
bool? hasLeftStartArea,
|
|
bool? hasVisitedCheckpoint,
|
|
Feature? currentCheckpoint,
|
|
bool? checkpointPhotoTaken,
|
|
bool? receiptPhotoTaken,
|
|
PendingAction? pendingAction,
|
|
}) {
|
|
return GameState(
|
|
status: status ?? this.status,
|
|
markers: markers ?? this.markers,
|
|
currentLocation: currentLocation ?? this.currentLocation,
|
|
visitedMarkers: visitedMarkers ?? this.visitedMarkers,
|
|
isWithinStartRadius: isWithinStartRadius ?? this.isWithinStartRadius,
|
|
hasLeftStartArea: hasLeftStartArea ?? this.hasLeftStartArea,
|
|
hasVisitedCheckpoint: hasVisitedCheckpoint ?? this.hasVisitedCheckpoint,
|
|
currentCheckpoint: currentCheckpoint ?? this.currentCheckpoint,
|
|
checkpointPhotoTaken: checkpointPhotoTaken ?? this.checkpointPhotoTaken,
|
|
receiptPhotoTaken: receiptPhotoTaken ?? this.receiptPhotoTaken,
|
|
pendingAction: pendingAction ?? this.pendingAction);
|
|
}
|
|
}
|