From 82f72713edffaf99d986405c4dc4c102ba7834ca Mon Sep 17 00:00:00 2001 From: Anders Jenbo Date: Sun, 8 Mar 2020 02:10:34 +0100 Subject: [PATCH] Load current heros level from save game when on difficulty screen Fixes #566 The hero is unloaded before entering this screen from a game, hacking the game to track the hero level would not work with single player (planned to also have a select screen) so the only proper solution is to load the info from the save game. Using gszHero allows us to stay synced with the engine. --- SourceX/DiabloUI/diabloui.cpp | 1 - SourceX/DiabloUI/diabloui.h | 2 +- SourceX/DiabloUI/selgame.cpp | 15 +++++++++++++++ SourceX/DiabloUI/selhero.cpp | 14 ++++++++------ 4 files changed, 24 insertions(+), 8 deletions(-) diff --git a/SourceX/DiabloUI/diabloui.cpp b/SourceX/DiabloUI/diabloui.cpp index 5ebbc2b40..0f46ce971 100644 --- a/SourceX/DiabloUI/diabloui.cpp +++ b/SourceX/DiabloUI/diabloui.cpp @@ -36,7 +36,6 @@ Art ArtBackground; Art ArtCursor; Art ArtHero; bool gbSpawned; -int heroLevel; void (*gfnSoundFunction)(char *file); void (*gfnListFocus)(int value); diff --git a/SourceX/DiabloUI/diabloui.h b/SourceX/DiabloUI/diabloui.h index 0d1529d99..0a3815f27 100644 --- a/SourceX/DiabloUI/diabloui.h +++ b/SourceX/DiabloUI/diabloui.h @@ -28,7 +28,6 @@ extern Art ArtBackground; extern Art ArtCursor; extern Art ArtHero; extern bool gbSpawned; -extern int heroLevel; constexpr auto MAINMENU_BACKGROUND = UiImage(&ArtBackground, { 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT }); constexpr auto MAINMENU_LOGO = UiImage(&ArtLogos[LOGO_MED], /*animated=*/true, /*frame=*/0, { 0, 0, 0, 0 }, UIS_CENTER); @@ -40,6 +39,7 @@ constexpr size_t size(T (&)[N]) } extern void (*gfnSoundFunction)(char *file); +extern BOOL (*gfnHeroInfo)(BOOL (*fninfofunc)(_uiheroinfo *)); bool IsInsideRect(const SDL_Event &event, const SDL_Rect &rect); void UiFadeIn(); diff --git a/SourceX/DiabloUI/selgame.cpp b/SourceX/DiabloUI/selgame.cpp index 84e48254e..d43d2a7ee 100644 --- a/SourceX/DiabloUI/selgame.cpp +++ b/SourceX/DiabloUI/selgame.cpp @@ -18,6 +18,7 @@ int selgame_selectedGame; bool selgame_endMenu; int *gdwPlayerId; int gbDifficulty; +int heroLevel; static _SNETPROGRAMDATA *m_client_info; extern int provider; @@ -126,6 +127,19 @@ void selgame_GameSelection_Focus(int value) WordWrapArtStr(selgame_Description, SELGAME_DESCRIPTION.rect.w); } +/** + * @brief Load the current hero level from save file + * @param pInfo Hero info + * @return always true + */ +BOOL UpdateHeroLevel(_uiheroinfo *pInfo) +{ + if (strcasecmp(pInfo->name, gszHero) == 0) + heroLevel = pInfo->level; + + return true; +} + void selgame_GameSelection_Select(int value) { selgame_enteringGame = true; @@ -134,6 +148,7 @@ void selgame_GameSelection_Select(int value) switch (value) { case 0: strcpy(title, "Create Game"); + gfnHeroInfo(UpdateHeroLevel); UiInitList(0, NUM_DIFFICULTIES - 1, selgame_Diff_Focus, selgame_Diff_Select, selgame_Diff_Esc, SELDIFF_DIALOG, size(SELDIFF_DIALOG)); break; case 1: diff --git a/SourceX/DiabloUI/selhero.cpp b/SourceX/DiabloUI/selhero.cpp index 35247854b..6e894b47f 100644 --- a/SourceX/DiabloUI/selhero.cpp +++ b/SourceX/DiabloUI/selhero.cpp @@ -29,10 +29,12 @@ bool selhero_isMultiPlayer; bool selhero_navigateYesNo; bool selhero_deleteEnabled; -BOOL(*gfnHeroStats) -(unsigned int, _uidefaultstats *); +BOOL (*gfnHeroInfo) +(BOOL (*fninfofunc)(_uiheroinfo *)); BOOL(*gfnHeroCreate) (_uiheroinfo *); +BOOL(*gfnHeroStats) +(unsigned int, _uidefaultstats *); namespace { @@ -346,14 +348,15 @@ BOOL UiSelHeroDialog( LoadBackgroundArt("ui_art\\selhero.pcx"); LoadScrollBar(); - selhero_result = *dlgresult; - gfnHeroStats = fnstats; + gfnHeroInfo = fninfo; gfnHeroCreate = fncreate; + gfnHeroStats = fnstats; + selhero_result = *dlgresult; selhero_navigateYesNo = false; selhero_SaveCount = 0; - fninfo(SelHero_GetHeroInfo); + gfnHeroInfo(SelHero_GetHeroInfo); std::reverse(selhero_heros, selhero_heros + selhero_SaveCount); if (selhero_SaveCount) { @@ -386,7 +389,6 @@ BOOL UiSelHeroDialog( *dlgresult = selhero_result; strcpy(name, selhero_heroInfo.name); - heroLevel = selhero_heroInfo.level; UnloadScrollBar(); return true;