diff --git a/src/program/main.cpp b/src/program/main.cpp index 31c5d9ff..1e19b1f4 100644 --- a/src/program/main.cpp +++ b/src/program/main.cpp @@ -99,6 +99,11 @@ static void print_usage(void) std::cout << " --libtas-so-path Path to libtas.so (equivalent to setting LIBTAS_SO_PATH)" << std::endl; std::cout << " --libtas32-so-path Path to libtas32.so (equivalent to setting LIBTAS32_SO_PATH)" << std::endl; std::cout << " -i, --input-editor Open Input Editor window at startup" << std::endl; + std::cout << " -L, --lua-console Open Lua Console window at startup" << std::endl; + std::cout << " -t, --system-time-sec Set the system time option (sec)" << std::endl; + std::cout << " -T, --system-time-nsec Set the system time option (nsec)" << std::endl; + std::cout << " -e, --elapsed-time-sec Set the elapsed time option (sec)" << std::endl; + std::cout << " -E, --elapsed-time-nsec Set the elapsed time option (nsec)" << std::endl; std::cout << " -h, --help Show this message" << std::endl; } @@ -136,13 +141,17 @@ int main(int argc, char **argv) {"libtas32-so-path", required_argument, nullptr, 'P'}, {"help", no_argument, nullptr, 'h'}, {"input-editor", no_argument, nullptr, 'i'}, + {"system-time-sec", required_argument, nullptr, 't'}, + {"system-time-nsec", required_argument, nullptr, 'T'}, + {"elapsed-time-sec", required_argument, nullptr, 'e'}, + {"elapsed-time-nsec", required_argument, nullptr, 'E'}, {nullptr, 0, nullptr, 0} }; int option_index = 0; bool openInputEditor = false; // std::string libname; - while ((c = getopt_long (argc, argv, "+r:w:d:l:nhi", long_options, &option_index)) != -1) { + while ((c = getopt_long (argc, argv, "+r:w:d:l:nhit:T:e:E:", long_options, &option_index)) != -1) { switch (c) { case 'r': case 'w': @@ -186,6 +195,22 @@ int main(int argc, char **argv) case 'i': openInputEditor = true; break; + case 'e': + context.config.sc.initial_monotonic_time_sec = atoll(optarg); + context.config.sc.initial_monotonic_time_set_via_cli = true; + break; + case 'E': + context.config.sc.initial_monotonic_time_nsec = atoll(optarg); + context.config.sc.initial_monotonic_time_set_via_cli = true; + break; + case 't': + context.config.sc.initial_time_sec = atoll(optarg); + context.config.sc.initial_time_set_via_cli = true; + break; + case 'T': + context.config.sc.initial_time_nsec = atoll(optarg); + context.config.sc.initial_time_set_via_cli = true; + break; default: return -1; } diff --git a/src/program/movie/MovieFileHeader.cpp b/src/program/movie/MovieFileHeader.cpp index e5c4cd64..fb95a6f6 100644 --- a/src/program/movie/MovieFileHeader.cpp +++ b/src/program/movie/MovieFileHeader.cpp @@ -49,10 +49,14 @@ void MovieFileHeader::load() context->config.sc.mouse_support = config.value("mouse_support").toBool(); context->config.sc.nb_controllers = config.value("nb_controllers").toInt(); - context->config.sc.initial_time_sec = config.value("initial_time_sec").toLongLong(); - context->config.sc.initial_time_nsec = config.value("initial_time_nsec").toLongLong(); - context->config.sc.initial_monotonic_time_sec = config.value("initial_monotonic_time_sec").toLongLong(); - context->config.sc.initial_monotonic_time_nsec = config.value("initial_monotonic_time_nsec").toLongLong(); + if (! context->config.sc.initial_time_set_via_cli) { + context->config.sc.initial_time_sec = config.value("initial_time_sec").toLongLong(); + context->config.sc.initial_time_nsec = config.value("initial_time_nsec").toLongLong(); + } + if (! context->config.sc.initial_monotonic_time_set_via_cli) { + context->config.sc.initial_monotonic_time_sec = config.value("initial_monotonic_time_sec").toLongLong(); + context->config.sc.initial_monotonic_time_nsec = config.value("initial_monotonic_time_nsec").toLongLong(); + } framerate_num = config.value("framerate_num").toUInt(); framerate_den = config.value("framerate_den").toUInt(); diff --git a/src/program/ui/MainWindow.cpp b/src/program/ui/MainWindow.cpp index 6726b99c..b9f8471d 100644 --- a/src/program/ui/MainWindow.cpp +++ b/src/program/ui/MainWindow.cpp @@ -1147,10 +1147,14 @@ void MainWindow::slotLaunch(bool attach_gdb) /* Set a few parameters */ context->config.sc.initial_framerate_num = fpsNumField->value(); context->config.sc.initial_framerate_den = fpsDenField->value(); - context->config.sc.initial_monotonic_time_sec = elapsedTimeSec->value(); - context->config.sc.initial_monotonic_time_nsec = elapsedTimeNsec->value(); - context->config.sc.initial_time_sec = realTimeSec->value(); - context->config.sc.initial_time_nsec = realTimeNsec->value(); + if (! context->config.sc.initial_monotonic_time_set_via_cli) { + context->config.sc.initial_monotonic_time_sec = elapsedTimeSec->value(); + context->config.sc.initial_monotonic_time_nsec = elapsedTimeNsec->value(); + } + if (! context->config.sc.initial_time_set_via_cli) { + context->config.sc.initial_time_sec = realTimeSec->value(); + context->config.sc.initial_time_nsec = realTimeNsec->value(); + } context->config.sc.sigint_upon_launch &= context->attach_gdb; diff --git a/src/program/ui/MovieSettingsWindow.cpp b/src/program/ui/MovieSettingsWindow.cpp index e181424e..6dd9841e 100644 --- a/src/program/ui/MovieSettingsWindow.cpp +++ b/src/program/ui/MovieSettingsWindow.cpp @@ -217,10 +217,14 @@ void MovieSettingsWindow::saveConfig() context->config.sc.initial_framerate_den = framerateDen->value(); context->config.auto_restart = autoRestart->currentData().toBool(); - context->config.sc.initial_time_sec = initialSec->value(); - context->config.sc.initial_time_nsec = initialNSec->value(); - context->config.sc.initial_monotonic_time_sec = initialMonotonicSec->value(); - context->config.sc.initial_monotonic_time_nsec = initialMonotonicNSec->value(); + if (! context->config.sc.initial_time_set_via_cli) { + context->config.sc.initial_time_sec = initialSec->value(); + context->config.sc.initial_time_nsec = initialNSec->value(); + } + if (! context->config.sc.initial_monotonic_time_set_via_cli) { + context->config.sc.initial_monotonic_time_sec = initialMonotonicSec->value(); + context->config.sc.initial_monotonic_time_nsec = initialMonotonicNSec->value(); + } context->config.sc.main_gettimes_threshold[SharedConfig::TIMETYPE_TIME] = timeTrackingTime->value(); context->config.sc.main_gettimes_threshold[SharedConfig::TIMETYPE_GETTIMEOFDAY] = timeTrackingGettimeofday->value(); diff --git a/src/shared/SharedConfig.h b/src/shared/SharedConfig.h index fbe0a333..ee82ccf7 100644 --- a/src/shared/SharedConfig.h +++ b/src/shared/SharedConfig.h @@ -144,12 +144,14 @@ struct __attribute__((packed, aligned(8))) SharedConfig { * depends on the arch.*/ int64_t initial_time_sec = 1; int64_t initial_time_nsec = 0; + bool initial_time_set_via_cli = false; /* Initial monotonic time at game startup. */ /* We don't use struct timespec because it contains longs so the size * depends on the arch.*/ int64_t initial_monotonic_time_sec = 1; int64_t initial_monotonic_time_nsec = 0; + bool initial_monotonic_time_set_via_cli = false; /* Virtual monitor resolution */ int screen_width = 0;