mirror of
https://github.com/Patoke/4JLibs.git
synced 2026-05-28 00:24:33 +00:00
291 lines
7.7 KiB
C++
291 lines
7.7 KiB
C++
#pragma once
|
|
#include "STO_SaveGame.h"
|
|
|
|
CSaveGame::CSaveGame()
|
|
{
|
|
m_pSaveData = nullptr;
|
|
m_uiSaveSize = 0;
|
|
m_bIsSafeDisabled = false;
|
|
|
|
ZeroMemory(m_szSaveUniqueName, sizeof(m_szSaveUniqueName));
|
|
ZeroMemory(m_szSaveTitle, sizeof(m_szSaveTitle));
|
|
|
|
m_pSaveDetails = nullptr;
|
|
m_bHasSaveDetails = false;
|
|
|
|
GetCurrentDirectoryA(sizeof(m_szSaveUniqueName), m_szSaveUniqueName);
|
|
|
|
char dirName[256];
|
|
char curDir[256];
|
|
GetCurrentDirectoryA(sizeof(dirName), dirName);
|
|
sprintf(curDir, "%s/Windows64/GameHDD/", dirName);
|
|
CreateDirectoryA(curDir, 0);
|
|
}
|
|
|
|
void CSaveGame::SetSaveDisabled(bool bDisable)
|
|
{
|
|
m_bIsSafeDisabled = bDisable;
|
|
}
|
|
|
|
bool CSaveGame::GetSaveDisabled(void)
|
|
{
|
|
return m_bIsSafeDisabled;
|
|
}
|
|
|
|
void CSaveGame::ResetSaveData()
|
|
{
|
|
free(m_pSaveData);
|
|
m_pSaveData = nullptr;
|
|
m_uiSaveSize = 0;
|
|
}
|
|
|
|
C4JStorage::ESaveGameState CSaveGame::GetSavesInfo(int iPad, int (*Func)(LPVOID lpParam, SAVE_DETAILS* pSaveDetails, const bool), LPVOID lpParam, char* pszSavePackName)
|
|
{
|
|
WIN32_FIND_DATAA findFileData{};
|
|
WIN32_FILE_ATTRIBUTE_DATA fileInfoBuffer{};
|
|
|
|
if (!m_pSaveDetails)
|
|
{
|
|
m_pSaveDetails = new SAVE_DETAILS();
|
|
memset(m_pSaveDetails, 0, sizeof(SAVE_DETAILS));
|
|
}
|
|
|
|
delete[] m_pSaveDetails->SaveInfoA;
|
|
m_pSaveDetails->SaveInfoA = nullptr;
|
|
m_pSaveDetails->iSaveC = 0;
|
|
|
|
char dirName[256];
|
|
char curDir[256];
|
|
GetCurrentDirectoryA(sizeof(dirName), dirName);
|
|
sprintf(curDir, "%s\\Windows64\\GameHDD\\*", dirName);
|
|
|
|
int resultCount = 0;
|
|
HANDLE h = FindFirstFileExA(curDir, FindExInfoStandard, &findFileData, FindExSearchLimitToDirectories, 0, 0);
|
|
if (h == INVALID_HANDLE_VALUE)
|
|
{
|
|
DWORD error = GetLastError();
|
|
printf("Error finding save dirs: 0x%08x\n", error);
|
|
}
|
|
else
|
|
{
|
|
do
|
|
{
|
|
if ((findFileData.dwFileAttributes & 0x10) != 0)
|
|
{
|
|
resultCount++;
|
|
}
|
|
} while (FindNextFileA(h, &findFileData));
|
|
FindClose(h);
|
|
}
|
|
|
|
if (resultCount > 0)
|
|
{
|
|
m_pSaveDetails->SaveInfoA = new SAVE_INFO[resultCount];
|
|
memset(m_pSaveDetails->SaveInfoA, 0, 184LL * resultCount);
|
|
|
|
m_pSaveDetails->iSaveC = 0;
|
|
int i = 0;
|
|
HANDLE fi = FindFirstFileExA(curDir, FindExInfoStandard, &findFileData, FindExSearchLimitToDirectories, 0, 0);
|
|
if (fi != INVALID_HANDLE_VALUE)
|
|
{
|
|
do
|
|
{
|
|
if ((findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0
|
|
&& strcmp(findFileData.cFileName, ".")
|
|
&& strcmp(findFileData.cFileName, ".."))
|
|
{
|
|
strcpy_s(m_pSaveDetails->SaveInfoA[i].UTF8SaveFilename, findFileData.cFileName);
|
|
strcpy_s(m_pSaveDetails->SaveInfoA[i].UTF8SaveTitle, findFileData.cFileName);
|
|
|
|
char fileName[280];
|
|
sprintf(fileName, "%s\\Windows64\\GameHDD\\%s\\saveData.ms", dirName, findFileData.cFileName);
|
|
|
|
GetFileAttributesExA(fileName, GetFileExInfoStandard, &fileInfoBuffer);
|
|
m_pSaveDetails->SaveInfoA[i++].metaData.dataSize = fileInfoBuffer.nFileSizeLow;
|
|
m_pSaveDetails->iSaveC++;
|
|
}
|
|
} while (FindNextFileA(fi, &findFileData));
|
|
FindClose(fi);
|
|
}
|
|
}
|
|
|
|
m_bHasSaveDetails = true;
|
|
if (Func)
|
|
{
|
|
Func(lpParam, m_pSaveDetails, true);
|
|
}
|
|
|
|
return C4JStorage::ESaveGame_Idle;
|
|
}
|
|
|
|
PSAVE_DETAILS CSaveGame::ReturnSavesInfo()
|
|
{
|
|
if (m_bHasSaveDetails)
|
|
return m_pSaveDetails;
|
|
else
|
|
return nullptr;
|
|
}
|
|
|
|
void CSaveGame::ClearSavesInfo()
|
|
{
|
|
m_bHasSaveDetails = false;
|
|
if (m_pSaveDetails)
|
|
{
|
|
if (m_pSaveDetails->SaveInfoA)
|
|
{
|
|
delete[] m_pSaveDetails->SaveInfoA;
|
|
m_pSaveDetails->SaveInfoA = nullptr;
|
|
m_pSaveDetails->iSaveC = 0;
|
|
}
|
|
delete m_pSaveDetails;
|
|
m_pSaveDetails = 0;
|
|
}
|
|
}
|
|
|
|
C4JStorage::ESaveGameState CSaveGame::LoadSaveDataThumbnail(PSAVE_INFO pSaveInfo, int(*Func)(LPVOID lpParam, PBYTE pbThumbnail, DWORD dwThumbnailBytes), LPVOID lpParam)
|
|
{
|
|
Func(lpParam, pSaveInfo->thumbnailData, pSaveInfo->metaData.thumbnailSize);
|
|
return C4JStorage::ESaveGame_GetSaveThumbnail;
|
|
}
|
|
|
|
C4JStorage::ESaveGameState CSaveGame::LoadSaveData(PSAVE_INFO pSaveInfo, int(*Func)(LPVOID lpParam, const bool, const bool), LPVOID lpParam)
|
|
{
|
|
SetSaveUniqueFilename(pSaveInfo->UTF8SaveFilename);
|
|
|
|
if (m_pSaveData)
|
|
{
|
|
free(m_pSaveData);
|
|
}
|
|
|
|
m_pSaveData = malloc(pSaveInfo->metaData.dataSize);
|
|
m_uiSaveSize = pSaveInfo->metaData.dataSize;
|
|
|
|
char dirName[256];
|
|
char curDir[256];
|
|
char fileName[280];
|
|
GetCurrentDirectoryA(sizeof(curDir), curDir);
|
|
sprintf(dirName, "%s/Windows64/GameHDD/%s", curDir, m_szSaveUniqueName);
|
|
CreateDirectoryA(dirName, 0);
|
|
sprintf(fileName, "%s/saveData.ms", dirName);
|
|
|
|
HANDLE h = CreateFileA(fileName, GENERIC_READ, 0, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
|
|
|
|
bool success = false;
|
|
if (h != INVALID_HANDLE_VALUE)
|
|
{
|
|
DWORD bytesRead = 0;
|
|
BOOL res = ReadFile(h, m_pSaveData, m_uiSaveSize, &bytesRead, 0);
|
|
_ASSERT(!res || bytesRead != m_uiSaveSize);
|
|
CloseHandle(h);
|
|
success = true;
|
|
}
|
|
|
|
if (Func)
|
|
{
|
|
Func(lpParam, 0, success);
|
|
}
|
|
|
|
return C4JStorage::ESaveGame_Idle;
|
|
}
|
|
|
|
unsigned int CSaveGame::GetSaveSize()
|
|
{
|
|
return m_uiSaveSize;
|
|
}
|
|
|
|
void CSaveGame::GetSaveData(void* pvData, unsigned int* puiBytes)
|
|
{
|
|
if (pvData)
|
|
{
|
|
memmove(pvData, m_pSaveData, m_uiSaveSize);
|
|
*puiBytes = m_uiSaveSize;
|
|
}
|
|
else
|
|
{
|
|
*puiBytes = 0;
|
|
}
|
|
}
|
|
|
|
bool CSaveGame::GetSaveUniqueNumber(INT* piVal)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
bool CSaveGame::GetSaveUniqueFilename(char* pszName)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
void CSaveGame::SetSaveTitle(LPCWSTR pwchDefaultSaveName)
|
|
{
|
|
CreateSaveUniqueName();
|
|
memmove(m_szSaveTitle, pwchDefaultSaveName, sizeof(m_szSaveTitle));
|
|
}
|
|
|
|
PVOID CSaveGame::AllocateSaveData(unsigned int uiBytes)
|
|
{
|
|
free(m_pSaveData);
|
|
|
|
m_pSaveData = malloc(uiBytes);
|
|
if (m_pSaveData)
|
|
{
|
|
m_uiSaveSize = uiBytes;
|
|
}
|
|
|
|
return m_pSaveData;
|
|
}
|
|
|
|
void CSaveGame::SetSaveImages(PBYTE pbThumbnail, DWORD dwThumbnailBytes, PBYTE pbImage, DWORD dwImageBytes, PBYTE pbTextData, DWORD dwTextDataBytes)
|
|
{
|
|
;
|
|
}
|
|
|
|
C4JStorage::ESaveGameState CSaveGame::SaveSaveData(int(*Func)(LPVOID, const bool), LPVOID lpParam)
|
|
{
|
|
char dirName[256];
|
|
char curDir[256];
|
|
char fileName[280];
|
|
GetCurrentDirectoryA(sizeof(curDir), curDir);
|
|
sprintf(dirName, "%s/Windows64/GameHDD/%s", curDir, m_szSaveUniqueName);
|
|
CreateDirectoryA(dirName, 0);
|
|
sprintf(fileName, "%s/saveData.ms", dirName);
|
|
|
|
HANDLE h = CreateFileA(fileName, GENERIC_WRITE, 0, nullptr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
|
|
|
|
DWORD bytesWritten = 0;
|
|
BOOL res = WriteFile(h, m_pSaveData, m_uiSaveSize, &bytesWritten, 0);
|
|
_ASSERT(!res || bytesWritten != m_uiSaveSize);
|
|
|
|
CloseHandle(h);
|
|
|
|
Func(lpParam, true);
|
|
|
|
return C4JStorage::ESaveGame_Idle;
|
|
}
|
|
|
|
C4JStorage::ESaveGameState CSaveGame::DeleteSaveData(PSAVE_INFO pSaveInfo, int(*Func)(LPVOID lpParam, const bool), LPVOID lpParam)
|
|
{
|
|
return C4JStorage::ESaveGame_Idle;
|
|
}
|
|
|
|
void CSaveGame::SetSaveUniqueFilename(char* szFilename)
|
|
{
|
|
strcpy_s(m_szSaveUniqueName, szFilename);
|
|
}
|
|
|
|
|
|
void CSaveGame::CreateSaveUniqueName(void)
|
|
{
|
|
_SYSTEMTIME UTCSysTime;
|
|
GetSystemTime(&UTCSysTime);
|
|
|
|
sprintf_s(m_szSaveUniqueName, sizeof(m_szSaveUniqueName),
|
|
"%4d%02d%02d%02d%02d%02d",
|
|
UTCSysTime.wYear,
|
|
UTCSysTime.wMonth,
|
|
UTCSysTime.wDay,
|
|
UTCSysTime.wHour,
|
|
UTCSysTime.wMinute,
|
|
UTCSysTime.wSecond);
|
|
}
|