diff --git a/Source/pfile.cpp b/Source/pfile.cpp index e301de36d..29dd0622b 100644 --- a/Source/pfile.cpp +++ b/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; diff --git a/Source/pfile.h b/Source/pfile.h index c86868f01..81ac9eb4c 100644 --- a/Source/pfile.h +++ b/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__ */