Skip to content

Commit cbaabda

Browse files
committed
Add basic algorithms for best jumper and rising star
1 parent 5899622 commit cbaabda

File tree

3 files changed

+60
-11
lines changed

3 files changed

+60
-11
lines changed

jumpers_female.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
[{"age":35,"name":"Philipp","surname":"Aschenwald","country":"at","sex":1,"skills":{"qualityOnSmallerHills":82.0,"qualityOnLargerHills":72.0,"landingStyle":-1,"jumpsConsistency":-1}},{"age":32,"name":"Daniel","surname":"Huber","country":"at","sex":1,"skills":{"qualityOnSmallerHills":81.24,"qualityOnLargerHills":88.0,"landingStyle":1,"jumpsConsistency":1}},{"age":37,"name":"Kamil","surname":"Stoch","country":"pl","sex":1,"skills":{"qualityOnSmallerHills":82.0,"qualityOnLargerHills":83.0,"landingStyle":3,"jumpsConsistency":2}},{"age":25,"name":"Silje","surname":"Opseth","country":"no","sex":1,"skills":{"qualityOnSmallerHills":87.0,"qualityOnLargerHills":94.0,"landingStyle":0,"jumpsConsistency":0}},{"age":31,"name":"Stefan","surname":"Kraft","country":"at","sex":1,"skills":{"qualityOnSmallerHills":88.0,"qualityOnLargerHills":95.0,"landingStyle":3,"jumpsConsistency":1}},{"age":37,"name":"Dawid","surname":"Kubacki","country":"pl","sex":1,"skills":{"qualityOnSmallerHills":91.25,"qualityOnLargerHills":81.0,"landingStyle":1,"jumpsConsistency":0}}]
1+
[{"age":35,"name":"Philipp","surname":"Aschenwald","country":"at","sex":1,"skills":{"qualityOnSmallerHills":82.0,"qualityOnLargerHills":72.0,"landingStyle":-1,"jumpsConsistency":-1}},{"age":32,"name":"Daniel","surname":"Huber","country":"at","sex":1,"skills":{"qualityOnSmallerHills":81.24,"qualityOnLargerHills":88.0,"landingStyle":1,"jumpsConsistency":1}},{"age":22,"name":"Kamil","surname":"Stoch","country":"pl","sex":1,"skills":{"qualityOnSmallerHills":82.0,"qualityOnLargerHills":83.0,"landingStyle":3,"jumpsConsistency":2}},{"age":14,"name":"Stefan","surname":"Kraft","country":"at","sex":1,"skills":{"qualityOnSmallerHills":88.0,"qualityOnLargerHills":95.0,"landingStyle":3,"jumpsConsistency":1}},{"age":21,"name":"Dawid","surname":"Kubacki","country":"pl","sex":1,"skills":{"qualityOnSmallerHills":91.25,"qualityOnLargerHills":81.0,"landingStyle":1,"jumpsConsistency":0}}]

lib/ui/screens/main_screen/large/simulation_wizard/simulation_wizard_dialog.dart

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ import 'package:sj_manager/models/db/team/country_team.dart';
1919
import 'package:sj_manager/models/simulations/enums.dart';
2020
import 'package:sj_manager/models/simulations/simulation_wizard_options_repo.dart';
2121
import 'package:sj_manager/models/db/team/team.dart';
22-
import 'package:sj_manager/repositories/generic/db_items_json_configuration.dart';
2322
import 'package:sj_manager/ui/reusable_widgets/countries/country_flag.dart';
2423
import 'package:sj_manager/ui/screens/main_screen/large/simulation_wizard/widgets/country_screen/country_title.dart';
2524
import 'package:sj_manager/ui/screens/main_screen/large/simulation_wizard/widgets/country_screen/preview_stat_texts.dart';

lib/utils/team_preview_creator.dart

Lines changed: 59 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
import 'package:sj_manager/models/db/hill/hill.dart';
22
import 'package:sj_manager/models/db/jumper/jumper.dart';
3+
import 'package:sj_manager/models/db/jumper/jumps_consistency.dart';
4+
import 'package:sj_manager/models/db/jumper/landing_style.dart';
35
import 'package:sj_manager/models/db/jumps/simple_jump.dart';
46
import 'package:sj_manager/models/db/local_db_repo.dart';
7+
import 'package:sj_manager/models/db/sex.dart';
58
import 'package:sj_manager/models/db/team/country_team.dart';
69
import 'package:sj_manager/models/db/team/team.dart';
710
import 'package:sj_manager/utils/db_items.dart';
8-
import 'package:sj_manager/utils/iterable_random_access.dart';
911

1012
abstract class TeamPreviewCreator<T extends Team> {
1113
const TeamPreviewCreator();
@@ -45,17 +47,65 @@ class DefaultCountryTeamPreviewCreator extends TeamPreviewCreator<CountryTeam> {
4547

4648
@override
4749
Jumper? bestJumper(CountryTeam team) {
48-
// TODO: Some algorithm
49-
final fromCountry = database.maleJumpers.last.fromCountryByCode(team.country.code);
50-
if (fromCountry.isEmpty) return null;
51-
return fromCountry.randomElement();
50+
final jumpers =
51+
team.sex == Sex.male ? database.maleJumpers.last : database.femaleJumpers.last;
52+
final jumpersFromCountry = jumpers.fromCountryByCode(team.country.code);
53+
if (jumpersFromCountry.isEmpty) return null;
54+
final jumperRatings = {
55+
for (var jumper in jumpersFromCountry) jumper: _calculateRating(jumper),
56+
};
57+
return _bestJumper(jumperRatings);
5258
}
5359

5460
@override
5561
Jumper? risingStar(CountryTeam team) {
56-
// TODO: Some algorithm
57-
final fromCountry = database.maleJumpers.last.fromCountryByCode(team.country.code);
58-
if (fromCountry.isEmpty) return null;
59-
return fromCountry.first;
62+
final jumpers =
63+
team.sex == Sex.male ? database.maleJumpers.last : database.femaleJumpers.last;
64+
final jumpersFromCountry = jumpers.fromCountryByCode(team.country.code);
65+
if (jumpersFromCountry.isEmpty) return null;
66+
final jumperRatings = {
67+
for (var jumper in jumpersFromCountry)
68+
jumper: _calculateRatingForRisingStar(jumper),
69+
};
70+
return _bestJumper(jumperRatings);
71+
}
72+
73+
double _calculateRatingForRisingStar(Jumper jumper) {
74+
final base = _calculateRating(jumper);
75+
final age = jumper.age;
76+
const k = 27;
77+
final multiplierByAge = (age == 17) ? 1.0 : (1.0 / (1.0 + (age - 18).abs() / k));
78+
print('multiplier by age ($age): $multiplierByAge');
79+
return base * multiplierByAge;
80+
}
81+
82+
double _calculateRating(Jumper jumper) {
83+
final skills = jumper.skills;
84+
final byQualityOnSmallerHills = skills.qualityOnSmallerHills * 1.0;
85+
final byQualityOnLargerHills = skills.qualityOnLargerHills * 1.0;
86+
final multiplierByConsistency = switch (skills.jumpsConsistency) {
87+
JumpsConsistency.veryConsistent => 1.08,
88+
JumpsConsistency.consistent => 1.04,
89+
JumpsConsistency.average => 1.0,
90+
JumpsConsistency.inconsistent => 0.96,
91+
JumpsConsistency.veryInconsistent => 0.92,
92+
};
93+
final multiplierByLandingStyle = switch (skills.landingStyle) {
94+
LandingStyle.perfect => 1.06,
95+
LandingStyle.veryGraceful => 1.04,
96+
LandingStyle.graceful => 1.02,
97+
LandingStyle.average => 1.00,
98+
LandingStyle.ugly => 0.98,
99+
LandingStyle.veryUgly => 0.96,
100+
LandingStyle.terrible => 0.94,
101+
};
102+
final rating = (byQualityOnSmallerHills + byQualityOnLargerHills) *
103+
multiplierByConsistency *
104+
multiplierByLandingStyle;
105+
return rating;
106+
}
107+
108+
Jumper _bestJumper(Map<Jumper, double> jumperRatings) {
109+
return jumperRatings.entries.reduce((a, b) => a.value > b.value ? a : b).key;
60110
}
61111
}

0 commit comments

Comments
 (0)