//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // // $NoKeywords: $ //=============================================================================// #include "SaveGameDialog.h" #include "EngineInterface.h" #include "GameUI_Interface.h" #include "vgui/ISystem.h" #include "vgui/ISurface.h" #include "vgui/IVGui.h" #include "vgui_controls/Button.h" #include "vgui_controls/ListPanel.h" #include "vgui_controls/QueryBox.h" #include "KeyValues.h" #include "filesystem.h" #include #include using namespace vgui; // memdbgon must be the last include file in a .cpp file!!! #include "tier0/memdbgon.h" #define NEW_SAVE_GAME_TIMESTAMP 0xFFFFFFFF //----------------------------------------------------------------------------- // Purpose:Constructor //----------------------------------------------------------------------------- CSaveGameDialog::CSaveGameDialog(vgui::Panel *parent) : BaseClass(parent, "SaveGameDialog") { SetDeleteSelfOnClose(true); SetBounds(0, 0, 512, 384); SetSizeable( true ); SetTitle("#GameUI_SaveGame", true); vgui::Button *cancel = new vgui::Button( this, "Cancel", "#GameUI_Cancel" ); cancel->SetCommand( "Close" ); LoadControlSettings("Resource\\SaveGameDialog.res"); } //----------------------------------------------------------------------------- // Purpose: Destructor //----------------------------------------------------------------------------- CSaveGameDialog::~CSaveGameDialog() { } //----------------------------------------------------------------------------- // Purpose: Saves game //----------------------------------------------------------------------------- void CSaveGameDialog::OnCommand( const char *command ) { if ( !stricmp( command, "loadsave" ) ) { int saveIndex = GetSelectedItemSaveIndex(); if ( m_SaveGames.IsValidIndex(saveIndex) ) { // see if we're overwriting if ( m_SaveGames[saveIndex].iTimestamp == NEW_SAVE_GAME_TIMESTAMP ) { // new save game, proceed OnCommand( "SaveOverwriteConfirmed" ); } else { // open confirmation dialog QueryBox *box = new QueryBox( "#GameUI_ConfirmOverwriteSaveGame_Title", "#GameUI_ConfirmOverwriteSaveGame_Info" ); box->AddActionSignalTarget(this); box->SetOKButtonText("#GameUI_ConfirmOverwriteSaveGame_OK"); box->SetOKCommand(new KeyValues("Command", "command", "SaveOverwriteConfirmed")); box->DoModal(); } } } else if ( !stricmp( command, "SaveOverwriteConfirmed" ) ) { int saveIndex = GetSelectedItemSaveIndex(); if ( m_SaveGames.IsValidIndex(saveIndex) ) { // delete any existing save DeleteSaveGame( m_SaveGames[saveIndex].szFileName ); // save to a new name char saveName[128]; FindSaveSlot( saveName, sizeof(saveName) ); if ( saveName[ 0 ] ) { // Load the game, return to top and switch to engine char sz[ 256 ]; Q_snprintf(sz, sizeof( sz ), "save %s\n", saveName ); engine->ClientCmd_Unrestricted( sz ); // Close this dialog Close(); // hide the UI GameUI().HideGameUI(); } } } else { BaseClass::OnCommand( command ); } } //----------------------------------------------------------------------------- // Purpose: Opens the dialog and rebuilds the save list //----------------------------------------------------------------------------- void CSaveGameDialog::Activate() { BaseClass::Activate(); ScanSavedGames(); } //----------------------------------------------------------------------------- // Purpose: scans for save games //----------------------------------------------------------------------------- void CSaveGameDialog::OnScanningSaveGames() { // create dummy item for current saved game SaveGameDescription_t save = { "NewSavedGame", "", "", "#GameUI_NewSaveGame", "", "", "Current", NEW_SAVE_GAME_TIMESTAMP }; m_SaveGames.AddToTail(save); } //----------------------------------------------------------------------------- // Purpose: generates a new save game name //----------------------------------------------------------------------------- void CSaveGameDialog::FindSaveSlot( char *buffer, int bufsize ) { buffer[0] = 0; char szFileName[512]; for (int i = 0; i < 1000; i++) { Q_snprintf(szFileName, sizeof( szFileName ), "save/half-life-%03i.sav", i ); FileHandle_t fp = g_pFullFileSystem->Open( szFileName, "rb" ); if (!fp) { // clean up name Q_strncpy( buffer, szFileName + 5, bufsize ); char *ext = strstr( buffer, ".sav" ); if ( ext ) { *ext = 0; } return; } g_pFullFileSystem->Close(fp); } Assert(!("Could not generate new save game file")); }