use bevy::prelude::*;
use crate::RollbackSnapshot;
#[derive(Resource, Clone, Default)]
pub struct Rollbacks {
pub(crate) snapshots: Vec<RollbackSnapshot>,
pub(crate) active: Option<usize>,
}
impl Rollbacks {
pub fn checkpoint(&mut self, snapshot: RollbackSnapshot) {
let active = self.active.unwrap_or(0);
self.snapshots.truncate(active + 1);
self.snapshots.push(snapshot);
self.active = Some(self.snapshots.len() - 1);
}
#[allow(clippy::cast_possible_wrap)]
#[allow(clippy::cast_sign_loss)]
pub fn rollback(&mut self, checkpoints: isize) -> Option<&RollbackSnapshot> {
if let Some(active) = self.active {
let raw = active as isize - checkpoints;
let new = raw.clamp(0, self.snapshots.len() as isize - 1) as usize;
self.active = Some(new);
Some(&self.snapshots[new])
} else {
None
}
}
}