From a9893379f4421eb08f2834ff8aaf70257811c65b Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Thu, 14 Mar 2024 22:11:04 -0400 Subject: [PATCH] [+] Detailed ranks --- .../java/icu/samnyan/aqua/net/games/Models.kt | 1 + .../icu/samnyan/aqua/net/utils/GameHelper.kt | 20 ++++++++++++++----- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/main/java/icu/samnyan/aqua/net/games/Models.kt b/src/main/java/icu/samnyan/aqua/net/games/Models.kt index 3b88f9a7..24eda438 100644 --- a/src/main/java/icu/samnyan/aqua/net/games/Models.kt +++ b/src/main/java/icu/samnyan/aqua/net/games/Models.kt @@ -19,6 +19,7 @@ data class GenericGameSummary( val rating: Int, val ratingHighest: Int, val ranks: List, + val detailedRanks: Map>, val maxCombo: Int, val fullCombo: Int, val allPerfect: Int, diff --git a/src/main/java/icu/samnyan/aqua/net/utils/GameHelper.kt b/src/main/java/icu/samnyan/aqua/net/utils/GameHelper.kt index 10705f85..ae637266 100644 --- a/src/main/java/icu/samnyan/aqua/net/utils/GameHelper.kt +++ b/src/main/java/icu/samnyan/aqua/net/utils/GameHelper.kt @@ -95,11 +95,20 @@ fun genericUserSummary( val user = userDataRepo.findByCard(card) ?: (404 - "Game data not found") val plays = userPlaylogRepo.findByUserCardExtId(card.extId) - // O(6n) ranks algorithm: Loop through the entire list of plays, - // count the number of each rank - val ranks = shownRanks.associate { (_, v) -> v to 0 }.toMutableMap() - plays.forEach { - shownRanks.find { (s, _) -> it.achievement > s }?.let { (_, v) -> ranks[v] = ranks[v]!! + 1 } + // Detailed ranks: Find the number of each rank in each level category + // map> + // TODO: Not all games have difficulty from 1 to 15 + val detailedRanks = (1..15).associateWith { lvl -> + shownRanks.associate { (_, v) -> v to 0 }.toMutableMap().also { ranks -> + plays.filter { lvl < it.level && it.level < lvl + 1 }.forEach { + shownRanks.find { (s, _) -> it.achievement > s }?.let { (_, v) -> ranks[v] = ranks[v]!! + 1 } + } + } + } + + // Collapse detailed ranks to get non-detailed ranks map + val ranks = detailedRanks.values.first().keys.associateWith { rank -> + detailedRanks.values.sumOf { it[rank] ?: 0 } } return GenericGameSummary( @@ -111,6 +120,7 @@ fun genericUserSummary( rating = user.playerRating, ratingHighest = user.highestRating, ranks = ranks.map { (k, v) -> RankCount(k, v) }, + detailedRanks = detailedRanks, maxCombo = plays.maxOfOrNull { it.maxCombo } ?: 0, fullCombo = plays.count { it.isFullCombo }, allPerfect = plays.count { it.isAllPerfect },