Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion bathbot/src/active/impls/leaderboard.rs
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ impl IActiveMessage for LeaderboardPagination {
let _ = write!(
author_text,
"[{}K] ",
self.map.attributes().build().cs as u32
self.map.attributes().build().cs() as u32
);
}

Expand Down
14 changes: 6 additions & 8 deletions bathbot/src/active/impls/map.rs
Original file line number Diff line number Diff line change
Expand Up @@ -89,11 +89,8 @@ impl IActiveMessage for MapPagination {

let clock_rate = match (self.attrs.bpm, self.attrs.clock_rate) {
(None, None) => self.mods.legacy_clock_rate(),
(_, Some(clock_rate)) => clock_rate,
(Some(new_bpm), None) => {
let old_bpm = map.bpm;
(new_bpm / old_bpm) as f64
}
(_, Some(clock_rate)) => clock_rate.clamp(0.01, 100.0),
(Some(new_bpm), None) => (new_bpm / map.bpm).clamp(0.01, 100.0) as f64,
};

seconds_total = (seconds_total as f64 / clock_rate) as u32;
Expand Down Expand Up @@ -130,7 +127,8 @@ impl IActiveMessage for MapPagination {
.attributes()
.mods(&self.mods)
.clock_rate(clock_rate)
.build();
.build()
.apply_clock_rate();

const ACCS: [f32; 4] = [95.0, 97.0, 99.0, 100.0];
let mut pps = Vec::with_capacity(ACCS.len());
Expand Down Expand Up @@ -221,10 +219,10 @@ impl IActiveMessage for MapPagination {
"BPM: `{}` Objects: `{}`\nCS: `{}` AR: `{}` OD: `{}` HP: `{}` Spinners: `{}`",
round(bpm as f32),
map.count_circles + map.count_sliders + map.count_spinners,
round(map_attrs.cs as f32),
round(map_attrs.cs),
round(map_attrs.ar as f32),
round(map_attrs.od as f32),
round(map_attrs.hp as f32),
round(map_attrs.hp),
map.count_spinners,
);

Expand Down
21 changes: 11 additions & 10 deletions bathbot/src/active/impls/profile/top100_stats.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@ pub(super) struct Top100Stats {
pub pp: MinMaxAvg<f32>,
pub stars: MinMaxAvg<f64>,
pub ar: MinMaxAvg<f64>,
pub cs: MinMaxAvg<f64>,
pub hp: MinMaxAvg<f64>,
pub cs: MinMaxAvg<f32>,
pub hp: MinMaxAvg<f32>,
pub od: MinMaxAvg<f64>,
pub bpm: MinMaxAvg<f32>,
pub len: MinMaxAvg<f32>,
Expand Down Expand Up @@ -98,14 +98,15 @@ impl Top100Stats {
this.pp.add(pp);

let map_attrs = map.attributes().mods(score.mods.clone()).build();

this.ar.add(map_attrs.ar);
this.cs.add(map_attrs.cs);
this.hp.add(map_attrs.hp);
this.od.add(map_attrs.od);
this.bpm.add(map.bpm() * map_attrs.clock_rate as f32);
this.len
.add(map.seconds_drain() as f32 / map_attrs.clock_rate as f32);
let clock_rate = map_attrs.clock_rate() as f32;
let adjusted_map_attrs = map_attrs.apply_clock_rate();

this.ar.add(adjusted_map_attrs.ar);
this.cs.add(adjusted_map_attrs.cs);
this.hp.add(adjusted_map_attrs.hp);
this.od.add(adjusted_map_attrs.od);
this.bpm.add(map.bpm() * clock_rate);
this.len.add(map.seconds_drain() as f32 / clock_rate);
}

Ok(this)
Expand Down
2 changes: 1 addition & 1 deletion bathbot/src/active/impls/recent_list.rs
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ impl IActiveMessage for RecentListPagination {
let _ = write!(
description,
"\t{}",
KeyFormatter::new(&score.mods, map.attributes().build().cs as f32)
KeyFormatter::new(&score.mods, map.attributes().build().cs())
);
}

Expand Down
6 changes: 4 additions & 2 deletions bathbot/src/active/impls/simulate/data.rs
Original file line number Diff line number Diff line change
Expand Up @@ -39,10 +39,12 @@ impl SimulateData {

let mod_bits = mods.bits();

if let Some(new_bpm) = self.bpm.filter(|_| self.clock_rate.is_none()) {
if let Some(ref mut clock_rate) = self.clock_rate {
*clock_rate = clock_rate.clamp(0.01, 100.0)
} else if let Some(new_bpm) = self.bpm {
let old_bpm = map.bpm();

self.clock_rate = Some((new_bpm / old_bpm) as f64);
self.clock_rate = Some((new_bpm / old_bpm).clamp(0.01, 100.0) as f64);
}

macro_rules! simulate {
Expand Down
15 changes: 8 additions & 7 deletions bathbot/src/active/impls/simulate/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -868,8 +868,7 @@ impl SimulateMap {
}

let attrs = builder.mods(bits).build();

let clock_rate = attrs.clock_rate;
let clock_rate = attrs.clock_rate();

let start_time = map.hit_objects.first().map_or(0.0, |h| h.start_time);
let end_time = map.hit_objects.last().map_or(0.0, |h| match &h.kind {
Expand All @@ -893,20 +892,22 @@ impl SimulateMap {
}

let (cs_key, cs_value) = if map.mode == Mode::Mania {
("Keys", MapInfo::keys(bits, attrs.cs as f32))
("Keys", MapInfo::keys(bits, attrs.cs()))
} else {
("CS", round(attrs.cs as f32))
("CS", round(attrs.cs()))
};

let adjusted_attrs = attrs.apply_clock_rate();

format!(
"Length: `{len}` BPM: `{bpm}` Objects: `{objs}`\n\
{cs_key}: `{cs_value}` AR: `{ar}` OD: `{od}` HP: `{hp}` Stars: `{stars}`",
len = SecToMinSec::new(sec_drain),
bpm = round(bpm),
objs = self.n_objects(),
ar = round(attrs.ar as f32),
od = round(attrs.od as f32),
hp = round(attrs.hp as f32),
ar = round(adjusted_attrs.ar as f32),
od = round(adjusted_attrs.od as f32),
hp = round(adjusted_attrs.hp),
stars = round(stars),
)
}
Expand Down
63 changes: 39 additions & 24 deletions bathbot/src/active/impls/single_score.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ use bathbot_util::{
numbers::round,
};
use eyre::{Report, Result};
use rosu_pp::model::beatmap::BeatmapAttributes;
use rosu_pp::model::beatmap::{AdjustedBeatmapAttributes, BeatmapAttributes};
use rosu_render::{ClientError as OrdrError, client::error::ApiError as OrdrApiError};
use rosu_v2::{
error::OsuError,
Expand Down Expand Up @@ -615,11 +615,13 @@ fn apply_settings(
writer.push('*');
}

let adjusted_map_attrs = map_attrs.apply_clock_rate();

let fmt = match curr.inner {
Value::Ar => MapAttribute::AR.fmt(data, &map_attrs),
Value::Cs => MapAttribute::CS.fmt(data, &map_attrs),
Value::Hp => MapAttribute::HP.fmt(data, &map_attrs),
Value::Od => MapAttribute::OD.fmt(data, &map_attrs),
Value::Ar => MapAttribute::AR.fmt(data, &adjusted_map_attrs),
Value::Cs => MapAttribute::CS.fmt(data, &adjusted_map_attrs),
Value::Hp => MapAttribute::HP.fmt(data, &adjusted_map_attrs),
Value::Od => MapAttribute::OD.fmt(data, &adjusted_map_attrs),
_ => unreachable!(),
};

Expand All @@ -642,11 +644,13 @@ fn apply_settings(
writer.push('*');
}

let adjusted_map_attrs = map_attrs.apply_clock_rate();

let fmt = match curr.inner {
Value::Ar => MapAttribute::AR.fmt(data, &map_attrs),
Value::Cs => MapAttribute::CS.fmt(data, &map_attrs),
Value::Hp => MapAttribute::HP.fmt(data, &map_attrs),
Value::Od => MapAttribute::OD.fmt(data, &map_attrs),
Value::Ar => MapAttribute::AR.fmt(data, &adjusted_map_attrs),
Value::Cs => MapAttribute::CS.fmt(data, &adjusted_map_attrs),
Value::Hp => MapAttribute::HP.fmt(data, &adjusted_map_attrs),
Value::Od => MapAttribute::OD.fmt(data, &adjusted_map_attrs),
_ => unreachable!(),
};

Expand Down Expand Up @@ -690,11 +694,13 @@ fn apply_settings(
writer.push('*');
}

let adjusted_map_attrs = map_attrs.apply_clock_rate();

let fmt = match curr.inner {
Value::Ar => MapAttribute::AR.fmt(data, &map_attrs),
Value::Cs => MapAttribute::CS.fmt(data, &map_attrs),
Value::Hp => MapAttribute::HP.fmt(data, &map_attrs),
Value::Od => MapAttribute::OD.fmt(data, &map_attrs),
Value::Ar => MapAttribute::AR.fmt(data, &adjusted_map_attrs),
Value::Cs => MapAttribute::CS.fmt(data, &adjusted_map_attrs),
Value::Hp => MapAttribute::HP.fmt(data, &adjusted_map_attrs),
Value::Od => MapAttribute::OD.fmt(data, &adjusted_map_attrs),
_ => unreachable!(),
};

Expand Down Expand Up @@ -977,7 +983,7 @@ fn write_value(
let _ = write!(writer, "{}★", round(data.stars));
}
Value::Length => {
let clock_rate = map_attrs.clock_rate as f32;
let clock_rate = map_attrs.clock_rate() as f32;
let seconds_drain = (data.map.seconds_drain() as f32 / clock_rate) as u32;

if value.y < SettingValue::FOOTER_Y {
Expand All @@ -995,11 +1001,13 @@ fn write_value(
writer.push('`');
}

let adjusted_map_attrs = map_attrs.apply_clock_rate();

let fmt = match &value.inner {
Value::Ar => MapAttribute::AR.fmt(data, map_attrs),
Value::Cs => MapAttribute::CS.fmt(data, map_attrs),
Value::Hp => MapAttribute::HP.fmt(data, map_attrs),
Value::Od => MapAttribute::OD.fmt(data, map_attrs),
Value::Ar => MapAttribute::AR.fmt(data, &adjusted_map_attrs),
Value::Cs => MapAttribute::CS.fmt(data, &adjusted_map_attrs),
Value::Hp => MapAttribute::HP.fmt(data, &adjusted_map_attrs),
Value::Od => MapAttribute::OD.fmt(data, &adjusted_map_attrs),
_ => unreachable!(),
};

Expand All @@ -1010,7 +1018,7 @@ fn write_value(
}
}
Value::Bpm(emote_text) => {
let clock_rate = map_attrs.clock_rate as f32;
let clock_rate = map_attrs.clock_rate() as f32;
let bpm = round(data.map.bpm() * clock_rate);

if value.y < SettingValue::FOOTER_Y {
Expand Down Expand Up @@ -1153,7 +1161,14 @@ impl Display for MapAttributeFormatter<'_> {
})
.collect();

let map_attrs = self.data.map.attributes().mods(alt_mods).build();
let map_attrs = self
.data
.map
.attributes()
.mods(alt_mods)
.build()
.apply_clock_rate();

let alt_value = self.map_attr.get_value(&map_attrs);

let symbol = match self.value.partial_cmp(&alt_value) {
Expand All @@ -1178,16 +1193,16 @@ impl MapAttribute {
fn fmt<'a>(
self,
data: &'a ScoreEmbedData,
attrs: &BeatmapAttributes,
attrs: &AdjustedBeatmapAttributes,
) -> MapAttributeFormatter<'a> {
MapAttributeFormatter::new(data, self, self.get_value(attrs))
}

fn get_value(self, attrs: &BeatmapAttributes) -> f64 {
fn get_value(self, attrs: &AdjustedBeatmapAttributes) -> f64 {
match self {
MapAttribute::AR => attrs.ar,
MapAttribute::CS => attrs.cs,
MapAttribute::HP => attrs.hp,
MapAttribute::CS => f64::from(attrs.cs),
MapAttribute::HP => f64::from(attrs.hp),
MapAttribute::OD => attrs.od,
}
}
Expand Down
13 changes: 7 additions & 6 deletions bathbot/src/commands/osu/top/if_.rs
Original file line number Diff line number Diff line change
Expand Up @@ -386,11 +386,12 @@ impl<'q> Searchable<TopCriteria<'q>> for TopIfEntry {
}

let attrs = self.map.attributes().mods(self.score.mods.clone()).build();
let adjusted_attrs = attrs.apply_clock_rate();

matches &= criteria.ar.contains(attrs.ar as f32);
matches &= criteria.cs.contains(attrs.cs as f32);
matches &= criteria.hp.contains(attrs.hp as f32);
matches &= criteria.od.contains(attrs.od as f32);
matches &= criteria.ar.contains(adjusted_attrs.ar as f32);
matches &= criteria.cs.contains(adjusted_attrs.cs);
matches &= criteria.hp.contains(adjusted_attrs.hp);
matches &= criteria.od.contains(adjusted_attrs.od as f32);

let keys = [
(GameModIntermode::OneKey, 1.0),
Expand All @@ -406,7 +407,7 @@ impl<'q> Searchable<TopCriteria<'q>> for TopIfEntry {
]
.into_iter()
.find_map(|(gamemod, keys)| self.score.mods.contains_intermode(gamemod).then_some(keys))
.unwrap_or(attrs.cs as f32);
.unwrap_or(adjusted_attrs.cs);

matches &= self.map.mode() != GameMode::Mania || criteria.keys.contains(keys);

Expand All @@ -422,7 +423,7 @@ impl<'q> Searchable<TopCriteria<'q>> for TopIfEntry {
return matches;
}

let clock_rate = attrs.clock_rate as f32;
let clock_rate = attrs.clock_rate() as f32;
matches &= criteria
.length
.contains(self.map.seconds_drain() as f32 / clock_rate);
Expand Down
Loading
Loading