Browse Source

Reorder pfile.cpp

pull/914/head
Anders Jenbo 6 years ago
parent
commit
3b8b5f9007
  1. 438
      Source/pfile.cpp
  2. 15
      Source/pfile.h

438
Source/pfile.cpp

@ -19,24 +19,7 @@
static char hero_names[MAX_CHARACTERS][PLR_NAME_LEN];
BOOL gbValidSaveFile;
void pfile_init_save_directory()
{
DWORD len;
char Buffer[MAX_PATH];
len = GetWindowsDirectory(Buffer, sizeof(Buffer));
if (len) {
pfile_check_available_space(Buffer);
len = GetModuleFileName(ghInst, Buffer, sizeof(Buffer));
}
if (!len)
app_fatal("Unable to initialize save directory");
else
pfile_check_available_space(Buffer);
}
void pfile_check_available_space(char *pszDir)
static void pfile_check_available_space(char *pszDir)
{
char *s;
BOOL hasSpace;
@ -64,20 +47,90 @@ void pfile_check_available_space(char *pszDir)
DiskFreeDlg(pszDir);
}
void pfile_write_hero()
void pfile_init_save_directory()
{
DWORD save_num;
PkPlayerStruct pkplr;
DWORD len;
char Buffer[MAX_PATH];
save_num = pfile_get_save_num_from_name(plr[myplr]._pName);
if (pfile_open_archive(TRUE, save_num)) {
PackPlayer(&pkplr, myplr, gbMaxPlayers == 1);
pfile_encode_hero(&pkplr);
pfile_flush(gbMaxPlayers == 1, save_num);
len = GetWindowsDirectory(Buffer, sizeof(Buffer));
if (len) {
pfile_check_available_space(Buffer);
len = GetModuleFileName(ghInst, Buffer, sizeof(Buffer));
}
if (!len)
app_fatal("Unable to initialize save directory");
else
pfile_check_available_space(Buffer);
}
DWORD pfile_get_save_num_from_name(const char *name)
static char *GetSaveDirectory(char *dst, int dst_size, DWORD save_num)
{
DWORD dirLen;
char FileName[MAX_PATH];
const char *savename;
// BUGFIX: ignores dst_size and uses MAX_PATH instead
if (gbMaxPlayers > 1) {
#ifdef SPAWN
savename = "\\slinfo_%d.drv";
#else
savename = "\\dlinfo_%d.drv";
#endif
dirLen = GetWindowsDirectory(dst, MAX_PATH);
} else {
char *s;
#ifdef SPAWN
savename = "\\spawn_%d.sv";
#else
savename = "\\single_%d.sv";
#endif
dirLen = GetModuleFileName(ghInst, dst, MAX_PATH);
s = strrchr(dst, '\\');
if (s)
*s = '\0';
}
if (!dirLen)
app_fatal("Unable to get save directory");
sprintf(FileName, savename, save_num);
strcat(dst, FileName);
return _strlwr(dst);
}
static void pfile_get_save_path(char *pszBuf, DWORD dwBufSize, DWORD save_num)
{
DWORD plen;
char *s;
char path[MAX_PATH];
#ifdef SPAWN
const char *fmt = "\\share_%d.sv";
if (gbMaxPlayers <= 1)
fmt = "\\spawn%d.sv";
#else
const char *fmt = "\\multi_%d.sv";
if (gbMaxPlayers <= 1)
fmt = "\\single_%d.sv";
#endif
// BUGFIX: ignores dwBufSize and uses MAX_PATH instead
plen = GetModuleFileName(ghInst, pszBuf, MAX_PATH);
s = strrchr(pszBuf, '\\');
if (s)
*s = '\0';
if (!plen)
app_fatal("Unable to get save directory");
sprintf(path, fmt, save_num);
strcat(pszBuf, path);
_strlwr(pszBuf);
}
static DWORD pfile_get_save_num_from_name(const char *name)
{
DWORD i;
@ -89,7 +142,51 @@ DWORD pfile_get_save_num_from_name(const char *name)
return i;
}
void pfile_encode_hero(const PkPlayerStruct *pPack)
static BOOL pfile_read_hero(HANDLE archive, PkPlayerStruct *pPack)
{
HANDLE file;
BOOL decoded;
DWORD dwlen, nSize;
BYTE *buf;
if (!SFileOpenFileEx(archive, "hero", 0, &file)) {
return FALSE;
} else {
BOOL ret = FALSE;
char password[16] = PASSWORD_SINGLE;
nSize = 16;
if (gbMaxPlayers > 1)
strcpy(password, PASSWORD_MULTI);
dwlen = SFileGetFileSize(file, NULL);
if (dwlen) {
DWORD read;
buf = DiabloAllocPtr(dwlen);
if (SFileReadFile(file, buf, dwlen, &read, NULL)) {
decoded = TRUE;
read = codec_decode(buf, dwlen, password);
if (!read && gbMaxPlayers > 1) {
GetComputerName(password, &nSize);
if (SFileSetFilePointer(file, 0, NULL, FILE_BEGIN) || !SFileReadFile(file, buf, dwlen, &read, NULL))
decoded = FALSE;
else
read = codec_decode(buf, dwlen, password);
}
if (decoded && read == sizeof(*pPack)) {
memcpy(pPack, buf, sizeof(*pPack));
ret = TRUE;
}
}
if (buf)
mem_free_dbg(buf);
}
SFileCloseFile(file);
return ret;
}
}
static void pfile_encode_hero(const PkPlayerStruct *pPack)
{
BYTE *packed;
DWORD packed_len;
@ -106,7 +203,7 @@ void pfile_encode_hero(const PkPlayerStruct *pPack)
mem_free_dbg(packed);
}
BOOL pfile_open_archive(BOOL update, DWORD save_num)
static BOOL pfile_open_archive(BOOL update, DWORD save_num)
{
char FileName[MAX_PATH];
@ -119,43 +216,44 @@ BOOL pfile_open_archive(BOOL update, DWORD save_num)
return FALSE;
}
void pfile_get_save_path(char *pszBuf, DWORD dwBufSize, DWORD save_num)
static void pfile_flush(BOOL is_single_player, DWORD save_num)
{
DWORD plen;
char *s;
char path[MAX_PATH];
#ifdef SPAWN
const char *fmt = "\\share_%d.sv";
if (gbMaxPlayers <= 1)
fmt = "\\spawn%d.sv";
#else
const char *fmt = "\\multi_%d.sv";
char FileName[MAX_PATH];
if (gbMaxPlayers <= 1)
fmt = "\\single_%d.sv";
#endif
pfile_get_save_path(FileName, sizeof(FileName), save_num);
mpqapi_flush_and_close(FileName, is_single_player, save_num);
}
// BUGFIX: ignores dwBufSize and uses MAX_PATH instead
plen = GetModuleFileName(ghInst, pszBuf, MAX_PATH);
s = strrchr(pszBuf, '\\');
if (s)
*s = '\0';
/**
* @param showFixedMsg Display a dialog if a save file was corrected (deprecated)
*/
static HANDLE pfile_open_save_archive(BOOL *showFixedMsg, DWORD save_num)
{
char SrcStr[MAX_PATH];
HANDLE archive;
if (!plen)
app_fatal("Unable to get save directory");
pfile_get_save_path(SrcStr, sizeof(SrcStr), save_num);
if (SFileOpenArchive(SrcStr, 0x7000, FS_PC, &archive))
return archive;
return NULL;
}
sprintf(path, fmt, save_num);
strcat(pszBuf, path);
_strlwr(pszBuf);
static void pfile_SFileCloseArchive(HANDLE hsArchive)
{
SFileCloseArchive(hsArchive);
}
void pfile_flush(BOOL is_single_player, DWORD save_num)
void pfile_write_hero()
{
char FileName[MAX_PATH];
DWORD save_num;
PkPlayerStruct pkplr;
pfile_get_save_path(FileName, sizeof(FileName), save_num);
mpqapi_flush_and_close(FileName, is_single_player, save_num);
save_num = pfile_get_save_num_from_name(plr[myplr]._pName);
if (pfile_open_archive(TRUE, save_num)) {
PackPlayer(&pkplr, myplr, gbMaxPlayers == 1);
pfile_encode_hero(&pkplr);
pfile_flush(gbMaxPlayers == 1, save_num);
}
}
BOOL pfile_create_player_description(char *dst, DWORD len)
@ -213,28 +311,28 @@ void pfile_flush_W()
pfile_flush(TRUE, pfile_get_save_num_from_name(plr[myplr]._pName));
}
void game_2_ui_player(const PlayerStruct *p, _uiheroinfo *heroinfo, BOOL bHasSaveFile)
static char pfile_get_player_class(unsigned int player_class_nr)
{
memset(heroinfo, 0, sizeof(*heroinfo));
strncpy(heroinfo->name, p->_pName, sizeof(heroinfo->name) - 1);
heroinfo->name[sizeof(heroinfo->name) - 1] = '\0';
heroinfo->level = p->_pLevel;
heroinfo->heroclass = game_2_ui_class(p);
heroinfo->strength = p->_pStrength;
heroinfo->magic = p->_pMagic;
heroinfo->dexterity = p->_pDexterity;
heroinfo->vitality = p->_pVitality;
heroinfo->gold = p->_pGold;
heroinfo->hassaved = bHasSaveFile;
heroinfo->herorank = p->pDiabloKillLevel;
#ifdef SPAWN
heroinfo->spawned = TRUE;
#else
heroinfo->spawned = FALSE;
char pc_class;
if (player_class_nr == UI_WARRIOR)
pc_class = PC_WARRIOR;
else if (player_class_nr == UI_ROGUE)
pc_class = PC_ROGUE;
#ifdef HELLFIRE
else if (player_class_nr == 3)
pc_class = PC_MONK;
else if (player_class_nr == 4)
pc_class = PC_BARD;
else if (player_class_nr == 5)
pc_class = PC_BARBARIAN;
#endif
else
pc_class = PC_SORCERER;
return pc_class;
}
BYTE game_2_ui_class(const PlayerStruct *p)
static BYTE game_2_ui_class(const PlayerStruct *p) // game_2_ui_class
{
BYTE uiclass;
if (p->_pClass == PC_WARRIOR)
@ -255,6 +353,27 @@ BYTE game_2_ui_class(const PlayerStruct *p)
return uiclass;
}
void game_2_ui_player(const PlayerStruct *p, _uiheroinfo *heroinfo, BOOL bHasSaveFile)
{
memset(heroinfo, 0, sizeof(*heroinfo));
strncpy(heroinfo->name, p->_pName, sizeof(heroinfo->name) - 1);
heroinfo->name[sizeof(heroinfo->name) - 1] = '\0';
heroinfo->level = p->_pLevel;
heroinfo->heroclass = game_2_ui_class(p);
heroinfo->strength = p->_pStrength;
heroinfo->magic = p->_pMagic;
heroinfo->dexterity = p->_pDexterity;
heroinfo->vitality = p->_pVitality;
heroinfo->gold = p->_pGold;
heroinfo->hassaved = bHasSaveFile;
heroinfo->herorank = p->pDiabloKillLevel;
#ifdef SPAWN
heroinfo->spawned = TRUE;
#else
heroinfo->spawned = FALSE;
#endif
}
BOOL __stdcall pfile_ui_set_hero_infos(BOOL(__stdcall *ui_add_hero_info)(_uiheroinfo *))
{
DWORD i, save_num;
@ -313,104 +432,6 @@ BOOL __stdcall pfile_ui_set_hero_infos(BOOL(__stdcall *ui_add_hero_info)(_uihero
return TRUE;
}
char *GetSaveDirectory(char *dst, int dst_size, DWORD save_num)
{
DWORD dirLen;
char FileName[MAX_PATH];
const char *savename;
// BUGFIX: ignores dst_size and uses MAX_PATH instead
if (gbMaxPlayers > 1) {
#ifdef SPAWN
savename = "\\slinfo_%d.drv";
#else
savename = "\\dlinfo_%d.drv";
#endif
dirLen = GetWindowsDirectory(dst, MAX_PATH);
} else {
char *s;
#ifdef SPAWN
savename = "\\spawn_%d.sv";
#else
savename = "\\single_%d.sv";
#endif
dirLen = GetModuleFileName(ghInst, dst, MAX_PATH);
s = strrchr(dst, '\\');
if (s)
*s = '\0';
}
if (!dirLen)
app_fatal("Unable to get save directory");
sprintf(FileName, savename, save_num);
strcat(dst, FileName);
return _strlwr(dst);
}
BOOL pfile_read_hero(HANDLE archive, PkPlayerStruct *pPack)
{
HANDLE file;
BOOL decoded;
DWORD dwlen, nSize;
BYTE *buf;
if (!SFileOpenFileEx(archive, "hero", 0, &file)) {
return FALSE;
} else {
BOOL ret = FALSE;
char password[16] = PASSWORD_SINGLE;
nSize = 16;
if (gbMaxPlayers > 1)
strcpy(password, PASSWORD_MULTI);
dwlen = SFileGetFileSize(file, NULL);
if (dwlen) {
DWORD read;
buf = DiabloAllocPtr(dwlen);
if (SFileReadFile(file, buf, dwlen, &read, NULL)) {
decoded = TRUE;
read = codec_decode(buf, dwlen, password);
if (!read && gbMaxPlayers > 1) {
GetComputerName(password, &nSize);
if (SFileSetFilePointer(file, 0, NULL, FILE_BEGIN) || !SFileReadFile(file, buf, dwlen, &read, NULL))
decoded = FALSE;
else
read = codec_decode(buf, dwlen, password);
}
if (decoded && read == sizeof(*pPack)) {
memcpy(pPack, buf, sizeof(*pPack));
ret = TRUE;
}
}
if (buf)
mem_free_dbg(buf);
}
SFileCloseFile(file);
return ret;
}
}
/**
* @param showFixedMsg Display a dialog if a save file was corrected (deprecated)
*/
HANDLE pfile_open_save_archive(BOOL *showFixedMsg, DWORD save_num)
{
char SrcStr[MAX_PATH];
HANDLE archive;
pfile_get_save_path(SrcStr, sizeof(SrcStr), save_num);
if (SFileOpenArchive(SrcStr, 0x7000, FS_PC, &archive))
return archive;
return NULL;
}
void pfile_SFileCloseArchive(HANDLE hsArchive)
{
SFileCloseArchive(hsArchive);
}
BOOL pfile_archive_contains_game(HANDLE hsArchive, DWORD save_num)
{
HANDLE file;
@ -437,27 +458,6 @@ BOOL __stdcall pfile_ui_set_class_stats(unsigned int player_class_nr, _uidefault
return TRUE;
}
char pfile_get_player_class(unsigned int player_class_nr)
{
char pc_class;
if (player_class_nr == UI_WARRIOR)
pc_class = PC_WARRIOR;
else if (player_class_nr == UI_ROGUE)
pc_class = PC_ROGUE;
#ifdef HELLFIRE
else if (player_class_nr == 3)
pc_class = PC_MONK;
else if (player_class_nr == 4)
pc_class = PC_BARD;
else if (player_class_nr == 5)
pc_class = PC_BARBARIAN;
#endif
else
pc_class = PC_SORCERER;
return pc_class;
}
BOOL __stdcall pfile_ui_save_create(_uiheroinfo *heroinfo)
{
DWORD save_num;
@ -583,18 +583,23 @@ void pfile_get_game_name(char *dst)
strcpy(dst, "game");
}
void pfile_remove_temp_files()
static BOOL __stdcall GetPermSaveNames(DWORD dwIndex, char *szPerm)
{
if (gbMaxPlayers <= 1) {
DWORD save_num = pfile_get_save_num_from_name(plr[myplr]._pName);
if (!pfile_open_archive(FALSE, save_num))
app_fatal("Unable to write to save file archive");
mpqapi_remove_hash_entries(GetTempSaveNames);
pfile_flush(TRUE, save_num);
}
const char *fmt;
if (dwIndex < 17)
fmt = "perml%02d";
else if (dwIndex < 34) {
dwIndex -= 17;
fmt = "perms%02d";
} else
return FALSE;
sprintf(szPerm, fmt, dwIndex);
return TRUE;
}
BOOL __stdcall GetTempSaveNames(DWORD dwIndex, char *szTemp)
static BOOL __stdcall GetTempSaveNames(DWORD dwIndex, char *szTemp)
{
const char *fmt;
@ -610,6 +615,17 @@ BOOL __stdcall GetTempSaveNames(DWORD dwIndex, char *szTemp)
return TRUE;
}
void pfile_remove_temp_files()
{
if (gbMaxPlayers <= 1) {
DWORD save_num = pfile_get_save_num_from_name(plr[myplr]._pName);
if (!pfile_open_archive(FALSE, save_num))
app_fatal("Unable to write to save file archive");
mpqapi_remove_hash_entries(GetTempSaveNames);
pfile_flush(TRUE, save_num);
}
}
void pfile_rename_temp_to_perm()
{
DWORD dwChar, dwIndex;
@ -639,22 +655,6 @@ void pfile_rename_temp_to_perm()
pfile_flush(TRUE, dwChar);
}
BOOL __stdcall GetPermSaveNames(DWORD dwIndex, char *szPerm)
{
const char *fmt;
if (dwIndex < 17)
fmt = "perml%02d";
else if (dwIndex < 34) {
dwIndex -= 17;
fmt = "perms%02d";
} else
return FALSE;
sprintf(szPerm, fmt, dwIndex);
return TRUE;
}
void pfile_write_save_file(const char *pszName, BYTE *pbData, DWORD dwLen, DWORD qwLen)
{
DWORD save_num;

15
Source/pfile.h

@ -9,26 +9,15 @@
extern BOOL gbValidSaveFile;
void pfile_init_save_directory();
void pfile_check_available_space(char *pszDir);
void pfile_write_hero();
DWORD pfile_get_save_num_from_name(const char *name);
void pfile_encode_hero(const PkPlayerStruct *pPack);
BOOL pfile_open_archive(BOOL update, DWORD save_num);
void pfile_get_save_path(char *pszBuf, DWORD dwBufSize, DWORD save_num);
void pfile_flush(BOOL is_single_player, DWORD save_num);
BOOL pfile_create_player_description(char *dst, DWORD len);
BOOL pfile_rename_hero(const char *name_1, const char *name_2);
void pfile_flush_W();
void game_2_ui_player(const PlayerStruct *p, _uiheroinfo *heroinfo, BOOL bHasSaveFile);
BYTE game_2_ui_class(const PlayerStruct *p);
BOOL __stdcall pfile_ui_set_hero_infos(BOOL(__stdcall *ui_add_hero_info)(_uiheroinfo *));
char *GetSaveDirectory(char *dst, int dst_size, DWORD save_num);
BOOL pfile_read_hero(HANDLE archive, PkPlayerStruct *pPack);
HANDLE pfile_open_save_archive(BOOL *showFixedMsg, DWORD save_num);
void pfile_SFileCloseArchive(HANDLE hsArchive);
BOOL pfile_archive_contains_game(HANDLE hsArchive, DWORD save_num);
BOOL __stdcall pfile_ui_set_class_stats(unsigned int player_class_nr, _uidefaultstats *class_stats);
char pfile_get_player_class(unsigned int player_class_nr);
BOOL __stdcall pfile_ui_save_create(_uiheroinfo *heroinfo);
BOOL __stdcall pfile_get_file_name(DWORD lvl, char *dst);
BOOL __stdcall pfile_delete_save(_uiheroinfo *hero_info);
@ -37,14 +26,10 @@ void GetTempLevelNames(char *szTemp);
void GetPermLevelNames(char *szPerm);
void pfile_get_game_name(char *dst);
void pfile_remove_temp_files();
BOOL __stdcall GetTempSaveNames(DWORD dwIndex, char *szTemp);
void pfile_rename_temp_to_perm();
BOOL __stdcall GetPermSaveNames(DWORD dwIndex, char *szPerm);
void pfile_write_save_file(const char *pszName, BYTE *pbData, DWORD dwLen, DWORD qwLen);
void pfile_strcpy(char *dst, const char *src);
BYTE *pfile_read(const char *pszName, DWORD *pdwLen);
void pfile_update(BOOL force_save);
/* rdata */
#endif /* __PFILE_H__ */

Loading…
Cancel
Save