pub struct Judge {
pub name: &'static str,
pub marvelous_window: f32,
pub perfect_window: f32,
pub great_window: f32,
pub good_window: f32,
pub bad_window: f32,
pub hold_window: f32,
pub roll_window: f32,
pub mine_window: f32,
pub(crate) timing_scale: f32,
}
impl Judge {
pub fn classify(&self, deviation: f32) -> crate::TapJudgement {
let deviation = deviation.abs();
if deviation <= self.marvelous_window {
crate::TapJudgement::Marvelous
} else if deviation <= self.perfect_window {
crate::TapJudgement::Perfect
} else if deviation <= self.great_window {
crate::TapJudgement::Great
} else if deviation <= self.good_window {
crate::TapJudgement::Good
} else if deviation <= self.bad_window {
crate::TapJudgement::Bad
} else {
crate::TapJudgement::Miss
}
}
pub fn is_cb(&self, deviation: f32) -> bool {
deviation <= self.great_window
}
pub fn is_marv(&self, deviation: f32) -> bool {
self.classify(deviation) == crate::TapJudgement::Marvelous
}
pub fn is_perf(&self, deviation: f32) -> bool {
self.classify(deviation) == crate::TapJudgement::Perfect
}
pub fn is_great(&self, deviation: f32) -> bool {
self.classify(deviation) == crate::TapJudgement::Great
}
pub fn is_good(&self, deviation: f32) -> bool {
self.classify(deviation) == crate::TapJudgement::Good
}
pub fn is_bad(&self, deviation: f32) -> bool {
self.classify(deviation) == crate::TapJudgement::Bad
}
pub fn is_miss(&self, deviation: f32) -> bool {
self.classify(deviation) == crate::TapJudgement::Miss
}
}
pub const J1: &Judge = &Judge {
name: "J1",
marvelous_window: 0.03375,
perfect_window: 0.0675,
great_window: 0.135,
good_window: 0.2025,
bad_window: 0.27,
hold_window: 0.375,
roll_window: 0.75,
mine_window: 0.075,
timing_scale: 1.50,
};
pub const J2: &Judge = &Judge {
name: "J2",
marvelous_window: 0.029925,
perfect_window: 0.05985,
great_window: 0.1197,
good_window: 0.17955,
bad_window: 0.2394,
hold_window: 0.3325,
roll_window: 0.665,
mine_window: 0.075,
timing_scale: 1.33,
};
pub const J3: &Judge = &Judge {
name: "J3",
marvelous_window: 0.0261,
perfect_window: 0.0522,
great_window: 0.1044,
good_window: 0.1566,
bad_window: 0.2088,
hold_window: 0.29,
roll_window: 0.58,
mine_window: 0.075,
timing_scale: 1.16,
};
pub const J4: &Judge = &Judge {
name: "J4",
marvelous_window: 0.0225,
perfect_window: 0.045,
great_window: 0.09,
good_window: 0.135,
bad_window: 0.18,
hold_window: 0.25,
roll_window: 0.5,
mine_window: 0.075,
timing_scale: 1.00,
};
pub const J5: &Judge = &Judge {
name: "J5",
marvelous_window: 0.0189,
perfect_window: 0.0378,
great_window: 0.0756,
good_window: 0.1134,
bad_window: 0.18,
hold_window: 0.21,
roll_window: 0.42,
timing_scale: 0.84,
mine_window: 0.075,
};
pub const J6: &Judge = &Judge {
name: "J6",
marvelous_window: 0.01485,
perfect_window: 0.0297,
great_window: 0.0594,
good_window: 0.0891,
bad_window: 0.18,
hold_window: 0.165,
roll_window: 0.33,
timing_scale: 0.66,
mine_window: 0.075,
};
pub const J7: &Judge = &Judge {
name: "J7",
marvelous_window: 0.01125,
perfect_window: 0.0225,
great_window: 0.045,
good_window: 0.0675,
bad_window: 0.18,
hold_window: 0.125,
roll_window: 0.25,
timing_scale: 0.50,
mine_window: 0.075,
};
pub const J8: &Judge = &Judge {
name: "J8",
marvelous_window: 0.007425,
perfect_window: 0.01485,
great_window: 0.0297,
good_window: 0.04455,
bad_window: 0.18,
hold_window: 0.0825,
timing_scale: 0.33,
roll_window: 0.25,
mine_window: 0.075,
};
pub const J9: &Judge = &Judge {
name: "J9",
marvelous_window: 0.0045,
perfect_window: 0.009,
great_window: 0.018,
good_window: 0.027,
bad_window: 0.18,
hold_window: 0.05,
timing_scale: 0.20,
roll_window: 0.25,
mine_window: 0.075,
};