2024-09-05 21:42:21 +00:00
|
|
|
// ignore_for_file: hash_and_equals
|
|
|
|
|
2024-09-14 22:05:50 +00:00
|
|
|
import 'dart:math';
|
|
|
|
|
2024-09-05 21:42:21 +00:00
|
|
|
import 'package:tetra_stats/data_objects/est_tr.dart';
|
|
|
|
import 'package:tetra_stats/data_objects/nerd_stats.dart';
|
|
|
|
import 'package:tetra_stats/data_objects/playstyle.dart';
|
|
|
|
import 'package:tetra_stats/data_objects/tetrio_constants.dart';
|
2024-09-15 16:38:07 +00:00
|
|
|
import 'package:tetra_stats/data_objects/tetrio_prisecter.dart';
|
2024-09-05 21:42:21 +00:00
|
|
|
|
|
|
|
class TetrioPlayerFromLeaderboard {
|
|
|
|
late String userId;
|
|
|
|
late String username;
|
|
|
|
late String role;
|
|
|
|
late double xp;
|
|
|
|
String? country;
|
|
|
|
late DateTime timestamp;
|
|
|
|
late int gamesPlayed;
|
|
|
|
late int gamesWon;
|
|
|
|
late double tr;
|
|
|
|
late double gxe;
|
|
|
|
late double? glicko;
|
|
|
|
late double? rd;
|
|
|
|
late String rank;
|
|
|
|
late String? bestRank;
|
|
|
|
late double apm;
|
|
|
|
late double pps;
|
|
|
|
late double vs;
|
|
|
|
late bool decaying;
|
|
|
|
late NerdStats nerdStats;
|
|
|
|
late EstTr estTr;
|
|
|
|
late Playstyle playstyle;
|
2024-09-14 22:05:50 +00:00
|
|
|
late int gamesPlayedTotal;
|
|
|
|
late int gamesWonTotal;
|
|
|
|
late Duration playtime;
|
|
|
|
late int ar;
|
2024-09-15 16:38:07 +00:00
|
|
|
late Map<String, int> ar_counts;
|
|
|
|
late Prisecter prisecter;
|
2024-09-05 21:42:21 +00:00
|
|
|
|
|
|
|
TetrioPlayerFromLeaderboard(
|
|
|
|
this.userId,
|
|
|
|
this.username,
|
|
|
|
this.role,
|
|
|
|
this.xp,
|
|
|
|
this.country,
|
|
|
|
this.timestamp,
|
|
|
|
this.gamesPlayed,
|
|
|
|
this.gamesWon,
|
|
|
|
this.tr,
|
|
|
|
this.gxe,
|
|
|
|
this.glicko,
|
|
|
|
this.rd,
|
|
|
|
this.rank,
|
|
|
|
this.bestRank,
|
|
|
|
this.apm,
|
|
|
|
this.pps,
|
|
|
|
this.vs,
|
2024-09-14 22:05:50 +00:00
|
|
|
this.decaying,
|
|
|
|
this.gamesPlayedTotal,
|
|
|
|
this.gamesWonTotal,
|
|
|
|
this.playtime,
|
|
|
|
this.ar){
|
2024-09-05 21:42:21 +00:00
|
|
|
nerdStats = NerdStats(apm, pps, vs);
|
|
|
|
estTr = EstTr(apm, pps, vs, nerdStats.app, nerdStats.dss, nerdStats.dsp, nerdStats.gbe);
|
|
|
|
playstyle = Playstyle(apm, pps, nerdStats.app, nerdStats.vsapm, nerdStats.dsp, nerdStats.gbe, estTr.srarea, estTr.statrank);
|
|
|
|
}
|
|
|
|
|
|
|
|
double get winrate => gamesWon / gamesPlayed;
|
2024-09-14 22:05:50 +00:00
|
|
|
double get winrateTotal => gamesWonTotal / gamesWonTotal;
|
|
|
|
double get level => pow((xp / 500), 0.6) + (xp / (5000 + (max(0, xp - 4 * pow(10, 6)) / 5000))) + 1;
|
2024-09-05 21:42:21 +00:00
|
|
|
double get esttracc => estTr.esttr - tr;
|
|
|
|
double get s1tr => gxe * 250;
|
|
|
|
|
|
|
|
TetrioPlayerFromLeaderboard.fromJson(Map<String, dynamic> json, DateTime ts) {
|
|
|
|
userId = json['_id'];
|
|
|
|
username = json['username'];
|
|
|
|
role = json['role'];
|
|
|
|
xp = json['xp'].toDouble();
|
|
|
|
country = json['country'];
|
|
|
|
timestamp = ts;
|
|
|
|
gamesPlayed = json['league']['gamesplayed'] as int;
|
|
|
|
gamesWon = json['league']['gameswon'] as int;
|
|
|
|
tr = json['league']['tr'] != null ? json['league']['tr'].toDouble() : 0;
|
2024-09-14 22:05:50 +00:00
|
|
|
gxe = json['league']['gxe']?.toDouble();
|
2024-09-05 21:42:21 +00:00
|
|
|
glicko = json['league']['glicko']?.toDouble();
|
|
|
|
rd = json['league']['rd']?.toDouble();
|
|
|
|
rank = json['league']['rank'];
|
|
|
|
bestRank = json['league']['bestrank'];
|
|
|
|
apm = json['league']['apm'] != null ? json['league']['apm'].toDouble() : 0.00;
|
|
|
|
pps = json['league']['pps'] != null ? json['league']['pps'].toDouble() : 0.00;
|
|
|
|
vs = json['league']['vs'] != null ? json['league']['vs'].toDouble(): 0.00;
|
|
|
|
decaying = json['league']['decaying'];
|
2024-09-14 22:05:50 +00:00
|
|
|
gamesPlayedTotal = json['gamesplayed'] as int;
|
|
|
|
gamesWonTotal = json['gameswon'] as int;
|
|
|
|
playtime = Duration(microseconds: (json['gametime'].toDouble() * 1000000).floor());
|
|
|
|
ar = json['ar'];
|
2024-09-15 16:38:07 +00:00
|
|
|
ar_counts = {};
|
|
|
|
for (var entry in json['ar_counts'].keys){
|
|
|
|
ar_counts[entry.toString()] = json['ar_counts'][entry];
|
|
|
|
}
|
|
|
|
prisecter = Prisecter.fromJson(json['p']);
|
2024-09-05 21:42:21 +00:00
|
|
|
nerdStats = NerdStats(apm, pps, vs);
|
|
|
|
estTr = EstTr(apm, pps, vs, nerdStats.app, nerdStats.dss, nerdStats.dsp, nerdStats.gbe);
|
|
|
|
playstyle = Playstyle(apm, pps, nerdStats.app, nerdStats.vsapm, nerdStats.dsp, nerdStats.gbe, estTr.srarea, estTr.statrank);
|
|
|
|
}
|
|
|
|
|
|
|
|
num getStatByEnum(Stats stat){
|
|
|
|
switch (stat) {
|
|
|
|
case Stats.tr:
|
|
|
|
return tr;
|
|
|
|
case Stats.glicko:
|
|
|
|
return glicko??-1;
|
|
|
|
case Stats.gxe:
|
|
|
|
return gxe;
|
|
|
|
case Stats.s1tr:
|
|
|
|
return s1tr;
|
|
|
|
case Stats.rd:
|
|
|
|
return rd??-1;
|
|
|
|
case Stats.gp:
|
|
|
|
return gamesPlayed;
|
|
|
|
case Stats.gw:
|
|
|
|
return gamesWon;
|
|
|
|
case Stats.wr:
|
|
|
|
return winrate*100;
|
|
|
|
case Stats.apm:
|
|
|
|
return apm;
|
|
|
|
case Stats.pps:
|
|
|
|
return pps;
|
|
|
|
case Stats.vs:
|
|
|
|
return vs;
|
|
|
|
case Stats.app:
|
|
|
|
return nerdStats.app;
|
|
|
|
case Stats.dss:
|
|
|
|
return nerdStats.dss;
|
|
|
|
case Stats.dsp:
|
|
|
|
return nerdStats.dsp;
|
|
|
|
case Stats.appdsp:
|
|
|
|
return nerdStats.appdsp;
|
|
|
|
case Stats.vsapm:
|
|
|
|
return nerdStats.vsapm;
|
|
|
|
case Stats.cheese:
|
|
|
|
return nerdStats.cheese;
|
|
|
|
case Stats.gbe:
|
|
|
|
return nerdStats.gbe;
|
|
|
|
case Stats.nyaapp:
|
|
|
|
return nerdStats.nyaapp;
|
|
|
|
case Stats.area:
|
|
|
|
return nerdStats.area;
|
|
|
|
case Stats.eTR:
|
|
|
|
return estTr.esttr;
|
|
|
|
case Stats.acceTR:
|
|
|
|
return esttracc;
|
|
|
|
case Stats.acceTRabs:
|
|
|
|
return esttracc.abs();
|
|
|
|
case Stats.opener:
|
|
|
|
return playstyle.opener;
|
|
|
|
case Stats.plonk:
|
|
|
|
return playstyle.plonk;
|
|
|
|
case Stats.infDS:
|
|
|
|
return playstyle.infds;
|
|
|
|
case Stats.stride:
|
|
|
|
return playstyle.stride;
|
|
|
|
case Stats.stridemMinusPlonk:
|
|
|
|
return playstyle.stride - playstyle.plonk;
|
|
|
|
case Stats.openerMinusInfDS:
|
|
|
|
return playstyle.opener - playstyle.infds;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|