From b536d0efa2df2d5c450e9ce2c65e530df56a6281 Mon Sep 17 00:00:00 2001 From: Gleb Mazovetskiy Date: Thu, 3 Oct 2019 11:41:01 +0100 Subject: [PATCH] DiabloUI: Handle logo like all the other elements Adds the `animated` flag to `UiImage`, allowing us to remove special handling for the logo. --- SourceX/DiabloUI/diabloui.cpp | 17 ++++++++++------- SourceX/DiabloUI/diabloui.h | 4 +++- SourceX/DiabloUI/dialogs.cpp | 1 - SourceX/DiabloUI/mainmenu.cpp | 3 ++- SourceX/DiabloUI/selconn.cpp | 3 ++- SourceX/DiabloUI/selgame.cpp | 13 ++++++++----- SourceX/DiabloUI/selhero.cpp | 3 ++- SourceX/DiabloUI/selyesno.cpp | 3 ++- SourceX/DiabloUI/title.cpp | 4 ++-- SourceX/DiabloUI/ui_item.h | 17 ++++++++++++----- 10 files changed, 43 insertions(+), 25 deletions(-) diff --git a/SourceX/DiabloUI/diabloui.cpp b/SourceX/DiabloUI/diabloui.cpp index 6b135513c..4951431b8 100644 --- a/SourceX/DiabloUI/diabloui.cpp +++ b/SourceX/DiabloUI/diabloui.cpp @@ -627,7 +627,6 @@ void UiPollAndRender() { UiFocusNavigation(&event); } UiRenderItems(gUiItems, gUiItemCnt); - DrawLogo(); DrawMouse(); UiFadeIn(); } @@ -651,7 +650,16 @@ void Render(const UiArtText &ui_art_text) void Render(const UiImage &ui_image) { - DrawArt(ui_image.rect.x, ui_image.rect.y, ui_image.art, ui_image.frame, ui_image.rect.w); + int x = ui_image.rect.x; + if ((ui_image.flags & UIS_CENTER) && ui_image.art != nullptr) { + const int x_offset = GetCenterOffset(ui_image.art->w(), ui_image.rect.w); + x += x_offset; + } + if (ui_image.animated) { + DrawAnimatedArt(ui_image.art, x, ui_image.rect.y); + } else { + DrawArt(x, ui_image.rect.y, ui_image.art, ui_image.frame, ui_image.rect.w); + } } void Render(const UiArtTextButton &ui_button) @@ -863,11 +871,6 @@ bool UiItemMouseEvents(SDL_Event *event, UiItem *items, std::size_t size) return handled; } -void DrawLogo(int t, int size) -{ - DrawAnimatedArt(&ArtLogos[size], GetCenterOffset(ArtLogos[size].w()), t); -} - void DrawMouse() { SDL_GetMouseState(&MouseX, &MouseY); diff --git a/SourceX/DiabloUI/diabloui.h b/SourceX/DiabloUI/diabloui.h index 1555c3ab0..4d6daec70 100644 --- a/SourceX/DiabloUI/diabloui.h +++ b/SourceX/DiabloUI/diabloui.h @@ -27,6 +27,9 @@ extern Art ArtCursor; extern Art ArtHero; extern bool gbSpawned; +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); + template constexpr size_t size(T (&)[N]) { @@ -41,7 +44,6 @@ bool UiFocusNavigation(SDL_Event *event); bool UiItemMouseEvents(SDL_Event *event, UiItem *items, std::size_t size); int GetCenterOffset(int w, int bw = 0); void LoadPalInMem(const PALETTEENTRY *pPal); -void DrawLogo(int t = 0, int size = LOGO_MED); void DrawMouse(); void LoadBackgroundArt(char *pszFile); void SetMenu(int MenuId); diff --git a/SourceX/DiabloUI/dialogs.cpp b/SourceX/DiabloUI/dialogs.cpp index b680ed7b8..df4f26485 100644 --- a/SourceX/DiabloUI/dialogs.cpp +++ b/SourceX/DiabloUI/dialogs.cpp @@ -180,7 +180,6 @@ void DialogLoop(UiItem *items, std::size_t num_items, UiItem *render_behind, std } } UiRenderItems(render_behind, render_behind_size); - DrawLogo(); UiRenderItems(items, num_items); DrawMouse(); UiFadeIn(); diff --git a/SourceX/DiabloUI/mainmenu.cpp b/SourceX/DiabloUI/mainmenu.cpp index 9bd84c932..c63d10792 100644 --- a/SourceX/DiabloUI/mainmenu.cpp +++ b/SourceX/DiabloUI/mainmenu.cpp @@ -15,7 +15,8 @@ UiListItem MAINMENU_DIALOG_ITEMS[] = { {"Exit Diablo", MAINMENU_EXIT_DIABLO} }; UiItem MAINMENU_DIALOG[] = { - UiImage(&ArtBackground, { 0, 0, 640, 480 }), + MAINMENU_BACKGROUND, + MAINMENU_LOGO, UiList(MAINMENU_DIALOG_ITEMS, 64, 192, 510, 43, UIS_HUGE | UIS_GOLD | UIS_CENTER), UiArtText(nullptr, { 17, 444, 605, 21 }, UIS_SMALL) }; diff --git a/SourceX/DiabloUI/selconn.cpp b/SourceX/DiabloUI/selconn.cpp index 0abe0cd87..1a57fb556 100644 --- a/SourceX/DiabloUI/selconn.cpp +++ b/SourceX/DiabloUI/selconn.cpp @@ -29,7 +29,8 @@ UiListItem SELCONN_DIALOG_ITEMS[] = { #endif }; UiItem SELCONNECT_DIALOG[] = { - UiImage(&ArtBackground, { 0, 0, 640, 480 }), + MAINMENU_BACKGROUND, + MAINMENU_LOGO, UiArtText("Multi Player Game", { 24, 161, 590, 35 }, UIS_CENTER | UIS_BIG), UiArtText(selconn_MaxPlayers, { 35, 218, 205, 21 }), UiArtText("Requirements:", { 35, 256, 205, 21 }), diff --git a/SourceX/DiabloUI/selgame.cpp b/SourceX/DiabloUI/selgame.cpp index 40dbbfa15..71ab1875b 100644 --- a/SourceX/DiabloUI/selgame.cpp +++ b/SourceX/DiabloUI/selgame.cpp @@ -21,7 +21,6 @@ int gbDifficulty; static _SNETPROGRAMDATA *m_client_info; extern DWORD provider; -constexpr UiImage SELGAME_BACKGROUND = UiImage(&ArtBackground, { 0, 0, 640, 480 }); constexpr UiArtTextButton SELGAME_OK = UiArtTextButton("OK", &UiFocusNavigationSelect, { 299, 427, 140, 35 }, UIS_CENTER | UIS_VCENTER | UIS_BIG | UIS_GOLD); constexpr UiArtTextButton SELGAME_CANCEL = UiArtTextButton("CANCEL", &UiFocusNavigationEsc, { 449, 427, 140, 35 }, UIS_CENTER | UIS_VCENTER | UIS_BIG | UIS_GOLD); @@ -33,7 +32,8 @@ UiListItem SELDIFF_DIALOG_ITEMS[] = { { "Hell", DIFF_HELL } }; UiItem SELDIFF_DIALOG[] = { - SELGAME_BACKGROUND, + MAINMENU_BACKGROUND, + MAINMENU_LOGO, UiArtText("Create Game", { 24, 161, 590, 35 }, UIS_CENTER | UIS_BIG), UiArtText(selgame_Label, { 34, 211, 205, 33 }, UIS_CENTER | UIS_BIG), // DIFF SELGAME_DESCRIPTION, @@ -51,7 +51,8 @@ UiListItem SELUDPGAME_DIALOG_ITEMS[] = { { "Enter IP", 1 }, }; UiItem SELUDPGAME_DIALOG[] = { - SELGAME_BACKGROUND, + MAINMENU_BACKGROUND, + MAINMENU_LOGO, SELUDPGAME_TITLE, SELUDPGAME_DESCRIPTION_LABEL, SELGAME_DESCRIPTION, @@ -62,7 +63,8 @@ UiItem SELUDPGAME_DIALOG[] = { }; UiItem ENTERIP_DIALOG[] = { - SELGAME_BACKGROUND, + MAINMENU_BACKGROUND, + MAINMENU_LOGO, SELUDPGAME_TITLE, SELUDPGAME_DESCRIPTION_LABEL, SELGAME_DESCRIPTION, @@ -73,7 +75,8 @@ UiItem ENTERIP_DIALOG[] = { }; UiItem ENTERPASSWORD_DIALOG[] = { - SELGAME_BACKGROUND, + MAINMENU_BACKGROUND, + MAINMENU_LOGO, SELUDPGAME_TITLE, SELUDPGAME_DESCRIPTION_LABEL, SELGAME_DESCRIPTION, diff --git a/SourceX/DiabloUI/selhero.cpp b/SourceX/DiabloUI/selhero.cpp index 3237084b4..507a48884 100644 --- a/SourceX/DiabloUI/selhero.cpp +++ b/SourceX/DiabloUI/selhero.cpp @@ -35,7 +35,8 @@ BOOL(*gfnHeroDelete) namespace { UiItem SELHERO_DIALOG[] = { - UiImage(&ArtBackground, { 0, 0, 640, 480 }), + MAINMENU_BACKGROUND, + MAINMENU_LOGO, UiArtText(title, { 24, 161, 590, 35 }, UIS_CENTER | UIS_BIG), UiImage(&ArtHero, UI_NUM_CLASSES, { 30, 211, 180, 76 }), UiArtText("Level:", { 39, 323, 110, 21 }, UIS_RIGHT), diff --git a/SourceX/DiabloUI/selyesno.cpp b/SourceX/DiabloUI/selyesno.cpp index c1ab230a8..b02cbeb37 100644 --- a/SourceX/DiabloUI/selyesno.cpp +++ b/SourceX/DiabloUI/selyesno.cpp @@ -19,7 +19,8 @@ UiListItem SELYESNO_DIALOG_ITEMS[] = { }; UiItem SELYESNO_DIALOG[] = { - UiImage(&ArtBackground, { 0, 0, 640, 480 }), + MAINMENU_BACKGROUND, + MAINMENU_LOGO, UiArtText(selyesno_title, { 24, 161, 590, 35 }, UIS_CENTER | UIS_BIG), UiArtText(selyesno_confirmationMessage, { 120, 236, 280, 168 }, UIS_MED), UiList(SELYESNO_DIALOG_ITEMS, 230, 390, 180, 35, UIS_CENTER | UIS_BIG | UIS_GOLD) diff --git a/SourceX/DiabloUI/title.cpp b/SourceX/DiabloUI/title.cpp index 1404380ee..ec656390c 100644 --- a/SourceX/DiabloUI/title.cpp +++ b/SourceX/DiabloUI/title.cpp @@ -18,7 +18,8 @@ void title_Free() BOOL UiTitleDialog(int a1) { UiItem TITLESCREEN_DIALOG[] = { - UiImage(&ArtBackground, { 0, 0, 640, 480 }), + MAINMENU_BACKGROUND, + UiImage(&ArtLogos[LOGO_BIG], /*animated=*/true, /*frame=*/0, { 0, 182, 0, 0 }, UIS_CENTER), UiArtText("Copyright \xA9 1996-2001 Blizzard Entertainment", { 49, 410, 550, 26 }, UIS_MED | UIS_CENTER) }; @@ -30,7 +31,6 @@ BOOL UiTitleDialog(int a1) SDL_Event event; while (!endMenu && SDL_GetTicks() < timeOut) { UiRenderItems(TITLESCREEN_DIALOG, size(TITLESCREEN_DIALOG)); - DrawLogo(182, LOGO_BIG); UiFadeIn(); while (SDL_PollEvent(&event)) { diff --git a/SourceX/DiabloUI/ui_item.h b/SourceX/DiabloUI/ui_item.h index 656d66919..8907180fe 100644 --- a/SourceX/DiabloUI/ui_item.h +++ b/SourceX/DiabloUI/ui_item.h @@ -70,19 +70,26 @@ struct UiItemBase { }; struct UiImage : public UiItemBase { - constexpr UiImage(Art *art, SDL_Rect rect, int flags = 0) - : UiImage(art, /*frame=*/0, rect, flags) + constexpr UiImage(Art *art, bool animated, int frame, SDL_Rect rect, int flags = 0) + : UiItemBase(rect, flags) + , art(art) + , animated(animated) + , frame(frame) { } constexpr UiImage(Art *art, int frame, SDL_Rect rect, int flags = 0) - : UiItemBase(rect, flags) - , art(art) - , frame(frame) + : UiImage(art, /*animated=*/false, frame, rect, flags) + { + } + + constexpr UiImage(Art *art, SDL_Rect rect, int flags = 0) + : UiImage(art, /*frame=*/0, rect, flags) { } Art *art; + bool animated; int frame; };