diff --git a/Cargo.lock b/Cargo.lock index 88fad6a..60a9cdb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -52,6 +52,14 @@ dependencies = [ "tokio", ] +[[package]] +name = "akatsuki-pp" +version = "0.9.6" +source = "git+https://github.com/osuAkatsuki/akatsuki-pp-rs?rev=588f8fe090bbf262cb86cd95ac9c9c9f35b0da03#588f8fe090bbf262cb86cd95ac9c9c9f35b0da03" +dependencies = [ + "tokio", +] + [[package]] name = "akatsuki-pp" version = "0.9.6" @@ -1846,6 +1854,7 @@ dependencies = [ "akatsuki-pp 0.9.3", "akatsuki-pp 0.9.4", "akatsuki-pp 0.9.6 (git+https://github.com/CursorDance/akatsuki-pp-rs?rev=56a71011e13274e63f6548611f3d5c822377c0d3)", + "akatsuki-pp 0.9.6 (git+https://github.com/osuAkatsuki/akatsuki-pp-rs?rev=588f8fe090bbf262cb86cd95ac9c9c9f35b0da03)", "akatsuki-pp 0.9.6 (git+https://github.com/osuAkatsuki/akatsuki-pp-rs?rev=5c97207f25cf9fd07252dca1ba68d785e2147ce1)", "akatsuki-pp 0.9.6 (git+https://github.com/osuAkatsuki/akatsuki-pp-rs?rev=9607e63c06927fee0cf2f94ce3a2039e3713387c)", "akatsuki-pp 0.9.6 (git+https://github.com/osuAkatsuki/akatsuki-pp-rs?rev=ce896ca661de4aa4c0c6739a703c4a162426878b)", diff --git a/Cargo.toml b/Cargo.toml index 7416d65..8f77880 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -62,6 +62,9 @@ no-accuracy = { package = "akatsuki-pp", git = "https://github.com/osuAkatsuki/a simplify-relax = { package = "akatsuki-pp", git = "https://github.com/osuAkatsuki/akatsuki-pp-rs", rev = "ce896ca661de4aa4c0c6739a703c4a162426878b", features = [ "async_tokio", ] } +improved-miss-penalty = { package = "akatsuki-pp", git = "https://github.com/osuAkatsuki/akatsuki-pp-rs", rev = "588f8fe090bbf262cb86cd95ac9c9c9f35b0da03", features = [ + "async_tokio", +] } [profile.release] lto = "fat" diff --git a/src/processor/mod.rs b/src/processor/mod.rs index 1ca60fe..24ff539 100644 --- a/src/processor/mod.rs +++ b/src/processor/mod.rs @@ -24,6 +24,7 @@ use conceptual_rework::{ GameMode as ConceptualGameMode, }; use cursordance::Beatmap as CdBeatmap; +use improved_miss_penalty::Beatmap as ImprovedMissPenaltyBeatmap; use no_accuracy::Beatmap as NoAccuracyBeatmap; use simplify_relax::Beatmap as SimplifyRelaxBeatmap; use skill_rebalance::{ @@ -191,6 +192,29 @@ async fn calculate_simplfy_relax_pp( Ok(pp) } +async fn calculate_improved_miss_penalty_pp( + score: &RippleScore, + context: Arc, +) -> anyhow::Result { + let beatmap_bytes = + usecases::beatmaps::fetch_beatmap_osu_file(score.beatmap_id, context).await?; + let beatmap = ImprovedMissPenaltyBeatmap::from_bytes(&beatmap_bytes).await?; + + let result = improved_miss_penalty::osu_2019::OsuPP::new(&beatmap) + .mods(score.mods as u32) + .combo(score.max_combo as usize) + .misses(score.count_misses as usize) + .accuracy(score.accuracy) + .calculate(); + + let mut pp = round(result.pp as f32, 2); + if pp.is_infinite() || pp.is_nan() { + pp = 0.0; + } + + Ok(pp) +} + async fn process_scores( rework: &Rework, scores: Vec, @@ -207,6 +231,7 @@ async fn process_scores( 16 => calculate_cursordance_pp(score, context.clone()).await?, 17 => calculate_no_accuracy_pp(score, context.clone()).await?, 18 => calculate_simplfy_relax_pp(score, context.clone()).await?, + 19 => calculate_improved_miss_penalty_pp(score, context.clone()).await?, _ => unreachable!(), };