#[derive(Debug, Clone, Copy)]
pub enum ReplayRate {
Realtime,
Accelerated(f64),
Instant,
}
impl ReplayRate {
pub fn delay_for(
&self,
sim_elapsed_ms: i64,
real_elapsed_ms: i64,
) -> Option<std::time::Duration> {
match self {
ReplayRate::Instant => None,
ReplayRate::Realtime => {
let remaining = sim_elapsed_ms - real_elapsed_ms;
if remaining > 0 {
Some(std::time::Duration::from_millis(remaining as u64))
} else {
None
}
}
ReplayRate::Accelerated(x) => {
if *x <= 0.0 {
return None;
}
let target_real_ms = (sim_elapsed_ms as f64 / x) as i64;
let remaining = target_real_ms - real_elapsed_ms;
if remaining > 0 {
Some(std::time::Duration::from_millis(remaining as u64))
} else {
None
}
}
}
}
}