ares-openbsd/desktop-ui/program/rewind.cpp

37 行
1.1 KiB
C++

auto Program::rewindSetMode(Rewind::Mode mode) -> void {
rewind.mode = mode;
rewind.counter = 0;
}
auto Program::rewindReset() -> void {
rewindSetMode(Rewind::Mode::Playing);
rewind.history.reset();
rewind.length = settings.rewind.length;
rewind.frequency = settings.rewind.frequency;
}
auto Program::rewindRun() -> void {
if(!settings.general.rewind) return; //rewind disabled?
if(rewind.mode == Rewind::Mode::Playing) {
if(++rewind.counter < rewind.frequency) return;
rewind.counter = 0;
if(rewind.history.size() >= rewind.length) rewind.history.takeFirst();
auto s = emulator->root->serialize(0);
rewind.history.append(s);
}
if(rewind.mode == Rewind::Mode::Rewinding) {
if(!rewind.history.size()) return rewindSetMode(Rewind::Mode::Playing); //nothing left to rewind?
if(++rewind.counter < rewind.frequency / 5) return; //rewind 5x faster than playing
rewind.counter = 0;
auto s = rewind.history.takeLast();
s.setReading();
emulator->root->unserialize(s);
if(!rewind.history) {
showMessage("Rewind history exhausted");
rewindReset();
}
}
}