Files
GTASource/game/SaveLoad/savegame_initial_checks.cpp

1087 lines
37 KiB
C++
Raw Permalink Normal View History

2025-02-23 17:40:52 +08:00
// Rage headers
#include "file/savegame.h"
// network includes
#include "network/Live/livemanager.h"
// Game headers
#include "frontend/ProfileSettings.h"
#include "SaveLoad/GenericGameStorage.h"
#include "SaveLoad/savegame_autoload.h"
#include "SaveLoad/savegame_channel.h"
#include "SaveLoad/savegame_free_space_check.h"
#include "SaveLoad/savegame_initial_checks.h"
#include "SaveLoad/savegame_list.h"
#include "SaveLoad/savegame_users_and_devices.h"
SAVEGAME_OPTIMISATIONS()
enum
{
BEGIN_PLAYER_SIGN_IN,
PLAYER_SIGN_IN_DIALOG,
PLAYER_DOESNT_WANT_TO_SIGN_IN_TRY_AGAIN,
CHECK_PLAYER_SIGNED_IN,
BEGIN_DEVICE_SELECTION,
DEVICE_SELECTION_DIALOG,
DISPLAY_DEVICE_SELECTION_UI_ONCE_NO_OTHER_UIS_ARE_SHOWING,
PLAYER_DOESNT_WANT_TO_SELECT_DEVICE_TRY_AGAIN,
CHECK_DEVICE_SELECTION,
BEGIN_ENUMERATION,
CHECK_ENUMERATION,
SORT_SAVE_GAME_SLOTS,
GET_FILE_TIMES,
BEGIN_FREE_SPACE,
CHECK_FREE_SPACE,
FREE_SPACE_DIALOG
// CHECK_FILE_DELETION
};
int CSavegameInitialChecks::ms_InitialChecksState = BEGIN_PLAYER_SIGN_IN;
u32 CSavegameInitialChecks::ms_SizeOfBufferToBeSaved = 0;
bool CSavegameInitialChecks::ms_bManageStorage = true;
// GSWTODO - do i need to add a forceshow flag here too?
bool CSavegameInitialChecks::ms_bPlayerChoseNotToSignIn = false;
bool CSavegameInitialChecks::ms_bPlayerChoseNotToSelectADevice = false;
bool CSavegameInitialChecks::ms_bForcePlayerToChooseADevice = false; // Needed for the Select Device button on the frontend
// Brings up the Select Device UI even if the player has already selected a storage device
// Also bypasses the "Do you want to select a device?" dialog box
bool CSavegameInitialChecks::ShouldTryAgainMessageBeDisplayed()
{
bool bMessageShouldBeDisplayed = true;
switch (CGenericGameStorage::GetSaveOperation())
{
case OPERATION_NONE :
savegameAssertf(0, "CSavegameInitialChecks::ShouldTryAgainMessageBeDisplayed - didn't expect SaveOperation to be OPERATION_NONE");
bMessageShouldBeDisplayed = false;
break;
case OPERATION_SCANNING_CONSOLE_FOR_LOADING_SAVEGAMES :
bMessageShouldBeDisplayed = false;
break;
case OPERATION_SCANNING_CONSOLE_FOR_SAVING_SAVEGAMES :
bMessageShouldBeDisplayed = true;
break;
case OPERATION_LOADING_SAVEGAME_FROM_CONSOLE :
case OPERATION_LOADING_REPLAY_SAVEGAME_FROM_CONSOLE :
savegameAssertf(0, "CSavegameInitialChecks::ShouldTryAgainMessageBeDisplayed - shouldn't get here for loading");
bMessageShouldBeDisplayed = false;
break;
case OPERATION_LOADING_PHOTO_FROM_CLOUD :
bMessageShouldBeDisplayed = false;
break;
case OPERATION_SAVING_SAVEGAME_TO_CONSOLE :
savegameAssertf(0, "CSavegameInitialChecks::ShouldTryAgainMessageBeDisplayed - shouldn't get here for a manual save");
bMessageShouldBeDisplayed = true;
break;
case OPERATION_SAVING_MISSION_REPEAT_SAVEGAME_TO_CONSOLE :
case OPERATION_SAVING_REPLAY_SAVEGAME_TO_CONSOLE :
bMessageShouldBeDisplayed = true;
break;
case OPERATION_AUTOSAVING :
bMessageShouldBeDisplayed = true;
break;
case OPERATION_SAVING_PHOTO_TO_CLOUD :
#if __ALLOW_CLOUD_UPLOAD_OF_LOCAL_SAVEGAME
case OPERATION_UPLOADING_SAVEGAME_TO_CLOUD :
#endif // __ALLOW_CLOUD_UPLOAD_OF_LOCAL_SAVEGAME
bMessageShouldBeDisplayed = true;
break;
#if RSG_ORBIS
case OPERATION_CHECKING_FOR_FREE_SPACE_AT_START_OF_GAME :
bMessageShouldBeDisplayed = true; // not sure whether this should be true or false
break;
#endif
case OPERATION_CHECKING_FOR_FREE_SPACE :
bMessageShouldBeDisplayed = true;
break;
case OPERATION_CHECKING_IF_FILE_EXISTS :
bMessageShouldBeDisplayed = false;
break;
case OPERATION_LOADING_MPSTATS_FROM_CLOUD :
#if __ALLOW_LOCAL_MP_STATS_SAVES
case OPERATION_LOADING_MPSTATS_SAVEGAME_FROM_CONSOLE :
#endif // __ALLOW_LOCAL_MP_STATS_SAVES
bMessageShouldBeDisplayed = false;
break;
case OPERATION_SAVING_MPSTATS_TO_CLOUD :
#if __ALLOW_LOCAL_MP_STATS_SAVES
case OPERATION_SAVING_MPSTATS_SAVEGAME_TO_CONSOLE :
#endif // __ALLOW_LOCAL_MP_STATS_SAVES
bMessageShouldBeDisplayed = true;
break;
case OPERATION_DELETING_LOCAL :
case OPERATION_DELETING_CLOUD :
bMessageShouldBeDisplayed = false;
break;
case OPERATION_SAVING_LOCAL_PHOTO :
case OPERATION_LOADING_LOCAL_PHOTO :
bMessageShouldBeDisplayed = false;
break;
case OPERATION_ENUMERATING_PHOTOS :
case OPERATION_ENUMERATING_SAVEGAMES :
bMessageShouldBeDisplayed = false;
break;
}
return bMessageShouldBeDisplayed;
}
u32 CSavegameInitialChecks::GetSizeOfBufferToBeSaved()
{
switch (CGenericGameStorage::GetSaveOperation())
{
case OPERATION_NONE :
savegameAssertf(0, "CSavegameInitialChecks::GetSizeOfBufferToBeSaved - didn't expect OPERATION_NONE");
break;
case OPERATION_LOADING_MPSTATS_FROM_CLOUD :
savegameAssertf(0, "CSavegameInitialChecks::GetSizeOfBufferToBeSaved - Graeme - just checking if it ever gets here for OPERATION_LOADING_MPSTATS_FROM_CLOUD");
break;
case OPERATION_LOADING_PHOTO_FROM_CLOUD :
savegameAssertf(0, "CSavegameInitialChecks::GetSizeOfBufferToBeSaved - Graeme - shouldn't get here for OPERATION_LOADING_PHOTO_FROM_CLOUD");
break;
case OPERATION_SCANNING_CONSOLE_FOR_LOADING_SAVEGAMES :
case OPERATION_LOADING_SAVEGAME_FROM_CONSOLE :
case OPERATION_LOADING_REPLAY_SAVEGAME_FROM_CONSOLE :
#if __ALLOW_LOCAL_MP_STATS_SAVES
case OPERATION_LOADING_MPSTATS_SAVEGAME_FROM_CONSOLE :
#endif // __ALLOW_LOCAL_MP_STATS_SAVES
case OPERATION_SCANNING_CONSOLE_FOR_SAVING_SAVEGAMES :
#if RSG_ORBIS
case OPERATION_CHECKING_FOR_FREE_SPACE_AT_START_OF_GAME :
#endif
case OPERATION_CHECKING_IF_FILE_EXISTS :
case OPERATION_DELETING_LOCAL :
case OPERATION_DELETING_CLOUD :
case OPERATION_LOADING_LOCAL_PHOTO :
case OPERATION_ENUMERATING_PHOTOS :
case OPERATION_ENUMERATING_SAVEGAMES :
break;
case OPERATION_SAVING_MPSTATS_TO_CLOUD :
savegameAssertf(0, "CSavegameInitialChecks::GetSizeOfBufferToBeSaved - Graeme - just checking if it ever gets here for OPERATION_SAVING_MPSTATS_TO_CLOUD");
break;
case OPERATION_SAVING_PHOTO_TO_CLOUD :
savegameAssertf(0, "CSavegameInitialChecks::GetSizeOfBufferToBeSaved - Graeme - just checking if it ever gets here for OPERATION_SAVING_PHOTO_TO_CLOUD");
break;
#if __ALLOW_CLOUD_UPLOAD_OF_LOCAL_SAVEGAME
case OPERATION_UPLOADING_SAVEGAME_TO_CLOUD :
savegameAssertf(0, "CSavegameInitialChecks::GetSizeOfBufferToBeSaved - Graeme - just checking if it ever gets here for OPERATION_UPLOADING_SAVEGAME_TO_CLOUD");
break;
#endif // __ALLOW_CLOUD_UPLOAD_OF_LOCAL_SAVEGAME
case OPERATION_SAVING_SAVEGAME_TO_CONSOLE :
case OPERATION_SAVING_MISSION_REPEAT_SAVEGAME_TO_CONSOLE :
case OPERATION_SAVING_REPLAY_SAVEGAME_TO_CONSOLE :
case OPERATION_AUTOSAVING :
case OPERATION_CHECKING_FOR_FREE_SPACE :
#if __ALLOW_LOCAL_MP_STATS_SAVES
case OPERATION_SAVING_MPSTATS_SAVEGAME_TO_CONSOLE :
#endif // __ALLOW_LOCAL_MP_STATS_SAVES
case OPERATION_SAVING_LOCAL_PHOTO :
return ms_SizeOfBufferToBeSaved;
}
return 0;
}
void CSavegameInitialChecks::BeginInitialChecks(bool bForcePlayerToChooseADevice)
{
ms_bManageStorage = true;
// GSWTODO - have a force show flag too?
savegameAssertf(CGenericGameStorage::IsStorageDeviceBeingAccessed(), "CSavegameInitialChecks::BeginInitialChecks - didn't expect operation to be OPERATION_NONE at this stage");
ms_bForcePlayerToChooseADevice = bForcePlayerToChooseADevice;
ms_bPlayerChoseNotToSignIn = false;
ms_bPlayerChoseNotToSelectADevice = false;
ms_InitialChecksState = BEGIN_PLAYER_SIGN_IN;
}
bool CSavegameInitialChecks::ShowLoggedSignInUi()
{
savegameDisplayf("ShowSigninUi from CSavegameInitialChecks");
return CLiveManager::ShowSigninUi();
}
MemoryCardError CSavegameInitialChecks::InitialChecks()
{
static int SpaceRequired = 0;
ms_bPlayerChoseNotToSignIn = false;
ms_bPlayerChoseNotToSelectADevice = false;
bool ReturnSelection;
switch (ms_InitialChecksState)
{
case BEGIN_PLAYER_SIGN_IN :
#if RSG_DURANGO
if (CSavegameUsers::GetSignedInUser() && !CLiveManager::SignedInIntoNewProfileAfterSuspendMode())
#else
if (CSavegameUsers::GetSignedInUser())
#endif
{
ms_InitialChecksState = BEGIN_DEVICE_SELECTION; // CALCULATE_SAVEGAME_SIZE;
// Kevin Baca added code that restarted the session if the player is signed into a profile and another player on a different Xbox signs in to the same profile.
// It was possible for this to happen while the storage device was in use so I've added the code below as a safeguard.
// The particular case in Bug 173335 shouldn't happen any more as Kevin has changed the code so that only network sessions are affected by Xbox Live disconnects.
savegameAssertf( (SAVEGAME.GetState(CSavegameUsers::GetUser()) == fiSaveGameState::IDLE) || (SAVEGAME.GetState(CSavegameUsers::GetUser()) == fiSaveGameState::HAD_ERROR), "CSavegameInitialChecks::InitialChecks - expected save game state to be IDLE or HAD_ERROR but it's %d", (s32) SAVEGAME.GetState(CSavegameUsers::GetUser()));
SAVEGAME.SetStateToIdle(CSavegameUsers::GetUser());
}
else
{
if (CGenericGameStorage::GetSaveOperation() == OPERATION_LOADING_REPLAY_SAVEGAME_FROM_CONSOLE)
{
CSavegameDialogScreens::SetSaveGameError(SAVE_GAME_DIALOG_NONE);
ms_bPlayerChoseNotToSignIn = true;
return MEM_CARD_ERROR;
}
else
{
ms_InitialChecksState = PLAYER_SIGN_IN_DIALOG;
}
}
break;
case PLAYER_SIGN_IN_DIALOG :
if (CLiveManager::IsSystemUiShowing())
{
ShowLoggedSignInUi();
ms_InitialChecksState = CHECK_PLAYER_SIGNED_IN;
}
else if (CSavegameUsers::GetSignedInUser())
{ // If the player brings up the System UI before starting the game then it can reach here
ms_InitialChecksState = CHECK_PLAYER_SIGNED_IN;
}
// TCRHERE - You are not signed in. Do you want to sign in now?
else if (CSavegameDialogScreens::HandleSaveGameDialogBox(SAVE_GAME_DIALOG_SIGN_IN, 0, &ReturnSelection))
{
if (ReturnSelection)
{
ShowLoggedSignInUi();
ms_InitialChecksState = CHECK_PLAYER_SIGNED_IN;
}
else
{ // player doesn't want to sign in
ms_InitialChecksState = PLAYER_DOESNT_WANT_TO_SIGN_IN_TRY_AGAIN;
}
}
break;
case PLAYER_DOESNT_WANT_TO_SIGN_IN_TRY_AGAIN :
{
bool bShouldMessageBeDisplayed = ShouldTryAgainMessageBeDisplayed();
ReturnSelection = false;
if (CLiveManager::IsSystemUiShowing())
{
ShowLoggedSignInUi();
ms_InitialChecksState = CHECK_PLAYER_SIGNED_IN;
}
else if (CSavegameUsers::GetSignedInUser())
{ // If the player brings up the System UI before starting the game then it can reach here
ms_InitialChecksState = CHECK_PLAYER_SIGNED_IN;
}
else if (!bShouldMessageBeDisplayed || CSavegameDialogScreens::HandleSaveGameDialogBox(SAVE_GAME_DIALOG_DONT_SIGN_IN_TRY_AGAIN, 0, &ReturnSelection))
{
// You have not signed in. You will need to sign in to save your progress
// and to be awarded Achievements. Do you want to sign in now?
// (Should I mention that you need a live enabled profile to play multiplayer games)
if (ReturnSelection && bShouldMessageBeDisplayed)
{
ShowLoggedSignInUi();
ms_InitialChecksState = CHECK_PLAYER_SIGNED_IN;
}
else
{
CSavegameDialogScreens::SetSaveGameError(SAVE_GAME_DIALOG_NONE);
ms_bPlayerChoseNotToSignIn = true;
return MEM_CARD_ERROR;
}
}
}
break;
case CHECK_PLAYER_SIGNED_IN :
#if RSG_DURANGO
if(CLiveManager::SignedInIntoNewProfileAfterSuspendMode())
{
CSavegameDialogScreens::SetSaveGameError(SAVE_GAME_DIALOG_PLAYER_HAS_SIGNED_OUT);
ms_bPlayerChoseNotToSignIn = true;
ms_InitialChecksState = PLAYER_DOESNT_WANT_TO_SIGN_IN_TRY_AGAIN;
return MEM_CARD_ERROR;
}
#endif
if (CLiveManager::IsSystemUiShowing() == false)
{
if (CSavegameUsers::GetSignedInUser())
{ // If player has just signed in then force device selection
// SetDeviceIsInvalid(false);
CSavegameUsers::ClearVariablesForNewlySignedInPlayer();
ms_InitialChecksState = BEGIN_DEVICE_SELECTION; // CALCULATE_SAVEGAME_SIZE;
}
else
{
ms_InitialChecksState = PLAYER_DOESNT_WANT_TO_SIGN_IN_TRY_AGAIN;
}
// ms_InitialChecksState = BEGIN_PLAYER_SIGN_IN; // start from the beginning
}
break;
// *************************************************************************************
case BEGIN_DEVICE_SELECTION :
if (CSavegameUsers::HasPlayerJustSignedOut())
{
CSavegameDialogScreens::SetSaveGameError(SAVE_GAME_DIALOG_PLAYER_HAS_SIGNED_OUT);
return MEM_CARD_ERROR;
}
if ( (CGenericGameStorage::GetSaveOperation() == OPERATION_SAVING_PHOTO_TO_CLOUD)
|| (CGenericGameStorage::GetSaveOperation() == OPERATION_LOADING_PHOTO_FROM_CLOUD)
#if __ALLOW_CLOUD_UPLOAD_OF_LOCAL_SAVEGAME
|| (CGenericGameStorage::GetSaveOperation() == OPERATION_UPLOADING_SAVEGAME_TO_CLOUD)
#endif // __ALLOW_CLOUD_UPLOAD_OF_LOCAL_SAVEGAME
)
{
CSavegameDialogScreens::SetMessageAsProcessing(false);
return MEM_CARD_COMPLETE;
}
if (ms_bForcePlayerToChooseADevice)
{
ms_InitialChecksState = DEVICE_SELECTION_DIALOG;
}
else if (!CSavegameDevices::IsDeviceValid())
{
bool bDeviceRemovalError = true;
switch (CGenericGameStorage::GetSaveOperation())
{ // Allow player to reselect storage device for autosaving and scanning.
case OPERATION_NONE :
savegameAssertf(0, "CSavegameInitialChecks::InitialChecks - didn't expect OPERATION_NONE");
break;
// For loading and saving we have to return an error because the player
// will have already selected a slot and we can't allow the player to
// change storage device without reselecting the slot.
// OPERATION_CHECKING_FOR_FREE_SPACE is used for saving and autosaving but returning
// an error for autosaving should still return to a state where the player
// can try to select a device and slot again. If ms_bManageStorage is false
// then allow the device selection UI to show again so that the player can choose
// a different device or try to free space on the current device but always return
// an error to force a rescan at the end in case the device is changed.
case OPERATION_SCANNING_CONSOLE_FOR_LOADING_SAVEGAMES :
case OPERATION_SCANNING_CONSOLE_FOR_SAVING_SAVEGAMES :
#if RSG_ORBIS
case OPERATION_CHECKING_FOR_FREE_SPACE_AT_START_OF_GAME :
#endif
case OPERATION_ENUMERATING_PHOTOS :
case OPERATION_ENUMERATING_SAVEGAMES :
bDeviceRemovalError = false;
break;
case OPERATION_LOADING_SAVEGAME_FROM_CONSOLE :
case OPERATION_LOADING_REPLAY_SAVEGAME_FROM_CONSOLE :
bDeviceRemovalError = true;
break;
case OPERATION_LOADING_MPSTATS_FROM_CLOUD:
savegameAssertf(0, "CSavegameInitialChecks::InitialChecks - BEGIN_DEVICE_SELECTION - Graeme - just checking if it ever gets here for OPERATION_LOADING_MPSTATS_FROM_CLOUD");
bDeviceRemovalError = false;
break;
case OPERATION_SAVING_MPSTATS_TO_CLOUD:
savegameAssertf(0, "CSavegameInitialChecks::InitialChecks - BEGIN_DEVICE_SELECTION - Graeme - just checking if it ever gets here for OPERATION_SAVING_MPSTATS_TO_CLOUD");
bDeviceRemovalError = false;
break;
case OPERATION_LOADING_PHOTO_FROM_CLOUD :
savegameAssertf(0, "CSavegameInitialChecks::InitialChecks - BEGIN_DEVICE_SELECTION - Graeme - shouldn't get here for OPERATION_LOADING_PHOTO_FROM_CLOUD");
bDeviceRemovalError = false; // I'll try false here
break;
case OPERATION_SAVING_SAVEGAME_TO_CONSOLE :
bDeviceRemovalError = true;
break;
case OPERATION_SAVING_MISSION_REPEAT_SAVEGAME_TO_CONSOLE :
case OPERATION_SAVING_REPLAY_SAVEGAME_TO_CONSOLE :
bDeviceRemovalError = false;
break;
case OPERATION_AUTOSAVING :
bDeviceRemovalError = false;
if (!ms_bManageStorage)
{ // If trying to free space for the autosave slot then don't display any "do you want to select a device" message
ms_bForcePlayerToChooseADevice = true;
}
break;
case OPERATION_SAVING_PHOTO_TO_CLOUD :
savegameAssertf(0, "CSavegameInitialChecks::InitialChecks - BEGIN_DEVICE_SELECTION - Graeme - shouldn't get here for OPERATION_SAVING_PHOTO_TO_CLOUD");
bDeviceRemovalError = false;
break;
#if __ALLOW_CLOUD_UPLOAD_OF_LOCAL_SAVEGAME
case OPERATION_UPLOADING_SAVEGAME_TO_CLOUD :
savegameAssertf(0, "CSavegameInitialChecks::InitialChecks - BEGIN_DEVICE_SELECTION - Graeme - shouldn't get here for OPERATION_UPLOADING_SAVEGAME_TO_CLOUD");
bDeviceRemovalError = false;
break;
#endif // __ALLOW_CLOUD_UPLOAD_OF_LOCAL_SAVEGAME
case OPERATION_CHECKING_FOR_FREE_SPACE :
if (ms_bManageStorage)
{ // The first time BEGIN_DEVICE_SELECTION is reached for OPERATION_CHECKING_FOR_FREE_SPACE, ms_bManageStorage will be true.
// If the device is invalid already then return an error
bDeviceRemovalError = true;
}
else
{ // ms_bManageStorage is set to false if the player wants to free space
// For this to have any effect, we must let the game call SAVEGAME.BeginSelectDevice again
// so don't return an error here
// Will return an error later if ms_bManageStorage is false where MEM_CARD_COMPLETE would have been returned
// to force the player to choose a slot again in case they've selected a different storage device
bDeviceRemovalError = false;
ms_bForcePlayerToChooseADevice = true;
}
break;
case OPERATION_CHECKING_IF_FILE_EXISTS :
bDeviceRemovalError = false;
break;
case OPERATION_DELETING_LOCAL :
case OPERATION_DELETING_CLOUD :
bDeviceRemovalError = true;
break;
#if __ALLOW_LOCAL_MP_STATS_SAVES
case OPERATION_SAVING_MPSTATS_SAVEGAME_TO_CONSOLE :
case OPERATION_LOADING_MPSTATS_SAVEGAME_FROM_CONSOLE :
bDeviceRemovalError = true;
break;
#endif // __ALLOW_LOCAL_MP_STATS_SAVES
case OPERATION_SAVING_LOCAL_PHOTO :
case OPERATION_LOADING_LOCAL_PHOTO :
bDeviceRemovalError = true;
break;
}
if (bDeviceRemovalError)
{
CSavegameDialogScreens::SetSaveGameError(SAVE_GAME_DIALOG_SELECTED_DEVICE_HAS_BEEN_REMOVED);
return MEM_CARD_ERROR;
}
else
{ // Allow the player to select a storage device
ms_InitialChecksState = DEVICE_SELECTION_DIALOG;
}
}
else
{
ms_InitialChecksState = BEGIN_ENUMERATION;
}
break;
case DEVICE_SELECTION_DIALOG :
{
if (CSavegameUsers::HasPlayerJustSignedOut())
{
CSavegameDialogScreens::SetSaveGameError(SAVE_GAME_DIALOG_PLAYER_HAS_SIGNED_OUT);
return MEM_CARD_ERROR;
}
bool bPlayerWantsToSelectADevice = false;
if (ms_bForcePlayerToChooseADevice)
{
bPlayerWantsToSelectADevice = true;
ReturnSelection = true;
ms_bForcePlayerToChooseADevice = false;
}
else if (CSavegameDialogScreens::HandleSaveGameDialogBox(SAVE_GAME_DIALOG_DEVICE_SELECTION, 0, &ReturnSelection))
{
bPlayerWantsToSelectADevice = true;
}
if (bPlayerWantsToSelectADevice)
{
CSavegameDevices::SetDisplayDeviceHasBeenRemovedMessageNextTime(false);
if (ReturnSelection)
{ // start device selection
ms_InitialChecksState = DISPLAY_DEVICE_SELECTION_UI_ONCE_NO_OTHER_UIS_ARE_SHOWING;
/*
// GSWTODO - change forceshow to true - do I need a variable to store this or will it always be true?
// TCRHERE
if (!SAVEGAME.BeginSelectDevice(CSavegameUsers::GetUser(), ContentType, sTotalBufferSize, true, ms_bManageStorage) ) // bool forceShow is true)
{
savegameAssertf(0, "CSavegameInitialChecks::InitialChecks - BeginSelectDevice failed");
CSavegameDialogScreens::SetSaveGameError(SAVE_GAME_DIALOG_DEVICE_SELECTION_FAILED);
return MEM_CARD_ERROR;
}
ms_InitialChecksState = CHECK_DEVICE_SELECTION;
*/
}
else
{ // player doesn't want to choose a storage device
ms_InitialChecksState = PLAYER_DOESNT_WANT_TO_SELECT_DEVICE_TRY_AGAIN;
}
}
}
break;
case DISPLAY_DEVICE_SELECTION_UI_ONCE_NO_OTHER_UIS_ARE_SHOWING :
if (CSavegameUsers::HasPlayerJustSignedOut())
{
CSavegameDialogScreens::SetSaveGameError(SAVE_GAME_DIALOG_PLAYER_HAS_SIGNED_OUT);
return MEM_CARD_ERROR;
}
if (CLiveManager::IsSystemUiShowing() == false)
{
// GSWTODO - change forceshow to true - do I need a variable to store this or will it always be true?
// TCRHERE
if (!SAVEGAME.BeginSelectDevice(CSavegameUsers::GetUser(), CGenericGameStorage::GetContentType(), GetSizeOfBufferToBeSaved(), true, ms_bManageStorage) ) // bool forceShow is true)
{
savegameAssertf(0, "CSavegameInitialChecks::InitialChecks - BeginSelectDevice failed");
CSavegameDialogScreens::SetSaveGameError(SAVE_GAME_DIALOG_DEVICE_SELECTION_FAILED);
return MEM_CARD_ERROR;
}
ms_InitialChecksState = CHECK_DEVICE_SELECTION;
}
break;
case PLAYER_DOESNT_WANT_TO_SELECT_DEVICE_TRY_AGAIN :
{
if (CSavegameUsers::HasPlayerJustSignedOut())
{
CSavegameDialogScreens::SetSaveGameError(SAVE_GAME_DIALOG_PLAYER_HAS_SIGNED_OUT);
return MEM_CARD_ERROR;
}
bool bShouldMessageBeDisplayed = ShouldTryAgainMessageBeDisplayed();
// You have not selected a storage device. You will need to select a storage device in order to
// save game progress. Do you want to select one now?
ReturnSelection = false;
if (!bShouldMessageBeDisplayed || CSavegameDialogScreens::HandleSaveGameDialogBox(SAVE_GAME_DIALOG_DONT_SELECT_DEVICE_TRY_AGAIN, 0, &ReturnSelection))
{
if (ReturnSelection && bShouldMessageBeDisplayed)
{
ms_InitialChecksState = DISPLAY_DEVICE_SELECTION_UI_ONCE_NO_OTHER_UIS_ARE_SHOWING;
/*
// start device selection
// GSWTODO - change forceshow to true - do I need a variable to store this or will it always be true?
// TCRHERE
if (!SAVEGAME.BeginSelectDevice(CSavegameUsers::GetUser(), ContentType, sTotalBufferSize, true, ms_bManageStorage) ) // bool forceShow is true)
{
savegameAssertf(0, "CSavegameInitialChecks::InitialChecks - BeginSelectDevice failed");
CSavegameDialogScreens::SetSaveGameError(SAVE_GAME_DIALOG_DEVICE_SELECTION_FAILED);
return MEM_CARD_ERROR;
}
ms_InitialChecksState = CHECK_DEVICE_SELECTION;
*/
}
else
{
CSavegameDialogScreens::SetSaveGameError(SAVE_GAME_DIALOG_NONE);
ms_bPlayerChoseNotToSelectADevice = true;
return MEM_CARD_ERROR;
}
}
}
break;
case CHECK_DEVICE_SELECTION :
if (SAVEGAME.CheckSelectDevice(CSavegameUsers::GetUser()))
{ // returns true for error or success, false for busy
SAVEGAME.EndSelectDevice(CSavegameUsers::GetUser());
if (CSavegameUsers::HasPlayerJustSignedOut())
{
CSavegameDialogScreens::SetSaveGameError(SAVE_GAME_DIALOG_PLAYER_HAS_SIGNED_OUT);
return MEM_CARD_ERROR;
}
if (SAVEGAME.GetState(CSavegameUsers::GetUser()) == fiSaveGameState::HAD_ERROR)
{
if (SAVEGAME.GetError(CSavegameUsers::GetUser()) == fiSaveGame::USER_CANCELLED_DEVICE_SELECTION)
{
ms_InitialChecksState = PLAYER_DOESNT_WANT_TO_SELECT_DEVICE_TRY_AGAIN;
break;
}
else
{
CSavegameDialogScreens::SetSaveGameError(SAVE_GAME_DIALOG_DEVICE_SELECTION_FAILED2);
return MEM_CARD_ERROR;
}
}
if (SAVEGAME.GetError(CSavegameUsers::GetUser()) != fiSaveGame::SAVE_GAME_SUCCESS)
{
CSavegameDialogScreens::SetSaveGameError(SAVE_GAME_DIALOG_DEVICE_SELECTION_FAILED3);
return MEM_CARD_ERROR;
}
if (CSavegameDevices::IsDeviceValid()) // only reason for calling this is so that ms_bAllowDeviceHasBeenRemovedMessageToBeDisplayed is set correctly
{
ms_InitialChecksState = BEGIN_ENUMERATION;
}
else
{
ms_InitialChecksState = BEGIN_PLAYER_SIGN_IN; // start from the beginning
}
}
break;
case BEGIN_ENUMERATION :
if (CSavegameUsers::HasPlayerJustSignedOut())
{
CSavegameDialogScreens::SetSaveGameError(SAVE_GAME_DIALOG_PLAYER_HAS_SIGNED_OUT);
return MEM_CARD_ERROR;
}
if (CSavegameDevices::HasSelectedDeviceJustBeenRemoved())
{
CSavegameDialogScreens::SetSaveGameError(SAVE_GAME_DIALOG_SELECTED_DEVICE_HAS_BEEN_REMOVED);
return MEM_CARD_ERROR;
}
#if RSG_ORBIS
if (CGenericGameStorage::GetSaveOperation() == OPERATION_CHECKING_FOR_FREE_SPACE_AT_START_OF_GAME)
{ // NewGameChecks have their own fiSaveGame::Content array so there's no point
// enumerating the fiSaveGame::Content array inside CSavegameList in this function
return MEM_CARD_COMPLETE;
}
#endif
if (CSavegameAutoload::IsPerformingAutoLoadAtStartOfGame())
{ // CSavegameAutoload has its own fiSaveGame::Content array so there's no point
// enumerating the fiSaveGame::Content array inside CSavegameList in this function
savegameAssertf(OPERATION_LOADING_SAVEGAME_FROM_CONSOLE == CGenericGameStorage::GetSaveOperation(), "CSavegameInitialChecks::InitialChecks - expected operation to be OPERATION_LOADING_SAVEGAME_FROM_CONSOLE during autoload");
return MEM_CARD_COMPLETE;
}
#if RSG_ORBIS
if (!CSavegameList::GetSaveGamesHaveAlreadyBeenScanned())
#endif
{
CSavegameList::ClearSlotData();
savegameDebugf1("CSavegameInitialChecks::InitialChecks - BeginEnumeration\n");
savegameDebugf1("Time = %d\n",sysTimer::GetSystemMsTime());
if (!CSavegameList::BeginEnumeration())
{
savegameAssertf(0, "CSavegameInitialChecks::InitialChecks - BeginEnumeration failed");
CSavegameDialogScreens::SetSaveGameError(SAVE_GAME_DIALOG_BEGIN_ENUMERATION_FAILED);
return MEM_CARD_ERROR;
}
}
ms_InitialChecksState = CHECK_ENUMERATION;
// break;
case CHECK_ENUMERATION :
{
bool bEnumerationIsComplete = false;
#if RSG_ORBIS
if (CSavegameList::GetSaveGamesHaveAlreadyBeenScanned())
{
bEnumerationIsComplete = true;
}
else
#endif
{
if (CSavegameList::CheckEnumeration())
{ // returns true for error or success, false for busy
SAVEGAME.EndEnumeration(CSavegameUsers::GetUser());
if (CSavegameUsers::HasPlayerJustSignedOut())
{
CSavegameDialogScreens::SetSaveGameError(SAVE_GAME_DIALOG_PLAYER_HAS_SIGNED_OUT);
return MEM_CARD_ERROR;
}
if (CSavegameDevices::HasSelectedDeviceJustBeenRemoved())
{
CSavegameDialogScreens::SetSaveGameError(SAVE_GAME_DIALOG_SELECTED_DEVICE_HAS_BEEN_REMOVED);
return MEM_CARD_ERROR;
}
if (SAVEGAME.GetState(CSavegameUsers::GetUser()) == fiSaveGameState::HAD_ERROR)
{
CSavegameDialogScreens::SetSaveGameError(SAVE_GAME_DIALOG_CHECK_ENUMERATION_FAILED1);
return MEM_CARD_ERROR;
}
savegameDebugf1("CSavegameInitialChecks::InitialChecks - CheckEnumeration has finished\n");
#if !__NO_OUTPUT
savegameDisplayf("CSavegameInitialChecks::InitialChecks - List of savegames before sorting");
CSavegameList::PrintFilenames();
#endif // !__NO_OUTPUT
savegameDebugf1("ms_NumberOfSaveGameSlots = %d Time = %d\n", CSavegameList::GetNumberOfSaveGameSlots(), sysTimer::GetSystemMsTime());
// GSWTODO - what other errors can be returned?
if ( (SAVEGAME.GetError(CSavegameUsers::GetUser()) != fiSaveGame::SAVE_GAME_SUCCESS) &&
(SAVEGAME.GetError(CSavegameUsers::GetUser()) != fiSaveGame::NO_FILES_EXIST) )
{ // don't treat "no files" as an error
CSavegameDialogScreens::SetSaveGameError(SAVE_GAME_DIALOG_CHECK_ENUMERATION_FAILED2);
return MEM_CARD_ERROR;
}
bEnumerationIsComplete = true;
}
}
if (bEnumerationIsComplete)
{
ms_InitialChecksState = SORT_SAVE_GAME_SLOTS;
}
}
break;
// *************************************************************************************
case SORT_SAVE_GAME_SLOTS :
{
bool bSortingIsComplete = false;
if (CSavegameUsers::HasPlayerJustSignedOut())
{
CSavegameDialogScreens::SetSaveGameError(SAVE_GAME_DIALOG_PLAYER_HAS_SIGNED_OUT);
return MEM_CARD_ERROR;
}
if (CSavegameDevices::HasSelectedDeviceJustBeenRemoved())
{
CSavegameDialogScreens::SetSaveGameError(SAVE_GAME_DIALOG_SELECTED_DEVICE_HAS_BEEN_REMOVED);
return MEM_CARD_ERROR;
}
#if RSG_ORBIS
if (CSavegameList::GetSaveGamesHaveAlreadyBeenScanned())
{
bSortingIsComplete = true;
}
else
#endif
{
if (CSavegameList::SortSaveGameSlots() == false)
{
// GSWTODO - set errors in SortSaveGameSlots or just a general error here
return MEM_CARD_ERROR;
}
else
{
bSortingIsComplete = true;
}
}
if (bSortingIsComplete)
{
switch (CGenericGameStorage::GetSaveOperation())
{
case OPERATION_CHECKING_IF_FILE_EXISTS :
case OPERATION_DELETING_LOCAL :
case OPERATION_DELETING_CLOUD :
case OPERATION_ENUMERATING_PHOTOS :
CSavegameDialogScreens::SetMessageAsProcessing(false);
return MEM_CARD_COMPLETE;
// break;
default :
ms_InitialChecksState = GET_FILE_TIMES;
CSavegameList::ResetFileTimeScan();
break;
}
}
}
break;
case GET_FILE_TIMES :
{
if (CSavegameUsers::HasPlayerJustSignedOut())
{
CSavegameDialogScreens::SetSaveGameError(SAVE_GAME_DIALOG_PLAYER_HAS_SIGNED_OUT);
return MEM_CARD_ERROR;
}
if (CSavegameDevices::HasSelectedDeviceJustBeenRemoved())
{
CSavegameDialogScreens::SetSaveGameError(SAVE_GAME_DIALOG_SELECTED_DEVICE_HAS_BEEN_REMOVED);
return MEM_CARD_ERROR;
}
switch (CSavegameList::GetFileTimes())
{
case MEM_CARD_COMPLETE :
{
switch (CGenericGameStorage::GetSaveOperation())
{
case OPERATION_SAVING_SAVEGAME_TO_CONSOLE :
case OPERATION_SAVING_MISSION_REPEAT_SAVEGAME_TO_CONSOLE :
case OPERATION_SAVING_REPLAY_SAVEGAME_TO_CONSOLE :
case OPERATION_AUTOSAVING :
case OPERATION_CHECKING_FOR_FREE_SPACE:
#if __ALLOW_LOCAL_MP_STATS_SAVES
case OPERATION_SAVING_MPSTATS_SAVEGAME_TO_CONSOLE :
#endif // __ALLOW_LOCAL_MP_STATS_SAVES
case OPERATION_SAVING_LOCAL_PHOTO :
ms_InitialChecksState = BEGIN_FREE_SPACE;
break;
case OPERATION_SCANNING_CONSOLE_FOR_LOADING_SAVEGAMES :
case OPERATION_SCANNING_CONSOLE_FOR_SAVING_SAVEGAMES :
case OPERATION_LOADING_SAVEGAME_FROM_CONSOLE :
case OPERATION_LOADING_REPLAY_SAVEGAME_FROM_CONSOLE :
#if __ALLOW_LOCAL_MP_STATS_SAVES
case OPERATION_LOADING_MPSTATS_SAVEGAME_FROM_CONSOLE :
#endif // __ALLOW_LOCAL_MP_STATS_SAVES
case OPERATION_LOADING_LOCAL_PHOTO :
case OPERATION_ENUMERATING_SAVEGAMES :
CSavegameDialogScreens::SetMessageAsProcessing(false);
return MEM_CARD_COMPLETE;
// break;
case OPERATION_LOADING_PHOTO_FROM_CLOUD :
savegameAssertf(0, "CSavegameInitialChecks::InitialChecks - GET_FILE_TIMES - Graeme - shouldn't get here for OPERATION_LOADING_PHOTO_FROM_CLOUD");
break;
case OPERATION_LOADING_MPSTATS_FROM_CLOUD:
savegameAssertf(0, "CSavegameInitialChecks::InitialChecks - GET_FILE_TIMES - Graeme - just checking if it ever gets here for OPERATION_LOADING_MPSTATS_FROM_CLOUD");
break;
case OPERATION_SAVING_MPSTATS_TO_CLOUD:
savegameAssertf(0, "CSavegameInitialChecks::InitialChecks - GET_FILE_TIMES - Graeme - just checking if it ever gets here for OPERATION_SAVING_MPSTATS_TO_CLOUD");
break;
case OPERATION_SAVING_PHOTO_TO_CLOUD :
savegameAssertf(0, "CSavegameInitialChecks::InitialChecks - GET_FILE_TIMES - Graeme - shouldn't get here for OPERATION_SAVING_PHOTO_TO_CLOUD");
break;
#if __ALLOW_CLOUD_UPLOAD_OF_LOCAL_SAVEGAME
case OPERATION_UPLOADING_SAVEGAME_TO_CLOUD :
savegameAssertf(0, "CSavegameInitialChecks::InitialChecks - GET_FILE_TIMES - Graeme - shouldn't get here for OPERATION_UPLOADING_SAVEGAME_TO_CLOUD");
break;
#endif // __ALLOW_CLOUD_UPLOAD_OF_LOCAL_SAVEGAME
case OPERATION_NONE :
#if RSG_ORBIS
case OPERATION_CHECKING_FOR_FREE_SPACE_AT_START_OF_GAME :
#endif
case OPERATION_CHECKING_IF_FILE_EXISTS :
case OPERATION_DELETING_LOCAL :
case OPERATION_DELETING_CLOUD :
case OPERATION_ENUMERATING_PHOTOS :
savegameAssertf(0, "CSavegameInitialChecks::InitialChecks - GET_FILE_TIMES - unexpected value for ms_Operation");
break;
}
}
break;
case MEM_CARD_BUSY :
// Do nothing
break;
case MEM_CARD_ERROR :
// CSavegameDialogScreens::SetSaveGameError();
savegameAssertf(0, "CSavegameInitialChecks::InitialChecks - CSavegameList::GetFileTimes() failed");
return MEM_CARD_ERROR;
// break;
}
}
break;
case BEGIN_FREE_SPACE :
#if !RSG_ORBIS
if (CSavegameFreeSpaceCheck::CheckForFreeSpaceForCurrentFilename(true, GetSizeOfBufferToBeSaved(), SpaceRequired) == MEM_CARD_ERROR)
{
return MEM_CARD_ERROR;
}
ms_InitialChecksState = CHECK_FREE_SPACE;
// break;
#endif
case CHECK_FREE_SPACE :
#if !RSG_ORBIS
{
MemoryCardError FreeSpaceResult = CSavegameFreeSpaceCheck::CheckForFreeSpaceForCurrentFilename(false, GetSizeOfBufferToBeSaved(), SpaceRequired);
if (FreeSpaceResult == MEM_CARD_ERROR)
{
return MEM_CARD_ERROR;
}
else if (FreeSpaceResult == MEM_CARD_COMPLETE)
{
if (SpaceRequired >= 0)
{
if (!ms_bManageStorage)
{ // If ms_bManageStorage is false then the player could have changed device due to lack of space on the first device chosen
if (CGenericGameStorage::GetSaveOperation() == OPERATION_AUTOSAVING)
{ // The player cannot choose the autosave slot so just allow them
// to save in the autosave slot on whichever device has been selected
if (CGenericGameStorage::ShouldWeDisplayTheMessageAboutOverwritingTheAutosaveSlot() )
{ // Don't unpause here as we will need to immediately display the autosave overwrite message
}
else
{
CSavegameDialogScreens::SetMessageAsProcessing(false);
}
return MEM_CARD_COMPLETE;
}
// Return an error so that the player has to choose the slot again
return MEM_CARD_ERROR;
}
else
{
if ( (CGenericGameStorage::GetSaveOperation() == OPERATION_AUTOSAVING)
&& CGenericGameStorage::ShouldWeDisplayTheMessageAboutOverwritingTheAutosaveSlot() )
{ // Don't unpause here as we will need to immediately display the autosave overwrite message
}
else
{
CSavegameDialogScreens::SetMessageAsProcessing(false);
}
return MEM_CARD_COMPLETE;
}
}
else
{
ms_InitialChecksState = FREE_SPACE_DIALOG;
}
}
}
#else
return MEM_CARD_COMPLETE;
#endif
break;
case FREE_SPACE_DIALOG :
{
if (CSavegameUsers::HasPlayerJustSignedOut())
{
CSavegameDialogScreens::SetSaveGameError(SAVE_GAME_DIALOG_PLAYER_HAS_SIGNED_OUT);
return MEM_CARD_ERROR;
}
if (CSavegameDevices::HasSelectedDeviceJustBeenRemoved())
{
CSavegameDialogScreens::SetSaveGameError(SAVE_GAME_DIALOG_SELECTED_DEVICE_HAS_BEEN_REMOVED);
return MEM_CARD_ERROR;
}
if (CSavegameDialogScreens::HandleSaveGameDialogBox(SAVE_GAME_DIALOG_FREE_SPACE_CHECK, -SpaceRequired, &ReturnSelection))
{
if (ReturnSelection)
{
#if __PPU
/* We can't afford the memory container for BeginDeleteFromList
if (!SAVEGAME.BeginDeleteFromList(CSavegameUsers::GetUser()))
{ // start delete from list
savegameAssertf(0, "CSavegameInitialChecks::InitialChecks - BeginDeleteFromList failed");
CSavegameDialogScreens::SetSaveGameError(SAVE_GAME_DIALOG_DELETE_FROM_LIST_FAILED);
return MEM_CARD_ERROR;
}
ms_InitialChecksState = CHECK_FILE_DELETION;
*/
// Try this so that the player can continue the game and attempt to save in to another slot
CSavegameDialogScreens::SetSaveGameError(SAVE_GAME_DIALOG_NONE);
return MEM_CARD_ERROR;
#else
ms_bManageStorage = false;
// Force device selection again
CSavegameDevices::SetAllowDeviceHasBeenRemovedMessageToBeDisplayed(false);
CSavegameDevices::SetDeviceIsInvalid(false);
ms_InitialChecksState = BEGIN_PLAYER_SIGN_IN; // start from the beginning
#endif
}
else
{ // player doesn't want to free space so give up now
// SetFailureErrorMessage(ms_Operation, CGenericGameStorage::GetPerformingAnAutoSave());
// maybe just call SetSaveGameError here
// CSavegameDialogScreens::SetSaveGameError(SAVE_GAME_DIALOG_PLAYER_DOESNT_WANT_TO_FREE_SPACE);
#if __PPU
savegameAssertf(0, "CSavegameInitialChecks::InitialChecks - should only be able to say OK to PS3 No Free Space dialog");
#endif
CSavegameDialogScreens::SetSaveGameError(SAVE_GAME_DIALOG_NONE);
return MEM_CARD_ERROR;
}
}
}
break;
// *************************************************************************************
/* We can't afford the memory container for CheckDeleteFromList
case CHECK_FILE_DELETION :
#if __PPU
if (SAVEGAME.CheckDeleteFromList(CSavegameUsers::GetUser()))
{ // GSWTODO - still need to deal with errors here
SAVEGAME.EndDeleteFromList(CSavegameUsers::GetUser());
// These might not actually be required on PS3 since you can't remove the storage device
// and I don't think you can sign out either
if (CSavegameUsers::HasPlayerJustSignedOut())
{
CSavegameDialogScreens::SetSaveGameError(SAVE_GAME_DIALOG_PLAYER_HAS_SIGNED_OUT);
return MEM_CARD_ERROR;
}
if (CSavegameDevices::HasSelectedDeviceJustBeenRemoved())
{
CSavegameDialogScreens::SetSaveGameError(SAVE_GAME_DIALOG_SELECTED_DEVICE_HAS_BEEN_REMOVED);
return MEM_CARD_ERROR;
}
// End of These might not actually be required on PS3 since you can't remove the storage device
// and I don't think you can sign out either
ms_InitialChecksState = BEGIN_PLAYER_SIGN_IN; // start from the beginning
}
#else
savegameAssertf(0, "CSavegameInitialChecks::InitialChecks - CHECK_FILE_DELETION - should only happen for PS3");
#endif
break;
*/
default :
savegameAssertf(0, "CSavegameInitialChecks::InitialChecks - unexpected value for ms_InitialChecksState");
break;
}
return MEM_CARD_BUSY;
}