|
1 | 1 | import 'package:sj_manager/models/db/hill/hill.dart';
|
2 | 2 | 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'; |
3 | 5 | import 'package:sj_manager/models/db/jumps/simple_jump.dart';
|
4 | 6 | import 'package:sj_manager/models/db/local_db_repo.dart';
|
| 7 | +import 'package:sj_manager/models/db/sex.dart'; |
5 | 8 | import 'package:sj_manager/models/db/team/country_team.dart';
|
6 | 9 | import 'package:sj_manager/models/db/team/team.dart';
|
7 | 10 | import 'package:sj_manager/utils/db_items.dart';
|
8 |
| -import 'package:sj_manager/utils/iterable_random_access.dart'; |
9 | 11 |
|
10 | 12 | abstract class TeamPreviewCreator<T extends Team> {
|
11 | 13 | const TeamPreviewCreator();
|
@@ -45,17 +47,65 @@ class DefaultCountryTeamPreviewCreator extends TeamPreviewCreator<CountryTeam> {
|
45 | 47 |
|
46 | 48 | @override
|
47 | 49 | 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); |
52 | 58 | }
|
53 | 59 |
|
54 | 60 | @override
|
55 | 61 | 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; |
60 | 110 | }
|
61 | 111 | }
|
0 commit comments