37 行
1.1 KiB
C++
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();
|
|
}
|
|
}
|
|
}
|