From e5ffa9711e80809f169f35854e84e42436abb2db Mon Sep 17 00:00:00 2001 From: dan63047 Date: Tue, 20 Aug 2024 20:17:59 +0300 Subject: [PATCH] compare view fix (fix #129) + records for X+ ranks fix --- lib/data_objects/tetrio.dart | 3 +- lib/views/compare_view.dart | 968 ++++++++++++++++++++++----- lib/views/main_view.dart | 8 +- lib/widgets/singleplayer_record.dart | 12 +- pubspec.yaml | 2 +- 5 files changed, 817 insertions(+), 176 deletions(-) diff --git a/lib/data_objects/tetrio.dart b/lib/data_objects/tetrio.dart index df4dfbe..277b5fa 100644 --- a/lib/data_objects/tetrio.dart +++ b/lib/data_objects/tetrio.dart @@ -18,7 +18,7 @@ const double vsapmWeight = 60; const double cheeseWeight = 1.25; const double gbeWeight = 315; const List ranks = [ - "d", "d+", "c-", "c", "c+", "b-", "b", "b+", "a-", "a", "a+", "s-", "s", "s+", "ss", "u", "x" + "d", "d+", "c-", "c", "c+", "b-", "b", "b+", "a-", "a", "a+", "s-", "s", "s+", "ss", "u", "x", "x+" ]; const Map rankCutoffs = { "x+": 0.002, @@ -1502,7 +1502,6 @@ class RecordSingle { RecordSingle({required this.userId, required this.replayId, required this.ownId, required this.timestamp, required this.stats, required this.rank, required this.countryRank, required this.aggregateStats}); RecordSingle.fromJson(Map json, int ran, int cran) { - //developer.log("RecordSingle.fromJson: $json", name: "data_objects/tetrio"); ownId = json['_id']; gamemode = json['gamemode']; stats = ResultsStats.fromJson(json['results']['stats']); diff --git a/lib/views/compare_view.dart b/lib/views/compare_view.dart index abc0a81..8c0df87 100644 --- a/lib/views/compare_view.dart +++ b/lib/views/compare_view.dart @@ -8,6 +8,7 @@ import 'package:intl/intl.dart'; import 'package:tetra_stats/data_objects/tetrio.dart'; import 'package:tetra_stats/gen/strings.g.dart'; import 'package:tetra_stats/main.dart' show teto; +import 'package:tetra_stats/utils/relative_timestamps.dart'; import 'package:tetra_stats/widgets/vs_graphs.dart'; import 'package:window_manager/window_manager.dart'; @@ -17,7 +18,7 @@ enum Mode{ averages } Mode greenSideMode = Mode.player; -List theGreenSide = [null, null, null]; // TetrioPlayer?, List>?, TetraLeague? +List theGreenSide = [null, null, null]; // TetrioPlayer?, List>?, Summary Mode redSideMode = Mode.player; List theRedSide = [null, null, null]; final DateFormat dateFormat = DateFormat.yMd(LocaleSettings.currentLocale.languageCode).add_Hm(); @@ -65,8 +66,9 @@ class CompareState extends State { if (user.startsWith("\$avg")){ try{ var average = (await teto.fetchTLLeaderboard()).getAverageOfRank(user.substring(4).toLowerCase())[0]; + Summaries summary = Summaries("avg${user.substring(4).toLowerCase()}", average, TetrioZen(level: 0, score: 0)); redSideMode = Mode.averages; - theRedSide = [null, null, average]; + theRedSide = [null, null, summary]; return setState(() {}); }on Exception { if (context.mounted) ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(t.compareViewWrongValue(value: user)))); @@ -82,7 +84,7 @@ class CompareState extends State { double vs = double.parse(threeNumbers[2][0]!); theRedSide = [null, null, - TetraLeague( + Summaries(user, TetraLeague( timestamp: DateTime.now(), apm: apm, pps: pps, @@ -100,30 +102,30 @@ class CompareState extends State { standing: -1, standingLocal: -1, nextAt: -1, - prevAt: -1) - ]; + prevAt: -1), TetrioZen(level: 0, score: 0))]; return setState(() {}); } var player = await teto.fetchPlayer(user); + Summaries summary = await teto.fetchSummaries(player.userId); redSideMode = Mode.player; - late List states; - List>? dStates = >[]; - try{ - states = await teto.getPlayer(player.userId); - for (final TetrioPlayer state in states) { - dStates.add(DropdownMenuItem( - value: state, child: Text(dateFormat.format(state.state)))); - } - dStates.firstWhere((element) => element.value == player, orElse: () { - dStates?.add(DropdownMenuItem( - value: player, child: Text(t.mostRecentOne))); - return DropdownMenuItem( - value: player, child: Text(t.mostRecentOne)); - },); - }on Exception { - dStates = null; - } - theRedSide = [player, dStates, player.tlSeason1]; + //late List states; + // List>? dStates = >[]; + // try{ + // states = await teto.getPlayer(player.userId); + // for (final TetrioPlayer state in states) { + // dStates.add(DropdownMenuItem( + // value: state, child: Text(dateFormat.format(state.state)))); + // } + // dStates.firstWhere((element) => element.value == player, orElse: () { + // dStates?.add(DropdownMenuItem( + // value: player, child: Text(t.mostRecentOne))); + // return DropdownMenuItem( + // value: player, child: Text(t.mostRecentOne)); + // },); + // }on Exception { + // dStates = null; + // } + theRedSide = [player, null, summary]; } on Exception { if (context.mounted) ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(t.compareViewWrongValue(value: user)))); } @@ -132,7 +134,7 @@ class CompareState extends State { void changeRedSide(TetrioPlayer user) { setState(() {theRedSide[0] = user; - theRedSide[2] = user.tlSeason1;}); + theRedSide[2].league = user.tlSeason1;}); } void fetchGreenSide(String user) async { @@ -140,8 +142,9 @@ class CompareState extends State { if (user.startsWith("\$avg")){ try{ var average = (await teto.fetchTLLeaderboard()).getAverageOfRank(user.substring(4).toLowerCase())[0]; + Summaries summary = Summaries("avg${user.substring(4).toLowerCase()}", average, TetrioZen(level: 0, score: 0)); greenSideMode = Mode.averages; - theGreenSide = [null, null, average]; + theGreenSide = [null, null, summary]; return setState(() {}); }on Exception { if (context.mounted) ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text("Falied to assign $user"))); @@ -157,7 +160,7 @@ class CompareState extends State { double vs = double.parse(threeNumbers[2][0]!); theGreenSide = [null, null, - TetraLeague( + Summaries(user, TetraLeague( timestamp: DateTime.now(), apm: apm, pps: pps, @@ -175,30 +178,30 @@ class CompareState extends State { standing: -1, standingLocal: -1, nextAt: -1, - prevAt: -1) - ]; + prevAt: -1), TetrioZen(level: 0, score: 0))]; return setState(() {}); } var player = await teto.fetchPlayer(user); + Summaries summary = await teto.fetchSummaries(player.userId); greenSideMode = Mode.player; - late List states; - List>? dStates = >[]; - try{ - states = await teto.getPlayer(player.userId); - for (final TetrioPlayer state in states) { - dStates.add(DropdownMenuItem( - value: state, child: Text(dateFormat.format(state.state)))); - } - dStates.firstWhere((element) => element.value == player, orElse: () { - dStates?.add(DropdownMenuItem( - value: player, child: Text(t.mostRecentOne))); - return DropdownMenuItem( - value: player, child: Text(t.mostRecentOne)); - },); - }on Exception { - dStates = null; - } - theGreenSide = [player, dStates, player.tlSeason1]; + // late List states; + // List>? dStates = >[]; + // try{ + // states = await teto.getPlayer(player.userId); + // for (final TetrioPlayer state in states) { + // dStates.add(DropdownMenuItem( + // value: state, child: Text(dateFormat.format(state.state)))); + // } + // dStates.firstWhere((element) => element.value == player, orElse: () { + // dStates?.add(DropdownMenuItem( + // value: player, child: Text(t.mostRecentOne))); + // return DropdownMenuItem( + // value: player, child: Text(t.mostRecentOne)); + // },); + // }on Exception { + // dStates = null; + // } + theGreenSide = [player, null, summary]; } on Exception { if (context.mounted) ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text("Falied to assign $user"))); } @@ -207,7 +210,7 @@ class CompareState extends State { void changeGreenSide(TetrioPlayer user) { setState(() {theGreenSide[0] = user; - theGreenSide[2] = user.tlSeason1;}); + theGreenSide[2].league = user.tlSeason1;}); } double getWinrateByTR(double yourGlicko, double yourRD, double notyourGlicko,double notyourRD) { @@ -237,10 +240,10 @@ class CompareState extends State { titleGreenSide = theGreenSide[0] != null ? theGreenSide[0].username.toUpperCase() : "???"; break; case Mode.stats: - titleGreenSide = "${theGreenSide[2].apm} APM, ${theGreenSide[2].pps} PPS, ${theGreenSide[2].vs} VS"; + titleGreenSide = "${theGreenSide[2].league.apm} APM, ${theGreenSide[2].league.pps} PPS, ${theGreenSide[2].league.vs} VS"; break; case Mode.averages: - titleGreenSide = t.averageXrank(rankLetter: theGreenSide[2].rank.toUpperCase()); + titleGreenSide = t.averageXrank(rankLetter: theGreenSide[2].league.rank.toUpperCase()); break; } switch (redSideMode){ @@ -248,10 +251,10 @@ class CompareState extends State { titleRedSide = theRedSide[0] != null ? theRedSide[0].username.toUpperCase() : "???"; break; case Mode.stats: - titleRedSide = "${theRedSide[2].apm} APM, ${theRedSide[2].pps} PPS, ${theRedSide[2].vs} VS"; + titleRedSide = "${theRedSide[2].league.apm} APM, ${theRedSide[2].league.pps} PPS, ${theRedSide[2].league.vs} VS"; break; case Mode.averages: - titleRedSide = t.averageXrank(rankLetter: theRedSide[2].rank.toUpperCase()); + titleRedSide = t.averageXrank(rankLetter: theRedSide[2].league.rank.toUpperCase()); break; } windowManager.setTitle("Tetra Stats: $titleGreenSide ${t.vs} $titleRedSide"); @@ -381,7 +384,7 @@ class CompareState extends State { label: t.normalBanned, trueIsBetter: false ), - (theGreenSide[2].gamesPlayed > 0 || greenSideMode == Mode.stats) && (theRedSide[2].gamesPlayed > 0 || redSideMode == Mode.stats) + (theGreenSide[2].league.gamesPlayed > 0 || greenSideMode == Mode.stats) && (theRedSide[2].league.gamesPlayed > 0 || redSideMode == Mode.stats) ? Column( children: [ Padding( @@ -391,14 +394,14 @@ class CompareState extends State { fontFamily: "Eurostile Round Extended", fontSize: bigScreen ? 42 : 28)), ), - if (theGreenSide[2].gamesPlayed > 9 && - theRedSide[2].gamesPlayed > 9 && + if (theGreenSide[2].league.gamesPlayed > 9 && + theRedSide[2].league.gamesPlayed > 9 && greenSideMode != Mode.stats && redSideMode != Mode.stats) CompareThingy( label: "TR", - greenSide: theGreenSide[2].tr, - redSide: theRedSide[2].tr, + greenSide: theGreenSide[2].league.tr, + redSide: theRedSide[2].league.tr, fractionDigits: 2, higherIsBetter: true, ), @@ -406,16 +409,16 @@ class CompareState extends State { redSideMode != Mode.stats) CompareThingy( label: t.statCellNum.gamesPlayed.replaceAll(RegExp(r'\n'), " "), - greenSide: theGreenSide[2].gamesPlayed, - redSide: theRedSide[2].gamesPlayed, + greenSide: theGreenSide[2].league.gamesPlayed, + redSide: theRedSide[2].league.gamesPlayed, higherIsBetter: true, ), if (greenSideMode != Mode.stats && redSideMode != Mode.stats) CompareThingy( label: t.statCellNum.gamesWonTL.replaceAll(RegExp(r'\n'), " "), - greenSide: theGreenSide[2].gamesWon, - redSide: theRedSide[2].gamesWon, + greenSide: theGreenSide[2].league.gamesWon, + redSide: theRedSide[2].league.gamesWon, higherIsBetter: true, ), if (greenSideMode != Mode.stats && @@ -423,93 +426,93 @@ class CompareState extends State { CompareThingy( label: "WR %", greenSide: - theGreenSide[2].winrate * 100, - redSide: theRedSide[2].winrate * 100, + theGreenSide[2].league.winrate * 100, + redSide: theRedSide[2].league.winrate * 100, fractionDigits: 2, higherIsBetter: true, ), - if (theGreenSide[2].gamesPlayed > 9 && - theRedSide[2].gamesPlayed > 9 && + if (theGreenSide[2].league.gamesPlayed > 9 && + theRedSide[2].league.gamesPlayed > 9 && greenSideMode != Mode.stats && redSideMode != Mode.stats) CompareThingy( label: "Glicko", - greenSide: theGreenSide[2].glicko!, - redSide: theRedSide[2].glicko!, + greenSide: theGreenSide[2].league.glicko!, + redSide: theRedSide[2].league.glicko!, fractionDigits: 2, higherIsBetter: true, ), - if (theGreenSide[2].gamesPlayed > 9 && - theRedSide[2].gamesPlayed > 9 && + if (theGreenSide[2].league.gamesPlayed > 9 && + theRedSide[2].league.gamesPlayed > 9 && greenSideMode != Mode.stats && redSideMode != Mode.stats) CompareThingy( label: "RD", - greenSide: theGreenSide[2].rd!, - redSide: theRedSide[2].rd!, + greenSide: theGreenSide[2].league.rd!, + redSide: theRedSide[2].league.rd!, fractionDigits: 3, higherIsBetter: false, ), - if (theGreenSide[2].standing > 0 && - theRedSide[2].standing > 0 && + if (theGreenSide[2].league.standing > 0 && + theRedSide[2].league.standing > 0 && greenSideMode == Mode.player && redSideMode == Mode.player) CompareThingy( label: t.statCellNum.lbpShort, - greenSide: theGreenSide[2].standing, - redSide: theRedSide[2].standing, + greenSide: theGreenSide[2].league.standing, + redSide: theRedSide[2].league.standing, higherIsBetter: false, ), - if (theGreenSide[2].standingLocal > 0 && - theRedSide[2].standingLocal > 0 && + if (theGreenSide[2].league.standingLocal > 0 && + theRedSide[2].league.standingLocal > 0 && greenSideMode == Mode.player && redSideMode == Mode.player) CompareThingy( label: t.statCellNum.lbpcShort, greenSide: - theGreenSide[2].standingLocal, - redSide: theRedSide[2].standingLocal, + theGreenSide[2].league.standingLocal, + redSide: theRedSide[2].league.standingLocal, higherIsBetter: false, ), - if (theGreenSide[2].apm != null && - theRedSide[2].apm != null) + if (theGreenSide[2].league.apm != null && + theRedSide[2].league.apm != null) CompareThingy( label: "APM", - greenSide: theGreenSide[2].apm!, - redSide: theRedSide[2].apm!, + greenSide: theGreenSide[2].league.apm!, + redSide: theRedSide[2].league.apm!, fractionDigits: 2, higherIsBetter: true, ), - if (theGreenSide[2].pps != null && - theRedSide[2].pps != null) + if (theGreenSide[2].league.pps != null && + theRedSide[2].league.pps != null) CompareThingy( label: "PPS", - greenSide: theGreenSide[2].pps!, - redSide: theRedSide[2].pps!, + greenSide: theGreenSide[2].league.pps!, + redSide: theRedSide[2].league.pps!, fractionDigits: 2, higherIsBetter: true, ), - if (theGreenSide[2].vs != null && - theRedSide[2].vs != null) + if (theGreenSide[2].league.vs != null && + theRedSide[2].league.vs != null) CompareThingy( label: "VS", - greenSide: theGreenSide[2].vs!, - redSide: theRedSide[2].vs!, + greenSide: theGreenSide[2].league.vs!, + redSide: theRedSide[2].league.vs!, fractionDigits: 2, higherIsBetter: true, ), ], ) : CompareBoolThingy( - greenSide: theGreenSide[2].gamesPlayed > 0, - redSide: theRedSide[2].gamesPlayed > 0, + greenSide: theGreenSide[2].league.gamesPlayed > 0, + redSide: theRedSide[2].league.gamesPlayed > 0, label: t.playedTL, trueIsBetter: false), - const Divider(), - if (theGreenSide[2].nerdStats != null && - theRedSide[2].nerdStats != null) + if (theGreenSide[2].league.nerdStats != null && + theRedSide[2].league.nerdStats != null) Column( children: [ + const Divider(), Padding( padding: const EdgeInsets.only(bottom: 16), child: Text(t.nerdStats, @@ -519,117 +522,117 @@ class CompareState extends State { ), CompareThingy( label: "APP", - greenSide: theGreenSide[2].nerdStats!.app, - redSide: theRedSide[2].nerdStats!.app, + greenSide: theGreenSide[2].league.nerdStats!.app, + redSide: theRedSide[2].league.nerdStats!.app, fractionDigits: 3, higherIsBetter: true, ), CompareThingy( label: "VS/APM", - greenSide: theGreenSide[2].nerdStats!.vsapm, - redSide: theRedSide[2].nerdStats!.vsapm, + greenSide: theGreenSide[2].league.nerdStats!.vsapm, + redSide: theRedSide[2].league.nerdStats!.vsapm, fractionDigits: 3, higherIsBetter: true, ), CompareThingy( label: "DS/S", - greenSide: theGreenSide[2].nerdStats!.dss, - redSide: theRedSide[2].nerdStats!.dss, + greenSide: theGreenSide[2].league.nerdStats!.dss, + redSide: theRedSide[2].league.nerdStats!.dss, fractionDigits: 3, higherIsBetter: true, ), CompareThingy( label: "DS/P", - greenSide: theGreenSide[2].nerdStats!.dsp, - redSide: theRedSide[2].nerdStats!.dsp, + greenSide: theGreenSide[2].league.nerdStats!.dsp, + redSide: theRedSide[2].league.nerdStats!.dsp, fractionDigits: 3, higherIsBetter: true, ), CompareThingy( label: "APP + DS/P", greenSide: - theGreenSide[2].nerdStats!.appdsp, - redSide: theRedSide[2].nerdStats!.appdsp, + theGreenSide[2].league.nerdStats!.appdsp, + redSide: theRedSide[2].league.nerdStats!.appdsp, fractionDigits: 3, higherIsBetter: true, ), CompareThingy( label: t.statCellNum.cheese.replaceAll(RegExp(r'\n'), " "), greenSide: - theGreenSide[2].nerdStats!.cheese, - redSide: theRedSide[2].nerdStats!.cheese, + theGreenSide[2].league.nerdStats!.cheese, + redSide: theRedSide[2].league.nerdStats!.cheese, fractionDigits: 2, higherIsBetter: true, ), CompareThingy( label: "Gb Eff.", - greenSide: theGreenSide[2].nerdStats!.gbe, - redSide: theRedSide[2].nerdStats!.gbe, + greenSide: theGreenSide[2].league.nerdStats!.gbe, + redSide: theRedSide[2].league.nerdStats!.gbe, fractionDigits: 3, higherIsBetter: true, ), CompareThingy( label: "wAPP", greenSide: - theGreenSide[2].nerdStats!.nyaapp, - redSide: theRedSide[2].nerdStats!.nyaapp, + theGreenSide[2].league.nerdStats!.nyaapp, + redSide: theRedSide[2].league.nerdStats!.nyaapp, fractionDigits: 3, higherIsBetter: true, ), CompareThingy( label: "Area", - greenSide: theGreenSide[2].nerdStats!.area, - redSide: theRedSide[2].nerdStats!.area, + greenSide: theGreenSide[2].league.nerdStats!.area, + redSide: theRedSide[2].league.nerdStats!.area, fractionDigits: 2, higherIsBetter: true, ), CompareThingy( label: t.statCellNum.estOfTRShort, - greenSide: theGreenSide[2].estTr!.esttr, - redSide: theRedSide[2].estTr!.esttr, + greenSide: theGreenSide[2].league.estTr!.esttr, + redSide: theRedSide[2].league.estTr!.esttr, fractionDigits: 2, higherIsBetter: true, ), - if (theGreenSide[2].gamesPlayed > 9 && - theGreenSide[2].gamesPlayed > 9 && + if (theGreenSide[2].league.gamesPlayed > 9 && + theGreenSide[2].league.gamesPlayed > 9 && greenSideMode != Mode.stats && redSideMode != Mode.stats) CompareThingy( label: t.statCellNum.accOfEstShort, - greenSide: theGreenSide[2].esttracc!, - redSide: theRedSide[2].esttracc!, + greenSide: theGreenSide[2].league.esttracc!, + redSide: theRedSide[2].league.esttracc!, fractionDigits: 2, higherIsBetter: true, ), CompareThingy( label: "Opener", - greenSide: theGreenSide[2].playstyle!.opener, - redSide: theRedSide[2].playstyle!.opener, + greenSide: theGreenSide[2].league.playstyle!.opener, + redSide: theRedSide[2].league.playstyle!.opener, fractionDigits: 3, higherIsBetter: true, ), CompareThingy( label: "Plonk", - greenSide: theGreenSide[2].playstyle!.plonk, - redSide: theRedSide[2].playstyle!.plonk, + greenSide: theGreenSide[2].league.playstyle!.plonk, + redSide: theRedSide[2].league.playstyle!.plonk, fractionDigits: 3, higherIsBetter: true, ), CompareThingy( label: "Stride", - greenSide: theGreenSide[2].playstyle!.stride, - redSide: theRedSide[2].playstyle!.stride, + greenSide: theGreenSide[2].league.playstyle!.stride, + redSide: theRedSide[2].league.playstyle!.stride, fractionDigits: 3, higherIsBetter: true, ), CompareThingy( label: "Inf. DS", - greenSide: theGreenSide[2].playstyle!.infds, - redSide: theRedSide[2].playstyle!.infds, + greenSide: theGreenSide[2].league.playstyle!.infds, + redSide: theRedSide[2].league.playstyle!.infds, fractionDigits: 3, higherIsBetter: true, ), - VsGraphs(theGreenSide[2].apm!, theGreenSide[2].pps!, theGreenSide[2].vs!, theGreenSide[2].nerdStats!, theGreenSide[2].playstyle!, theRedSide[2].apm!, theRedSide[2].pps!, theRedSide[2].vs!, theRedSide[2].nerdStats!, theRedSide[2].playstyle!), + VsGraphs(theGreenSide[2].league.apm!, theGreenSide[2].league.pps!, theGreenSide[2].league.vs!, theGreenSide[2].league.nerdStats!, theGreenSide[2].league.playstyle!, theRedSide[2].league.apm!, theRedSide[2].league.pps!, theRedSide[2].league.vs!, theRedSide[2].league.nerdStats!, theRedSide[2].league.playstyle!), const Divider(), Padding( padding: const EdgeInsets.only(bottom: 16), @@ -639,20 +642,20 @@ class CompareState extends State { fontSize: bigScreen ? 42 : 28)), ), if (greenSideMode != Mode.stats && redSideMode != Mode.stats && - theGreenSide[2].gamesPlayed > 9 && theRedSide[2].gamesPlayed > 9) + theGreenSide[2].league.gamesPlayed > 9 && theRedSide[2].league.gamesPlayed > 9) CompareThingy( label: t.byGlicko, greenSide: getWinrateByTR( - theGreenSide[2].glicko!, - theGreenSide[2].rd!, - theRedSide[2].glicko!, - theRedSide[2].rd!) * + theGreenSide[2].league.glicko!, + theGreenSide[2].league.rd!, + theRedSide[2].league.glicko!, + theRedSide[2].league.rd!) * 100, redSide: getWinrateByTR( - theRedSide[2].glicko!, - theRedSide[2].rd!, - theGreenSide[2].glicko!, - theGreenSide[2].rd!) * + theRedSide[2].league.glicko!, + theRedSide[2].league.rd!, + theGreenSide[2].league.glicko!, + theGreenSide[2].league.rd!) * 100, fractionDigits: 2, higherIsBetter: true, @@ -661,22 +664,604 @@ class CompareState extends State { CompareThingy( label: t.byEstTR, greenSide: getWinrateByTR( - theGreenSide[2].estTr!.estglicko, - theGreenSide[2].rd ?? noTrRd, - theRedSide[2].estTr!.estglicko, - theRedSide[2].rd ?? noTrRd) * + theGreenSide[2].league.estTr!.estglicko, + theGreenSide[2].league.rd ?? noTrRd, + theRedSide[2].league.estTr!.estglicko, + theRedSide[2].league.rd ?? noTrRd) * 100, redSide: getWinrateByTR( - theRedSide[2].estTr!.estglicko, - theRedSide[2].rd ?? noTrRd, - theGreenSide[2].estTr!.estglicko, - theGreenSide[2].rd ?? noTrRd) * + theRedSide[2].league.estTr!.estglicko, + theRedSide[2].league.rd ?? noTrRd, + theGreenSide[2].league.estTr!.estglicko, + theGreenSide[2].league.rd ?? noTrRd) * 100, fractionDigits: 2, higherIsBetter: true, postfix: "%", ), ], + ), + if (theGreenSide[2].zenith != null && theRedSide[2].zenith != null && greenSideMode == Mode.player && redSideMode == Mode.player) Column( + children: [ + const Divider(), + Padding( + padding: const EdgeInsets.only(bottom: 16), + child: Text(t.quickPlay, style: TextStyle(fontFamily: "Eurostile Round Extended", fontSize: bigScreen ? 42 : 28)), + ), + CompareThingy( + label: "Height", + greenSide: theGreenSide[2].zenith.stats.zenith!.altitude, + redSide: theRedSide[2].zenith.stats.zenith!.altitude, + fractionDigits: 2, + higherIsBetter: true, + postfix: "m", + ), + CompareThingy( + label: "Position", + greenSide: theGreenSide[2].zenith.rank, + redSide: theRedSide[2].zenith.rank, + higherIsBetter: false, + prefix: "№ ", + ), + CompareThingy( + label: "Position (Country)", + greenSide: theGreenSide[2].zenith.countryRank, + redSide: theRedSide[2].zenith.countryRank, + higherIsBetter: false, + prefix: "№ ", + ), + CompareThingy( + label: "APM", + greenSide: theGreenSide[2].zenith.aggregateStats.apm, + redSide: theRedSide[2].zenith.aggregateStats.apm, + fractionDigits: 2, + higherIsBetter: true, + ), + CompareThingy( + label: "PPS", + greenSide: theGreenSide[2].zenith.aggregateStats.pps, + redSide: theRedSide[2].zenith.aggregateStats.pps, + fractionDigits: 2, + higherIsBetter: true, + ), + CompareThingy( + label: "VS", + greenSide: theGreenSide[2].zenith.aggregateStats.vs, + redSide: theRedSide[2].zenith.aggregateStats.vs, + fractionDigits: 2, + higherIsBetter: true, + ), + CompareThingy( + label: "KO's", + greenSide: theGreenSide[2].zenith.stats.kills, + redSide: theRedSide[2].zenith.stats.kills, + higherIsBetter: true, + ), + CompareThingy( + label: "CPS", + greenSide: theGreenSide[2].zenith.stats.cps, + redSide: theRedSide[2].zenith.stats.cps, + fractionDigits: 2, + higherIsBetter: true, + ), + CompareThingy( + label: "Peak CPS", + greenSide: theGreenSide[2].zenith.stats.zenith!.peakrank, + redSide: theRedSide[2].zenith.stats.zenith!.peakrank, + fractionDigits: 2, + higherIsBetter: true, + ), + CompareDurationThingy( + label: "Time", + greenSide: theGreenSide[2].zenith.stats.finalTime, + redSide: theRedSide[2].zenith.stats.finalTime, + higherIsBetter: false, + ), + CompareThingy( + label: "Finesse", + greenSide: theGreenSide[2].zenith.stats.finessePercentage * 100, + redSide: theRedSide[2].zenith.stats.finessePercentage * 100, + fractionDigits: 2, + postfix: "%", + higherIsBetter: true, + ), + const Divider(), + Padding( + padding: const EdgeInsets.only(bottom: 16), + child: Text("${t.quickPlay} ${t.nerdStats}", style: TextStyle(fontFamily: "Eurostile Round Extended", fontSize: 28)), + ), + CompareThingy( + label: "APP", + greenSide: theGreenSide[2].zenith.aggregateStats.nerdStats.app, + redSide: theRedSide[2].zenith.aggregateStats.nerdStats.app, + fractionDigits: 3, + higherIsBetter: true, + ), + CompareThingy( + label: "VS/APM", + greenSide: theGreenSide[2].zenith.aggregateStats.nerdStats.vsapm, + redSide: theRedSide[2].zenith.aggregateStats.nerdStats.vsapm, + fractionDigits: 3, + higherIsBetter: true, + ), + CompareThingy( + label: "DS/S", + greenSide: theGreenSide[2].zenith.aggregateStats.nerdStats.dss, + redSide: theRedSide[2].zenith.aggregateStats.nerdStats.dss, + fractionDigits: 3, + higherIsBetter: true, + ), + CompareThingy( + label: "DS/P", + greenSide: theGreenSide[2].zenith.aggregateStats.nerdStats.dsp, + redSide: theRedSide[2].zenith.aggregateStats.nerdStats.dsp, + fractionDigits: 3, + higherIsBetter: true, + ), + CompareThingy( + label: "APP + DS/P", + greenSide: + theGreenSide[2].zenith.aggregateStats.nerdStats.appdsp, + redSide: theRedSide[2].zenith.aggregateStats.nerdStats.appdsp, + fractionDigits: 3, + higherIsBetter: true, + ), + CompareThingy( + label: t.statCellNum.cheese.replaceAll(RegExp(r'\n'), " "), + greenSide: + theGreenSide[2].zenith.aggregateStats.nerdStats.cheese, + redSide: theRedSide[2].zenith.aggregateStats.nerdStats.cheese, + fractionDigits: 2, + higherIsBetter: true, + ), + CompareThingy( + label: "Gb Eff.", + greenSide: theGreenSide[2].zenith.aggregateStats.nerdStats.gbe, + redSide: theRedSide[2].zenith.aggregateStats.nerdStats.gbe, + fractionDigits: 3, + higherIsBetter: true, + ), + CompareThingy( + label: "wAPP", + greenSide: + theGreenSide[2].zenith.aggregateStats.nerdStats.nyaapp, + redSide: theRedSide[2].zenith.aggregateStats.nerdStats.nyaapp, + fractionDigits: 3, + higherIsBetter: true, + ), + CompareThingy( + label: "Area", + greenSide: theGreenSide[2].zenith.aggregateStats.nerdStats.area, + redSide: theRedSide[2].zenith.aggregateStats.nerdStats.area, + fractionDigits: 2, + higherIsBetter: true, + ), + CompareThingy( + label: "Opener", + greenSide: theGreenSide[2].zenith.aggregateStats.playstyle.opener, + redSide: theRedSide[2].zenith.aggregateStats.playstyle.opener, + fractionDigits: 3, + higherIsBetter: true, + ), + CompareThingy( + label: "Plonk", + greenSide: theGreenSide[2].zenith.aggregateStats.playstyle.plonk, + redSide: theRedSide[2].zenith.aggregateStats.playstyle.plonk, + fractionDigits: 3, + higherIsBetter: true, + ), + CompareThingy( + label: "Stride", + greenSide: theGreenSide[2].zenith.aggregateStats.playstyle.stride, + redSide: theRedSide[2].zenith.aggregateStats.playstyle.stride, + fractionDigits: 3, + higherIsBetter: true, + ), + CompareThingy( + label: "Inf. DS", + greenSide: theGreenSide[2].zenith.aggregateStats.playstyle.infds, + redSide: theRedSide[2].zenith.aggregateStats.playstyle.infds, + fractionDigits: 3, + higherIsBetter: true, + ), + VsGraphs(theGreenSide[2].zenith.aggregateStats.apm, theGreenSide[2].zenith.aggregateStats.pps, theGreenSide[2].zenith.aggregateStats.vs, theGreenSide[2].zenith.aggregateStats.nerdStats, theGreenSide[2].zenith.aggregateStats.playstyle, theRedSide[2].zenith.aggregateStats.apm, theRedSide[2].zenith.aggregateStats.pps, theRedSide[2].zenith.aggregateStats.vs, theRedSide[2].zenith.aggregateStats.nerdStats, theRedSide[2].zenith.aggregateStats.playstyle), + ], + ) + else if (greenSideMode == Mode.player && redSideMode == Mode.player) CompareBoolThingy(greenSide: theGreenSide[2].zenith != null, redSide: theRedSide[2].zenith != null, label: "Played QP", trueIsBetter: true), + if (theGreenSide[2].zenithEx != null && theRedSide[2].zenithEx != null && greenSideMode == Mode.player && redSideMode == Mode.player) Column( + children: [ + const Divider(), + Padding( + padding: const EdgeInsets.only(bottom: 16), + child: Text("${t.quickPlay} ${t.expert}", style: TextStyle(fontFamily: "Eurostile Round Extended", fontSize: bigScreen ? 42 : 28)), + ), + CompareThingy( + label: "Height", + greenSide: theGreenSide[2].zenithEx.stats.zenith!.altitude, + redSide: theRedSide[2].zenithEx.stats.zenith!.altitude, + fractionDigits: 2, + higherIsBetter: true, + postfix: "m", + ), + CompareThingy( + label: "Position", + greenSide: theGreenSide[2].zenithEx.rank, + redSide: theRedSide[2].zenithEx.rank, + higherIsBetter: false, + prefix: "№ ", + ), + CompareThingy( + label: "Position (Country)", + greenSide: theGreenSide[2].zenithEx.countryRank, + redSide: theRedSide[2].zenithEx.countryRank, + higherIsBetter: false, + prefix: "№ ", + ), + CompareThingy( + label: "APM", + greenSide: theGreenSide[2].zenithEx.aggregateStats.apm, + redSide: theRedSide[2].zenithEx.aggregateStats.apm, + fractionDigits: 2, + higherIsBetter: true, + ), + CompareThingy( + label: "PPS", + greenSide: theGreenSide[2].zenithEx.aggregateStats.pps, + redSide: theRedSide[2].zenithEx.aggregateStats.pps, + fractionDigits: 2, + higherIsBetter: true, + ), + CompareThingy( + label: "VS", + greenSide: theGreenSide[2].zenithEx.aggregateStats.vs, + redSide: theRedSide[2].zenithEx.aggregateStats.vs, + fractionDigits: 2, + higherIsBetter: true, + ), + CompareThingy( + label: "KO's", + greenSide: theGreenSide[2].zenithEx.stats.kills, + redSide: theRedSide[2].zenithEx.stats.kills, + higherIsBetter: true, + ), + CompareThingy( + label: "CPS", + greenSide: theGreenSide[2].zenithEx.stats.cps, + redSide: theRedSide[2].zenithEx.stats.cps, + fractionDigits: 2, + higherIsBetter: true, + ), + CompareThingy( + label: "Peak CPS", + greenSide: theGreenSide[2].zenithEx.stats.zenith!.peakrank, + redSide: theRedSide[2].zenithEx.stats.zenith!.peakrank, + fractionDigits: 2, + higherIsBetter: true, + ), + CompareDurationThingy( + label: "Time", + greenSide: theGreenSide[2].zenithEx.stats.finalTime, + redSide: theRedSide[2].zenithEx.stats.finalTime, + higherIsBetter: false, + ), + CompareThingy( + label: "Finesse", + greenSide: theGreenSide[2].zenithEx.stats.finessePercentage * 100, + redSide: theRedSide[2].zenithEx.stats.finessePercentage * 100, + fractionDigits: 2, + postfix: "%", + higherIsBetter: true, + ), + const Divider(), + Padding( + padding: const EdgeInsets.only(bottom: 16), + child: Text("${t.quickPlay} ${t.expert} ${t.nerdStats}", style: TextStyle(fontFamily: "Eurostile Round Extended", fontSize: 28)), + ), + CompareThingy( + label: "APP", + greenSide: theGreenSide[2].zenithEx.aggregateStats.nerdStats.app, + redSide: theRedSide[2].zenithEx.aggregateStats.nerdStats.app, + fractionDigits: 3, + higherIsBetter: true, + ), + CompareThingy( + label: "VS/APM", + greenSide: theGreenSide[2].zenithEx.aggregateStats.nerdStats.vsapm, + redSide: theRedSide[2].zenithEx.aggregateStats.nerdStats.vsapm, + fractionDigits: 3, + higherIsBetter: true, + ), + CompareThingy( + label: "DS/S", + greenSide: theGreenSide[2].zenithEx.aggregateStats.nerdStats.dss, + redSide: theRedSide[2].zenithEx.aggregateStats.nerdStats.dss, + fractionDigits: 3, + higherIsBetter: true, + ), + CompareThingy( + label: "DS/P", + greenSide: theGreenSide[2].zenithEx.aggregateStats.nerdStats.dsp, + redSide: theRedSide[2].zenithEx.aggregateStats.nerdStats.dsp, + fractionDigits: 3, + higherIsBetter: true, + ), + CompareThingy( + label: "APP + DS/P", + greenSide: + theGreenSide[2].zenithEx.aggregateStats.nerdStats.appdsp, + redSide: theRedSide[2].zenithEx.aggregateStats.nerdStats.appdsp, + fractionDigits: 3, + higherIsBetter: true, + ), + CompareThingy( + label: t.statCellNum.cheese.replaceAll(RegExp(r'\n'), " "), + greenSide: + theGreenSide[2].zenithEx.aggregateStats.nerdStats.cheese, + redSide: theRedSide[2].zenithEx.aggregateStats.nerdStats.cheese, + fractionDigits: 2, + higherIsBetter: true, + ), + CompareThingy( + label: "Gb Eff.", + greenSide: theGreenSide[2].zenithEx.aggregateStats.nerdStats.gbe, + redSide: theRedSide[2].zenithEx.aggregateStats.nerdStats.gbe, + fractionDigits: 3, + higherIsBetter: true, + ), + CompareThingy( + label: "wAPP", + greenSide: + theGreenSide[2].zenithEx.aggregateStats.nerdStats.nyaapp, + redSide: theRedSide[2].zenithEx.aggregateStats.nerdStats.nyaapp, + fractionDigits: 3, + higherIsBetter: true, + ), + CompareThingy( + label: "Area", + greenSide: theGreenSide[2].zenithEx.aggregateStats.nerdStats.area, + redSide: theRedSide[2].zenithEx.aggregateStats.nerdStats.area, + fractionDigits: 2, + higherIsBetter: true, + ), + CompareThingy( + label: "Opener", + greenSide: theGreenSide[2].zenithEx.aggregateStats.playstyle.opener, + redSide: theRedSide[2].zenithEx.aggregateStats.playstyle.opener, + fractionDigits: 3, + higherIsBetter: true, + ), + CompareThingy( + label: "Plonk", + greenSide: theGreenSide[2].zenithEx.aggregateStats.playstyle.plonk, + redSide: theRedSide[2].zenithEx.aggregateStats.playstyle.plonk, + fractionDigits: 3, + higherIsBetter: true, + ), + CompareThingy( + label: "Stride", + greenSide: theGreenSide[2].zenithEx.aggregateStats.playstyle.stride, + redSide: theRedSide[2].zenithEx.aggregateStats.playstyle.stride, + fractionDigits: 3, + higherIsBetter: true, + ), + CompareThingy( + label: "Inf. DS", + greenSide: theGreenSide[2].zenithEx.aggregateStats.playstyle.infds, + redSide: theRedSide[2].zenithEx.aggregateStats.playstyle.infds, + fractionDigits: 3, + higherIsBetter: true, + ), + VsGraphs(theGreenSide[2].zenithEx.aggregateStats.apm, theGreenSide[2].zenithEx.aggregateStats.pps, theGreenSide[2].zenithEx.aggregateStats.vs, theGreenSide[2].zenithEx.aggregateStats.nerdStats, theGreenSide[2].zenithEx.aggregateStats.playstyle, theRedSide[2].zenithEx.aggregateStats.apm, theRedSide[2].zenithEx.aggregateStats.pps, theRedSide[2].zenithEx.aggregateStats.vs, theRedSide[2].zenithEx.aggregateStats.nerdStats, theRedSide[2].zenithEx.aggregateStats.playstyle), + ], + ) + else if (greenSideMode == Mode.player && redSideMode == Mode.player) CompareBoolThingy(greenSide: theGreenSide[2].zenithEx != null, redSide: theRedSide[2].zenithEx != null, label: "Played QP Expert", trueIsBetter: true), + if (theGreenSide[2].sprint != null && theRedSide[2].sprint != null && greenSideMode == Mode.player && redSideMode == Mode.player) Column( + children: [ + const Divider(), + Padding( + padding: const EdgeInsets.only(bottom: 16), + child: Text(t.sprint, style: TextStyle(fontFamily: "Eurostile Round Extended", fontSize: bigScreen ? 42 : 28)), + ), + CompareDurationThingy( + label: "Time", + greenSide: theGreenSide[2].sprint.stats.finalTime, + redSide: theRedSide[2].sprint.stats.finalTime, + higherIsBetter: false, + ), + CompareThingy( + label: "Lines", + greenSide: theGreenSide[2].sprint.stats.lines, + redSide: theRedSide[2].sprint.stats.lines, + higherIsBetter: false, + ), + CompareThingy( + label: t.statCellNum.pieces.replaceAll(RegExp(r'\n'), " "), + greenSide: theGreenSide[2].sprint.stats.piecesPlaced, + redSide: theRedSide[2].sprint.stats.piecesPlaced, + higherIsBetter: false, + ), + CompareThingy( + label: t.statCellNum.keys.replaceAll(RegExp(r'\n'), " "), + greenSide: theGreenSide[2].sprint.stats.inputs, + redSide: theRedSide[2].sprint.stats.inputs, + higherIsBetter: false, + ), + CompareThingy( + label: "PPS", + greenSide: theGreenSide[2].sprint.stats.pps, + redSide: theRedSide[2].sprint.stats.pps, + fractionDigits: 2, + higherIsBetter: true, + ), + CompareThingy( + label: "KPP", + greenSide: theGreenSide[2].sprint.stats.kpp, + redSide: theRedSide[2].sprint.stats.kpp, + fractionDigits: 2, + higherIsBetter: false, + ), + CompareThingy( + label: "KPS", + greenSide: theGreenSide[2].sprint.stats.kps, + redSide: theRedSide[2].sprint.stats.kps, + fractionDigits: 2, + higherIsBetter: true, + ), + CompareThingy( + label: "Finesse", + greenSide: theGreenSide[2].sprint.stats.finessePercentage * 100, + redSide: theRedSide[2].sprint.stats.finessePercentage * 100, + fractionDigits: 2, + postfix: "%", + higherIsBetter: true, + ), + CompareThingy( + label: "Holds", + greenSide: theGreenSide[2].sprint.stats.holds, + redSide: theRedSide[2].sprint.stats.holds, + higherIsBetter: false, + ), + CompareThingy( + label: "T-spins", + greenSide: theGreenSide[2].sprint.stats.tSpins, + redSide: theRedSide[2].sprint.stats.tSpins, + higherIsBetter: false, + ), + CompareThingy( + label: "Quads", + greenSide: theGreenSide[2].sprint.stats.clears.quads, + redSide: theRedSide[2].sprint.stats.clears.quads, + higherIsBetter: true, + ), + CompareThingy( + label: "PC's", + greenSide: theGreenSide[2].sprint.stats.clears.allClears, + redSide: theRedSide[2].sprint.stats.clears.allClears, + higherIsBetter: true, + ), + ], + ) + else if (greenSideMode == Mode.player && redSideMode == Mode.player) CompareBoolThingy(greenSide: theGreenSide[2].sprint != null, redSide: theRedSide[2].sprint != null, label: "Played 40 Lines", trueIsBetter: true), + if (theGreenSide[2].blitz != null && theRedSide[2].blitz != null && greenSideMode == Mode.player && redSideMode == Mode.player) Column( + children: [ + const Divider(), + Padding( + padding: const EdgeInsets.only(bottom: 16), + child: Text(t.blitz, style: TextStyle(fontFamily: "Eurostile Round Extended", fontSize: bigScreen ? 42 : 28)), + ), + CompareThingy( + label: "Score", + greenSide: theGreenSide[2].blitz.stats.score, + redSide: theRedSide[2].blitz.stats.score, + higherIsBetter: true, + ), + CompareThingy( + label: "SPP", + greenSide: theGreenSide[2].blitz.stats.spp, + redSide: theRedSide[2].blitz.stats.spp, + fractionDigits: 2, + higherIsBetter: true, + ), + CompareThingy( + label: "Level", + greenSide: theGreenSide[2].blitz.stats.level, + redSide: theRedSide[2].blitz.stats.level, + higherIsBetter: true, + ), + CompareThingy( + label: "Lines", + greenSide: theGreenSide[2].blitz.stats.lines, + redSide: theRedSide[2].blitz.stats.lines, + higherIsBetter: true, + ), + CompareThingy( + label: t.statCellNum.pieces.replaceAll(RegExp(r'\n'), " "), + greenSide: theGreenSide[2].blitz.stats.piecesPlaced, + redSide: theRedSide[2].blitz.stats.piecesPlaced, + higherIsBetter: true, + ), + CompareThingy( + label: t.statCellNum.keys.replaceAll(RegExp(r'\n'), " "), + greenSide: theGreenSide[2].blitz.stats.inputs, + redSide: theRedSide[2].blitz.stats.inputs, + higherIsBetter: true, + ), + CompareThingy( + label: "PPS", + greenSide: theGreenSide[2].blitz.stats.pps, + redSide: theRedSide[2].blitz.stats.pps, + fractionDigits: 2, + higherIsBetter: true, + ), + CompareThingy( + label: "KPP", + greenSide: theGreenSide[2].blitz.stats.kpp, + redSide: theRedSide[2].blitz.stats.kpp, + fractionDigits: 2, + higherIsBetter: false, + ), + CompareThingy( + label: "KPS", + greenSide: theGreenSide[2].blitz.stats.kps, + redSide: theRedSide[2].blitz.stats.kps, + fractionDigits: 2, + higherIsBetter: true, + ), + CompareThingy( + label: "Finesse", + greenSide: theGreenSide[2].blitz.stats.finessePercentage * 100, + redSide: theRedSide[2].blitz.stats.finessePercentage * 100, + fractionDigits: 2, + postfix: "%", + higherIsBetter: true, + ), + CompareThingy( + label: "Holds", + greenSide: theGreenSide[2].blitz.stats.holds, + redSide: theRedSide[2].blitz.stats.holds, + higherIsBetter: false, + ), + CompareThingy( + label: "T-spins", + greenSide: theGreenSide[2].blitz.stats.tSpins, + redSide: theRedSide[2].blitz.stats.tSpins, + higherIsBetter: false, + ), + CompareThingy( + label: "Quads", + greenSide: theGreenSide[2].blitz.stats.clears.quads, + redSide: theRedSide[2].blitz.stats.clears.quads, + higherIsBetter: true, + ), + CompareThingy( + label: "PC's", + greenSide: theGreenSide[2].blitz.stats.clears.allClears, + redSide: theRedSide[2].blitz.stats.clears.allClears, + higherIsBetter: true, + ), + ], + ) + else if (greenSideMode == Mode.player && redSideMode == Mode.player) CompareBoolThingy(greenSide: theGreenSide[2].blitz != null, redSide: theRedSide[2].blitz != null, label: "Played Blitz", trueIsBetter: true), + if (greenSideMode == Mode.player && redSideMode == Mode.player) Column( + children: [ + const Divider(), + Padding( + padding: const EdgeInsets.only(bottom: 16), + child: Text(t.zen, style: TextStyle(fontFamily: "Eurostile Round Extended", fontSize: bigScreen ? 42 : 28)), + ), + CompareThingy( + label: "Level", + greenSide: theGreenSide[2].zen.level, + redSide: theRedSide[2].zen.level, + higherIsBetter: true, + ), + CompareThingy( + label: "Score", + greenSide: theGreenSide[2].zen.score, + redSide: theRedSide[2].zen.score, + higherIsBetter: true, + ), + ], ) ], ) @@ -684,7 +1269,7 @@ class CompareState extends State { padding: const EdgeInsets.all(8.0), child: Text(t.compareViewNoValues(avgR: "\$avgR"), textAlign: TextAlign.center), ) - ], + ], ), ), ), @@ -717,10 +1302,10 @@ class PlayerSelector extends StatelessWidget { playerController.text = data[0] != null ? data[0].username : ""; break; case Mode.stats: - playerController.text = "${data[2].apm} ${data[2].pps} ${data[2].vs}"; + playerController.text = "${data[2].league.apm} ${data[2].league.pps} ${data[2].league.vs}"; break; case Mode.averages: - playerController.text = "\$avg${data[2].rank.toUpperCase()}"; + playerController.text = "\$avg${data[2].league.rank.toUpperCase()}"; break; } } @@ -730,10 +1315,10 @@ class PlayerSelector extends StatelessWidget { underFieldString = data[0] != null ? data[0].toString() : "???"; break; case Mode.stats: - underFieldString = "${data[2].apm} APM, ${data[2].pps} PPS, ${data[2].vs} VS"; + underFieldString = "${data[2].league.apm} APM, ${data[2].league.pps} PPS, ${data[2].league.vs} VS"; break; case Mode.averages: - underFieldString = t.averageXrank(rankLetter: data[2].rank.toUpperCase()); + underFieldString = t.averageXrank(rankLetter: data[2].league.rank.toUpperCase()); break; } } @@ -1055,14 +1640,42 @@ class CompareDurationThingy extends StatelessWidget { child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ - Expanded( - child: Text( - greenSide.toString(), - style: const TextStyle( - fontSize: 22, + Expanded(child: Container( + padding: const EdgeInsets.all(4), + decoration: BoxDecoration( + gradient: LinearGradient( + colors: const [Colors.green, Colors.transparent], + begin: Alignment.centerLeft, + end: Alignment.centerRight, + transform: const GradientRotation(0.6), + stops: [ + 0.0, + higherIsBetter + ? greenSide > redSide + ? 0.6 + : 0 + : greenSide < redSide + ? 0.6 + : 0 + ], + ) ), - textAlign: TextAlign.start, - )), + child: Text(get40lTime(greenSide.inMicroseconds), style: const TextStyle( + fontSize: 22, + shadows: [ + Shadow( + offset: Offset(0.0, 0.0), + blurRadius: 3.0, + color: Colors.black, + ), + Shadow( + offset: Offset(0.0, 0.0), + blurRadius: 8.0, + color: Colors.black, + ), + ], + ), textAlign: TextAlign.start) + )), Column( children: [ Text( @@ -1088,12 +1701,41 @@ class CompareDurationThingy extends StatelessWidget { verdict(greenSide, redSide).toString(), style: verdictStyle, textAlign: TextAlign.center) ], ), - Expanded( - child: Text( - redSide.toString(), - style: const TextStyle(fontSize: 22), - textAlign: TextAlign.end, - )), + Expanded(child: Container( + padding: const EdgeInsets.all(4), + decoration: BoxDecoration( + gradient: LinearGradient( + colors: const [Colors.red, Colors.transparent], + begin: Alignment.centerRight, + end: Alignment.centerLeft, + transform: const GradientRotation(-0.6), + stops: [ + 0.0, + higherIsBetter + ? redSide > greenSide + ? 0.6 + : 0 + : redSide < greenSide + ? 0.6 + : 0 + ], + )), + child: Text(get40lTime(redSide.inMicroseconds), style: const TextStyle( + fontSize: 22, + shadows: [ + Shadow( + offset: Offset(0.0, 0.0), + blurRadius: 3.0, + color: Colors.black, + ), + Shadow( + offset: Offset(0.0, 0.0), + blurRadius: 8.0, + color: Colors.black, + ), + ], + ), textAlign: TextAlign.end) + )), ], ), ); diff --git a/lib/views/main_view.dart b/lib/views/main_view.dart index df6fe00..324bed9 100644 --- a/lib/views/main_view.dart +++ b/lib/views/main_view.dart @@ -1103,10 +1103,10 @@ class _TwoRecordsThingy extends StatelessWidget { Widget build(BuildContext context) { late MapEntry closestAverageBlitz; late bool blitzBetterThanClosestAverage; - bool? blitzBetterThanRankAverage = (rank != null && rank != "z" && blitz != null) ? blitz!.stats.score > blitzAverages[rank]! : null; + bool? blitzBetterThanRankAverage = (rank != null && rank != "z" && rank != "x+" && blitz != null) ? blitz!.stats.score > blitzAverages[rank]! : null; late MapEntry closestAverageSprint; late bool sprintBetterThanClosestAverage; - bool? sprintBetterThanRankAverage = (rank != null && rank != "z" && sprint != null) ? sprint!.stats.finalTime < sprintAverages[rank]! : null; + bool? sprintBetterThanRankAverage = (rank != null && rank != "z" && rank != "x+" && sprint != null) ? sprint!.stats.finalTime < sprintAverages[rank]! : null; if (sprint != null) { closestAverageSprint = sprintAverages.entries.singleWhere((element) => element.value == sprintAverages.values.reduce((a, b) => (a-sprint!.stats.finalTime).abs() < (b -sprint!.stats.finalTime).abs() ? a : b)); sprintBetterThanClosestAverage = sprint!.stats.finalTime < closestAverageSprint.value; @@ -1144,7 +1144,7 @@ class _TwoRecordsThingy extends StatelessWidget { text: "", style: const TextStyle(fontFamily: "Eurostile Round", fontSize: 14, color: Colors.grey), children: [ - if (rank != null && rank != "z") TextSpan(text: "${t.verdictGeneral(n: readableTimeDifference(sprint!.stats.finalTime, sprintAverages[rank]!), verdict: sprintBetterThanRankAverage??false ? t.verdictBetter : t.verdictWorse, rank: rank!.toUpperCase())}\n", style: TextStyle( + if (rank != null && rank != "z" && rank != "x+") TextSpan(text: "${t.verdictGeneral(n: readableTimeDifference(sprint!.stats.finalTime, sprintAverages[rank]!), verdict: sprintBetterThanRankAverage??false ? t.verdictBetter : t.verdictWorse, rank: rank!.toUpperCase())}\n", style: TextStyle( color: sprintBetterThanRankAverage??false ? Colors.greenAccent : Colors.redAccent )) else TextSpan(text: "${t.verdictGeneral(n: readableTimeDifference(sprint!.stats.finalTime, closestAverageSprint.value), verdict: sprintBetterThanClosestAverage ? t.verdictBetter : t.verdictWorse, rank: closestAverageSprint.key.toUpperCase())}\n", style: TextStyle( @@ -1227,7 +1227,7 @@ class _TwoRecordsThingy extends StatelessWidget { text: "", style: const TextStyle(fontFamily: "Eurostile Round", fontSize: 14, color: Colors.grey), children: [ - if (rank != null && rank != "z") TextSpan(text: "${t.verdictGeneral(n: readableIntDifference(blitz!.stats.score, blitzAverages[rank]!), verdict: blitzBetterThanRankAverage??false ? t.verdictBetter : t.verdictWorse, rank: rank!.toUpperCase())}\n", style: TextStyle( + if (rank != null && rank != "z" && rank != "x+") TextSpan(text: "${t.verdictGeneral(n: readableIntDifference(blitz!.stats.score, blitzAverages[rank]!), verdict: blitzBetterThanRankAverage??false ? t.verdictBetter : t.verdictWorse, rank: rank!.toUpperCase())}\n", style: TextStyle( color: blitzBetterThanRankAverage??false ? Colors.greenAccent : Colors.redAccent )) else TextSpan(text: "${t.verdictGeneral(n: readableIntDifference(blitz!.stats.score, closestAverageBlitz.value), verdict: blitzBetterThanClosestAverage ? t.verdictBetter : t.verdictWorse, rank: closestAverageBlitz.key.toUpperCase())}\n", style: TextStyle( diff --git a/lib/widgets/singleplayer_record.dart b/lib/widgets/singleplayer_record.dart index 890f59e..f717ca2 100644 --- a/lib/widgets/singleplayer_record.dart +++ b/lib/widgets/singleplayer_record.dart @@ -28,10 +28,10 @@ class SingleplayerRecord extends StatelessWidget { if (record == null) return Center(child: Text(t.noRecord, textAlign: TextAlign.center, style: const TextStyle(fontFamily: "Eurostile Round", fontSize: 28))); late MapEntry closestAverageBlitz; late bool blitzBetterThanClosestAverage; - bool? blitzBetterThanRankAverage = (rank != null && rank != "z") ? record!.stats.score > blitzAverages[rank]! : null; + bool? blitzBetterThanRankAverage = (rank != null && rank != "z" && rank != "x+") ? record!.stats.score > blitzAverages[rank]! : null; late MapEntry closestAverageSprint; late bool sprintBetterThanClosestAverage; - bool? sprintBetterThanRankAverage = (rank != null && rank != "z") ? record!.stats.finalTime < sprintAverages[rank]! : null; + bool? sprintBetterThanRankAverage = (rank != null && rank != "z" && rank != "x+") ? record!.stats.finalTime < sprintAverages[rank]! : null; if (record!.gamemode == "40l") { closestAverageSprint = sprintAverages.entries.singleWhere((element) => element.value == sprintAverages.values.reduce((a, b) => (a-record!.stats.finalTime).abs() < (b -record!.stats.finalTime).abs() ? a : b)); sprintBetterThanClosestAverage = record!.stats.finalTime < closestAverageSprint.value; @@ -74,16 +74,16 @@ class SingleplayerRecord extends StatelessWidget { text: "", style: const TextStyle(fontFamily: "Eurostile Round", fontSize: 14, color: Colors.grey), children: [ - if (record!.gamemode == "40l" && (rank != null && rank != "z")) TextSpan(text: "${t.verdictGeneral(n: readableTimeDifference(record!.stats.finalTime, sprintAverages[rank]!), verdict: sprintBetterThanRankAverage??false ? t.verdictBetter : t.verdictWorse, rank: rank!.toUpperCase())}\n", style: TextStyle( + if (record!.gamemode == "40l" && (rank != null && rank != "z" && rank != "x+")) TextSpan(text: "${t.verdictGeneral(n: readableTimeDifference(record!.stats.finalTime, sprintAverages[rank]!), verdict: sprintBetterThanRankAverage??false ? t.verdictBetter : t.verdictWorse, rank: rank!.toUpperCase())}\n", style: TextStyle( color: sprintBetterThanRankAverage??false ? Colors.greenAccent : Colors.redAccent )) - else if (record!.gamemode == "40l" && (rank == null || rank == "z")) TextSpan(text: "${t.verdictGeneral(n: readableTimeDifference(record!.stats.finalTime, closestAverageSprint.value), verdict: sprintBetterThanClosestAverage ? t.verdictBetter : t.verdictWorse, rank: closestAverageSprint.key.toUpperCase())}\n", style: TextStyle( + else if (record!.gamemode == "40l" && (rank == null || rank == "z" || rank != "x+")) TextSpan(text: "${t.verdictGeneral(n: readableTimeDifference(record!.stats.finalTime, closestAverageSprint.value), verdict: sprintBetterThanClosestAverage ? t.verdictBetter : t.verdictWorse, rank: closestAverageSprint.key.toUpperCase())}\n", style: TextStyle( color: sprintBetterThanClosestAverage ? Colors.greenAccent : Colors.redAccent )) - else if (record!.gamemode == "blitz" && (rank != null && rank != "z")) TextSpan(text: "${t.verdictGeneral(n: readableIntDifference(record!.stats.score, blitzAverages[rank]!), verdict: blitzBetterThanRankAverage??false ? t.verdictBetter : t.verdictWorse, rank: rank!.toUpperCase())}\n", style: TextStyle( + else if (record!.gamemode == "blitz" && (rank != null && rank != "z" && rank != "x+")) TextSpan(text: "${t.verdictGeneral(n: readableIntDifference(record!.stats.score, blitzAverages[rank]!), verdict: blitzBetterThanRankAverage??false ? t.verdictBetter : t.verdictWorse, rank: rank!.toUpperCase())}\n", style: TextStyle( color: blitzBetterThanRankAverage??false ? Colors.greenAccent : Colors.redAccent )) - else if (record!.gamemode == "blitz" && (rank == null || rank == "z")) TextSpan(text: "${t.verdictGeneral(n: readableIntDifference(record!.stats.score, closestAverageBlitz.value), verdict: blitzBetterThanClosestAverage ? t.verdictBetter : t.verdictWorse, rank: closestAverageBlitz.key.toUpperCase())}\n", style: TextStyle( + else if (record!.gamemode == "blitz" && (rank == null || rank == "z" || rank != "x+")) TextSpan(text: "${t.verdictGeneral(n: readableIntDifference(record!.stats.score, closestAverageBlitz.value), verdict: blitzBetterThanClosestAverage ? t.verdictBetter : t.verdictWorse, rank: closestAverageBlitz.key.toUpperCase())}\n", style: TextStyle( color: blitzBetterThanClosestAverage ? Colors.greenAccent : Colors.redAccent )), if (record!.rank != -1) TextSpan(text: "№${record!.rank}", style: TextStyle(color: getColorOfRank(record!.rank))), diff --git a/pubspec.yaml b/pubspec.yaml index bf491d7..f4cc18a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -2,7 +2,7 @@ name: tetra_stats description: Track your and other player stats in TETR.IO publish_to: 'none' -version: 1.6.6+32 +version: 1.6.7+33 environment: sdk: '>=3.0.0'