source-engine/gameui/LoadGameDialog_Xbox.cpp

220 lines
6.0 KiB
C++
Raw Normal View History

2020-04-22 16:56:21 +00:00
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
//=============================================================================//
#include "BasePanel.h"
#include "LoadGameDialog.h"
#include "winlite.h"
#include "vgui/ISurface.h"
#include "EngineInterface.h"
#include "GameUI_Interface.h"
#include "ixboxsystem.h"
#include "filesystem.h"
#include "SaveGameBrowserDialog.h"
using namespace vgui;
// memdbgon must be the last include file in a .cpp file!!!
#include <tier0/memdbgon.h>
CLoadGameDialogXbox::CLoadGameDialogXbox( vgui::Panel *parent ) : BaseClass( parent )
{
m_bFilterAutosaves = false;
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CLoadGameDialogXbox::ApplySchemeSettings( vgui::IScheme *pScheme )
{
BaseClass::ApplySchemeSettings( pScheme );
vgui::Label *pTitle = (Label *) FindChildByName( "TitleLabel" );
if ( pTitle )
{
pTitle->SetText( "#GameUI_LoadGame" );
}
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CLoadGameDialogXbox::PerformSelectedAction( void )
{
BaseClass::PerformSelectedAction();
if ( !GetNumPanels() )
return;
SetControlDisabled( true );
// Warn the player if they're already in a map
if ( !GameUI().HasSavedThisMenuSession() && GameUI().IsInLevel() && engine->GetMaxClients() == 1 )
{
BasePanel()->ShowMessageDialog( MD_SAVE_BEFORE_LOAD, this );
}
else
{
// Otherwise just do it
OnCommand( "LoadGame" );
}
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CLoadGameDialogXbox::PerformDeletion( void )
{
// Cannot delete autosaves!
CGameSavePanel *pPanel = GetActivePanel();
if ( pPanel == NULL || ( pPanel && pPanel->IsAutoSaveType() ) )
return;
BaseClass::PerformDeletion();
SetControlDisabled( true );
vgui::surface()->PlaySound( "UI/buttonclickrelease.wav" );
BasePanel()->ShowMessageDialog( MD_DELETE_SAVE_CONFIRM, this );
}
//-----------------------------------------------------------------------------
// Purpose:
// Input : bNewSaveSelected -
//-----------------------------------------------------------------------------
void CLoadGameDialogXbox::UpdateFooterOptions( void )
{
CFooterPanel *pFooter = GetFooterPanel();
// Show available buttons
pFooter->ClearButtons();
// Make sure we have panels to show
if ( HasActivePanels() )
{
pFooter->AddNewButtonLabel( "#GameUI_Load", "#GameUI_Icons_A_BUTTON" );
// Don't allow deletions of autosaves!
CGameSavePanel *pPanel = GetActivePanel();
if ( pPanel && pPanel->IsAutoSaveType() == false )
{
pFooter->AddNewButtonLabel( "#GameUI_Delete", "#GameUI_Icons_X_BUTTON" );
}
}
// Always allow storage devices changes and cancelling
pFooter->AddNewButtonLabel( "#GameUI_Close", "#GameUI_Icons_B_BUTTON" );
pFooter->AddNewButtonLabel( "#GameUI_Console_StorageChange", "#GameUI_Icons_Y_BUTTON" );
}
//-----------------------------------------------------------------------------
// Purpose:
// Input : *command -
//-----------------------------------------------------------------------------
void CLoadGameDialogXbox::OnCommand( const char *command )
{
m_KeyRepeat.Reset();
if ( !Q_stricmp( command, "LoadGame" ) )
{
// Must have an active panel to perform this action
if ( GetNumPanels() == 0 )
{
SetControlDisabled( false );
return;
}
const SaveGameDescription_t *pSave = GetActivePanelSaveDescription();
// Load the saved game
char szCmd[ 256 ];
Q_snprintf( szCmd, sizeof( szCmd ), "xload %s", pSave->szShortName );
engine->ClientCmd_Unrestricted( szCmd );
// Ignore all other input while we're open
OnClose();
}
else if ( !Q_stricmp( command, "DeleteGame" ) )
{
// Must have an active panel to perform this action
if ( GetNumPanels() == 0 )
{
SetControlDisabled( false );
return;
}
// Delete the game they've selected
const SaveGameDescription_t *pSave = GetActivePanelSaveDescription();
DeleteSaveGame( pSave );
RemoveActivePanel();
}
else if ( !Q_stricmp( command, "RefreshSaveGames" ) )
{
// FIXME: At this point the rug has been pulled out from undereath us!
RefreshSaveGames();
}
else if ( !Q_stricmp( command, "LoadGameCancelled" ) )
{
SetControlDisabled( false );
}
else if ( !Q_stricmp( command, "ReleaseModalWindow" ) )
{
vgui::surface()->RestrictPaintToSinglePanel( NULL );
}
else if ( !Q_stricmp( command, "DeleteGameCancelled" ) )
{
SetControlDisabled( false );
}
else
{
BaseClass::OnCommand(command);
}
}
//-----------------------------------------------------------------------------
// Purpose: deletes an existing save game
//-----------------------------------------------------------------------------
void CLoadGameDialogXbox::DeleteSaveGame( const SaveGameDescription_t *pSaveDesc )
{
if ( pSaveDesc == NULL )
{
SetControlDisabled( false );
return;
}
// If we're deleting our more recent save game, we need to make sure we setup the engine to properly load the last most recent
if ( Q_stristr( engine->GetMostRecentSaveGame(), pSaveDesc->szShortName ) )
{
// We must have at least two active save games that we know about
if ( GetNumPanels() > 1 )
{
// The panels are sorted by how recent they are, so the first element is the most recent
const SaveGameDescription_t *pDesc = GetPanelSaveDecription( 0 );
if ( pDesc == pSaveDesc )
{
// If we're deleting our most recent, we need to pick the next most recent
pDesc = GetPanelSaveDecription( 1 );
}
// Remember this filename for the next time we need to reload
if ( pDesc )
{
engine->SetMostRecentSaveGame( pDesc->szShortName );
}
}
}
// Delete the save game file
g_pFullFileSystem->RemoveFile( pSaveDesc->szFileName, "MOD" );
vgui::surface()->PlaySound( "UI/buttonclick.wav" );
// Return control
SetControlDisabled( false );
}