1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
|
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();
}
}
}
|