|
|
@@ -29,33 +29,53 @@ class Flag {
|
|
|
static List<Flag> get values => [red, yellow, blue];
|
|
|
}
|
|
|
|
|
|
-class PlayerInfo {
|
|
|
+class PlayerInfo extends AppGameState {
|
|
|
var id = 0;
|
|
|
+ int heartRatePercent = 0;
|
|
|
+}
|
|
|
+
|
|
|
+class PlayerInfoExt {
|
|
|
var name = '';
|
|
|
var routeName = '';
|
|
|
- var cpWantList = <ControlPoint>[];
|
|
|
+ var cpListWant = <ControlPoint>[];
|
|
|
+}
|
|
|
+
|
|
|
+class EventInfo {
|
|
|
+ var id = 0;
|
|
|
+ var players = <PlayerInfo>[];
|
|
|
}
|
|
|
|
|
|
-class PlayerOnMap extends AppGameState {
|
|
|
+class EventInfoExt {
|
|
|
+ var name = '';
|
|
|
+ var cpAllCount = 0;
|
|
|
+}
|
|
|
+
|
|
|
+class PlayerOnMap {
|
|
|
var info = PlayerInfo();
|
|
|
+ var _ext = PlayerInfoExt();
|
|
|
+ set ext(PlayerInfoExt v) {
|
|
|
+ _ext = v;
|
|
|
+ info.cpListWant = v.cpListWant;
|
|
|
+ }
|
|
|
+
|
|
|
int get id => info.id;
|
|
|
- String get name => info.name;
|
|
|
- List<ControlPoint> get cpList => cpListChecked;
|
|
|
+ String get name => _ext.name;
|
|
|
+ List<ControlPoint> get cpList => info.cpListWant;
|
|
|
final isHide = false.obs;
|
|
|
var trace = <TracePoint>[].obs;
|
|
|
var flag = Flag.red.obs;
|
|
|
- String get routeName => info.routeName;
|
|
|
- int heartRatePercent = 0;
|
|
|
- Pace pace = Pace.perKm(99.hours);
|
|
|
- var distance = 0.km;
|
|
|
- List<HeartRate> get hrInfo => hrHistory;
|
|
|
- List<Position> get positionList => positionHistory;
|
|
|
-
|
|
|
- @override
|
|
|
- Duration get duration => DateTime.now().difference(startAt);
|
|
|
+ String get routeName => _ext.routeName;
|
|
|
+ Distance get distance => info.distance;
|
|
|
+ List<HeartRate> get hrInfo => info.hrHistory;
|
|
|
+ List<Position> get positionList => info.positionHistory;
|
|
|
+ DateTime watchAt = DateTime.now();
|
|
|
+ int get heartRatePercent => info.heartRatePercent;
|
|
|
+ Pace get pace => info.pace;
|
|
|
+ Duration get duration => info.duration;
|
|
|
+ ControlPoint? get cpNextWant => info.cpNextWant;
|
|
|
|
|
|
Distance get nextDistance {
|
|
|
- final one = cpNextWant;
|
|
|
+ final one = info.cpNextWant;
|
|
|
if (one != null) {
|
|
|
final p1 = one.position;
|
|
|
final p22 = positionList.lastOrNull;
|
|
|
@@ -67,19 +87,20 @@ class PlayerOnMap extends AppGameState {
|
|
|
}
|
|
|
|
|
|
String get nextCPSN {
|
|
|
- return cpNextWant?.snString ?? '';
|
|
|
+ return info.cpNextWant?.snString ?? '';
|
|
|
}
|
|
|
}
|
|
|
|
|
|
class EventOnMap {
|
|
|
var info = EventInfo();
|
|
|
+ var ext = EventInfoExt();
|
|
|
var userList = <PlayerOnMap>[];
|
|
|
|
|
|
int get id => info.id;
|
|
|
|
|
|
- String get name => info.name;
|
|
|
+ String get name => ext.name;
|
|
|
|
|
|
- int get cpAllCount => info.cpAllCount;
|
|
|
+ int get cpAllCount => ext.cpAllCount;
|
|
|
final isHide = false.obs;
|
|
|
|
|
|
PlayerOnMap? getUserById(int id) {
|
|
|
@@ -104,6 +125,7 @@ abstract class MapWatchService extends GetxService {
|
|
|
Future<void> setMap(MapInfo mapInfo) async {
|
|
|
final thisInstance = await newInstanceByMap(mapInfo);
|
|
|
thisInstance.addPlugs([thisInstance.plugMap]);
|
|
|
+ _instance.value?.close();
|
|
|
_instance.value = thisInstance;
|
|
|
thisInstance.init();
|
|
|
thisInstance.workFlushData();
|
|
|
@@ -158,39 +180,36 @@ abstract class MapWatch extends PlugController {
|
|
|
eventList.value = newList;
|
|
|
}
|
|
|
|
|
|
- Future<EventOnMap> initEvent(EventOnMap event) async {
|
|
|
- final id = event.id;
|
|
|
- final info = await getEventInfo(id);
|
|
|
- event.info = info;
|
|
|
- event.info.id = id;
|
|
|
- for (var p in event.userList) {
|
|
|
- await initPlayer(event, p);
|
|
|
+ Future<EventOnMap> initEvent(EventInfo info) async {
|
|
|
+ final ext = await getEventInfoExt(info.id);
|
|
|
+ final one = EventOnMap()
|
|
|
+ ..info = info
|
|
|
+ ..ext = ext;
|
|
|
+ for (var p in info.players) {
|
|
|
+ one.userList.add(await initPlayer(info, p));
|
|
|
}
|
|
|
- return event;
|
|
|
+ return one;
|
|
|
}
|
|
|
|
|
|
- Future<PlayerOnMap> initPlayer(EventOnMap event, PlayerOnMap player) async {
|
|
|
- final userId = player.id;
|
|
|
- final info = await getPlayerInfo(event.id, userId);
|
|
|
- player.info = info;
|
|
|
- player.info.id = userId;
|
|
|
- player.cpListWant = info.cpWantList;
|
|
|
+ Future<PlayerOnMap> initPlayer(EventInfo event, PlayerInfo playerInfo) async {
|
|
|
+ final userId = playerInfo.id;
|
|
|
+ final ext = await getPlayerInfoExt(event.id, userId);
|
|
|
+ final player = PlayerOnMap()..info = playerInfo;
|
|
|
+ player.ext = ext;
|
|
|
return player;
|
|
|
}
|
|
|
|
|
|
- Future<void> updateEvent(EventOnMap old, EventOnMap newOne) async {
|
|
|
+ Future<void> updateEvent(EventOnMap old, EventInfo newOne) async {
|
|
|
final newUserList = <PlayerOnMap>[];
|
|
|
|
|
|
- for (final nUser in newOne.userList) {
|
|
|
+ for (final nUser in newOne.players) {
|
|
|
late PlayerOnMap user;
|
|
|
final oUser = old.getUserById(nUser.id);
|
|
|
if (oUser != null) {
|
|
|
- user = oUser;
|
|
|
- await updatePlayer(user, nUser);
|
|
|
+ user = await updatePlayer(oUser, nUser);
|
|
|
} else {
|
|
|
- user = await initPlayer(old, nUser);
|
|
|
+ user = await initPlayer(old.info, nUser);
|
|
|
}
|
|
|
- user.updateState();
|
|
|
await playerUpdateMap(user);
|
|
|
newUserList.add(user);
|
|
|
}
|
|
|
@@ -203,16 +222,18 @@ abstract class MapWatch extends PlugController {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- Future<void> updatePlayer(PlayerOnMap old, PlayerOnMap newUser) async {
|
|
|
+ Future<PlayerOnMap> updatePlayer(PlayerOnMap old, PlayerInfo newUser) async {
|
|
|
final indexMap = <int, TracePoint>{};
|
|
|
+ old.info = newUser;
|
|
|
+ old.ext = old._ext;
|
|
|
|
|
|
for (final one in old.trace) {
|
|
|
indexMap[one.ts.inMilliseconds] = one;
|
|
|
}
|
|
|
|
|
|
- for (final one in newUser.positionList) {
|
|
|
+ for (final one in newUser.positionHistory) {
|
|
|
final t = one.timestamp;
|
|
|
- final startAt = old.startAt;
|
|
|
+ final startAt = old.watchAt;
|
|
|
final ts = t.difference(startAt);
|
|
|
if (ts.inMilliseconds > 0 && !indexMap.containsKey(ts.inMilliseconds)) {
|
|
|
final pos = one;
|
|
|
@@ -225,16 +246,28 @@ abstract class MapWatch extends PlugController {
|
|
|
}
|
|
|
|
|
|
old.trace.add(oneTrace);
|
|
|
+ } else if (old.trace.isEmpty) {
|
|
|
+ final oneTrace = TracePoint()
|
|
|
+ ..ts = Duration.zero
|
|
|
+ ..position = one;
|
|
|
+ if (plugMap.isInitFinish) {
|
|
|
+ oneTrace.onMap =
|
|
|
+ await plugMap.gameMap.worldToPixel(oneTrace.position);
|
|
|
+
|
|
|
+ old.trace.add(oneTrace);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ return old;
|
|
|
}
|
|
|
|
|
|
@protected
|
|
|
- Future<List<EventOnMap>> getEventList(int mapId);
|
|
|
+ Future<List<EventInfo>> getEventList(int mapId);
|
|
|
|
|
|
@protected
|
|
|
- Future<EventInfo> getEventInfo(int id);
|
|
|
+ Future<EventInfoExt> getEventInfoExt(int id);
|
|
|
|
|
|
@protected
|
|
|
- Future<PlayerInfo> getPlayerInfo(int eventId, int userId);
|
|
|
+ Future<PlayerInfoExt> getPlayerInfoExt(int eventId, int userId);
|
|
|
}
|