diff --git a/Stub/DiabloUI/progress.cpp b/Stub/DiabloUI/progress.cpp index 5aa68c09a..03b80df14 100644 --- a/Stub/DiabloUI/progress.cpp +++ b/Stub/DiabloUI/progress.cpp @@ -51,9 +51,9 @@ void progress_Render(BYTE progress) int y = GetCenterOffset(144, SCREEN_HEIGHT); DrawArt(x, y, &ArtPopupSm); - DrawArt(GetCenterOffset(228), y + 52, &ArtProgBG, 0, 228); + DrawArt(GetCenterOffset(227), y + 52, &ArtProgBG, 0, 227); if (progress) { - DrawArt(GetCenterOffset(228), y + 52, &ProgFil, 0, 228 * progress / 100); + DrawArt(GetCenterOffset(227), y + 52, &ProgFil, 0, 227 * progress / 100); } DrawArt(GetCenterOffset(110), y + 99, &ButImage, 2, 110); diff --git a/Stub/DiabloUI/selhero.cpp b/Stub/DiabloUI/selhero.cpp index 8f881c336..6bb9d7cd7 100644 --- a/Stub/DiabloUI/selhero.cpp +++ b/Stub/DiabloUI/selhero.cpp @@ -6,11 +6,11 @@ _uiheroinfo heroInfo; void RenderStats() { - char lvl[3] = "--"; - char str[3] = "--"; - char mag[3] = "--"; - char dex[3] = "--"; - char vit[3] = "--"; + char lvl[4] = "--"; + char str[4] = "--"; + char mag[4] = "--"; + char dex[4] = "--"; + char vit[4] = "--"; if (heroInfo.heroclass != UI_NUM_CLASSES) { sprintf(lvl, "%d", heroInfo.level); @@ -32,7 +32,7 @@ void RenderStats() DrawArtStr(149, 422, AFT_SMALL, AFC_SILVER, vit, JustCentre, 61); } -void selhero_Render() +void selhero_Render(bool multiPlayer) { heroInfo.heroclass = UI_NUM_CLASSES; if (SelectedItem <= selhero_SaveCount) { @@ -42,7 +42,11 @@ void selhero_Render() DrawArt(0, 0, &ArtBackground); DrawLogo(); - DrawArtStr(-1, 161, AFT_BIG, AFC_SILVER, "Single Player Characters", JustCentre); + char *title = "Single Player Characters"; + if (multiPlayer) { + title = "Multi Player Characters"; + } + DrawArtStr(-1, 161, AFT_BIG, AFC_SILVER, title, JustCentre); DrawArt(30, 211, &ArtHero, heroInfo.heroclass); RenderStats(); @@ -67,7 +71,7 @@ void selhero_Render() DrawArtStr(501, 429, AFT_BIG, AFC_GOLD, "Cancel"); } -void selhero_Render_DifficultySelection() +void selhero_Render_Name(bool multiPlayer) { DrawArt(0, 0, &ArtBackground); DrawLogo(); @@ -75,47 +79,12 @@ void selhero_Render_DifficultySelection() DrawArt(30, 211, &ArtHero, heroInfo.heroclass); RenderStats(); - char *GameOptions[3] = { "Normal", "Nightmare", "Hell" }; - - // this should not be hard coded. - int x = 280; - int y = 256; - - for (int i = 0; i < 3; i++) { - y += 40; - DrawArtStr(x, y, AFT_SMALL, AFC_SILVER, GameOptions[i]); + char *title = "New Single Player Hero"; + if (multiPlayer) { + title = "New Multi Player Hero"; } -} - -void selhero_Render_GameType() -{ - DrawArt(0, 0, &ArtBackground); - DrawLogo(); - DrawArt(30, 211, &ArtHero, heroInfo.heroclass); - RenderStats(); - - char *GameOptions[2] = { "New Game", "Load Game" }; - - // this should not be hard coded. - int x = 280; - int y = 256; - - for (int i = 0; i < 2; i++) { - y += 40; - DrawArtStr(x, y, AFT_SMALL, AFC_SILVER, GameOptions[i]); - } -} - -void selhero_Render_Name() -{ - DrawArt(0, 0, &ArtBackground); - DrawLogo(); - - DrawArt(30, 211, &ArtHero, heroInfo.heroclass); - RenderStats(); - - DrawArtStr(-1, 161, AFT_BIG, AFC_SILVER, "New Single Player Hero", JustCentre); + DrawArtStr(-1, 161, AFT_BIG, AFC_SILVER, title, JustCentre); int w = 369; int x = 241; @@ -141,7 +110,7 @@ void selhero_Render_Name() // Have this load the function above and then render it in the main menu. // Cnacel box is also needed. -void selhero_Render_ClassSelector() +void selhero_Render_ClassSelector(bool multiPlayer) { DrawArt(0, 0, &ArtBackground); DrawLogo(); @@ -149,7 +118,11 @@ void selhero_Render_ClassSelector() DrawArt(30, 211, &ArtHero, heroInfo.heroclass); RenderStats(); - DrawArtStr(-1, 161, AFT_BIG, AFC_SILVER, "New Single Player Hero", JustCentre); + char *title = "New Single Player Hero"; + if (multiPlayer) { + title = "New Multi Player Hero"; + } + DrawArtStr(-1, 161, AFT_BIG, AFC_SILVER, title, JustCentre); int w = 369; int x = 241; @@ -215,16 +188,12 @@ void selhero_setDefaultStats(BOOL(__stdcall *fnstats)(unsigned int, _uidefaultst heroInfo.vitality = defaults.vitality; } -BOOL __stdcall UiSelHeroSingDialog( - BOOL(__stdcall *fninfo)(BOOL(__stdcall *fninfofunc)(_uiheroinfo *)), +bool UiSelHeroDialog( BOOL(__stdcall *fncreate)(_uiheroinfo *), BOOL(__stdcall *fnremove)(_uiheroinfo *), BOOL(__stdcall *fnstats)(unsigned int, _uidefaultstats *), - int *dlgresult, - char *name, - int *difficulty) + bool multiPlayer) { - selhero_Loade(fninfo); MenuItem[SINGLEPLAYER_LOAD] = 1 + selhero_SaveCount; submenu = SINGLEPLAYER_LOAD; @@ -238,24 +207,20 @@ BOOL __stdcall UiSelHeroSingDialog( int nameLen; SDL_Event event; - int x, y; - - *difficulty = gnDifficulty; // BUGFIX this replicates a bug that allowed setting deficulity in SP - bool endMenu = false; - while (!endMenu) { + while (1) { CapFPS(); switch (submenu) { case SINGLEPLAYER_LOAD: - selhero_Render(); + selhero_Render(multiPlayer); break; case SINGLEPLAYER_CLASSES: selhero_setDefaultStats(fnstats); - selhero_Render_ClassSelector(); + selhero_Render_ClassSelector(multiPlayer); break; case SINGLEPLAYER_NAME: - selhero_Render_Name(); + selhero_Render_Name(multiPlayer); break; } @@ -272,9 +237,7 @@ BOOL __stdcall UiSelHeroSingDialog( break; } - *dlgresult = EXIT_MENU; - endMenu = true; - break; + return FALSE; case SDLK_BACKSPACE: nameLen = strlen(heroInfo.name); if (nameLen > 0) { @@ -306,20 +269,12 @@ BOOL __stdcall UiSelHeroSingDialog( break; } - strcpy(name, heroInfo.name); - *dlgresult = LOAD_GAME; - endMenu = true; - break; + return true; case SINGLEPLAYER_CLASSES: SetMenu(SINGLEPLAYER_NAME); break; case SINGLEPLAYER_NAME: - if (!heroInfo.hassaved) { - fncreate(&heroInfo); - } - strcpy(name, heroInfo.name); - endMenu = true; - break; + return true; } break; default: @@ -343,12 +298,92 @@ BOOL __stdcall UiSelHeroSingDialog( } } + return TRUE; +} + +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) +{ + selhero_Loade(fninfo); + if (!UiSelHeroDialog(fncreate, fnremove, fnstats, false)) { + *dlgresult = EXIT_MENU; + } else { + strcpy(name, heroInfo.name); + + if (!heroInfo.hassaved) { + fncreate(&heroInfo); // todo don't overwrite + } else if (heroInfo.hassaved) { + *dlgresult = LOAD_GAME; + } + } + BlackPalette(); selhero_Free(); return TRUE; } +////////////////////////////////////////// +// MULTI PLAYER // +////////////////////////////////////////// + +void selhero_multi_Loade() +{ + LoadBackgroundArt("ui_art\\selgame.pcx"); +} + +void selhero_multi_Free() +{ + mem_free_dbg(ArtBackground.data); + ArtBackground.data = NULL; +} + +void selhero_Render_DifficultySelection() +{ + DrawArt(0, 0, &ArtBackground); + DrawLogo(); + + DrawArt(30, 211, &ArtHero, heroInfo.heroclass); + RenderStats(); + + char *GameOptions[3] = { "Normal", "Nightmare", "Hell" }; + + // this should not be hard coded. + int x = 280; + int y = 256; + + for (int i = 0; i < 3; i++) { + y += 40; + DrawArtStr(x, y, AFT_SMALL, AFC_SILVER, GameOptions[i]); + } +} + +void selhero_Render_GameSelection() +{ + DrawArt(0, 0, &ArtBackground); + DrawLogo(); + + DrawArt(30, 211, &ArtHero, heroInfo.heroclass); + RenderStats(); + + char *GameOptions[2] = { "New Game", "Load Game" }; + + // this should not be hard coded. + int x = 280; + int y = 256; + + for (int i = 0; i < 2; i++) { + y += 40; + DrawArtStr(x, y, AFT_SMALL, AFC_SILVER, GameOptions[i]); + } +} + BOOL __stdcall UiSelHeroMultDialog( BOOL(__stdcall *fninfo)(BOOL(__stdcall *fninfofunc)(_uiheroinfo *)), BOOL(__stdcall *fncreate)(_uiheroinfo *), @@ -359,14 +394,19 @@ BOOL __stdcall UiSelHeroMultDialog( char *name) { *hero_is_created = false; - BOOL success = UiSelHeroSingDialog(fninfo, fncreate, fnremove, fnstats, dlgresult, name, &gnDifficulty); - if (!success) { - return FALSE; - } else if (*dlgresult == EXIT_MENU) { + + selhero_Loade(fninfo); + bool playerSelected = UiSelHeroDialog(fncreate, fnremove, fnstats, true); + BlackPalette(); + selhero_Free(); + if (!playerSelected) { + *dlgresult = EXIT_MENU; return TRUE; } - selhero_Loade(fninfo); + strcpy(name, heroInfo.name); + + selhero_multi_Loade(); submenu = MULTIPLAYER_LOBBY; @@ -380,7 +420,7 @@ BOOL __stdcall UiSelHeroMultDialog( switch (submenu) { case MULTIPLAYER_LOBBY: - selhero_Render_GameType(); + selhero_Render_GameSelection(); break; case MULTIPLAYER_DIFFICULTY: selhero_Render_DifficultySelection();