rewind.cpp 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. auto Program::rewindSetMode(Rewind::Mode mode) -> void {
  2. rewind.mode = mode;
  3. rewind.counter = 0;
  4. }
  5. auto Program::rewindReset() -> void {
  6. rewindSetMode(Rewind::Mode::Playing);
  7. rewind.history.reset();
  8. rewind.length = settings.rewind.length;
  9. rewind.frequency = settings.rewind.frequency;
  10. }
  11. auto Program::rewindRun() -> void {
  12. if(rewind.frequency == 0) return; //rewind disabled?
  13. if(rewind.mode == Rewind::Mode::Playing) {
  14. if(++rewind.counter < rewind.frequency) return;
  15. rewind.counter = 0;
  16. if(rewind.history.size() >= rewind.length) rewind.history.takeFirst();
  17. auto s = emulator->interface->serialize(0);
  18. rewind.history.append(s);
  19. }
  20. if(rewind.mode == Rewind::Mode::Rewinding) {
  21. if(!rewind.history.size()) return rewindSetMode(Rewind::Mode::Playing); //nothing left to rewind?
  22. if(++rewind.counter < rewind.frequency / 5) return; //rewind 5x faster than playing
  23. rewind.counter = 0;
  24. auto s = rewind.history.takeLast();
  25. s.setMode(serializer::Mode::Load);
  26. emulator->interface->unserialize(s);
  27. if(!rewind.history) {
  28. showMessage("Rewind history exhausted");
  29. rewindReset();
  30. }
  31. }
  32. }