savedata_factory: Automatically create certain savedata
After further hardware investigation, it appears that some games, perhaps those more lazily coded, will not call EnsureSaveData, meaning that they expect the normal (current) save to be automatically made. Additionally, some games do not create a cache or temporary save before use. In these 3 specific instances, the save is created automatically for the game if it doesn't exist.
This commit is contained in:
parent
dd2e96b362
commit
bb207fe27a
@ -16,6 +16,7 @@ namespace FileSys {
|
|||||||
constexpr char SAVE_DATA_SIZE_FILENAME[] = ".yuzu_save_size";
|
constexpr char SAVE_DATA_SIZE_FILENAME[] = ".yuzu_save_size";
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
void PrintSaveDataDescriptorWarnings(SaveDataDescriptor meta) {
|
void PrintSaveDataDescriptorWarnings(SaveDataDescriptor meta) {
|
||||||
if (meta.type == SaveDataType::SystemSaveData || meta.type == SaveDataType::SaveData) {
|
if (meta.type == SaveDataType::SystemSaveData || meta.type == SaveDataType::SaveData) {
|
||||||
if (meta.zero_1 != 0) {
|
if (meta.zero_1 != 0) {
|
||||||
@ -52,6 +53,13 @@ void PrintSaveDataDescriptorWarnings(SaveDataDescriptor meta) {
|
|||||||
meta.user_id[1], meta.user_id[0]);
|
meta.user_id[1], meta.user_id[0]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ShouldSaveDataBeAutomaticallyCreated(SaveDataSpaceId space, const SaveDataDescriptor& desc) {
|
||||||
|
return desc.type == SaveDataType::CacheStorage || desc.type == SaveDataType::TemporaryStorage ||
|
||||||
|
(space == SaveDataSpaceId::NandUser && ///< Normal Save Data -- Current Title & User
|
||||||
|
desc.type == SaveDataType::SaveData && desc.title_id == 0 && desc.save_id == 0);
|
||||||
|
}
|
||||||
|
|
||||||
} // Anonymous namespace
|
} // Anonymous namespace
|
||||||
|
|
||||||
std::string SaveDataDescriptor::DebugInfo() const {
|
std::string SaveDataDescriptor::DebugInfo() const {
|
||||||
@ -96,6 +104,10 @@ ResultVal<VirtualDir> SaveDataFactory::Open(SaveDataSpaceId space,
|
|||||||
|
|
||||||
auto out = dir->GetDirectoryRelative(save_directory);
|
auto out = dir->GetDirectoryRelative(save_directory);
|
||||||
|
|
||||||
|
if (out == nullptr && ShouldSaveDataBeAutomaticallyCreated(space, meta)) {
|
||||||
|
return Create(space, meta);
|
||||||
|
}
|
||||||
|
|
||||||
// Return an error if the save data doesn't actually exist.
|
// Return an error if the save data doesn't actually exist.
|
||||||
if (out == nullptr) {
|
if (out == nullptr) {
|
||||||
// TODO(Subv): Find out correct error code.
|
// TODO(Subv): Find out correct error code.
|
||||||
|
Loading…
Reference in New Issue
Block a user