//+-------------------------------------------------------------------------- // // Copyright (C) DreamWorks Interactive, 1996. // // File: uidlgs.cpp // // Contents: // // Classes: // // Functions: // // History: 23-Nov-96 SHernd Created // //--------------------------------------------------------------------------- #include "precomp.h" #pragma hdrstop #include "tpassglobals.h" #include "supportfn.hpp" #include "resource.h" #include "dialogs.h" #include "main.h" #include "uiwnd.h" #include "uidlgs.h" #include "Cdib.h" #include "../Lib/Sys/reg.h" #include "../Lib/Sys/RegInit.hpp" extern HINSTANCE g_hInst; extern HWND g_hwnd; //+-------------------------------------------------------------------------- // // Function: AddToLoadGameVector // // Synopsis: Basic Insertion sort. Most recent files first in the list. // // Arguments: [psgi] -- item to insert // [pInfo] -- List to insert into // // Returns: void // // History: 10-Jul-98 SHernd Created // //--------------------------------------------------------------------------- void AddToLoadGameVector(SAVEGAMEINFO * psgi, std::vector * pInfo) { bool fEntered; std::vector::iterator ppinfo; for (ppinfo = pInfo->begin(), fEntered = false; ppinfo != pInfo->end(); ppinfo++) { if (CompareFileTime(&ppinfo->ft, &psgi->ft) == -1) { fEntered = true; pInfo->insert(ppinfo, *psgi); break; } } if (!fEntered) { pInfo->push_back(*psgi); } } BOOL ExtractDataFromSaveFile(LPSTR pszFile, SAVEGAMEINFO * psgi) { CSaveFile sf(pszFile, true, true); int iSize; const char *pc; MEMDIBINFO memdib; if (!sf.bValidFile) { TraceError(("ExtractDataFromSaveFile() -- Invalid File %s", pszFile)); return FALSE; } // Read in the save name pc = sf.pcLoad("SaveGameName", &iSize); strcpy(psgi->szName, pc); // Read in the original SCN name pc = sf.pcLoad("SaveSCNName", &iSize); strcpy(psgi->szSCN, pc); // Read in the bmp pc = sf.pcLoad("SaveBMP", &iSize); memdib.pbBase = (LPBYTE)pc; memdib.pbCurr = (LPBYTE)pc; memdib.dwSize = (DWORD)iSize; psgi->pdib = new CDib(); Assert(psgi->pdib); psgi->pdib->LoadFromStream(&memdib, (PFNDIBREAD)MemDibRead, (PFNDIBSEEK)MemDibSeek); return TRUE; } //+-------------------------------------------------------------------------- // // Function: EnterSavedGamesIntoLoadGameVector // // Synopsis: Looks in the installed directory for the SAVEGAME.* file type // and then tries to add them all to the Load Game Vector // // Arguments: [pInfo] -- Vector to enter the files into // // Returns: BOOL // // History: 01-Jun-97 SHernd Created // //--------------------------------------------------------------------------- BOOL EnterSavedGamesIntoLoadGameVector(std::vector * pInfo) { char szPath[_MAX_PATH]; char szBase[_MAX_PATH]; char szSavePrefix[_MAX_PATH]; HANDLE hfind; WIN32_FIND_DATA finddata; SAVEGAMEINFO sgi; LoadString(g_hInst, IDS_SAVEGAMEPREFIX, szSavePrefix, sizeof(szSavePrefix)); GetFileLoc(FA_INSTALLDIR, szBase, sizeof(szBase)); // Save Off Base path strcpy(szPath, szBase); strcat(szBase, szSavePrefix); strcat(szBase, ".*"); hfind = FindFirstFile(szBase, &finddata); if (hfind == INVALID_HANDLE_VALUE) { // No files found so back out. return TRUE; } do { // Create the full path for this. if (finddata.ftLastWriteTime.dwLowDateTime != 0 && finddata.ftLastWriteTime.dwHighDateTime != 0) { sgi.ft = finddata.ftLastWriteTime; } else { sgi.ft = finddata.ftCreationTime; } strcpy(sgi.szFName, finddata.cFileName); wsprintf(szBase, "%s%s", szPath, finddata.cFileName); strcpy(sgi.szFName, finddata.cFileName); ExtractDataFromSaveFile(szBase, &sgi); AddToLoadGameVector(&sgi, pInfo); } while (FindNextFile(hfind, &finddata)); FindClose(hfind); return TRUE; } void FindSavedGames(CUIListbox * plist, std::vector * psgi) { std::vector::iterator ppinfo; EnterSavedGamesIntoLoadGameVector(psgi); for (ppinfo = psgi->begin(); ppinfo != psgi->end(); ppinfo++) { plist->AddItem(ppinfo->szName, (DWORD)&(*ppinfo), -1, 0); } } //+-------------------------------------------------------------------------- //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- CLoadGameWnd::CLoadGameWnd(CUIManager * puimgr) : CUIDlg(puimgr) { } CLoadGameWnd::~CLoadGameWnd() { std::vector::iterator ppinfo; for (ppinfo = m_vInfo.begin(); ppinfo != m_vInfo.end(); ppinfo++) { delete ppinfo->pdib; } } BOOL CLoadGameWnd::OnCreate() { if (!CUIDlg::OnCreate()) { TraceError(("CLoadGameWnd::OnCreate() -- base create failed")); return FALSE; } m_pSaveGameList = (CUIListbox *)GetUICtrl(1002); FindSavedGames(m_pSaveGameList, &m_vInfo); CenterUIWindow(this); return TRUE; } void CLoadGameWnd::GetWndFile(LPSTR psz, int ic) { strcpy(psz, "loadgame.ddf"); } void CLoadGameWnd::UIButtonUp(CUIButton * pbutton) { switch (pbutton->GetID()) { // Controls // Cancel case 1000: EndUIWnd(0); break; // OK case 1001: ActualLoad(); break; // Delete case 1004: { char szExt[100]; char szMsg[250]; char szFName[50]; DWORD dwParam; WORD wFlags; int i; SAVEGAMEINFO sgi; i = m_pSaveGameList->GetCurrSel(); Assert(i != -1); m_pSaveGameList->GetItem(szFName, sizeof(szFName), dwParam, wFlags, i); // Ask the user if they want to delete this savegame. LoadString(g_hInst, IDS_DELETE_SAVEGAME, szExt, sizeof(szExt)); wsprintf(szMsg, szExt, szFName); CYesNoTextDlg dlg(szMsg, m_pUIMgr); dlg.StartUIWnd(); if (dlg.m_dwExitValue == 0) { return; } // Delete Save Game m_pSaveGameList->RemoveItem(i); sgi = m_vInfo[i]; m_vInfo.erase(m_vInfo.begin() + i); g_CTPassGlobals.DeleteGame(sgi.szFName); i = m_pSaveGameList->GetCurrSel(); if (i == -1) { ((CUIStatic*)GetUICtrl(1003))->SetRaster(NULL); GetUICtrl(1004)->SetActive(FALSE); GetUICtrl(1001)->SetActive(FALSE); } else { UIListboxClick(m_pSaveGameList, i); } } break; } } void CLoadGameWnd::UIListboxClick(CUICtrl * pctrl, int iIndex) { CRasterDC * pras; char sz[255]; DWORD dwParam; WORD wFlags; CUIStatic * pstatic; SAVEGAMEINFO* ppinfo; if (iIndex == -1) { return; } // Activate the OK button GetUICtrl(1001)->SetActive(TRUE); // Activate the Delete Button GetUICtrl(1004)->SetActive(TRUE); // Load in the correct BMP to put in the static control m_pSaveGameList->GetItem(sz, sizeof(sz), dwParam, wFlags, iIndex); ppinfo = (SAVEGAMEINFO*)dwParam; pras = (CRasterDC *)ConvertBMP(ppinfo->pdib, true); pstatic = (CUIStatic *)GetUICtrl(1003); pstatic->SetRaster(pras, FALSE); } void CLoadGameWnd::UIListboxDblClk(CUICtrl * pctrl, int iIndex) { if (iIndex == -1) { return; } ActualLoad(); } void CLoadGameWnd::UpdateButtons() { } void CLoadGameWnd::ActualLoad() { char szDir[_MAX_PATH]; int i; i = m_pSaveGameList->GetCurrSel(); GetFileLoc(FA_INSTALLDIR, szDir, sizeof(szDir)); strcat(szDir, m_vInfo[i].szFName); g_CTPassGlobals.FreeMenuAudio(); i = g_CTPassGlobals.LoadScene(szDir, m_vInfo[i].szSCN); if (i < 0) { DisplayLoadingFileError(i); } else { EndUIWnd(1); } } //+-------------------------------------------------------------------------- //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- CSaveGameWnd::CSaveGameWnd(CUIManager * puimgr) : CUIDlg(puimgr) { } CSaveGameWnd::~CSaveGameWnd() { std::vector::iterator ppinfo; for (ppinfo = m_vInfo.begin(); ppinfo != m_vInfo.end(); ppinfo++) { delete ppinfo->pdib; } } BOOL CSaveGameWnd::OnCreate() { char sz[50]; if (!CUIDlg::OnCreate()) { TraceError(("CSaveGameWnd::OnCreate() -- base create failed")); return FALSE; } m_pSaveGameList = (CUIListbox *)GetUICtrl(1002); Assert(m_pSaveGameList); LoadString(g_hInst, IDS_NEWSAVE, sz, sizeof(sz)); m_pSaveGameList->AddItem(sz, 0, -1, 0); m_pSaveGameList->SetCurrSel(0); FindSavedGames(m_pSaveGameList, &m_vInfo); m_pGameName = (CUIEditbox *)GetUICtrl(1004); m_pGameName->SetMaxCharNum(21); UpdateButtons(); CenterUIWindow(this); return TRUE; } void CSaveGameWnd::GetWndFile(LPSTR psz, int ic) { strcpy(psz, "savegame.ddf"); } void CSaveGameWnd::UIButtonUp(CUIButton * pbutton) { switch (pbutton->GetID()) { // Controls case 1000: //cancel EndUIWnd(0); break; case 1001: ActualSave(); break; // Delete case 1005: { char szExt[100]; char szMsg[250]; char szFName[50]; DWORD dwParam; WORD wFlags; int i; SAVEGAMEINFO sgi; i = m_pSaveGameList->GetCurrSel(); Assert(i != -1); m_pSaveGameList->GetItem(szFName, sizeof(szFName), dwParam, wFlags, i); // Ask the user if they want to delete this savegame. LoadString(g_hInst, IDS_DELETE_SAVEGAME, szExt, sizeof(szExt)); wsprintf(szMsg, szExt, szFName); CYesNoTextDlg dlg(szMsg, m_pUIMgr); dlg.StartUIWnd(); if (dlg.m_dwExitValue == 0) { return; } // Delete Save Game m_pSaveGameList->RemoveItem(i); sgi = m_vInfo[i - 1]; m_vInfo.erase(m_vInfo.begin() + (i - 1)); g_CTPassGlobals.DeleteGame(sgi.szFName); i = m_pSaveGameList->GetCurrSel(); if (i == -1) { ((CUIStatic*)GetUICtrl(1003))->SetRaster(NULL); GetUICtrl(1004)->SetActive(FALSE); GetUICtrl(1001)->SetActive(FALSE); } else { UIListboxClick(m_pSaveGameList, i); } UpdateButtons(); } break; } } void CSaveGameWnd::UIEditboxKey(CUICtrl * pctrl, UINT vk, int cRepeat, UINT flags) { if (vk == VK_ESCAPE) { EndUIWnd(0); } else if (vk == VK_RETURN) { ActualSave(); } } void CSaveGameWnd::UIEditboxMaxText(CUICtrl * pctrl) { g_CTPassGlobals.PlayButtonAudio(); } void CSaveGameWnd::OnKey(UINT vk, BOOL fDown, int cRepeat, UINT flags) { m_pGameName->OnKey(vk, fDown, cRepeat, flags); UpdateButtons(TRUE); } void CSaveGameWnd::OnChar(TCHAR ch, int cRepeat) { if (ch < 32 || ch > 126) { return; } m_pGameName->OnChar(ch, cRepeat); UpdateButtons(TRUE); } void CSaveGameWnd:: UIListboxClick(CUICtrl * pctrl, int iIndex) { CRasterDC * pras; char sz[255]; DWORD dwParam; WORD wFlags; CUIStatic * pstatic; SAVEGAMEINFO* ppinfo; pstatic = (CUIStatic *)GetUICtrl(1003); if (iIndex == 0) { pstatic->SetRaster(NULL); UpdateButtons(); return; } // Load in the correct BMP to put in the static control m_pSaveGameList->GetItem(sz, sizeof(sz), dwParam, wFlags, iIndex); ppinfo = (SAVEGAMEINFO*)dwParam; pras = (CRasterDC *)ConvertBMP(ppinfo->pdib, true); pstatic = (CUIStatic *)GetUICtrl(1003); pstatic->SetRaster(pras, FALSE); UpdateButtons(); } void CSaveGameWnd::ActualSave() { int i; char szExt[255]; char szMsg[255]; char szFName[_MAX_PATH]; LPCSTR psz; DWORD dwParam; WORD wFlags; BOOL bValidName = FALSE; int iLen; SAVEGAMEINFO * psgi; LPSTR pszExt; DWORD dwSectorsPerCluster; DWORD dwBytesPerSector; DWORD dwFreeClusters; DWORD dwTotalClusters; psz = m_pGameName->GetText(); if (psz) { iLen = strlen(psz); if (!iLen) return; //lets not let the user create names that are all white space for (i = 0; i < iLen; i++) { if (!isspace(psz[i])) bValidName = TRUE; } if (!bValidName) return; // Check for available disk space GetFileLoc(FA_INSTALLDIR, szFName, sizeof(szFName)); _splitpath(szFName, szExt, NULL,NULL, NULL); strcat(szExt, "\\"); bValidName = GetDiskFreeSpace(szExt, &dwSectorsPerCluster, &dwBytesPerSector, &dwFreeClusters, &dwTotalClusters); if (!bValidName) { Trace(("CSaveGameWnd::ActualSave() -- GetFreeDiskSpace error %i", GetLastError())); } // Check for enough free space for a save if (dwSectorsPerCluster * dwBytesPerSector * dwFreeClusters < 1024 * 1024) { CMsgOkDlg dlg(IDS_ERROR_DISKSPACE_SAVE, m_pUIMgr); dlg.StartUIWnd(); return; } i = m_pSaveGameList->GetCurrSel(); if (i != 0) { m_pSaveGameList->GetItem(szFName, sizeof(szFName), dwParam, wFlags, i); // Ask the user if they want to overwrite this savegame. LoadString(g_hInst, IDS_OVERWRITE_SAVEGAME, szExt, sizeof(szExt)); wsprintf(szMsg, szExt, szFName); CYesNoTextDlg dlg(szMsg, m_pUIMgr); dlg.StartUIWnd(); if (dlg.m_dwExitValue == 0) { return; } psgi = (SAVEGAMEINFO*)dwParam; pszExt = strchr(psgi->szFName, '.'); Assert(pszExt); pszExt++; i = atoi(pszExt); } else { i = -1; } g_CTPassGlobals.SaveGame(psz, i); EndUIWnd(1); } } void CSaveGameWnd::UpdateButtons(BOOL bIgnoreText) { LPCSTR psz; int i; char sz[40]; DWORD dwParam; WORD wFlags; if (!bIgnoreText) { i = m_pSaveGameList->GetCurrSel(); if (i == 0) { GetUICtrl(1005)->SetActive(FALSE); m_pGameName->SetText(""); } else { GetUICtrl(1005)->SetActive(TRUE); m_pSaveGameList->GetItem(sz, sizeof(sz), dwParam, wFlags, i); m_pGameName->SetText(sz); } } psz = m_pGameName->GetText(); if (psz && (int)strlen(psz) > 0 ) { GetUICtrl(1001)->SetActive(TRUE); } else { GetUICtrl(1001)->SetActive(FALSE); } }