Record replays into AppData

This commit is contained in:
2025-02-22 10:43:49 -06:00
parent 60b178d6e8
commit 8ba173e5eb
2 changed files with 19 additions and 5 deletions

View File

@@ -33,7 +33,7 @@ bool mac_is_intel(){
} }
return _mac_is_intel; return _mac_is_intel;
} }
fs::path progDir, tempDir, scenDir; fs::path progDir, tempDir, scenDir, replayDir;
// This is here to avoid unnecessarily duplicating it in platform-specific files. // This is here to avoid unnecessarily duplicating it in platform-specific files.
cursor_type Cursor::current = sword_curs; cursor_type Cursor::current = sword_curs;
@@ -77,6 +77,10 @@ void init_directories(const char* exec_path) {
#endif #endif
scenDir = tempDir/"Scenarios"; scenDir = tempDir/"Scenarios";
fs::create_directories(scenDir); fs::create_directories(scenDir);
replayDir = tempDir/"Replays";
fs::create_directories(replayDir);
add_resmgr_paths(tempDir/"data"); add_resmgr_paths(tempDir/"data");
tempDir /= "Temporary Files"; tempDir /= "Temporary Files";
@@ -100,6 +104,7 @@ void init_directories(const char* exec_path) {
std::cout << "Program directory: " << progDir << std::endl; std::cout << "Program directory: " << progDir << std::endl;
std::cout << "Scenario directory: " << scenDir << std::endl; std::cout << "Scenario directory: " << scenDir << std::endl;
std::cout << "Temporary directory: " << tempDir << std::endl; std::cout << "Temporary directory: " << tempDir << std::endl;
std::cout << "Replay directory: " << replayDir << std::endl;
} }
#if !defined(_WIN32) && !defined(_WIN64) && !defined(__APPLE__) #if !defined(_WIN32) && !defined(_WIN64) && !defined(__APPLE__)

View File

@@ -40,12 +40,12 @@ const std::string replay_error = "Replay system internal error! ";
using namespace ticpp; using namespace ticpp;
Document log_document; Document log_document;
std::string log_file; fs::path log_file;
Element* next_action; Element* next_action;
boost::optional<cFramerateLimiter> replay_fps_limit; boost::optional<cFramerateLimiter> replay_fps_limit;
static void save_log() { static void save_log() {
if(!log_file.empty()) log_document.SaveFile(log_file); if(!log_file.empty()) log_document.SaveFile(log_file.string());
} }
void start_log_file(std::string file) { void start_log_file(std::string file) {
@@ -54,6 +54,8 @@ void start_log_file(std::string file) {
save_log(); save_log();
} }
extern fs::path replayDir;
bool init_action_log(std::string command, std::string file) { bool init_action_log(std::string command, std::string file) {
if(command == "record-unique") { if(command == "record-unique") {
// If a filename is given, use it as a base, but insert a timestamp for uniqueness. // If a filename is given, use it as a base, but insert a timestamp for uniqueness.
@@ -73,6 +75,9 @@ bool init_action_log(std::string command, std::string file) {
} }
if(command == "record") { if(command == "record") {
log_file = file; log_file = file;
if(!log_file.empty() && log_file == log_file.filename()){
log_file = replayDir / log_file;
}
try { try {
Element root_element("actions"); Element root_element("actions");
#ifndef MSBUILD_GITREV #ifndef MSBUILD_GITREV
@@ -86,7 +91,7 @@ bool init_action_log(std::string command, std::string file) {
if(log_file.empty()){ if(log_file.empty()){
std::cout << "Recording this session in memory." << std::endl; std::cout << "Recording this session in memory." << std::endl;
}else{ }else{
start_log_file(log_file); start_log_file(log_file.string());
} }
} catch(...) { } catch(...) {
std::cout << "Failed to write to file " << log_file << std::endl; std::cout << "Failed to write to file " << log_file << std::endl;
@@ -95,7 +100,11 @@ bool init_action_log(std::string command, std::string file) {
} }
else if (command == "replay") { else if (command == "replay") {
try { try {
log_document.LoadFile(file); fs::path file_path = file;
if(file_path == file_path.filename() && !fs::exists(file_path)){
file_path = replayDir / file_path;
}
log_document.LoadFile(file_path.string());
Element* root = log_document.FirstChildElement(); Element* root = log_document.FirstChildElement();
next_action = root->FirstChildElement(); next_action = root->FirstChildElement();