History Viewer: Prevent history viewer window from overwriting .sav files

This commit is contained in:
Sour 2018-07-22 17:31:50 -04:00
parent 82c4dc8316
commit 6fc37e980f
10 changed files with 45 additions and 39 deletions

View file

@ -26,7 +26,7 @@ protected:
public:
AsciiTurboFile(shared_ptr<Console> console) : BaseControlDevice(console, BaseControlDevice::ExpDevicePort)
{
BatteryManager::LoadBattery(".tf", _data, AsciiTurboFile::FileSize);
_console->GetBatteryManager()->LoadBattery(".tf", _data, AsciiTurboFile::FileSize);
}
~AsciiTurboFile()
@ -36,7 +36,7 @@ public:
void SaveBattery() override
{
BatteryManager::SaveBattery(".tf", _data, AsciiTurboFile::FileSize);
_console->GetBatteryManager()->SaveBattery(".tf", _data, AsciiTurboFile::FileSize);
}
uint8_t ReadRAM(uint16_t addr) override

View file

@ -353,22 +353,22 @@ bool BaseMapper::HasBattery()
void BaseMapper::LoadBattery()
{
if(HasBattery() && _saveRamSize > 0) {
BatteryManager::LoadBattery(".sav", _saveRam, _saveRamSize);
_console->GetBatteryManager()->LoadBattery(".sav", _saveRam, _saveRamSize);
}
if(_hasChrBattery && _chrRamSize > 0) {
BatteryManager::LoadBattery(".sav.chr", _chrRam, _chrRamSize);
_console->GetBatteryManager()->LoadBattery(".sav.chr", _chrRam, _chrRamSize);
}
}
void BaseMapper::SaveBattery()
{
if(HasBattery() && _saveRamSize > 0) {
BatteryManager::SaveBattery(".sav", _saveRam, _saveRamSize);
_console->GetBatteryManager()->SaveBattery(".sav", _saveRam, _saveRamSize);
}
if(_hasChrBattery && _chrRamSize > 0) {
BatteryManager::SaveBattery(".sav.chr", _chrRam, _chrRamSize);
_console->GetBatteryManager()->SaveBattery(".sav.chr", _chrRam, _chrRamSize);
}
}

View file

@ -3,14 +3,10 @@
#include "VirtualFile.h"
#include "../Utilities/FolderUtilities.h"
string BatteryManager::_romName;
bool BatteryManager::_saveEnabled = true;
std::weak_ptr<IBatteryRecorder> BatteryManager::_recorder;
std::weak_ptr<IBatteryProvider> BatteryManager::_provider;
void BatteryManager::Initialize(string romName)
{
_romName = romName;
_saveEnabled = true;
}
string BatteryManager::GetBasePath()

View file

@ -16,25 +16,23 @@ public:
class BatteryManager
{
private:
static string _romName;
static bool _saveEnabled;
static string GetBasePath();
string _romName;
bool _saveEnabled;
string GetBasePath();
static std::weak_ptr<IBatteryProvider> _provider;
static std::weak_ptr<IBatteryRecorder> _recorder;
BatteryManager() = delete;
std::weak_ptr<IBatteryProvider> _provider;
std::weak_ptr<IBatteryRecorder> _recorder;
public:
static void Initialize(string romName);
void Initialize(string romName);
static void SetSaveEnabled(bool enabled);
void SetSaveEnabled(bool enabled);
static void SetBatteryProvider(shared_ptr<IBatteryProvider> provider);
static void SetBatteryRecorder(shared_ptr<IBatteryRecorder> recorder);
void SetBatteryProvider(shared_ptr<IBatteryProvider> provider);
void SetBatteryRecorder(shared_ptr<IBatteryRecorder> recorder);
static void SaveBattery(string extension, uint8_t* data, uint32_t length);
void SaveBattery(string extension, uint8_t* data, uint32_t length);
static vector<uint8_t> LoadBattery(string extension);
static void LoadBattery(string extension, uint8_t* data, uint32_t length);
vector<uint8_t> LoadBattery(string extension);
void LoadBattery(string extension, uint8_t* data, uint32_t length);
};

View file

@ -33,7 +33,7 @@ protected:
public:
BattleBox(shared_ptr<Console> console) : BaseControlDevice(console, BaseControlDevice::ExpDevicePort)
{
BatteryManager::LoadBattery(".bb", (uint8_t*)_data, BattleBox::FileSize);
_console->GetBatteryManager()->LoadBattery(".bb", (uint8_t*)_data, BattleBox::FileSize);
}
~BattleBox()
@ -43,7 +43,7 @@ public:
void SaveBattery() override
{
BatteryManager::SaveBattery(".bb", (uint8_t*)_data, BattleBox::FileSize);
_console->GetBatteryManager()->SaveBattery(".bb", (uint8_t*)_data, BattleBox::FileSize);
}
uint8_t ReadRAM(uint16_t addr) override

View file

@ -74,6 +74,7 @@ Console::~Console()
void Console::Init()
{
_notificationManager.reset(new NotificationManager());
_batteryManager.reset(new BatteryManager());
_videoRenderer.reset(new VideoRenderer(shared_from_this()));
_videoDecoder.reset(new VideoDecoder(shared_from_this()));
@ -135,6 +136,11 @@ void Console::Release(bool forShutdown)
_controlManager.reset();
}
shared_ptr<BatteryManager> Console::GetBatteryManager()
{
return _batteryManager;
}
shared_ptr<SaveStateManager> Console::GetSaveStateManager()
{
return _saveStateManager;
@ -264,7 +270,7 @@ bool Console::Initialize(VirtualFile &romFile, VirtualFile &patchFile)
vector<uint8_t> fileData;
romFile.ReadFile(fileData);
BatteryManager::Initialize(FolderUtilities::GetFilename(romFile.GetFileName(), false));
_batteryManager->Initialize(FolderUtilities::GetFilename(romFile.GetFileName(), false));
shared_ptr<BaseMapper> mapper = MapperFactory::InitializeFromFile(shared_from_this(), romFile.GetFileName(), fileData);
if(mapper) {
_soundMixer->StopAudio(true);
@ -324,7 +330,7 @@ bool Console::Initialize(VirtualFile &romFile, VirtualFile &patchFile)
}
//Temporarely disable battery saves to prevent battery files from being created for the wrong game (for Battle Box & Turbo File)
BatteryManager::SetSaveEnabled(false);
_batteryManager->SetSaveEnabled(false);
uint32_t pollCounter = 0;
if(_controlManager && !isDifferentGame) {
@ -341,7 +347,7 @@ bool Console::Initialize(VirtualFile &romFile, VirtualFile &patchFile)
_controlManager->UpdateControlDevices();
//Re-enable battery saves
BatteryManager::SetSaveEnabled(true);
_batteryManager->SetSaveEnabled(true);
if(_hdData && (!_hdData->Tiles.empty() || !_hdData->Backgrounds.empty())) {
_ppu.reset(new HdPpu(shared_from_this(), _hdData.get()));
@ -415,7 +421,7 @@ bool Console::Initialize(VirtualFile &romFile, VirtualFile &patchFile)
}
//Reset battery source to current game if new game failed to load
BatteryManager::Initialize(FolderUtilities::GetFilename(GetRomInfo().RomName, false));
_batteryManager->Initialize(FolderUtilities::GetFilename(GetRomInfo().RomName, false));
if(_mapper) {
_videoDecoder->StartThread();
}
@ -1275,6 +1281,8 @@ void Console::CopyRewindData(shared_ptr<Console> sourceConsole)
sourceConsole->Pause();
Pause();
//Disable battery saving for this instance
_batteryManager->SetSaveEnabled(false);
_historyViewer.reset(new HistoryViewer(shared_from_this()));
sourceConsole->_rewindManager->CopyHistory(_historyViewer);

View file

@ -27,6 +27,7 @@ class SoundMixer;
class NotificationManager;
class Debugger;
class EmulationSettings;
class BatteryManager;
struct HdPackData;
struct HashInfo;
@ -61,7 +62,8 @@ private:
//Used by VS-DualSystem
shared_ptr<Console> _master;
shared_ptr<Console> _slave;
shared_ptr<BatteryManager> _batteryManager;
shared_ptr<SystemActionManager> _systemActionManager;
shared_ptr<VideoDecoder> _videoDecoder;
@ -106,6 +108,7 @@ public:
void Init();
void Release(bool forShutdown);
shared_ptr<BatteryManager> GetBatteryManager();
shared_ptr<SaveStateManager> GetSaveStateManager();
shared_ptr<VideoDecoder> GetVideoDecoder();
shared_ptr<VideoRenderer> GetVideoRenderer();

View file

@ -31,7 +31,7 @@ void FDS::InitMapper(RomData &romData)
_fdsRawData = romData.RawData;
//Apply save data (saved as an IPS file), if found
vector<uint8_t> ipsData = BatteryManager::LoadBattery(".ips");
vector<uint8_t> ipsData = _console->GetBatteryManager()->LoadBattery(".ips");
LoadDiskData(ipsData);
}
@ -60,7 +60,7 @@ vector<uint8_t> FDS::CreateIpsPatch()
void FDS::SaveBattery()
{
vector<uint8_t> ipsData = CreateIpsPatch();
BatteryManager::SaveBattery(".ips", ipsData.data(), (uint32_t)ipsData.size());
_console->GetBatteryManager()->SaveBattery(".ips", ipsData.data(), (uint32_t)ipsData.size());
}
void FDS::Reset(bool softReset)

View file

@ -112,7 +112,7 @@ bool MesenMovie::Play(VirtualFile &file)
_console->Pause();
BatteryManager::SetBatteryProvider(shared_from_this());
_console->GetBatteryManager()->SetBatteryProvider(shared_from_this());
_console->GetNotificationManager()->RegisterNotificationListener(shared_from_this());
ApplySettings();

View file

@ -40,12 +40,12 @@ bool MovieRecorder::Record(RecordMovieOptions options)
_console->Pause();
if(options.RecordFrom == RecordMovieFrom::StartWithoutSaveData) {
BatteryManager::SetBatteryProvider(shared_from_this());
_console->GetBatteryManager()->SetBatteryProvider(shared_from_this());
}
//Save existing battery files
if(options.RecordFrom == RecordMovieFrom::StartWithSaveData) {
BatteryManager::SetBatteryRecorder(shared_from_this());
_console->GetBatteryManager()->SetBatteryRecorder(shared_from_this());
}
_console->GetNotificationManager()->RegisterNotificationListener(shared_from_this());
@ -56,7 +56,7 @@ bool MovieRecorder::Record(RecordMovieOptions options)
} else {
_console->PowerCycle();
}
BatteryManager::SetBatteryRecorder(nullptr);
_console->GetBatteryManager()->SetBatteryRecorder(nullptr);
_console->Resume();
MessageManager::DisplayMessage("Movies", "MovieRecordingTo", FolderUtilities::GetFilename(_filename, true));
@ -238,7 +238,8 @@ bool MovieRecorder::CreateMovie(string movieFile, std::deque<RewindData> &data,
if(startPosition < data.size() && endPosition <= data.size() && _writer->Initialize(_filename)) {
vector<shared_ptr<BaseControlDevice>> devices = _console->GetControlManager()->GetControlDevices();
if(startPosition > 0) {
if(startPosition > 0 || _console->GetRomInfo().HasBattery) {
//Create a movie from a savestate if we don't start from the beginning (or if the game has save ram)
_hasSaveState = true;
_saveStateData = stringstream();
_console->GetSaveStateManager()->GetSaveStateHeader(_saveStateData);