mania: slightly accounted for calculating on osu!standard maps
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
use crate::Pos2;
|
use crate::Pos2;
|
||||||
|
|
||||||
const PLAYFIELD_WIDHT: f32 = 512.0;
|
const PLAYFIELD_WIDTH: f32 = 512.0;
|
||||||
const BASE_SPEED: f32 = 1.0;
|
const BASE_SPEED: f32 = 1.0;
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
@@ -33,7 +33,7 @@ impl CatchObject {
|
|||||||
if pos_diff.abs() > f32::EPSILON {
|
if pos_diff.abs() > f32::EPSILON {
|
||||||
if pos_diff.abs() < (time_diff / 3.0).floor() {
|
if pos_diff.abs() < (time_diff / 3.0).floor() {
|
||||||
if pos_diff > 0.0 {
|
if pos_diff > 0.0 {
|
||||||
if offset_pos + pos_diff < PLAYFIELD_WIDHT {
|
if offset_pos + pos_diff < PLAYFIELD_WIDTH {
|
||||||
offset_pos += pos_diff;
|
offset_pos += pos_diff;
|
||||||
}
|
}
|
||||||
} else if offset_pos + pos_diff > 0.0 {
|
} else if offset_pos + pos_diff > 0.0 {
|
||||||
|
|||||||
+25
-2
@@ -6,7 +6,7 @@ mod strain;
|
|||||||
pub use pp::*;
|
pub use pp::*;
|
||||||
use strain::Strain;
|
use strain::Strain;
|
||||||
|
|
||||||
use crate::{Beatmap, HitObject, Mods, StarResult, Strains};
|
use crate::{Beatmap, GameMode, HitObject, Mods, StarResult, Strains};
|
||||||
|
|
||||||
const SECTION_LEN: f32 = 400.0;
|
const SECTION_LEN: f32 = 400.0;
|
||||||
const STAR_SCALING_FACTOR: f32 = 0.018;
|
const STAR_SCALING_FACTOR: f32 = 0.018;
|
||||||
@@ -21,9 +21,32 @@ pub fn stars(map: &Beatmap, mods: impl Mods, passed_objects: Option<usize>) -> S
|
|||||||
return StarResult::Mania(DifficultyAttributes { stars: 0.0 });
|
return StarResult::Mania(DifficultyAttributes { stars: 0.0 });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let rounded_cs = map.cs.round();
|
||||||
|
|
||||||
|
let columns = match map.mode {
|
||||||
|
GameMode::MNA => rounded_cs.max(1.0) as u8,
|
||||||
|
GameMode::STD => {
|
||||||
|
let rounded_od = map.od.round();
|
||||||
|
|
||||||
|
let n_objects = map.n_circles + map.n_sliders + map.n_spinners;
|
||||||
|
let slider_or_spinner_ratio = (n_objects - map.n_circles) as f32 / n_objects as f32;
|
||||||
|
|
||||||
|
if slider_or_spinner_ratio < 0.2 {
|
||||||
|
7
|
||||||
|
} else if slider_or_spinner_ratio < 0.3 || rounded_cs >= 5.0 {
|
||||||
|
6 + (rounded_od > 5.0) as u8
|
||||||
|
} else if slider_or_spinner_ratio > 0.6 {
|
||||||
|
4 + (rounded_od > 4.0) as u8
|
||||||
|
} else {
|
||||||
|
(rounded_od as u8 + 1).max(4).min(7)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
other => panic!("can not calculate mania difficulty on a {:?} map", other),
|
||||||
|
};
|
||||||
|
|
||||||
let clock_rate = mods.speed();
|
let clock_rate = mods.speed();
|
||||||
let section_len = SECTION_LEN * clock_rate;
|
let section_len = SECTION_LEN * clock_rate;
|
||||||
let mut strain = Strain::new(map.cs as u8);
|
let mut strain = Strain::new(columns);
|
||||||
|
|
||||||
let mut hit_objects = map
|
let mut hit_objects = map
|
||||||
.hit_objects
|
.hit_objects
|
||||||
|
|||||||
+2
-2
@@ -230,8 +230,8 @@ const HITWINDOW_AVG: f32 = 35.0;
|
|||||||
const HITWINDOW_MAX: f32 = 20.0;
|
const HITWINDOW_MAX: f32 = 20.0;
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn difficulty_range_od(ar: f32) -> f32 {
|
fn difficulty_range_od(od: f32) -> f32 {
|
||||||
crate::difficulty_range(ar, HITWINDOW_MAX, HITWINDOW_AVG, HITWINDOW_MIN)
|
crate::difficulty_range(od, HITWINDOW_MAX, HITWINDOW_AVG, HITWINDOW_MIN)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub trait TaikoAttributeProvider {
|
pub trait TaikoAttributeProvider {
|
||||||
|
|||||||
Reference in New Issue
Block a user