diff --git a/DiabloUI/_temp_data.cpp b/DiabloUI/_temp_data.cpp index 24c76fae9..0d5e90b2c 100644 --- a/DiabloUI/_temp_data.cpp +++ b/DiabloUI/_temp_data.cpp @@ -315,7 +315,7 @@ char byte_1002A380[128]; // weak int dword_1002A400; // weak int dword_1002A404; // weak int dword_1002A408; // weak -BOOL (__stdcall *selhero_fnstats)(int, _uidefaultstats *); +BOOL (__stdcall *selhero_fnstats)(unsigned int, _uidefaultstats *); int SelHero_cpp_float; // weak DWORD selhero_sizedata[2]; // idb int selhero_difficulty; // weak diff --git a/DiabloUI/diabloui.h b/DiabloUI/diabloui.h index d85a9f1df..3258df8e4 100644 --- a/DiabloUI/diabloui.h +++ b/DiabloUI/diabloui.h @@ -34,8 +34,8 @@ void __cdecl UiInitialize(); BOOL __stdcall UiCopyProtError(int *pdwResult); void __stdcall UiAppActivate(BOOL bActive); BOOL __fastcall UiValidPlayerName(char *name); /* check __stdcall */ -BOOL __stdcall UiSelHeroMultDialog(BOOL (__stdcall *fninfo)(BOOL (__stdcall *fninfofunc)(_uiheroinfo *)), BOOL (__stdcall *fncreate)(_uiheroinfo *), BOOL (__stdcall *fnremove)(_uiheroinfo *), BOOL (__stdcall *fnstats)(int, _uidefaultstats *), int *dlgresult, int *a6, char *name); -BOOL __stdcall UiSelHeroSingDialog(BOOL (__stdcall *fninfo)(BOOL (__stdcall *fninfofunc)(_uiheroinfo *)), BOOL (__stdcall *fncreate)(_uiheroinfo *), BOOL (__stdcall *fnremove)(_uiheroinfo *), BOOL (__stdcall *fnstats)(int, _uidefaultstats *), int *dlgresult, char *name, int *difficulty); +BOOL __stdcall UiSelHeroMultDialog(BOOL (__stdcall *fninfo)(BOOL (__stdcall *fninfofunc)(_uiheroinfo *)), BOOL (__stdcall *fncreate)(_uiheroinfo *), BOOL (__stdcall *fnremove)(_uiheroinfo *), BOOL (__stdcall *fnstats)(unsigned int, _uidefaultstats *), int *dlgresult, int *a6, char *name); +BOOL __stdcall UiSelHeroSingDialog(BOOL (__stdcall *fninfo)(BOOL (__stdcall *fninfofunc)(_uiheroinfo *)), BOOL (__stdcall *fncreate)(_uiheroinfo *), BOOL (__stdcall *fnremove)(_uiheroinfo *), BOOL (__stdcall *fnstats)(unsigned int, _uidefaultstats *), int *dlgresult, char *name, int *difficulty); BOOL __stdcall UiCreditsDialog(int a1); BOOL __stdcall UiMainMenuDialog(char *name, int *pdwResult, void (__stdcall *fnSound)(char *file), int a4); int __stdcall UiProgressDialog(HWND window, char *msg, int a3, void *fnfunc, int a5); diff --git a/DiabloUI/selhero.cpp b/DiabloUI/selhero.cpp index a9cb92dc6..f5a53953f 100644 --- a/DiabloUI/selhero.cpp +++ b/DiabloUI/selhero.cpp @@ -219,7 +219,7 @@ BOOL __fastcall UiValidPlayerName(char *name) } // ref: 0x1000BBB4 -BOOL __stdcall UiSelHeroMultDialog(BOOL (__stdcall *fninfo)(BOOL (__stdcall *fninfofunc)(_uiheroinfo *)), BOOL (__stdcall *fncreate)(_uiheroinfo *), BOOL (__stdcall *fnremove)(_uiheroinfo *), BOOL (__stdcall *fnstats)(int, _uidefaultstats *), int *dlgresult, int *a6, char *name) +BOOL __stdcall UiSelHeroMultDialog(BOOL (__stdcall *fninfo)(BOOL (__stdcall *fninfofunc)(_uiheroinfo *)), BOOL (__stdcall *fncreate)(_uiheroinfo *), BOOL (__stdcall *fnremove)(_uiheroinfo *), BOOL (__stdcall *fnstats)(unsigned int, _uidefaultstats *), int *dlgresult, int *a6, char *name) { int v7; // eax int v8; // eax @@ -762,7 +762,7 @@ BOOL __stdcall SelHero_GetHeroInfo(_uiheroinfo *pInfo) // 1002A428: using guessed type int selhero_numheroesleft; // ref: 0x1000C57A -BOOL __stdcall UiSelHeroSingDialog(BOOL (__stdcall *fninfo)(BOOL (__stdcall *fninfofunc)(_uiheroinfo *)), BOOL (__stdcall *fncreate)(_uiheroinfo *), BOOL (__stdcall *fnremove)(_uiheroinfo *), BOOL (__stdcall *fnstats)(int, _uidefaultstats *), int *dlgresult, char *name, int *difficulty) +BOOL __stdcall UiSelHeroSingDialog(BOOL (__stdcall *fninfo)(BOOL (__stdcall *fninfofunc)(_uiheroinfo *)), BOOL (__stdcall *fncreate)(_uiheroinfo *), BOOL (__stdcall *fnremove)(_uiheroinfo *), BOOL (__stdcall *fnstats)(unsigned int, _uidefaultstats *), int *dlgresult, char *name, int *difficulty) { int v7; // eax int v8; // edi diff --git a/Source/mpqapi.cpp b/Source/mpqapi.cpp index b7ac94731..6af9e837b 100644 --- a/Source/mpqapi.cpp +++ b/Source/mpqapi.cpp @@ -315,9 +315,9 @@ void __fastcall mpqapi_remove_hash_entries(BOOL (__stdcall *fnGetName)(DWORD, ch } } -BOOL __fastcall mpqapi_write_file(const char *pszName, const char *pbData, DWORD dwLen) +BOOL __fastcall mpqapi_write_file(const char *pszName, const BYTE *pbData, DWORD dwLen) { - const char *v3; // edi + const BYTE *v3; // edi const char *v4; // esi _BLOCKENTRY *v5; // eax @@ -379,7 +379,7 @@ _BLOCKENTRY *__fastcall mpqapi_add_file(const char *pszName, _BLOCKENTRY *pBlk, return v12; } -bool __fastcall mpqapi_write_file_contents(const char *pszName, const char *pbData, int dwLen, _BLOCKENTRY *pBlk) +bool __fastcall mpqapi_write_file_contents(const char *pszName, const BYTE *pbData, int dwLen, _BLOCKENTRY *pBlk) { const char *v4; // esi const char *v5; // eax @@ -393,7 +393,7 @@ bool __fastcall mpqapi_write_file_contents(const char *pszName, const char *pbDa unsigned int v14; // eax int v15; // ecx int size; // [esp+Ch] [ebp-10h] - const char *v17; // [esp+10h] [ebp-Ch] + const BYTE *v17; // [esp+10h] [ebp-Ch] int v18; // [esp+14h] [ebp-8h] DWORD nNumberOfBytesToWrite; // [esp+18h] [ebp-4h] diff --git a/Source/mpqapi.h b/Source/mpqapi.h index bcfadc40f..e28e88443 100644 --- a/Source/mpqapi.h +++ b/Source/mpqapi.h @@ -24,9 +24,9 @@ _BLOCKENTRY *__fastcall mpqapi_new_block(int *block_index); int __fastcall mpqapi_get_hash_index_of_path(const char *pszName); int __fastcall mpqapi_get_hash_index(short index, int hash_a, int hash_b, int locale); void __fastcall mpqapi_remove_hash_entries(BOOL (__stdcall *fnGetName)(DWORD, char *)); -BOOL __fastcall mpqapi_write_file(const char *pszName, const char *pbData, DWORD dwLen); +BOOL __fastcall mpqapi_write_file(const char *pszName, const BYTE *pbData, DWORD dwLen); _BLOCKENTRY *__fastcall mpqapi_add_file(const char *pszName, _BLOCKENTRY *pBlk, int block_index); -bool __fastcall mpqapi_write_file_contents(const char *pszName, const char *pbData, int dwLen, _BLOCKENTRY *pBlk); +bool __fastcall mpqapi_write_file_contents(const char *pszName, const BYTE *pbData, int dwLen, _BLOCKENTRY *pBlk); int __fastcall mpqapi_find_free_block(int size, int *block_size); void __fastcall mpqapi_rename(char *pszOld, char *pszNew); BOOL __fastcall mpqapi_has_file(const char *pszName); diff --git a/Source/pfile.cpp b/Source/pfile.cpp index 133ea6ef4..9372eba15 100644 --- a/Source/pfile.cpp +++ b/Source/pfile.cpp @@ -5,20 +5,10 @@ #define PASSWORD_SINGLE "xrgyrkj1" #define PASSWORD_MULTI "szqnlsk1" -static int pfile_cpp_init_value; -static char hero_names[MAX_CHARACTERS][PLR_NAME_LEN]; -BOOL gbValidSaveFile; // idb - -const int pfile_inf = 0x7F800000; // weak +static float pfile_cpp_init_value = INFINITY; -struct pfile_cpp_init -{ - pfile_cpp_init() - { - pfile_cpp_init_value = pfile_inf; - } -} _pfile_cpp_init; -// 47F1C0: using guessed type int pfile_inf; +static char hero_names[MAX_CHARACTERS][PLR_NAME_LEN]; +BOOL gbValidSaveFile; void __cdecl pfile_init_save_directory() { @@ -92,7 +82,7 @@ unsigned int __fastcall pfile_get_save_num_from_name(const char *name) void __fastcall pfile_encode_hero(const PkPlayerStruct *pPack) { - char *packed; + BYTE *packed; DWORD packed_len; char password[16] = PASSWORD_SINGLE; @@ -100,7 +90,7 @@ void __fastcall pfile_encode_hero(const PkPlayerStruct *pPack) strcpy(password, PASSWORD_MULTI); packed_len = codec_get_encoded_len(sizeof(*pPack)); - packed = (char*)DiabloAllocPtr(packed_len); + packed = (BYTE*)DiabloAllocPtr(packed_len); memcpy(packed, pPack, sizeof(*pPack)); codec_encode(packed, sizeof(*pPack), packed_len, password); mpqapi_write_file("hero", packed, packed_len); @@ -152,65 +142,54 @@ void __fastcall pfile_flush(BOOL is_single_player, unsigned int save_num) mpqapi_flush_and_close(FileName, is_single_player, save_num); } -bool __fastcall pfile_create_player_description(char *dst, int len) +BOOL __fastcall pfile_create_player_description(char *dst, unsigned int len) { - int v2; // edi - char *v3; // ebx - int v4; // eax - char src[128]; // [esp+Ch] [ebp-ACh] - _uiheroinfo hero_info; // [esp+8Ch] [ebp-2Ch] + char desc[128]; + _uiheroinfo uihero; myplr = 0; - v2 = len; - v3 = dst; pfile_read_player_from_save(); - game_2_ui_player(plr, &hero_info, gbValidSaveFile); - UiSetupPlayerInfo(chr_name_str, &hero_info, 'DRTL'); - if ( !v3 || !v2 ) - goto LABEL_5; - v4 = UiCreatePlayerDescription(&hero_info, 'DRTL', src); - if ( v4 ) - { - SStrCopy(v3, src, v2); -LABEL_5: - v4 = 1; + game_2_ui_player(plr, &uihero, gbValidSaveFile); + UiSetupPlayerInfo(chr_name_str, &uihero, GAME_ID); + + if ( dst != NULL && len ) { + if ( UiCreatePlayerDescription(&uihero, GAME_ID, desc) == 0 ) + return FALSE; + SStrCopy(dst, desc, len); } - return v4; + return TRUE; } -int __fastcall pfile_create_save_file(char *name_1, char *name_2) +BOOL __fastcall pfile_create_save_file(const char *name_1, const char *name_2) { - char *v2; // edi - char *v3; // ebp - int v4; // esi - int v5; // eax - char *v7; // [esp+20h] [ebp-30h] - _uiheroinfo heroinfo; // [esp+24h] [ebp-2Ch] + int i; + unsigned int save_num; + _uiheroinfo uihero; + BOOL found = FALSE; - v2 = name_2; - v3 = name_1; - if ( pfile_get_save_num_from_name(name_2) != MAX_CHARACTERS ) - return 0; - v4 = 0; - v7 = plr[0]._pName; - while ( _strcmpi(v3, v7) ) - { - v7 += 21720; - ++v4; - if ( v7 == plr[4]._pName ) - return 0; + if ( pfile_get_save_num_from_name(name_2) == MAX_CHARACTERS ) { + for ( i = 0; i != MAX_PLRS; i++ ) { + if ( !_strcmpi(name_1, plr[i]._pName) ) { + found = TRUE; + break; + } + } } - v5 = pfile_get_save_num_from_name(v3); - if ( v5 == MAX_CHARACTERS ) - return 0; - SStrCopy(hero_names[v5], v2, 32); - SStrCopy(plr[v4]._pName, v2, 32); - if ( !_strcmpi(chr_name_str, v3) ) - SStrCopy(chr_name_str, v2, 16); - game_2_ui_player(plr, &heroinfo, gbValidSaveFile); - UiSetupPlayerInfo(chr_name_str, &heroinfo, 'DRTL'); + + if ( !found ) + return FALSE; + save_num = pfile_get_save_num_from_name(name_1); + if ( save_num == MAX_CHARACTERS ) + return FALSE; + + SStrCopy(hero_names[save_num], name_2, PLR_NAME_LEN); + SStrCopy(plr[i]._pName, name_2, PLR_NAME_LEN); + if ( !_strcmpi(chr_name_str, name_1) ) + SStrCopy(chr_name_str, name_2, sizeof(chr_name_str)); + game_2_ui_player(plr, &uihero, gbValidSaveFile); + UiSetupPlayerInfo(chr_name_str, &uihero, GAME_ID); pfile_write_hero(); - return 1; + return TRUE; } void __cdecl pfile_flush_W() @@ -250,89 +229,61 @@ unsigned char __fastcall game_2_ui_class(const PlayerStruct *p) BOOL __stdcall pfile_ui_set_hero_infos(BOOL (__stdcall *ui_add_hero_info)(_uiheroinfo *)) { - char *v1; // esi - //int v2; // eax - int v3; // eax - DWORD v4; // eax - unsigned int v5; // esi - void *v7; // eax - void *v8; // edi - //int v9; // eax - bool v10; // al - PkPlayerStruct pkplr; // [esp+Ch] [ebp-7BCh] - struct _OFSTRUCT ReOpenBuff; // [esp+500h] [ebp-2C8h] - char FileName[260]; // [esp+588h] [ebp-240h] - char NewFileName[260]; // [esp+68Ch] [ebp-13Ch] - _uiheroinfo hero_info; // [esp+790h] [ebp-38h] - int unused; // [esp+7BCh] [ebp-Ch] - LPCSTR lpSrcStr; // [esp+7C0h] [ebp-8h] - int save_num; // [esp+7C4h] [ebp-4h] + unsigned int i, save_num; + char FileName[MAX_PATH]; + char NewFileName[MAX_PATH]; + int a1; memset(hero_names, 0, sizeof(hero_names)); - if ( (unsigned char)gbMaxPlayers > 1u ) - { - lpSrcStr = 0; - save_num = 0; - do - { - if ( (unsigned int)save_num >= MAX_CHARACTERS ) - break; - GetSaveDirectory(FileName, 260, (int)lpSrcStr); - v1 = strrchr(FileName, '\\') + 1; - if ( v1 != (char *)1 && OpenFile(FileName, &ReOpenBuff, 0x4000u) != -1 ) - { - if ( !SRegLoadString("Diablo\\Converted", (const char *)v1, 0, NewFileName, 260) ) - { - while ( 1 ) - { - v3 = save_num++; - pfile_get_save_path(NewFileName, 260, v3); - if ( OpenFile(NewFileName, &ReOpenBuff, 0x4000u) == -1 ) - break; - if ( (unsigned int)save_num >= MAX_CHARACTERS ) - goto LABEL_13; - } - if ( CopyFile(FileName, NewFileName, 1) ) - { - SRegSaveString("Diablo\\Converted", v1, 0, NewFileName); - v4 = GetFileAttributes(NewFileName); - if ( v4 != -1 ) - { - _LOBYTE(v4) = v4 & 0xF9; - SetFileAttributes(NewFileName, v4); + if (gbMaxPlayers > 1) { + for ( i = 0, save_num = 0; i < MAX_CHARACTERS && save_num < MAX_CHARACTERS; i++) { + struct _OFSTRUCT ReOpenBuff; + const char *s; + + GetSaveDirectory(FileName, sizeof(FileName), i); + s = strrchr(FileName, '\\') + 1; + if ( s == (const char*)1 ) + continue; + if ( OpenFile(FileName, &ReOpenBuff, OF_EXIST) == HFILE_ERROR ) + continue; + if (!SRegLoadString("Diablo\\Converted", s, 0, NewFileName, sizeof(NewFileName))) { + while (save_num < MAX_CHARACTERS) { + pfile_get_save_path(NewFileName, sizeof(NewFileName), save_num++); + if (OpenFile(NewFileName, &ReOpenBuff, OF_EXIST)==HFILE_ERROR) { + if (CopyFile(FileName, NewFileName, TRUE)) { + DWORD attrib; + SRegSaveString("Diablo\\Converted", s, 0, NewFileName); + attrib = GetFileAttributes(NewFileName); + if (attrib != INVALID_FILE_ATTRIBUTES) { + attrib &= ~(FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM); + SetFileAttributes(NewFileName, attrib); + } } + break; } } } -LABEL_13: - ++lpSrcStr; } - while ( (unsigned int)lpSrcStr < MAX_CHARACTERS ); } - unused = 1; - v5 = 0; - do - { - v7 = pfile_open_save_archive(&unused, v5); - v8 = v7; - if ( v7 ) - { - if ( pfile_read_hero(v7, &pkplr) ) - { - strcpy(hero_names[v5], pkplr.pName); - UnPackPlayer(&pkplr, 0, 0); - v10 = pfile_archive_contains_game(v8); - game_2_ui_player(plr, &hero_info, v10); - ui_add_hero_info(&hero_info); + + a1 = 1; + for (i=0; i < MAX_CHARACTERS; i++) { + PkPlayerStruct pkplr; + HANDLE archive = pfile_open_save_archive(&a1, i); + if (archive) { + if (pfile_read_hero(archive, &pkplr)) { + _uiheroinfo uihero; + strcpy(hero_names[i], pkplr.pName); + UnPackPlayer(&pkplr, 0, FALSE); + game_2_ui_player(plr, &uihero, pfile_archive_contains_game(archive, i)); + ui_add_hero_info(&uihero); } - pfile_SFileCloseArchive(v8); + pfile_SFileCloseArchive(archive); } - ++v5; } - while ( v5 < MAX_CHARACTERS ); - return 1; + + return TRUE; } -// 679660: using guessed type char gbMaxPlayers; char *__fastcall GetSaveDirectory(char *dst, int dst_size, unsigned int save_num) { @@ -361,7 +312,7 @@ char *__fastcall GetSaveDirectory(char *dst, int dst_size, unsigned int save_num return _strlwr(dst); } -BOOL __fastcall pfile_read_hero(void *archive, PkPlayerStruct *pPack) +BOOL __fastcall pfile_read_hero(HANDLE archive, PkPlayerStruct *pPack) { HANDLE file; @@ -419,7 +370,7 @@ void __fastcall pfile_SFileCloseArchive(HANDLE hsArchive) SFileCloseArchive(hsArchive); } -BOOL __fastcall pfile_archive_contains_game(HANDLE hsArchive) +BOOL __fastcall pfile_archive_contains_game(HANDLE hsArchive, unsigned int save_num) { HANDLE file; @@ -433,16 +384,16 @@ BOOL __fastcall pfile_archive_contains_game(HANDLE hsArchive) return TRUE; } -BOOL __stdcall pfile_ui_set_class_stats(int player_class_nr, _uidefaultstats *class_stats) +BOOL __stdcall pfile_ui_set_class_stats(unsigned int player_class_nr, _uidefaultstats *class_stats) { - int v2; // eax + int c; - v2 = (char)pfile_get_player_class(player_class_nr); - class_stats->strength = StrengthTbl[v2]; - class_stats->magic = MagicTbl[v2]; - class_stats->dexterity = DexterityTbl[v2]; - class_stats->vitality = VitalityTbl[v2]; - return 1; + c = pfile_get_player_class(player_class_nr); + class_stats->strength = StrengthTbl[c]; + class_stats->magic = MagicTbl[c]; + class_stats->dexterity = DexterityTbl[c]; + class_stats->vitality = VitalityTbl[c]; + return TRUE; } char __fastcall pfile_get_player_class(unsigned int player_class_nr) @@ -460,40 +411,33 @@ char __fastcall pfile_get_player_class(unsigned int player_class_nr) BOOL __stdcall pfile_ui_save_create(_uiheroinfo *heroinfo) { - unsigned int v1; // edi - //int v3; // eax - char v5; // al - PkPlayerStruct pkplr; // [esp+8h] [ebp-4F4h] + unsigned int save_num; + char cl; + PkPlayerStruct pkplr; - v1 = pfile_get_save_num_from_name(heroinfo->name); - if ( v1 == MAX_CHARACTERS ) - { - v1 = 0; - do - { - if ( !*hero_names[v1] ) + save_num = pfile_get_save_num_from_name(heroinfo->name); + if ( save_num == MAX_CHARACTERS ) { + for ( save_num=0; save_num < MAX_CHARACTERS; save_num++) { + if ( !hero_names[save_num][0] ) break; - ++v1; } - while ( v1 < MAX_CHARACTERS ); - if ( v1 == MAX_CHARACTERS ) - return 0; + if ( save_num == MAX_CHARACTERS ) + return false; } - //_LOBYTE(v3) = pfile_open_archive(0, v1); - if ( !pfile_open_archive(0, v1) ) - return 0; + if ( !pfile_open_archive(FALSE, save_num) ) + return FALSE; mpqapi_remove_hash_entries(pfile_get_file_name); - strncpy(hero_names[v1], heroinfo->name, 0x20u); - hero_names[v1][31] = 0; - v5 = pfile_get_player_class((unsigned char)heroinfo->heroclass); - CreatePlayer(0, v5); - strncpy(plr[0]._pName, heroinfo->name, 0x20u); - plr[0]._pName[31] = 0; - PackPlayer(&pkplr, 0, 1); + strncpy(hero_names[save_num], heroinfo->name, PLR_NAME_LEN); + hero_names[save_num][PLR_NAME_LEN - 1] = '\0'; + cl = pfile_get_player_class(heroinfo->heroclass); + CreatePlayer(0, cl); + strncpy(plr[0]._pName, heroinfo->name, PLR_NAME_LEN); + plr[0]._pName[PLR_NAME_LEN - 1] = '\0'; + PackPlayer(&pkplr, 0, TRUE); pfile_encode_hero(&pkplr); - game_2_ui_player(plr, heroinfo, 0); - pfile_flush(1, v1); - return 1; + game_2_ui_player(&plr[0], heroinfo, FALSE); + pfile_flush(TRUE, save_num); + return TRUE; } BOOL __stdcall pfile_get_file_name(DWORD lvl, char *dst) @@ -523,75 +467,66 @@ BOOL __stdcall pfile_get_file_name(DWORD lvl, char *dst) BOOL __stdcall pfile_delete_save(_uiheroinfo *hero_info) { - unsigned int v1; // eax - char FileName[260]; // [esp+0h] [ebp-104h] + unsigned int save_num; + char FileName[MAX_PATH]; - v1 = pfile_get_save_num_from_name(hero_info->name); - if ( v1 < MAX_CHARACTERS ) - { - hero_names[v1][0] = 0; - pfile_get_save_path(FileName, 260, v1); + save_num = pfile_get_save_num_from_name(hero_info->name); + if ( save_num < MAX_CHARACTERS ) { + hero_names[save_num][0] = '\0'; + pfile_get_save_path(FileName, sizeof(FileName), save_num); DeleteFile(FileName); } - return 1; + return TRUE; } void __cdecl pfile_read_player_from_save() { - int dwChar; // edi - void *v1; // esi - //int v2; // eax - PkPlayerStruct pkplr; // [esp+8h] [ebp-4F4h] + HANDLE archive; + unsigned int save_num; + PkPlayerStruct pkplr; - dwChar = pfile_get_save_num_from_name(chr_name_str); - v1 = pfile_open_save_archive(0, dwChar); - if ( !v1 ) + save_num = pfile_get_save_num_from_name(chr_name_str); + archive = pfile_open_save_archive(NULL, save_num); + if ( archive == NULL ) TermMsg("Unable to open archive"); - //_LOBYTE(v2) = pfile_read_hero(v1, &pkplr); - if ( !pfile_read_hero(v1, &pkplr) ) + if ( !pfile_read_hero(archive, &pkplr) ) TermMsg("Unable to load character"); - UnPackPlayer(&pkplr, myplr, 0); - gbValidSaveFile = pfile_archive_contains_game(v1); - pfile_SFileCloseArchive(v1); + + UnPackPlayer(&pkplr, myplr, FALSE); + gbValidSaveFile = pfile_archive_contains_game(archive, save_num); + pfile_SFileCloseArchive(archive); } void __fastcall GetTempLevelNames(char *szTemp) { - char *v1; // esi - - v1 = szTemp; + // BUGFIX: function call has no purpose pfile_get_save_num_from_name(plr[myplr]._pName); if ( setlevel ) - sprintf(v1, "temps%02d", (unsigned char)setlvlnum); + sprintf(szTemp, "temps%02d", (unsigned char)setlvlnum); else - sprintf(v1, "templ%02d", currlevel); + sprintf(szTemp, "templ%02d", currlevel); } // 5CCB10: using guessed type char setlvlnum; // 5CF31D: using guessed type char setlevel; void __fastcall GetPermLevelNames(char *szPerm) { - char *v1; // esi - int v2; // ebx - //int v3; // eax - //int v4; // eax - int v5; // edi - - v1 = szPerm; - v2 = pfile_get_save_num_from_name(plr[myplr]._pName); - GetTempLevelNames(v1); - //_LOBYTE(v3) = pfile_open_archive(0, v2); - if ( !pfile_open_archive(0, v2) ) + unsigned int save_num; + BOOL has_file; + + save_num = pfile_get_save_num_from_name(plr[myplr]._pName); + GetTempLevelNames(szPerm); + if ( !pfile_open_archive(FALSE, save_num) ) TermMsg("Unable to read to save file archive"); - //_LOBYTE(v4) = mpqapi_has_file(v1); - v5 = mpqapi_has_file(v1); - pfile_flush(1, v2); - if ( !v5 ) + + has_file = mpqapi_has_file(szPerm); + pfile_flush(TRUE, save_num); + if ( !has_file ) { if ( setlevel ) - sprintf(v1, "perms%02d", (unsigned char)setlvlnum); + sprintf(szPerm, "perms%02d", (unsigned char)setlvlnum); else - sprintf(v1, "perml%02d", currlevel); + sprintf(szPerm, "perml%02d", currlevel); } } // 5CCB10: using guessed type char setlvlnum; @@ -599,31 +534,22 @@ void __fastcall GetPermLevelNames(char *szPerm) void __fastcall pfile_get_game_name(char *dst) { - char *v1; // esi - - v1 = dst; + // BUGFIX: function call with no purpose pfile_get_save_num_from_name(plr[myplr]._pName); - strcpy(v1, "game"); + strcpy(dst, "game"); } void __cdecl pfile_remove_temp_files() { - int v0; // eax - int v1; // esi - //int v2; // eax - - if ( (unsigned char)gbMaxPlayers <= 1u ) + if ( gbMaxPlayers <= 1 ) { - v0 = pfile_get_save_num_from_name(plr[myplr]._pName); - v1 = v0; - //_LOBYTE(v2) = pfile_open_archive(0, v0); - if ( !pfile_open_archive(0, v0) ) + unsigned int save_num = pfile_get_save_num_from_name(plr[myplr]._pName); + if ( !pfile_open_archive(FALSE, save_num) ) TermMsg("Unable to write to save file archive"); mpqapi_remove_hash_entries(GetTempSaveNames); - pfile_flush(1, v1); + pfile_flush(TRUE, save_num); } } -// 679660: using guessed type char gbMaxPlayers; BOOL __stdcall GetTempSaveNames(DWORD dwIndex, char *szTemp) { @@ -643,39 +569,27 @@ BOOL __stdcall GetTempSaveNames(DWORD dwIndex, char *szTemp) void __cdecl pfile_rename_temp_to_perm() { - int v0; // eax - int v1; // edi - //int v2; // eax - int v3; // esi - //int v4; // eax - //int v5; // eax - //int v6; // eax - char v7[260]; // [esp+8h] [ebp-208h] - char v8[260]; // [esp+10Ch] [ebp-104h] - - v0 = pfile_get_save_num_from_name(plr[myplr]._pName); - v1 = v0; - //_LOBYTE(v2) = pfile_open_archive(0, v0); - if ( !pfile_open_archive(0, v0) ) + unsigned int save_num; + unsigned int i; + char TempName[MAX_PATH]; + char PermName[MAX_PATH]; + + save_num = pfile_get_save_num_from_name(plr[myplr]._pName); + if ( !pfile_open_archive(FALSE, save_num) ) TermMsg("Unable to write to save file archive"); - v3 = 0; - while ( 1 ) - { - //_LOBYTE(v6) = GetTempSaveNames(v3, v7); - if ( !GetTempSaveNames(v3, v7) ) - break; - GetPermSaveNames(v3++, v8); - //_LOBYTE(v4) = mpqapi_has_file(v7); - if ( mpqapi_has_file(v7) ) - { - //_LOBYTE(v5) = mpqapi_has_file(v8); - if ( mpqapi_has_file(v8) ) - mpqapi_remove_hash_entry(v8); - mpqapi_rename(v7, v8); + + i = 0; + while (GetTempSaveNames(i,TempName)) { + GetPermSaveNames(i, PermName); + i++; + if ( mpqapi_has_file(TempName) ) { + if ( mpqapi_has_file(PermName) ) + mpqapi_remove_hash_entry(PermName); + mpqapi_rename(TempName, PermName); } } - GetPermSaveNames(v3, v8); - pfile_flush(1, v1); + GetPermSaveNames(i, PermName); + pfile_flush(TRUE, save_num); } BOOL __stdcall GetPermSaveNames(DWORD dwIndex, char *szPerm) @@ -694,106 +608,84 @@ BOOL __stdcall GetPermSaveNames(DWORD dwIndex, char *szPerm) return TRUE; } -void __fastcall pfile_write_save_file(char *pszName, void *pbData, int dwLen, int qwLen) -{ - void *v4; // ebx - int v5; // eax - //int v6; // eax - char file_name[260]; // [esp+Ch] [ebp-118h] - char password[16]; // [esp+110h] [ebp-14h] - int v9; // [esp+120h] [ebp-4h] - - v4 = pbData; - pfile_strcpy(file_name, pszName); - v5 = pfile_get_save_num_from_name(plr[myplr]._pName); - strcpy(password, "xrgyrkj1"); - v9 = v5; - *(_DWORD *)&password[9] = 0; - *(_WORD *)&password[13] = 0; - password[15] = 0; - if ( (unsigned char)gbMaxPlayers > 1u ) - strcpy(password, "szqnlsk1"); - codec_encode(v4, dwLen, qwLen, password); - //_LOBYTE(v6) = pfile_open_archive(0, v9); - if ( !pfile_open_archive(0, v9) ) - TermMsg("Unable to write to save file archive"); - mpqapi_write_file(file_name, (char *)v4, qwLen); - pfile_flush(1, v9); +void __fastcall pfile_write_save_file(const char *pszName, BYTE *pbData, DWORD dwLen, DWORD qwLen) +{ + unsigned int save_num; + char FileName[MAX_PATH]; + + pfile_strcpy(FileName, pszName); + save_num = pfile_get_save_num_from_name(plr[myplr]._pName); + { + char password[16] = PASSWORD_SINGLE; + if ( gbMaxPlayers > 1 ) + strcpy(password, PASSWORD_MULTI); + + codec_encode(pbData, dwLen, qwLen, password); + } + if ( !pfile_open_archive(FALSE, save_num) ) + TermMsg("Unable to write so save file archive"); + mpqapi_write_file(FileName, pbData, qwLen); + pfile_flush(TRUE, save_num); } -// 679660: using guessed type char gbMaxPlayers; void __fastcall pfile_strcpy(char *dst, const char *src) { strcpy(dst, src); } -char *__fastcall pfile_read(char *pszName, int *pdwLen) -{ - int *v2; // ebx - int v3; // eax - void *v4; // edi - //int v5; // eax - int v6; // eax - void *v7; // eax - //int v8; // eax - char *v9; // esi - int v10; // eax - //int v11; // eax - char v13[260]; // [esp+Ch] [ebp-124h] - char password[16]; // [esp+110h] [ebp-20h] - void *src_dst; // [esp+120h] [ebp-10h] - int nread; // [esp+124h] [ebp-Ch] - DWORD nSize; // [esp+128h] [ebp-8h] - void *file; // [esp+12Ch] [ebp-4h] - - v2 = pdwLen; - pfile_strcpy(v13, pszName); - v3 = pfile_get_save_num_from_name(plr[myplr]._pName); - v4 = pfile_open_save_archive(0, v3); - if ( !v4 ) +BYTE *__fastcall pfile_read(const char *pszName, DWORD *pdwLen) +{ + unsigned int save_num; + char FileName[MAX_PATH]; + HANDLE archive, save; + BYTE *buf; + DWORD nread; + + pfile_strcpy(FileName, pszName); + save_num = pfile_get_save_num_from_name(plr[myplr]._pName); + archive = pfile_open_save_archive(NULL, save_num); + if ( archive == NULL ) TermMsg("Unable to open save file archive"); - //_LOBYTE(v5) = SFileOpenFileEx(v4, v13, 0, &file); - if ( !SFileOpenFileEx(v4, v13, 0, &file) ) + + if ( !SFileOpenFileEx(archive, FileName, 0, &save) ) TermMsg("Unable to open save file"); - v6 = SFileGetFileSize((int *)file, 0); - *v2 = v6; - if ( !v6 ) + + *pdwLen = SFileGetFileSize(save, NULL); + if ( *pdwLen == 0 ) TermMsg("Invalid save file"); - v7 = DiabloAllocPtr(*v2); - src_dst = v7; - //_LOBYTE(v8) = SFileReadFile(file, (char *)v7, *v2, (unsigned long *)&nread, 0); - if ( !SFileReadFile(file, (char *)v7, *v2, (unsigned long *)&nread, 0) ) + + buf = (BYTE*)DiabloAllocPtr(*pdwLen); + if ( !SFileReadFile(save, buf, *pdwLen, &nread, NULL) ) TermMsg("Unable to read save file"); - SFileCloseFile(file); - pfile_SFileCloseArchive(v4); - strcpy(password, "xrgyrkj1"); - nSize = 16; - *(_DWORD *)&password[9] = 0; - *(_WORD *)&password[13] = 0; - password[15] = 0; - if ( (unsigned char)gbMaxPlayers > 1u ) - strcpy(password, "szqnlsk1"); - v9 = (char *)src_dst; - v10 = codec_decode(src_dst, *v2, password); - *v2 = v10; - if ( !v10 ) + SFileCloseFile(save); + pfile_SFileCloseArchive(archive); + { - if ( (unsigned char)gbMaxPlayers > 1u ) - { - GetComputerName(password, &nSize); - if ( SFileSetFilePointer(file, 0, 0, 0) ) - TermMsg("Unable to read save file"); - //_LOBYTE(v11) = SFileReadFile(file, v9, *v2, (unsigned long *)&nread, 0); - if ( !SFileReadFile(file, v9, *v2, (unsigned long *)&nread, 0) ) - TermMsg("Unable to read save file"); - *v2 = codec_decode(v9, *v2, password); + char password[16] = PASSWORD_SINGLE; + DWORD nSize = 16; + + if ( gbMaxPlayers > 1 ) + strcpy(password, PASSWORD_MULTI); + + *pdwLen = codec_decode(buf, *pdwLen, password); + if (*pdwLen == 0) { + // BUGFIFX: *pdwLen has already been overwritten with zero and the savefile has been closed + // there is no way this can work correctly + if (gbMaxPlayers > 1) { + GetComputerName(password, &nSize); + if ( SFileSetFilePointer(save, 0, NULL, 0) ) + TermMsg("Unable to read save file"); + + if ( !SFileReadFile(save, buf, *pdwLen, &nread, NULL) ) + TermMsg("Unable to read save file"); + *pdwLen = codec_decode(buf, *pdwLen, password); + } + if ( *pdwLen == 0 ) + TermMsg("Invalid save file"); } - if ( !*v2 ) - TermMsg("Invalid save file"); } - return v9; + return buf; } -// 679660: using guessed type char gbMaxPlayers; void __fastcall pfile_update(BOOL force_save) { diff --git a/Source/pfile.h b/Source/pfile.h index 8da8c8e3c..d18c4335b 100644 --- a/Source/pfile.h +++ b/Source/pfile.h @@ -4,7 +4,6 @@ extern BOOL gbValidSaveFile; // idb -void __cdecl pfile_cpp_init(); void __cdecl pfile_init_save_directory(); void __fastcall pfile_check_available_space(char *pszDir); void __cdecl pfile_write_hero(); @@ -13,18 +12,18 @@ void __fastcall pfile_encode_hero(const PkPlayerStruct *pPack); BOOL __fastcall pfile_open_archive(BOOL a1, unsigned int save_num); void __fastcall pfile_get_save_path(char *pszBuf, DWORD dwBufSize, unsigned int save_num); void __fastcall pfile_flush(BOOL is_single_player, unsigned int save_num); -bool __fastcall pfile_create_player_description(char *dst, int len); -int __fastcall pfile_create_save_file(char *name_1, char *name_2); +BOOL __fastcall pfile_create_player_description(char *dst, unsigned int len); +BOOL __fastcall pfile_create_save_file(const char *name_1, const char *name_2); void __cdecl pfile_flush_W(); void __fastcall game_2_ui_player(const PlayerStruct *p, _uiheroinfo *heroinfo, BOOL bHasSaveFile); unsigned char __fastcall game_2_ui_class(const PlayerStruct *p); BOOL __stdcall pfile_ui_set_hero_infos(BOOL (__stdcall *ui_add_hero_info)(_uiheroinfo *)); char *__fastcall GetSaveDirectory(char *dst, int dst_size, unsigned int save_num); -BOOL __fastcall pfile_read_hero(void *archive, PkPlayerStruct *pPack); +BOOL __fastcall pfile_read_hero(HANDLE archive, PkPlayerStruct *pPack); HANDLE __fastcall pfile_open_save_archive(int *unused, unsigned int save_num); void __fastcall pfile_SFileCloseArchive(HANDLE hsArchive); -BOOL __fastcall pfile_archive_contains_game(HANDLE hsArchive); -BOOL __stdcall pfile_ui_set_class_stats(int player_class_nr, _uidefaultstats *class_stats); +BOOL __fastcall pfile_archive_contains_game(HANDLE hsArchive, unsigned int save_num); +BOOL __stdcall pfile_ui_set_class_stats(unsigned int player_class_nr, _uidefaultstats *class_stats); char __fastcall 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); @@ -37,9 +36,9 @@ void __cdecl pfile_remove_temp_files(); BOOL __stdcall GetTempSaveNames(DWORD dwIndex, char *szTemp); void __cdecl pfile_rename_temp_to_perm(); BOOL __stdcall GetPermSaveNames(DWORD dwIndex, char *szPerm); -void __fastcall pfile_write_save_file(char *pszName, void *pbData, int dwLen, int qwLen); +void __fastcall pfile_write_save_file(const char *pszName, BYTE *pbData, DWORD dwLen, DWORD qwLen); void __fastcall pfile_strcpy(char *dst, const char *src); -char *__fastcall pfile_read(char *pszName, int *pdwLen); +BYTE *__fastcall pfile_read(const char *pszName, DWORD *pdwLen); void __fastcall pfile_update(BOOL force_save); /* rdata */ diff --git a/defs.h b/defs.h index 4d8c81b3e..2faa723ce 100644 --- a/defs.h +++ b/defs.h @@ -56,6 +56,9 @@ #define PMSG_COUNT 8 +// Diablo Retail Version Game ID +#define GAME_ID ((int)'DRTL') + // Diablo uses a 256 color palette // Entry 0-127 (0x00-0x7F) are level specific // Entry 128-255 (0x80-0xFF) are global