Browse Source

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.
pull/651/head
Anders Jenbo 6 years ago
parent
commit
82f72713ed
  1. 1
      SourceX/DiabloUI/diabloui.cpp
  2. 2
      SourceX/DiabloUI/diabloui.h
  3. 15
      SourceX/DiabloUI/selgame.cpp
  4. 14
      SourceX/DiabloUI/selhero.cpp

1
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);

2
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();

15
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:

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

Loading…
Cancel
Save