feat: DX RATING calculation

This commit is contained in:
mokurin000
2025-08-01 03:31:16 +08:00
parent ef2df9052b
commit 68e8a6e005
5 changed files with 150 additions and 14 deletions

View File

@@ -40,8 +40,6 @@ pub struct UserRating {
pub struct MusicRating {
/// Maimai music id
pub music_id: u32,
/// difficulty
///
/// - 0: BASIC
/// - 1: ADVANCED
/// - 2: EXPERT
@@ -92,17 +90,28 @@ pub struct Udemae {
impl Display for GetUserRatingApiResp {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let b35 = &self.user_rating.rating_list;
let b15 = &self.user_rating.new_rating_list;
f.write_fmt(format_args!("用户ID: {}\n", self.user_id))?;
f.write_str("\n---------- B35 ----------\n")?;
for b35 in &self.user_rating.rating_list {
f.write_fmt(format_args!("{b35}\n---\n"))?;
f.write_str("\n--------- B35 ---------\n")?;
for music in b35 {
f.write_fmt(format_args!("{music}\n---\n"))?;
}
f.write_str("\n---------- B15 ----------\n")?;
for b15 in &self.user_rating.new_rating_list {
f.write_fmt(format_args!("{b15}\n---\n"))?;
f.write_str("\n--------- B15 ---------\n")?;
for music in b15 {
f.write_fmt(format_args!("{music}\n---\n"))?;
}
let b35_rating: u32 = b35.iter().filter_map(|m| m.dx_rating()).sum();
let b15_rating: u32 = b15.iter().filter_map(|m| m.dx_rating()).sum();
f.write_str("\n--------- Total ---------\n")?;
f.write_fmt(format_args!("B35 Rating: {b35_rating}\n"))?;
f.write_fmt(format_args!("B15 Rating: {b15_rating}\n"))?;
f.write_fmt(format_args!("总 Rating: {}\n", b35_rating + b15_rating))?;
Ok(())
}
}
@@ -110,10 +119,11 @@ impl Display for GetUserRatingApiResp {
impl Display for MusicRating {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_fmt(format_args!("歌曲ID: \t{}\n", self.music_id))?;
if let Some(info) = MUSIC_DB.as_ref().map(|db| db.get(&self.music_id)).flatten() {
let title = &info.name;
if let Some(title) = self.music_title() {
f.write_fmt(format_args!("曲目标题: \t{title}\n"))?;
}
f.write_fmt(format_args!(
"谱面版本: \t{}\n",
match (self.music_id / 10000) % 10 {
@@ -125,11 +135,36 @@ impl Display for MusicRating {
f.write_fmt(format_args!("游玩难度: \t{}\n", level_name(self.level)))?;
f.write_fmt(format_args!(
"达成率: \t{}.{:04}%",
"达成率: \t{}.{:04}%\n",
self.achievement / 10000,
self.achievement % 10000
))?;
if let Some(dx_rating) = self.dx_rating() {
f.write_fmt(format_args!("DX RATING: \t{dx_rating}"))?;
}
Ok(())
}
}
impl MusicRating {
pub fn music_title(&self) -> Option<String> {
MUSIC_DB
.as_ref()?
.get(&self.music_id)
.map(|music_info| music_info.name.clone())
}
pub fn dx_rating(&self) -> Option<u32> {
Some(
MUSIC_DB
.as_ref()?
.get(&self.music_id)?
.levels
.iter()
.find(|d| d.level == self.level)?
.dx_rating(self.achievement),
)
}
}