diff --git a/src/core/movie.cpp b/src/core/movie.cpp index 1e27b45f2f..0c90950b4f 100644 --- a/src/core/movie.cpp +++ b/src/core/movie.cpp @@ -2,6 +2,7 @@ // Licensed under GPLv2 or any later version // Refer to the license.txt file included. +#include #include #include #include @@ -182,10 +183,16 @@ void Movie::serialize(Archive& ar, const unsigned int file_version) { if (play_mode == PlayMode::Recording) { SaveMovie(); } - if (current_byte >= recorded_input.size()) { - throw std::runtime_error( - "This savestate was created at a later point and must be loaded in R+W mode"); + if (recorded_input_.size() >= recorded_input.size()) { + throw std::runtime_error("Future event savestate not allowed in R/O mode"); } + // Ensure that the current movie and savestate movie are in the same timeline + if (std::mismatch(recorded_input_.begin(), recorded_input_.end(), + recorded_input.begin()) + .first != recorded_input_.end()) { + throw std::runtime_error("Timeline mismatch not allowed in R/O mode"); + } + play_mode = PlayMode::Playing; total_input = GetInputCount(recorded_input); } else {