|
|
|
|
@ -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; |
|
|
|
|
|