diff --git a/Source/DiabloUI/credits.cpp b/Source/DiabloUI/credits.cpp index 5365bb2a8..2980dd286 100644 --- a/Source/DiabloUI/credits.cpp +++ b/Source/DiabloUI/credits.cpp @@ -94,8 +94,9 @@ void CreditsRenderer::Render() prev_offset_y_ = offsetY; SDL_FillRect(DiabloUiSurface(), nullptr, 0x000000); - DrawArt({ PANEL_LEFT - 320, UI_OFFSET_Y }, &ArtBackgroundWidescreen); - DrawArt({ PANEL_LEFT, UI_OFFSET_Y }, &ArtBackground); + const Point uiPosition = GetUIRectangle().position; + DrawArt(uiPosition - Displacement { 320, 0 }, &ArtBackgroundWidescreen); + DrawArt(uiPosition, &ArtBackground); const std::size_t linesBegin = std::max(offsetY / LINE_H, 0); const std::size_t linesEnd = std::min(linesBegin + MAX_VISIBLE_LINES, linesToRender.size()); @@ -107,15 +108,15 @@ void CreditsRenderer::Render() } SDL_Rect viewport = VIEWPORT; - viewport.x += PANEL_LEFT; - viewport.y += UI_OFFSET_Y; + viewport.x += uiPosition.x; + viewport.y += uiPosition.y; ScaleOutputRect(&viewport); SDL_SetClipRect(DiabloUiSurface(), &viewport); // We use unscaled coordinates for calculation throughout. - Sint16 destY = UI_OFFSET_Y + VIEWPORT.y - (offsetY - linesBegin * LINE_H); + Sint16 destY = uiPosition.y + VIEWPORT.y - (offsetY - linesBegin * LINE_H); for (std::size_t i = linesBegin; i < linesEnd; ++i, destY += LINE_H) { - Sint16 destX = PANEL_LEFT + VIEWPORT.x + 31; + Sint16 destX = uiPosition.x + VIEWPORT.x + 31; auto &lineContent = linesToRender[i]; diff --git a/Source/DiabloUI/diabloui.cpp b/Source/DiabloUI/diabloui.cpp index 6df21cc6c..44c95f369 100644 --- a/Source/DiabloUI/diabloui.cpp +++ b/Source/DiabloUI/diabloui.cpp @@ -693,18 +693,19 @@ void LoadBackgroundArt(const char *pszFile, int frames) void UiAddBackground(std::vector> *vecDialog) { + int uiPositionY = GetUIRectangle().position.y; if (ArtBackgroundWidescreen.surface != nullptr) { - SDL_Rect rectw = { 0, UI_OFFSET_Y, 0, 0 }; + SDL_Rect rectw = { 0, uiPositionY, 0, 0 }; vecDialog->push_back(std::make_unique(&ArtBackgroundWidescreen, rectw, UiFlags::AlignCenter)); } - SDL_Rect rect = { 0, UI_OFFSET_Y, 0, 0 }; + SDL_Rect rect = { 0, uiPositionY, 0, 0 }; vecDialog->push_back(std::make_unique(&ArtBackground, rect, UiFlags::AlignCenter)); } void UiAddLogo(std::vector> *vecDialog, int size, int y) { - SDL_Rect rect = { 0, (Sint16)(UI_OFFSET_Y + y), 0, 0 }; + SDL_Rect rect = { 0, (Sint16)(GetUIRectangle().position.y + y), 0, 0 }; vecDialog->push_back(std::make_unique( CelSpriteWithFrameHeight { ArtLogos[size]->sprite, ArtLogos[size]->frameHeight }, rect, UiFlags::AlignCenter, /*bAnimated=*/true)); } diff --git a/Source/DiabloUI/dialogs.cpp b/Source/DiabloUI/dialogs.cpp index e56b091dd..9b39b0fbc 100644 --- a/Source/DiabloUI/dialogs.cpp +++ b/Source/DiabloUI/dialogs.cpp @@ -185,26 +185,27 @@ void Init(string_view caption, string_view text, bool error, bool renderBehind) wrappedText = WordWrapString(text, textWidth, FontSizeDialog); + const Point uiPosition = GetUIRectangle().position; if (caption.empty()) { - SDL_Rect rect1 = MakeSdlRect(PANEL_LEFT + 180, UI_OFFSET_Y + 168, dialogArt.w(), dialogArt.h()); + SDL_Rect rect1 = MakeSdlRect(uiPosition.x + 180, uiPosition.y + 168, dialogArt.w(), dialogArt.h()); vecOkDialog.push_back(std::make_unique(&dialogArt, rect1)); - SDL_Rect rect2 = MakeSdlRect(PANEL_LEFT + 200, UI_OFFSET_Y + 211, textWidth, 80); + SDL_Rect rect2 = MakeSdlRect(uiPosition.x + 200, uiPosition.y + 211, textWidth, 80); vecOkDialog.push_back(std::make_unique(wrappedText, rect2, UiFlags::AlignCenter | UiFlags::ColorDialogWhite)); - SDL_Rect rect3 = MakeSdlRect(PANEL_LEFT + 265, UI_OFFSET_Y + 265, SML_BUTTON_WIDTH, SML_BUTTON_HEIGHT); + SDL_Rect rect3 = MakeSdlRect(uiPosition.x + 265, uiPosition.y + 265, SML_BUTTON_WIDTH, SML_BUTTON_HEIGHT); vecOkDialog.push_back(std::make_unique(&SmlButton, _("OK"), &DialogActionOK, rect3)); } else { - SDL_Rect rect1 = MakeSdlRect(PANEL_LEFT + 127, UI_OFFSET_Y + 100, dialogArt.w(), dialogArt.h()); + SDL_Rect rect1 = MakeSdlRect(uiPosition.x + 127, uiPosition.y + 100, dialogArt.w(), dialogArt.h()); vecOkDialog.push_back(std::make_unique(&dialogArt, rect1)); - SDL_Rect rect2 = MakeSdlRect(PANEL_LEFT + 147, UI_OFFSET_Y + 110, textWidth, 20); + SDL_Rect rect2 = MakeSdlRect(uiPosition.x + 147, uiPosition.y + 110, textWidth, 20); vecOkDialog.push_back(std::make_unique(caption, rect2, UiFlags::AlignCenter | UiFlags::ColorDialogYellow)); - SDL_Rect rect3 = MakeSdlRect(PANEL_LEFT + 147, UI_OFFSET_Y + 141, textWidth, 190); + SDL_Rect rect3 = MakeSdlRect(uiPosition.x + 147, uiPosition.y + 141, textWidth, 190); vecOkDialog.push_back(std::make_unique(wrappedText, rect3, UiFlags::AlignCenter | UiFlags::ColorDialogWhite)); - SDL_Rect rect4 = MakeSdlRect(PANEL_LEFT + 264, UI_OFFSET_Y + 335, SML_BUTTON_WIDTH, SML_BUTTON_HEIGHT); + SDL_Rect rect4 = MakeSdlRect(uiPosition.x + 264, uiPosition.y + 335, SML_BUTTON_WIDTH, SML_BUTTON_HEIGHT); vecOkDialog.push_back(std::make_unique(&SmlButton, _("OK"), &DialogActionOK, rect4)); } } diff --git a/Source/DiabloUI/mainmenu.cpp b/Source/DiabloUI/mainmenu.cpp index e5fdfe028..d9149757a 100644 --- a/Source/DiabloUI/mainmenu.cpp +++ b/Source/DiabloUI/mainmenu.cpp @@ -55,12 +55,14 @@ void MainmenuLoad(const char *name, void (*fnSound)(const char *file)) UiAddBackground(&vecMainMenuDialog); UiAddLogo(&vecMainMenuDialog); + const Point uiPosition = GetUIRectangle().position; + if (gbIsSpawn && gbIsHellfire) { - SDL_Rect rect1 = { (Sint16)(PANEL_LEFT), (Sint16)(UI_OFFSET_Y + 145), 640, 30 }; + SDL_Rect rect1 = { (Sint16)(uiPosition.x), (Sint16)(uiPosition.y + 145), 640, 30 }; vecMainMenuDialog.push_back(std::make_unique(_("Shareware").c_str(), rect1, UiFlags::FontSize30 | UiFlags::ColorUiSilver | UiFlags::AlignCenter, 8)); } - vecMainMenuDialog.push_back(std::make_unique(vecMenuItems, vecMenuItems.size(), PANEL_LEFT + 64, (UI_OFFSET_Y + 192), 510, 43, UiFlags::FontSize42 | UiFlags::ColorUiGold | UiFlags::AlignCenter, 5)); + vecMainMenuDialog.push_back(std::make_unique(vecMenuItems, vecMenuItems.size(), uiPosition.x + 64, (uiPosition.y + 192), 510, 43, UiFlags::FontSize42 | UiFlags::ColorUiGold | UiFlags::AlignCenter, 5)); SDL_Rect rect2 = { 17, (Sint16)(gnScreenHeight - 36), 605, 21 }; vecMainMenuDialog.push_back(std::make_unique(name, rect2, UiFlags::FontSize12 | UiFlags::ColorUiSilverDark)); diff --git a/Source/DiabloUI/progress.cpp b/Source/DiabloUI/progress.cpp index 27504d0b6..ba726f450 100644 --- a/Source/DiabloUI/progress.cpp +++ b/Source/DiabloUI/progress.cpp @@ -33,7 +33,8 @@ void ProgressLoad() LoadArt("ui_art\\prog_fil.pcx", &ProgFil); LoadSmlButtonArt(); - SDL_Rect rect3 = { (Sint16)(PANEL_LEFT + 265), (Sint16)(UI_OFFSET_Y + 267), SML_BUTTON_WIDTH, SML_BUTTON_HEIGHT }; + const Point uiPosition = GetUIRectangle().position; + SDL_Rect rect3 = { (Sint16)(uiPosition.x + 265), (Sint16)(uiPosition.y + 267), SML_BUTTON_WIDTH, SML_BUTTON_HEIGHT }; vecProgress.push_back(std::make_unique(&SmlButton, _("Cancel"), &DialogActionCancel, rect3)); } diff --git a/Source/DiabloUI/selconn.cpp b/Source/DiabloUI/selconn.cpp index f1d315cba..276093e24 100644 --- a/Source/DiabloUI/selconn.cpp +++ b/Source/DiabloUI/selconn.cpp @@ -50,36 +50,38 @@ void SelconnLoad() UiAddBackground(&vecSelConnDlg); UiAddLogo(&vecSelConnDlg); - SDL_Rect rect1 = { (Sint16)(PANEL_LEFT + 24), (Sint16)(Sint16)(UI_OFFSET_Y + 161), 590, 35 }; + const Point uiPosition = GetUIRectangle().position; + + SDL_Rect rect1 = { (Sint16)(uiPosition.x + 24), (Sint16)(Sint16)(uiPosition.y + 161), 590, 35 }; vecSelConnDlg.push_back(std::make_unique(_("Multi Player Game").c_str(), rect1, UiFlags::AlignCenter | UiFlags::FontSize30 | UiFlags::ColorUiSilver, 3)); - SDL_Rect rect2 = { (Sint16)(PANEL_LEFT + 35), (Sint16)(UI_OFFSET_Y + 218), DESCRIPTION_WIDTH, 21 }; + SDL_Rect rect2 = { (Sint16)(uiPosition.x + 35), (Sint16)(uiPosition.y + 218), DESCRIPTION_WIDTH, 21 }; vecSelConnDlg.push_back(std::make_unique(selconn_MaxPlayers, rect2, UiFlags::FontSize12 | UiFlags::ColorUiSilverDark)); - SDL_Rect rect3 = { (Sint16)(PANEL_LEFT + 35), (Sint16)(UI_OFFSET_Y + 256), DESCRIPTION_WIDTH, 21 }; + SDL_Rect rect3 = { (Sint16)(uiPosition.x + 35), (Sint16)(uiPosition.y + 256), DESCRIPTION_WIDTH, 21 }; vecSelConnDlg.push_back(std::make_unique(_("Requirements:").c_str(), rect3, UiFlags::FontSize12 | UiFlags::ColorUiSilverDark)); - SDL_Rect rect4 = { (Sint16)(PANEL_LEFT + 35), (Sint16)(UI_OFFSET_Y + 275), DESCRIPTION_WIDTH, 66 }; + SDL_Rect rect4 = { (Sint16)(uiPosition.x + 35), (Sint16)(uiPosition.y + 275), DESCRIPTION_WIDTH, 66 }; vecSelConnDlg.push_back(std::make_unique(selconn_Description, rect4, UiFlags::FontSize12 | UiFlags::ColorUiSilverDark, 1, 16)); - SDL_Rect rect5 = { (Sint16)(PANEL_LEFT + 30), (Sint16)(UI_OFFSET_Y + 356), 220, 31 }; + SDL_Rect rect5 = { (Sint16)(uiPosition.x + 30), (Sint16)(uiPosition.y + 356), 220, 31 }; vecSelConnDlg.push_back(std::make_unique(_("no gateway needed").c_str(), rect5, UiFlags::AlignCenter | UiFlags::FontSize24 | UiFlags::ColorUiSilver, 0)); - SDL_Rect rect6 = { (Sint16)(PANEL_LEFT + 35), (Sint16)(UI_OFFSET_Y + 393), DESCRIPTION_WIDTH, 21 }; + SDL_Rect rect6 = { (Sint16)(uiPosition.x + 35), (Sint16)(uiPosition.y + 393), DESCRIPTION_WIDTH, 21 }; vecSelConnDlg.push_back(std::make_unique(selconn_Gateway, rect6, UiFlags::AlignCenter | UiFlags::FontSize12 | UiFlags::ColorUiSilverDark)); - SDL_Rect rect7 = { (Sint16)(PANEL_LEFT + 300), (Sint16)(UI_OFFSET_Y + 211), 295, 33 }; + SDL_Rect rect7 = { (Sint16)(uiPosition.x + 300), (Sint16)(uiPosition.y + 211), 295, 33 }; vecSelConnDlg.push_back(std::make_unique(_("Select Connection").c_str(), rect7, UiFlags::AlignCenter | UiFlags::FontSize30 | UiFlags::ColorUiSilver, 3)); - SDL_Rect rect8 = { (Sint16)(PANEL_LEFT + 16), (Sint16)(UI_OFFSET_Y + 427), 250, 35 }; + SDL_Rect rect8 = { (Sint16)(uiPosition.x + 16), (Sint16)(uiPosition.y + 427), 250, 35 }; vecSelConnDlg.push_back(std::make_unique(_("Change Gateway"), nullptr, rect8, UiFlags::AlignCenter | UiFlags::VerticalCenter | UiFlags::FontSize30 | UiFlags::ColorUiGold | UiFlags::ElementHidden)); - vecSelConnDlg.push_back(std::make_unique(vecConnItems, vecConnItems.size(), PANEL_LEFT + 305, (UI_OFFSET_Y + 256), 285, 26, UiFlags::AlignCenter | UiFlags::FontSize12 | UiFlags::VerticalCenter | UiFlags::ColorUiGoldDark)); + vecSelConnDlg.push_back(std::make_unique(vecConnItems, vecConnItems.size(), uiPosition.x + 305, (uiPosition.y + 256), 285, 26, UiFlags::AlignCenter | UiFlags::FontSize12 | UiFlags::VerticalCenter | UiFlags::ColorUiGoldDark)); - SDL_Rect rect9 = { (Sint16)(PANEL_LEFT + 299), (Sint16)(UI_OFFSET_Y + 427), 140, 35 }; + SDL_Rect rect9 = { (Sint16)(uiPosition.x + 299), (Sint16)(uiPosition.y + 427), 140, 35 }; vecSelConnDlg.push_back(std::make_unique(_("OK"), &UiFocusNavigationSelect, rect9, UiFlags::AlignCenter | UiFlags::VerticalCenter | UiFlags::FontSize30 | UiFlags::ColorUiGold)); - SDL_Rect rect10 = { (Sint16)(PANEL_LEFT + 454), (Sint16)(UI_OFFSET_Y + 427), 140, 35 }; + SDL_Rect rect10 = { (Sint16)(uiPosition.x + 454), (Sint16)(uiPosition.y + 427), 140, 35 }; vecSelConnDlg.push_back(std::make_unique(_("Cancel"), &UiFocusNavigationEsc, rect10, UiFlags::AlignCenter | UiFlags::VerticalCenter | UiFlags::FontSize30 | UiFlags::ColorUiGold)); UiInitList(SelconnFocus, SelconnSelect, SelconnEsc, vecSelConnDlg, true); diff --git a/Source/DiabloUI/selgame.cpp b/Source/DiabloUI/selgame.cpp index c4484e98a..78f0d485c 100644 --- a/Source/DiabloUI/selgame.cpp +++ b/Source/DiabloUI/selgame.cpp @@ -124,19 +124,21 @@ void selgame_GameSelection_Init() UiAddBackground(&vecSelGameDialog); UiAddLogo(&vecSelGameDialog); - SDL_Rect rectScrollbar = { (Sint16)(PANEL_LEFT + 590), (Sint16)(UI_OFFSET_Y + 244), 25, 178 }; + const Point uiPosition = GetUIRectangle().position; + + SDL_Rect rectScrollbar = { (Sint16)(uiPosition.x + 590), (Sint16)(uiPosition.y + 244), 25, 178 }; vecSelGameDialog.push_back(std::make_unique(&ArtScrollBarBackground, &ArtScrollBarThumb, &ArtScrollBarArrow, rectScrollbar)); - SDL_Rect rect1 = { (Sint16)(PANEL_LEFT + 24), (Sint16)(UI_OFFSET_Y + 161), 590, 35 }; + SDL_Rect rect1 = { (Sint16)(uiPosition.x + 24), (Sint16)(uiPosition.y + 161), 590, 35 }; vecSelGameDialog.push_back(std::make_unique(_(ConnectionNames[provider]).c_str(), rect1, UiFlags::AlignCenter | UiFlags::FontSize30 | UiFlags::ColorUiSilver, 3)); - SDL_Rect rect2 = { (Sint16)(PANEL_LEFT + 35), (Sint16)(UI_OFFSET_Y + 211), 205, 192 }; + SDL_Rect rect2 = { (Sint16)(uiPosition.x + 35), (Sint16)(uiPosition.y + 211), 205, 192 }; vecSelGameDialog.push_back(std::make_unique(_("Description:").c_str(), rect2, UiFlags::FontSize24 | UiFlags::ColorUiSilver)); - SDL_Rect rect3 = { (Sint16)(PANEL_LEFT + 35), (Sint16)(UI_OFFSET_Y + 256), DESCRIPTION_WIDTH, 192 }; + SDL_Rect rect3 = { (Sint16)(uiPosition.x + 35), (Sint16)(uiPosition.y + 256), DESCRIPTION_WIDTH, 192 }; vecSelGameDialog.push_back(std::make_unique(selgame_Description, rect3, UiFlags::FontSize12 | UiFlags::ColorUiSilverDark, 1, 16)); - SDL_Rect rect4 = { (Sint16)(PANEL_LEFT + 300), (Sint16)(UI_OFFSET_Y + 211), 295, 33 }; + SDL_Rect rect4 = { (Sint16)(uiPosition.x + 300), (Sint16)(uiPosition.y + 211), 295, 33 }; vecSelGameDialog.push_back(std::make_unique(_("Select Action").c_str(), rect4, UiFlags::AlignCenter | UiFlags::FontSize30 | UiFlags::ColorUiSilver, 3)); #ifdef PACKET_ENCRYPTION @@ -162,12 +164,12 @@ void selgame_GameSelection_Init() } } - vecSelGameDialog.push_back(std::make_unique(vecSelGameDlgItems, 6, PANEL_LEFT + 305, (UI_OFFSET_Y + 255), 285, 26, UiFlags::AlignCenter | UiFlags::FontSize24)); + vecSelGameDialog.push_back(std::make_unique(vecSelGameDlgItems, 6, uiPosition.x + 305, (uiPosition.y + 255), 285, 26, UiFlags::AlignCenter | UiFlags::FontSize24)); - SDL_Rect rect5 = { (Sint16)(PANEL_LEFT + 299), (Sint16)(UI_OFFSET_Y + 427), 140, 35 }; + SDL_Rect rect5 = { (Sint16)(uiPosition.x + 299), (Sint16)(uiPosition.y + 427), 140, 35 }; vecSelGameDialog.push_back(std::make_unique(_("OK"), &UiFocusNavigationSelect, rect5, UiFlags::AlignCenter | UiFlags::VerticalCenter | UiFlags::FontSize30 | UiFlags::ColorUiGold)); - SDL_Rect rect6 = { (Sint16)(PANEL_LEFT + 449), (Sint16)(UI_OFFSET_Y + 427), 140, 35 }; + SDL_Rect rect6 = { (Sint16)(uiPosition.x + 449), (Sint16)(uiPosition.y + 427), 140, 35 }; vecSelGameDialog.push_back(std::make_unique(_("CANCEL"), &UiFocusNavigationEsc, rect6, UiFlags::AlignCenter | UiFlags::VerticalCenter | UiFlags::FontSize30 | UiFlags::ColorUiGold)); auto selectFn = [](int index) { @@ -279,13 +281,15 @@ void selgame_GameSelection_Select(int value) UiAddBackground(&vecSelGameDialog); UiAddLogo(&vecSelGameDialog); - SDL_Rect rect1 = { (Sint16)(PANEL_LEFT + 24), (Sint16)(UI_OFFSET_Y + 161), 590, 35 }; + const Point uiPosition = GetUIRectangle().position; + + SDL_Rect rect1 = { (Sint16)(uiPosition.x + 24), (Sint16)(uiPosition.y + 161), 590, 35 }; vecSelGameDialog.push_back(std::make_unique(&title, rect1, UiFlags::AlignCenter | UiFlags::FontSize30 | UiFlags::ColorUiSilver, 3)); - SDL_Rect rect2 = { (Sint16)(PANEL_LEFT + 34), (Sint16)(UI_OFFSET_Y + 211), 205, 33 }; + SDL_Rect rect2 = { (Sint16)(uiPosition.x + 34), (Sint16)(uiPosition.y + 211), 205, 33 }; vecSelGameDialog.push_back(std::make_unique(selgame_Label, rect2, UiFlags::AlignCenter | UiFlags::FontSize30 | UiFlags::ColorUiSilver, 3)); - SDL_Rect rect3 = { (Sint16)(PANEL_LEFT + 35), (Sint16)(UI_OFFSET_Y + 256), DESCRIPTION_WIDTH, 192 }; + SDL_Rect rect3 = { (Sint16)(uiPosition.x + 35), (Sint16)(uiPosition.y + 256), DESCRIPTION_WIDTH, 192 }; vecSelGameDialog.push_back(std::make_unique(selgame_Description, rect3, UiFlags::FontSize12 | UiFlags::ColorUiSilverDark, 1, 16)); switch (value) { @@ -293,19 +297,19 @@ void selgame_GameSelection_Select(int value) case 1: { title = _("Create Game").c_str(); - SDL_Rect rect4 = { (Sint16)(PANEL_LEFT + 299), (Sint16)(UI_OFFSET_Y + 211), 295, 35 }; + SDL_Rect rect4 = { (Sint16)(uiPosition.x + 299), (Sint16)(uiPosition.y + 211), 295, 35 }; vecSelGameDialog.push_back(std::make_unique(_("Select Difficulty").c_str(), rect4, UiFlags::AlignCenter | UiFlags::FontSize30 | UiFlags::ColorUiSilver, 3)); vecSelGameDlgItems.push_back(std::make_unique(_("Normal"), DIFF_NORMAL)); vecSelGameDlgItems.push_back(std::make_unique(_("Nightmare"), DIFF_NIGHTMARE)); vecSelGameDlgItems.push_back(std::make_unique(_("Hell"), DIFF_HELL)); - vecSelGameDialog.push_back(std::make_unique(vecSelGameDlgItems, vecSelGameDlgItems.size(), PANEL_LEFT + 300, (UI_OFFSET_Y + 282), 295, 26, UiFlags::AlignCenter | UiFlags::FontSize24 | UiFlags::ColorUiGold)); + vecSelGameDialog.push_back(std::make_unique(vecSelGameDlgItems, vecSelGameDlgItems.size(), uiPosition.x + 300, (uiPosition.y + 282), 295, 26, UiFlags::AlignCenter | UiFlags::FontSize24 | UiFlags::ColorUiGold)); - SDL_Rect rect5 = { (Sint16)(PANEL_LEFT + 299), (Sint16)(UI_OFFSET_Y + 427), 140, 35 }; + SDL_Rect rect5 = { (Sint16)(uiPosition.x + 299), (Sint16)(uiPosition.y + 427), 140, 35 }; vecSelGameDialog.push_back(std::make_unique(_("OK"), &UiFocusNavigationSelect, rect5, UiFlags::AlignCenter | UiFlags::VerticalCenter | UiFlags::FontSize30 | UiFlags::ColorUiGold)); - SDL_Rect rect6 = { (Sint16)(PANEL_LEFT + 449), (Sint16)(UI_OFFSET_Y + 427), 140, 35 }; + SDL_Rect rect6 = { (Sint16)(uiPosition.x + 449), (Sint16)(uiPosition.y + 427), 140, 35 }; vecSelGameDialog.push_back(std::make_unique(_("CANCEL"), &UiFocusNavigationEsc, rect6, UiFlags::AlignCenter | UiFlags::VerticalCenter | UiFlags::FontSize30 | UiFlags::ColorUiGold)); UiInitList(selgame_Diff_Focus, selgame_Diff_Select, selgame_Diff_Esc, vecSelGameDialog, true); @@ -322,16 +326,16 @@ void selgame_GameSelection_Select(int value) inputHint = _("Enter address").c_str(); } - SDL_Rect rect4 = { (Sint16)(PANEL_LEFT + 305), (Sint16)(UI_OFFSET_Y + 211), 285, 33 }; + SDL_Rect rect4 = { (Sint16)(uiPosition.x + 305), (Sint16)(uiPosition.y + 211), 285, 33 }; vecSelGameDialog.push_back(std::make_unique(inputHint, rect4, UiFlags::AlignCenter | UiFlags::FontSize30 | UiFlags::ColorUiSilver, 3)); - SDL_Rect rect5 = { (Sint16)(PANEL_LEFT + 305), (Sint16)(UI_OFFSET_Y + 314), 285, 33 }; + SDL_Rect rect5 = { (Sint16)(uiPosition.x + 305), (Sint16)(uiPosition.y + 314), 285, 33 }; vecSelGameDialog.push_back(std::make_unique(inputHint, selgame_Ip, 128, false, rect5, UiFlags::FontSize24 | UiFlags::ColorUiGold)); - SDL_Rect rect6 = { (Sint16)(PANEL_LEFT + 299), (Sint16)(UI_OFFSET_Y + 427), 140, 35 }; + SDL_Rect rect6 = { (Sint16)(uiPosition.x + 299), (Sint16)(uiPosition.y + 427), 140, 35 }; vecSelGameDialog.push_back(std::make_unique(_("OK"), &UiFocusNavigationSelect, rect6, UiFlags::AlignCenter | UiFlags::VerticalCenter | UiFlags::FontSize30 | UiFlags::ColorUiGold)); - SDL_Rect rect7 = { (Sint16)(PANEL_LEFT + 449), (Sint16)(UI_OFFSET_Y + 427), 140, 35 }; + SDL_Rect rect7 = { (Sint16)(uiPosition.x + 449), (Sint16)(uiPosition.y + 427), 140, 35 }; vecSelGameDialog.push_back(std::make_unique(_("CANCEL"), &UiFocusNavigationEsc, rect7, UiFlags::AlignCenter | UiFlags::VerticalCenter | UiFlags::FontSize30 | UiFlags::ColorUiGold)); HighlightedItem = 0; @@ -449,16 +453,18 @@ void selgame_GameSpeedSelection() UiAddBackground(&vecSelGameDialog); UiAddLogo(&vecSelGameDialog); - SDL_Rect rect1 = { (Sint16)(PANEL_LEFT + 24), (Sint16)(UI_OFFSET_Y + 161), 590, 35 }; + const Point uiPosition = GetUIRectangle().position; + + SDL_Rect rect1 = { (Sint16)(uiPosition.x + 24), (Sint16)(uiPosition.y + 161), 590, 35 }; vecSelGameDialog.push_back(std::make_unique(_("Create Game").c_str(), rect1, UiFlags::AlignCenter | UiFlags::FontSize30 | UiFlags::ColorUiSilver, 3)); - SDL_Rect rect2 = { (Sint16)(PANEL_LEFT + 34), (Sint16)(UI_OFFSET_Y + 211), 205, 33 }; + SDL_Rect rect2 = { (Sint16)(uiPosition.x + 34), (Sint16)(uiPosition.y + 211), 205, 33 }; vecSelGameDialog.push_back(std::make_unique(selgame_Label, rect2, UiFlags::AlignCenter | UiFlags::FontSize30 | UiFlags::ColorUiSilver, 3)); - SDL_Rect rect3 = { (Sint16)(PANEL_LEFT + 35), (Sint16)(UI_OFFSET_Y + 256), DESCRIPTION_WIDTH, 192 }; + SDL_Rect rect3 = { (Sint16)(uiPosition.x + 35), (Sint16)(uiPosition.y + 256), DESCRIPTION_WIDTH, 192 }; vecSelGameDialog.push_back(std::make_unique(selgame_Description, rect3, UiFlags::FontSize12 | UiFlags::ColorUiSilverDark, 1, 16)); - SDL_Rect rect4 = { (Sint16)(PANEL_LEFT + 299), (Sint16)(UI_OFFSET_Y + 211), 295, 35 }; + SDL_Rect rect4 = { (Sint16)(uiPosition.x + 299), (Sint16)(uiPosition.y + 211), 295, 35 }; vecSelGameDialog.push_back(std::make_unique(_("Select Game Speed").c_str(), rect4, UiFlags::AlignCenter | UiFlags::FontSize30 | UiFlags::ColorUiSilver, 3)); vecSelGameDlgItems.push_back(std::make_unique(_("Normal"), 20)); @@ -466,12 +472,12 @@ void selgame_GameSpeedSelection() vecSelGameDlgItems.push_back(std::make_unique(_("Faster"), 40)); vecSelGameDlgItems.push_back(std::make_unique(_("Fastest"), 50)); - vecSelGameDialog.push_back(std::make_unique(vecSelGameDlgItems, vecSelGameDlgItems.size(), PANEL_LEFT + 300, (UI_OFFSET_Y + 279), 295, 26, UiFlags::AlignCenter | UiFlags::FontSize24 | UiFlags::ColorUiGold)); + vecSelGameDialog.push_back(std::make_unique(vecSelGameDlgItems, vecSelGameDlgItems.size(), uiPosition.x + 300, (uiPosition.y + 279), 295, 26, UiFlags::AlignCenter | UiFlags::FontSize24 | UiFlags::ColorUiGold)); - SDL_Rect rect5 = { (Sint16)(PANEL_LEFT + 299), (Sint16)(UI_OFFSET_Y + 427), 140, 35 }; + SDL_Rect rect5 = { (Sint16)(uiPosition.x + 299), (Sint16)(uiPosition.y + 427), 140, 35 }; vecSelGameDialog.push_back(std::make_unique(_("OK"), &UiFocusNavigationSelect, rect5, UiFlags::AlignCenter | UiFlags::VerticalCenter | UiFlags::FontSize30 | UiFlags::ColorUiGold)); - SDL_Rect rect6 = { (Sint16)(PANEL_LEFT + 449), (Sint16)(UI_OFFSET_Y + 427), 140, 35 }; + SDL_Rect rect6 = { (Sint16)(uiPosition.x + 449), (Sint16)(uiPosition.y + 427), 140, 35 }; vecSelGameDialog.push_back(std::make_unique(_("CANCEL"), &UiFocusNavigationEsc, rect6, UiFlags::AlignCenter | UiFlags::VerticalCenter | UiFlags::FontSize30 | UiFlags::ColorUiGold)); UiInitList(selgame_Speed_Focus, selgame_Speed_Select, selgame_Speed_Esc, vecSelGameDialog, true); @@ -526,27 +532,29 @@ void selgame_Password_Init(int /*value*/) UiAddBackground(&vecSelGameDialog); UiAddLogo(&vecSelGameDialog); - SDL_Rect rect1 = { (Sint16)(PANEL_LEFT + 24), (Sint16)(UI_OFFSET_Y + 161), 590, 35 }; + const Point uiPosition = GetUIRectangle().position; + + SDL_Rect rect1 = { (Sint16)(uiPosition.x + 24), (Sint16)(uiPosition.y + 161), 590, 35 }; vecSelGameDialog.push_back(std::make_unique(_(ConnectionNames[provider]).c_str(), rect1, UiFlags::AlignCenter | UiFlags::FontSize30 | UiFlags::ColorUiSilver, 3)); - SDL_Rect rect2 = { (Sint16)(PANEL_LEFT + 35), (Sint16)(UI_OFFSET_Y + 211), 205, 192 }; + SDL_Rect rect2 = { (Sint16)(uiPosition.x + 35), (Sint16)(uiPosition.y + 211), 205, 192 }; vecSelGameDialog.push_back(std::make_unique(_("Description:").c_str(), rect2, UiFlags::FontSize24 | UiFlags::ColorUiSilver)); - SDL_Rect rect3 = { (Sint16)(PANEL_LEFT + 35), (Sint16)(UI_OFFSET_Y + 256), DESCRIPTION_WIDTH, 192 }; + SDL_Rect rect3 = { (Sint16)(uiPosition.x + 35), (Sint16)(uiPosition.y + 256), DESCRIPTION_WIDTH, 192 }; vecSelGameDialog.push_back(std::make_unique(selgame_Description, rect3, UiFlags::FontSize12 | UiFlags::ColorUiSilverDark, 1, 16)); - SDL_Rect rect4 = { (Sint16)(PANEL_LEFT + 305), (Sint16)(UI_OFFSET_Y + 211), 285, 33 }; + SDL_Rect rect4 = { (Sint16)(uiPosition.x + 305), (Sint16)(uiPosition.y + 211), 285, 33 }; vecSelGameDialog.push_back(std::make_unique(_("Enter Password").c_str(), rect4, UiFlags::AlignCenter | UiFlags::FontSize30 | UiFlags::ColorUiSilver, 3)); // Allow password to be empty only when joining games bool allowEmpty = selgame_selectedGame == 2; - SDL_Rect rect5 = { (Sint16)(PANEL_LEFT + 305), (Sint16)(UI_OFFSET_Y + 314), 285, 33 }; + SDL_Rect rect5 = { (Sint16)(uiPosition.x + 305), (Sint16)(uiPosition.y + 314), 285, 33 }; vecSelGameDialog.push_back(std::make_unique(_("Enter Password"), selgame_Password, 15, allowEmpty, rect5, UiFlags::FontSize24 | UiFlags::ColorUiGold)); - SDL_Rect rect6 = { (Sint16)(PANEL_LEFT + 299), (Sint16)(UI_OFFSET_Y + 427), 140, 35 }; + SDL_Rect rect6 = { (Sint16)(uiPosition.x + 299), (Sint16)(uiPosition.y + 427), 140, 35 }; vecSelGameDialog.push_back(std::make_unique(_("OK"), &UiFocusNavigationSelect, rect6, UiFlags::AlignCenter | UiFlags::VerticalCenter | UiFlags::FontSize30 | UiFlags::ColorUiGold)); - SDL_Rect rect7 = { (Sint16)(PANEL_LEFT + 449), (Sint16)(UI_OFFSET_Y + 427), 140, 35 }; + SDL_Rect rect7 = { (Sint16)(uiPosition.x + 449), (Sint16)(uiPosition.y + 427), 140, 35 }; vecSelGameDialog.push_back(std::make_unique(_("CANCEL"), &UiFocusNavigationEsc, rect7, UiFlags::AlignCenter | UiFlags::VerticalCenter | UiFlags::FontSize30 | UiFlags::ColorUiGold)); UiInitList(nullptr, selgame_Password_Select, selgame_Password_Esc, vecSelGameDialog); diff --git a/Source/DiabloUI/selhero.cpp b/Source/DiabloUI/selhero.cpp index 32d14b83f..4b54a510e 100644 --- a/Source/DiabloUI/selhero.cpp +++ b/Source/DiabloUI/selhero.cpp @@ -125,10 +125,12 @@ bool SelheroListDeleteYesNo() void SelheroListSelect(int value) { + const Point uiPosition = GetUIRectangle().position; + if (static_cast(value) == selhero_SaveCount) { vecSelDlgItems.clear(); - SDL_Rect rect1 = { (Sint16)(PANEL_LEFT + 264), (Sint16)(UI_OFFSET_Y + 211), 320, 33 }; + SDL_Rect rect1 = { (Sint16)(uiPosition.x + 264), (Sint16)(uiPosition.y + 211), 320, 33 }; vecSelDlgItems.push_back(std::make_unique(_("Choose Class").c_str(), rect1, UiFlags::AlignCenter | UiFlags::FontSize30 | UiFlags::ColorUiSilver, 3)); vecSelHeroDlgItems.clear(); @@ -148,12 +150,12 @@ void SelheroListSelect(int value) if (vecSelHeroDlgItems.size() > 4) itemH = 26; int itemY = 246 + (176 - vecSelHeroDlgItems.size() * itemH) / 2; - vecSelDlgItems.push_back(std::make_unique(vecSelHeroDlgItems, vecSelHeroDlgItems.size(), PANEL_LEFT + 264, (UI_OFFSET_Y + itemY), 320, itemH, UiFlags::AlignCenter | UiFlags::FontSize24 | UiFlags::ColorUiGold)); + vecSelDlgItems.push_back(std::make_unique(vecSelHeroDlgItems, vecSelHeroDlgItems.size(), uiPosition.x + 264, (uiPosition.y + itemY), 320, itemH, UiFlags::AlignCenter | UiFlags::FontSize24 | UiFlags::ColorUiGold)); - SDL_Rect rect2 = { (Sint16)(PANEL_LEFT + 279), (Sint16)(UI_OFFSET_Y + 429), 140, 35 }; + SDL_Rect rect2 = { (Sint16)(uiPosition.x + 279), (Sint16)(uiPosition.y + 429), 140, 35 }; vecSelDlgItems.push_back(std::make_unique(_("OK"), &UiFocusNavigationSelect, rect2, UiFlags::AlignCenter | UiFlags::FontSize30 | UiFlags::ColorUiGold)); - SDL_Rect rect3 = { (Sint16)(PANEL_LEFT + 429), (Sint16)(UI_OFFSET_Y + 429), 140, 35 }; + SDL_Rect rect3 = { (Sint16)(uiPosition.x + 429), (Sint16)(uiPosition.y + 429), 140, 35 }; vecSelDlgItems.push_back(std::make_unique(_("Cancel"), &UiFocusNavigationEsc, rect3, UiFlags::AlignCenter | UiFlags::FontSize30 | UiFlags::ColorUiGold)); UiInitList(SelheroClassSelectorFocus, SelheroClassSelectorSelect, SelheroClassSelectorEsc, vecSelDlgItems, true); @@ -167,18 +169,18 @@ void SelheroListSelect(int value) if (selhero_heroInfo.hassaved) { vecSelDlgItems.clear(); - SDL_Rect rect1 = { (Sint16)(PANEL_LEFT + 264), (Sint16)(UI_OFFSET_Y + 211), 320, 33 }; + SDL_Rect rect1 = { (Sint16)(uiPosition.x + 264), (Sint16)(uiPosition.y + 211), 320, 33 }; vecSelDlgItems.push_back(std::make_unique(_("Save File Exists").c_str(), rect1, UiFlags::AlignCenter | UiFlags::FontSize30 | UiFlags::ColorUiSilver, 3)); vecSelHeroDlgItems.clear(); vecSelHeroDlgItems.push_back(std::make_unique(_("Load Game"), 0)); vecSelHeroDlgItems.push_back(std::make_unique(_("New Game"), 1)); - vecSelDlgItems.push_back(std::make_unique(vecSelHeroDlgItems, vecSelHeroDlgItems.size(), PANEL_LEFT + 265, (UI_OFFSET_Y + 285), 320, 33, UiFlags::AlignCenter | UiFlags::FontSize24 | UiFlags::ColorUiGold)); + vecSelDlgItems.push_back(std::make_unique(vecSelHeroDlgItems, vecSelHeroDlgItems.size(), uiPosition.x + 265, (uiPosition.y + 285), 320, 33, UiFlags::AlignCenter | UiFlags::FontSize24 | UiFlags::ColorUiGold)); - SDL_Rect rect2 = { (Sint16)(PANEL_LEFT + 279), (Sint16)(UI_OFFSET_Y + 427), 140, 35 }; + SDL_Rect rect2 = { (Sint16)(uiPosition.x + 279), (Sint16)(uiPosition.y + 427), 140, 35 }; vecSelDlgItems.push_back(std::make_unique(_("OK"), &UiFocusNavigationSelect, rect2, UiFlags::AlignCenter | UiFlags::VerticalCenter | UiFlags::FontSize30 | UiFlags::ColorUiGold)); - SDL_Rect rect3 = { (Sint16)(PANEL_LEFT + 429), (Sint16)(UI_OFFSET_Y + 427), 140, 35 }; + SDL_Rect rect3 = { (Sint16)(uiPosition.x + 429), (Sint16)(uiPosition.y + 427), 140, 35 }; vecSelDlgItems.push_back(std::make_unique(_("Cancel"), &UiFocusNavigationEsc, rect3, UiFlags::AlignCenter | UiFlags::VerticalCenter | UiFlags::FontSize30 | UiFlags::ColorUiGold)); UiInitList(SelheroLoadFocus, SelheroLoadSelect, selhero_List_Init, vecSelDlgItems, true); @@ -234,21 +236,23 @@ void SelheroClassSelectorSelect(int value) return; } + const Point uiPosition = GetUIRectangle().position; + title = selhero_isMultiPlayer ? _("New Multi Player Hero").c_str() : _("New Single Player Hero").c_str(); memset(selhero_heroInfo.name, '\0', sizeof(selhero_heroInfo.name)); if (ShouldPrefillHeroName()) strcpy(selhero_heroInfo.name, SelheroGenerateName(selhero_heroInfo.heroclass)); vecSelDlgItems.clear(); - SDL_Rect rect1 = { (Sint16)(PANEL_LEFT + 264), (Sint16)(UI_OFFSET_Y + 211), 320, 33 }; + SDL_Rect rect1 = { (Sint16)(uiPosition.x + 264), (Sint16)(uiPosition.y + 211), 320, 33 }; vecSelDlgItems.push_back(std::make_unique(_("Enter Name").c_str(), rect1, UiFlags::AlignCenter | UiFlags::FontSize30 | UiFlags::ColorUiSilver, 3)); - SDL_Rect rect2 = { (Sint16)(PANEL_LEFT + 265), (Sint16)(UI_OFFSET_Y + 317), 320, 33 }; + SDL_Rect rect2 = { (Sint16)(uiPosition.x + 265), (Sint16)(uiPosition.y + 317), 320, 33 }; vecSelDlgItems.push_back(std::make_unique(_("Enter Name"), selhero_heroInfo.name, 15, false, rect2, UiFlags::FontSize24 | UiFlags::ColorUiGold)); - SDL_Rect rect3 = { (Sint16)(PANEL_LEFT + 279), (Sint16)(UI_OFFSET_Y + 429), 140, 35 }; + SDL_Rect rect3 = { (Sint16)(uiPosition.x + 279), (Sint16)(uiPosition.y + 429), 140, 35 }; vecSelDlgItems.push_back(std::make_unique(_("OK"), &UiFocusNavigationSelect, rect3, UiFlags::AlignCenter | UiFlags::FontSize30 | UiFlags::ColorUiGold)); - SDL_Rect rect4 = { (Sint16)(PANEL_LEFT + 429), (Sint16)(UI_OFFSET_Y + 429), 140, 35 }; + SDL_Rect rect4 = { (Sint16)(uiPosition.x + 429), (Sint16)(uiPosition.y + 429), 140, 35 }; vecSelDlgItems.push_back(std::make_unique(_("Cancel"), &UiFocusNavigationEsc, rect4, UiFlags::AlignCenter | UiFlags::FontSize30 | UiFlags::ColorUiGold)); UiInitList(nullptr, SelheroNameSelect, SelheroNameEsc, vecSelDlgItems); @@ -423,57 +427,61 @@ void selhero_Init() gfnHeroInfo(SelHeroGetHeroInfo); std::reverse(selhero_heros, selhero_heros + selhero_SaveCount); + const Point uiPosition = GetUIRectangle().position; + vecSelDlgItems.clear(); - SDL_Rect rect1 = { (Sint16)(PANEL_LEFT + 24), (Sint16)(UI_OFFSET_Y + 161), 590, 35 }; + SDL_Rect rect1 = { (Sint16)(uiPosition.x + 24), (Sint16)(uiPosition.y + 161), 590, 35 }; vecSelHeroDialog.push_back(std::make_unique(&title, rect1, UiFlags::AlignCenter | UiFlags::FontSize30 | UiFlags::ColorUiSilver, 3)); - SDL_Rect rect2 = { (Sint16)(PANEL_LEFT + 30), (Sint16)(UI_OFFSET_Y + 211), 180, 76 }; + SDL_Rect rect2 = { (Sint16)(uiPosition.x + 30), (Sint16)(uiPosition.y + 211), 180, 76 }; auto heroImg = std::make_unique(&ArtHero, rect2, UiFlags::None, /*bAnimated=*/false, static_cast(enum_size::value)); SELHERO_DIALOG_HERO_IMG = heroImg.get(); vecSelHeroDialog.push_back(std::move(heroImg)); - SDL_Rect rect3 = { (Sint16)(PANEL_LEFT + 39), (Sint16)(UI_OFFSET_Y + 323), 110, 21 }; + SDL_Rect rect3 = { (Sint16)(uiPosition.x + 39), (Sint16)(uiPosition.y + 323), 110, 21 }; vecSelHeroDialog.push_back(std::make_unique(_("Level:").c_str(), rect3, UiFlags::AlignRight | UiFlags::FontSize12 | UiFlags::ColorUiSilverDark)); - SDL_Rect rect4 = { (Sint16)(PANEL_LEFT + 39), (Sint16)(UI_OFFSET_Y + 323), 110, 21 }; + SDL_Rect rect4 = { (Sint16)(uiPosition.x + 39), (Sint16)(uiPosition.y + 323), 110, 21 }; vecSelHeroDialog.push_back(std::make_unique(_("Level:").c_str(), rect4, UiFlags::AlignRight | UiFlags::FontSize12 | UiFlags::ColorUiSilverDark)); - SDL_Rect rect5 = { (Sint16)(PANEL_LEFT + 159), (Sint16)(UI_OFFSET_Y + 323), 40, 21 }; + SDL_Rect rect5 = { (Sint16)(uiPosition.x + 159), (Sint16)(uiPosition.y + 323), 40, 21 }; vecSelHeroDialog.push_back(std::make_unique(textStats[0], rect5, UiFlags::AlignCenter | UiFlags::FontSize12 | UiFlags::ColorUiSilverDark)); - SDL_Rect rect6 = { (Sint16)(PANEL_LEFT + 39), (Sint16)(UI_OFFSET_Y + 358), 110, 21 }; + SDL_Rect rect6 = { (Sint16)(uiPosition.x + 39), (Sint16)(uiPosition.y + 358), 110, 21 }; vecSelHeroDialog.push_back(std::make_unique(_("Strength:").c_str(), rect6, UiFlags::AlignRight | UiFlags::FontSize12 | UiFlags::ColorUiSilverDark)); - SDL_Rect rect7 = { (Sint16)(PANEL_LEFT + 159), (Sint16)(UI_OFFSET_Y + 358), 40, 21 }; + SDL_Rect rect7 = { (Sint16)(uiPosition.x + 159), (Sint16)(uiPosition.y + 358), 40, 21 }; vecSelHeroDialog.push_back(std::make_unique(textStats[1], rect7, UiFlags::AlignCenter | UiFlags::FontSize12 | UiFlags::ColorUiSilverDark)); - SDL_Rect rect8 = { (Sint16)(PANEL_LEFT + 39), (Sint16)(UI_OFFSET_Y + 380), 110, 21 }; + SDL_Rect rect8 = { (Sint16)(uiPosition.x + 39), (Sint16)(uiPosition.y + 380), 110, 21 }; vecSelHeroDialog.push_back(std::make_unique(_("Magic:").c_str(), rect8, UiFlags::AlignRight | UiFlags::FontSize12 | UiFlags::ColorUiSilverDark)); - SDL_Rect rect9 = { (Sint16)(PANEL_LEFT + 159), (Sint16)(UI_OFFSET_Y + 380), 40, 21 }; + SDL_Rect rect9 = { (Sint16)(uiPosition.x + 159), (Sint16)(uiPosition.y + 380), 40, 21 }; vecSelHeroDialog.push_back(std::make_unique(textStats[2], rect9, UiFlags::AlignCenter | UiFlags::FontSize12 | UiFlags::ColorUiSilverDark)); - SDL_Rect rect10 = { (Sint16)(PANEL_LEFT + 39), (Sint16)(UI_OFFSET_Y + 401), 110, 21 }; + SDL_Rect rect10 = { (Sint16)(uiPosition.x + 39), (Sint16)(uiPosition.y + 401), 110, 21 }; vecSelHeroDialog.push_back(std::make_unique(_("Dexterity:").c_str(), rect10, UiFlags::AlignRight | UiFlags::FontSize12 | UiFlags::ColorUiSilverDark)); - SDL_Rect rect11 = { (Sint16)(PANEL_LEFT + 159), (Sint16)(UI_OFFSET_Y + 401), 40, 21 }; + SDL_Rect rect11 = { (Sint16)(uiPosition.x + 159), (Sint16)(uiPosition.y + 401), 40, 21 }; vecSelHeroDialog.push_back(std::make_unique(textStats[3], rect11, UiFlags::AlignCenter | UiFlags::FontSize12 | UiFlags::ColorUiSilverDark)); - SDL_Rect rect12 = { (Sint16)(PANEL_LEFT + 39), (Sint16)(UI_OFFSET_Y + 422), 110, 21 }; + SDL_Rect rect12 = { (Sint16)(uiPosition.x + 39), (Sint16)(uiPosition.y + 422), 110, 21 }; vecSelHeroDialog.push_back(std::make_unique(_("Vitality:").c_str(), rect12, UiFlags::AlignRight | UiFlags::FontSize12 | UiFlags::ColorUiSilverDark)); - SDL_Rect rect13 = { (Sint16)(PANEL_LEFT + 159), (Sint16)(UI_OFFSET_Y + 422), 40, 21 }; + SDL_Rect rect13 = { (Sint16)(uiPosition.x + 159), (Sint16)(uiPosition.y + 422), 40, 21 }; vecSelHeroDialog.push_back(std::make_unique(textStats[4], rect13, UiFlags::AlignCenter | UiFlags::FontSize12 | UiFlags::ColorUiSilverDark)); #ifdef _DEBUG - SDL_Rect rect14 = { (Sint16)(PANEL_LEFT + 39), (Sint16)(UI_OFFSET_Y + 443), 110, 21 }; + SDL_Rect rect14 = { (Sint16)(uiPosition.x + 39), (Sint16)(uiPosition.y + 443), 110, 21 }; vecSelHeroDialog.push_back(std::make_unique(_("Savegame:").c_str(), rect14, UiFlags::AlignRight | UiFlags::FontSize12 | UiFlags::ColorUiSilverDark)); - SDL_Rect rect15 = { (Sint16)(PANEL_LEFT + 159), (Sint16)(UI_OFFSET_Y + 443), 40, 21 }; + SDL_Rect rect15 = { (Sint16)(uiPosition.x + 159), (Sint16)(uiPosition.y + 443), 40, 21 }; vecSelHeroDialog.push_back(std::make_unique(textStats[5], rect15, UiFlags::AlignCenter | UiFlags::FontSize12 | UiFlags::ColorUiSilverDark)); #endif } void selhero_List_Init() { + const Point uiPosition = GetUIRectangle().position; + size_t selectedItem = 0; vecSelDlgItems.clear(); - SDL_Rect rect1 = { (Sint16)(PANEL_LEFT + 264), (Sint16)(UI_OFFSET_Y + 211), 320, 33 }; + SDL_Rect rect1 = { (Sint16)(uiPosition.x + 264), (Sint16)(uiPosition.y + 211), 320, 33 }; vecSelDlgItems.push_back(std::make_unique(_("Select Hero").c_str(), rect1, UiFlags::AlignCenter | UiFlags::FontSize30 | UiFlags::ColorUiSilver, 3)); vecSelHeroDlgItems.clear(); @@ -484,20 +492,20 @@ void selhero_List_Init() } vecSelHeroDlgItems.push_back(std::make_unique(_("New Hero").c_str(), static_cast(selhero_SaveCount))); - vecSelDlgItems.push_back(std::make_unique(vecSelHeroDlgItems, 6, PANEL_LEFT + 265, (UI_OFFSET_Y + 256), 320, 26, UiFlags::AlignCenter | UiFlags::FontSize24 | UiFlags::ColorUiGold)); + vecSelDlgItems.push_back(std::make_unique(vecSelHeroDlgItems, 6, uiPosition.x + 265, (uiPosition.y + 256), 320, 26, UiFlags::AlignCenter | UiFlags::FontSize24 | UiFlags::ColorUiGold)); - SDL_Rect rect2 = { (Sint16)(PANEL_LEFT + 585), (Sint16)(UI_OFFSET_Y + 244), 25, 178 }; + SDL_Rect rect2 = { (Sint16)(uiPosition.x + 585), (Sint16)(uiPosition.y + 244), 25, 178 }; vecSelDlgItems.push_back(std::make_unique(&ArtScrollBarBackground, &ArtScrollBarThumb, &ArtScrollBarArrow, rect2)); - SDL_Rect rect3 = { (Sint16)(PANEL_LEFT + 239), (Sint16)(UI_OFFSET_Y + 429), 120, 35 }; + SDL_Rect rect3 = { (Sint16)(uiPosition.x + 239), (Sint16)(uiPosition.y + 429), 120, 35 }; vecSelDlgItems.push_back(std::make_unique(_("OK"), &UiFocusNavigationSelect, rect3, UiFlags::AlignCenter | UiFlags::FontSize30 | UiFlags::ColorUiGold)); - SDL_Rect rect4 = { (Sint16)(PANEL_LEFT + 364), (Sint16)(UI_OFFSET_Y + 429), 120, 35 }; + SDL_Rect rect4 = { (Sint16)(uiPosition.x + 364), (Sint16)(uiPosition.y + 429), 120, 35 }; auto setlistDialogDeleteButton = std::make_unique(_("Delete"), &SelheroUiFocusNavigationYesNo, rect4, UiFlags::AlignCenter | UiFlags::FontSize30 | UiFlags::ColorUiSilver | UiFlags::ElementDisabled); SELLIST_DIALOG_DELETE_BUTTON = setlistDialogDeleteButton.get(); vecSelDlgItems.push_back(std::move(setlistDialogDeleteButton)); - SDL_Rect rect5 = { (Sint16)(PANEL_LEFT + 489), (Sint16)(UI_OFFSET_Y + 429), 120, 35 }; + SDL_Rect rect5 = { (Sint16)(uiPosition.x + 489), (Sint16)(uiPosition.y + 429), 120, 35 }; vecSelDlgItems.push_back(std::make_unique(_("Cancel"), &UiFocusNavigationEsc, rect5, UiFlags::AlignCenter | UiFlags::FontSize30 | UiFlags::ColorUiGold)); UiInitList(SelheroListFocus, SelheroListSelect, SelheroListEsc, vecSelDlgItems, false, nullptr, SelheroListDeleteYesNo, selectedItem); diff --git a/Source/DiabloUI/selok.cpp b/Source/DiabloUI/selok.cpp index 44c5733e7..364a52282 100644 --- a/Source/DiabloUI/selok.cpp +++ b/Source/DiabloUI/selok.cpp @@ -55,19 +55,21 @@ void UiSelOkDialog(const char *title, const char *body, bool background) UiAddBackground(&vecSelOkDialog); UiAddLogo(&vecSelOkDialog); + const Point uiPosition = GetUIRectangle().position; + if (title != nullptr) { - SDL_Rect rect1 = { (Sint16)(PANEL_LEFT + 24), (Sint16)(UI_OFFSET_Y + 161), 590, 35 }; + SDL_Rect rect1 = { (Sint16)(uiPosition.x + 24), (Sint16)(uiPosition.y + 161), 590, 35 }; vecSelOkDialog.push_back(std::make_unique(title, rect1, UiFlags::AlignCenter | UiFlags::FontSize30 | UiFlags::ColorUiSilver, 3)); - SDL_Rect rect2 = { (Sint16)(PANEL_LEFT + 140), (Sint16)(UI_OFFSET_Y + 210), 560, 168 }; + SDL_Rect rect2 = { (Sint16)(uiPosition.x + 140), (Sint16)(uiPosition.y + 210), 560, 168 }; vecSelOkDialog.push_back(std::make_unique(dialogText, rect2, UiFlags::FontSize24 | UiFlags::ColorUiSilver)); } else { - SDL_Rect rect1 = { (Sint16)(PANEL_LEFT + 140), (Sint16)(UI_OFFSET_Y + 197), 560, 168 }; + SDL_Rect rect1 = { (Sint16)(uiPosition.x + 140), (Sint16)(uiPosition.y + 197), 560, 168 }; vecSelOkDialog.push_back(std::make_unique(dialogText, rect1, UiFlags::FontSize24 | UiFlags::ColorUiSilver)); } vecSelOkDialogItems.push_back(std::make_unique(_("OK"), 0)); - vecSelOkDialog.push_back(std::make_unique(vecSelOkDialogItems, 1, PANEL_LEFT + 230, (UI_OFFSET_Y + 390), 180, 35, UiFlags::AlignCenter | UiFlags::FontSize30 | UiFlags::ColorUiGold)); + vecSelOkDialog.push_back(std::make_unique(vecSelOkDialogItems, 1, uiPosition.x + 230, (uiPosition.y + 390), 180, 35, UiFlags::AlignCenter | UiFlags::FontSize30 | UiFlags::ColorUiGold)); CopyUtf8(dialogText, WordWrapString(body, MESSAGE_WIDTH, GameFont24), sizeof(dialogText)); diff --git a/Source/DiabloUI/selstart.cpp b/Source/DiabloUI/selstart.cpp index 1b1b78548..3cb94cb7a 100644 --- a/Source/DiabloUI/selstart.cpp +++ b/Source/DiabloUI/selstart.cpp @@ -37,12 +37,14 @@ void UiSelStartUpGameOption() LoadMaskedArt("ui_art\\hf_logo2.pcx", &artLogo, 16); UiAddBackground(&vecDialog); - SDL_Rect rect = { 0, (Sint16)(UI_OFFSET_Y), 0, 0 }; + const Point uiPosition = GetUIRectangle().position; + + SDL_Rect rect = { 0, (Sint16)(uiPosition.y), 0, 0 }; vecDialog.push_back(std::make_unique(&artLogo, rect, UiFlags::AlignCenter, /*bAnimated=*/true)); vecDialogItems.push_back(std::make_unique(_("Enter Hellfire"), static_cast(StartUpGameMode::Hellfire))); vecDialogItems.push_back(std::make_unique(_("Switch to Diablo"), static_cast(StartUpGameMode::Diablo))); - vecDialog.push_back(std::make_unique(vecDialogItems, vecDialogItems.size(), PANEL_LEFT + 64, (UI_OFFSET_Y + 240), 510, 43, UiFlags::AlignCenter | UiFlags::FontSize42 | UiFlags::ColorUiGold, 5)); + vecDialog.push_back(std::make_unique(vecDialogItems, vecDialogItems.size(), uiPosition.x + 64, (uiPosition.y + 240), 510, 43, UiFlags::AlignCenter | UiFlags::FontSize42 | UiFlags::ColorUiGold, 5)); UiInitList(nullptr, ItemSelected, EscPressed, vecDialog, true); diff --git a/Source/DiabloUI/selyesno.cpp b/Source/DiabloUI/selyesno.cpp index 091d817e2..d458ff2f8 100644 --- a/Source/DiabloUI/selyesno.cpp +++ b/Source/DiabloUI/selyesno.cpp @@ -46,15 +46,17 @@ bool UiSelHeroYesNoDialog(const char *title, const char *body) UiAddBackground(&vecSelYesNoDialog); UiAddLogo(&vecSelYesNoDialog); - SDL_Rect rect1 = { (Sint16)(PANEL_LEFT + 24), (Sint16)(UI_OFFSET_Y + 161), 590, 35 }; + const Point uiPosition = GetUIRectangle().position; + + SDL_Rect rect1 = { (Sint16)(uiPosition.x + 24), (Sint16)(uiPosition.y + 161), 590, 35 }; vecSelYesNoDialog.push_back(std::make_unique(title, rect1, UiFlags::AlignCenter | UiFlags::FontSize30 | UiFlags::ColorUiSilver, 3)); - SDL_Rect rect2 = { (Sint16)(PANEL_LEFT + 120), (Sint16)(UI_OFFSET_Y + 236), MESSAGE_WIDTH, 168 }; + SDL_Rect rect2 = { (Sint16)(uiPosition.x + 120), (Sint16)(uiPosition.y + 236), MESSAGE_WIDTH, 168 }; vecSelYesNoDialog.push_back(std::make_unique(selyesno_confirmationMessage, rect2, UiFlags::FontSize24 | UiFlags::ColorUiSilver)); vecSelYesNoDialogItems.push_back(std::make_unique(_("Yes"), 0)); vecSelYesNoDialogItems.push_back(std::make_unique(_("No"), 1)); - vecSelYesNoDialog.push_back(std::make_unique(vecSelYesNoDialogItems, vecSelYesNoDialogItems.size(), PANEL_LEFT + 230, (UI_OFFSET_Y + 390), 180, 35, UiFlags::AlignCenter | UiFlags::FontSize30 | UiFlags::ColorUiGold)); + vecSelYesNoDialog.push_back(std::make_unique(vecSelYesNoDialogItems, vecSelYesNoDialogItems.size(), uiPosition.x + 230, (uiPosition.y + 390), 180, 35, UiFlags::AlignCenter | UiFlags::FontSize30 | UiFlags::ColorUiGold)); CopyUtf8(selyesno_confirmationMessage, WordWrapString(body, MESSAGE_WIDTH, GameFont24), sizeof(selyesno_confirmationMessage)); diff --git a/Source/DiabloUI/settingsmenu.cpp b/Source/DiabloUI/settingsmenu.cpp index 2c88d18e8..f17a698ef 100644 --- a/Source/DiabloUI/settingsmenu.cpp +++ b/Source/DiabloUI/settingsmenu.cpp @@ -252,13 +252,15 @@ void UiSettingsMenu() UiAddBackground(&vecDialog); UiAddLogo(&vecDialog); - rectList = { { PANEL_LEFT + 50, (UI_OFFSET_Y + 204) }, { 540, 208 } }; - rectDescription = { { PANEL_LEFT + 24, rectList.position.y + rectList.size.height + 16 }, { 590, 35 } }; + const Rectangle &uiRectangle = GetUIRectangle(); + + rectList = { { uiRectangle.position.x + 50, (uiRectangle.position.y + 204) }, { 540, 208 } }; + rectDescription = { { uiRectangle.position.x + 24, rectList.position.y + rectList.size.height + 16 }, { 590, 35 } }; optionDescription[0] = '\0'; string_view titleText = shownMenu == ShownMenuType::Settings ? _("Settings") : selectedOption->GetName(); - vecDialog.push_back(std::make_unique(titleText.data(), MakeSdlRect(PANEL_LEFT, UI_OFFSET_Y + 161, PANEL_WIDTH, 35), UiFlags::FontSize30 | UiFlags::ColorUiSilver | UiFlags::AlignCenter, 8)); + vecDialog.push_back(std::make_unique(titleText.data(), MakeSdlRect(uiRectangle.position.x, uiRectangle.position.y + 161, uiRectangle.size.width, 35), UiFlags::FontSize30 | UiFlags::ColorUiSilver | UiFlags::AlignCenter, 8)); vecDialog.push_back(std::make_unique(&ArtScrollBarBackground, &ArtScrollBarThumb, &ArtScrollBarArrow, MakeSdlRect(rectList.position.x + rectList.size.width + 5, rectList.position.y, 25, rectList.size.height))); vecDialog.push_back(std::make_unique(optionDescription, MakeSdlRect(rectDescription), UiFlags::FontSize12 | UiFlags::ColorUiSilverDark | UiFlags::AlignCenter, 1, IsSmallFontTall() ? 22 : 18)); diff --git a/Source/DiabloUI/title.cpp b/Source/DiabloUI/title.cpp index b42d114d5..eab711f85 100644 --- a/Source/DiabloUI/title.cpp +++ b/Source/DiabloUI/title.cpp @@ -38,15 +38,16 @@ void TitleFree() void UiTitleDialog() { TitleLoad(); + const Point uiPosition = GetUIRectangle().position; if (gbIsHellfire) { - SDL_Rect rect = { 0, UI_OFFSET_Y, 0, 0 }; + SDL_Rect rect = { 0, uiPosition.y, 0, 0 }; vecTitleScreen.push_back(std::make_unique(&ArtBackgroundWidescreen, rect, UiFlags::AlignCenter, /*bAnimated=*/true)); vecTitleScreen.push_back(std::make_unique(&ArtBackground, rect, UiFlags::AlignCenter, /*bAnimated=*/true)); } else { UiAddBackground(&vecTitleScreen); UiAddLogo(&vecTitleScreen, LOGO_BIG, 182); - SDL_Rect rect = { (Sint16)(PANEL_LEFT), (Sint16)(UI_OFFSET_Y + 410), 640, 26 }; + SDL_Rect rect = { (Sint16)(uiPosition.x), (Sint16)(uiPosition.y + 410), 640, 26 }; vecTitleScreen.push_back(std::make_unique(_("Copyright © 1996-2001 Blizzard Entertainment").c_str(), rect, UiFlags::AlignCenter | UiFlags::FontSize24 | UiFlags::ColorUiSilver)); } diff --git a/Source/doom.cpp b/Source/doom.cpp index ce7eee0b9..d9f008b53 100644 --- a/Source/doom.cpp +++ b/Source/doom.cpp @@ -37,7 +37,7 @@ void doom_draw(const Surface &out) return; } - CelDrawTo(out, { PANEL_X, PANEL_Y - 1 }, *DoomCel, 0); + CelDrawTo(out, GetUIRectangle().position + Displacement { 0, 352 }, *DoomCel, 0); } } // namespace devilution diff --git a/Source/error.cpp b/Source/error.cpp index ea17f8fd4..679a6006f 100644 --- a/Source/error.cpp +++ b/Source/error.cpp @@ -141,14 +141,15 @@ void ClrDiabloMsg() void DrawDiabloMsg(const Surface &out) { - int dialogStartY = ((gnScreenHeight - PANEL_HEIGHT) / 2) - (ErrorWindowHeight / 2) + 9; + auto &uiRectanglePosition = GetUIRectangle().position; + int dialogStartY = ((gnScreenHeight - GetMainPanel().size.height) / 2) - (ErrorWindowHeight / 2) + 9; - CelDrawTo(out, { PANEL_X + 101, dialogStartY }, *pSTextSlidCels, 0); - CelDrawTo(out, { PANEL_X + 101, dialogStartY + ErrorWindowHeight - 6 }, *pSTextSlidCels, 1); - CelDrawTo(out, { PANEL_X + 527, dialogStartY + ErrorWindowHeight - 6 }, *pSTextSlidCels, 2); - CelDrawTo(out, { PANEL_X + 527, dialogStartY }, *pSTextSlidCels, 3); + CelDrawTo(out, { uiRectanglePosition.x + 101, dialogStartY }, *pSTextSlidCels, 0); + CelDrawTo(out, { uiRectanglePosition.x + 101, dialogStartY + ErrorWindowHeight - 6 }, *pSTextSlidCels, 1); + CelDrawTo(out, { uiRectanglePosition.x + 527, dialogStartY + ErrorWindowHeight - 6 }, *pSTextSlidCels, 2); + CelDrawTo(out, { uiRectanglePosition.x + 527, dialogStartY }, *pSTextSlidCels, 3); - int sx = PANEL_X + 109; + int sx = uiRectanglePosition.x + 109; for (int i = 0; i < 35; i++) { CelDrawTo(out, { sx, dialogStartY }, *pSTextSlidCels, 4); CelDrawTo(out, { sx, dialogStartY + ErrorWindowHeight - 6 }, *pSTextSlidCels, 6); @@ -156,16 +157,16 @@ void DrawDiabloMsg(const Surface &out) } int drawnYborder = 12; while ((drawnYborder + 12) < ErrorWindowHeight) { - CelDrawTo(out, { PANEL_X + 101, dialogStartY + drawnYborder }, *pSTextSlidCels, 5); - CelDrawTo(out, { PANEL_X + 527, dialogStartY + drawnYborder }, *pSTextSlidCels, 7); + CelDrawTo(out, { uiRectanglePosition.x + 101, dialogStartY + drawnYborder }, *pSTextSlidCels, 5); + CelDrawTo(out, { uiRectanglePosition.x + 527, dialogStartY + drawnYborder }, *pSTextSlidCels, 7); drawnYborder += 12; } - DrawHalfTransparentRectTo(out, PANEL_X + 104, dialogStartY - 8, 432, ErrorWindowHeight); + DrawHalfTransparentRectTo(out, uiRectanglePosition.x + 104, dialogStartY - 8, 432, ErrorWindowHeight); int lineNumber = 0; for (auto &line : TextLines) { - DrawString(out, line, { { PANEL_X + 109, dialogStartY + 12 + lineNumber * LineHeight }, { LineWidth, LineHeight } }, UiFlags::AlignCenter, 1, LineHeight); + DrawString(out, line, { { uiRectanglePosition.x + 109, dialogStartY + 12 + lineNumber * LineHeight }, { LineWidth, LineHeight } }, UiFlags::AlignCenter, 1, LineHeight); lineNumber += 1; } diff --git a/Source/gmenu.cpp b/Source/gmenu.cpp index 36d7733bb..198615290 100644 --- a/Source/gmenu.cpp +++ b/Source/gmenu.cpp @@ -105,13 +105,14 @@ void GmenuDrawMenuItem(const Surface &out, TMenuItem *pItem, int y) { int w = GmenuGetLineWidth(pItem); if ((pItem->dwFlags & GMENU_SLIDER) != 0) { + int uiPositionX = GetUIRectangle().position.x; int x = 16 + w / 2; - CelDrawTo(out, { x + PANEL_LEFT, y + 40 }, *optbar_cel, 0); + CelDrawTo(out, { x + uiPositionX, y + 40 }, *optbar_cel, 0); uint16_t step = pItem->dwFlags & 0xFFF; uint16_t steps = std::max((pItem->dwFlags & 0xFFF000) >> 12, 2); uint16_t pos = step * 256 / steps; - GmenuClearBuffer(out, x + 2 + PANEL_LEFT, y + 38, pos + 13, 28); - CelDrawTo(out, { x + 2 + pos + PANEL_LEFT, y + 38 }, *option_cel, 0); + GmenuClearBuffer(out, x + 2 + uiPositionX, y + 38, pos + 13, 28); + CelDrawTo(out, { x + 2 + pos + uiPositionX, y + 38 }, *option_cel, 0); } int x = (gnScreenWidth - w) / 2; @@ -135,10 +136,11 @@ void GameMenuMove() bool GmenuMouseNavigation() { - if (MousePosition.x < 282 + PANEL_LEFT) { + int uiPositionX = GetUIRectangle().position.x; + if (MousePosition.x < 282 + uiPositionX) { return false; } - if (MousePosition.x > 538 + PANEL_LEFT) { + if (MousePosition.x > 538 + uiPositionX) { return false; } return true; @@ -146,13 +148,14 @@ bool GmenuMouseNavigation() int GmenuGetMouseSlider() { - if (MousePosition.x < 282 + PANEL_LEFT) { + int uiPositionX = GetUIRectangle().position.x; + if (MousePosition.x < 282 + uiPositionX) { return 0; } - if (MousePosition.x > 538 + PANEL_LEFT) { + if (MousePosition.x > 538 + uiPositionX) { return 256; } - return MousePosition.x - 282 - PANEL_LEFT; + return MousePosition.x - 282 - uiPositionX; } } // namespace @@ -165,7 +168,7 @@ void gmenu_draw_pause(const Surface &out) RedBack(out); if (sgpCurrentMenu == nullptr) { LightTableIndex = 0; - DrawString(out, _("Pause"), { { 0, 0 }, { gnScreenWidth, PANEL_TOP } }, UiFlags::FontSize46 | UiFlags::ColorGold | UiFlags::AlignCenter | UiFlags::VerticalCenter, 2); + DrawString(out, _("Pause"), { { 0, 0 }, { gnScreenWidth, GetMainPanel().position.y } }, UiFlags::FontSize46 | UiFlags::ColorGold | UiFlags::AlignCenter | UiFlags::VerticalCenter, 2); } } @@ -236,8 +239,9 @@ void gmenu_draw(const Surface &out) LogoAnim_tick = ticks; } } - CelDrawTo(out, { (gnScreenWidth - sgpLogo->Width()) / 2, 102 + UI_OFFSET_Y }, *sgpLogo, LogoAnim_frame); - int y = 110 + UI_OFFSET_Y; + int uiPositionY = GetUIRectangle().position.y; + CelDrawTo(out, { (gnScreenWidth - sgpLogo->Width()) / 2, 102 + uiPositionY }, *sgpLogo, LogoAnim_frame); + int y = 110 + uiPositionY; TMenuItem *i = sgpCurrentMenu; if (sgpCurrentMenu->fnMenu != nullptr) { while (i->fnMenu != nullptr) { @@ -311,13 +315,14 @@ bool gmenu_left_mouse(bool isDown) if (sgpCurrentMenu == nullptr) { return false; } + const Point uiPosition = GetUIRectangle().position; if (MousePosition.y >= GetMainPanel().position.y) { return false; } - if (MousePosition.y - (117 + GetUIOffsetY()) < 0) { + if (MousePosition.y - (117 + uiPosition.y) < 0) { return true; } - int i = (MousePosition.y - (117 + GetUIOffsetY())) / 45; + int i = (MousePosition.y - (117 + uiPosition.y)) / 45; if (i >= sgCurrentMenuIdx) { return true; } diff --git a/Source/help.cpp b/Source/help.cpp index 11e4dbff8..af082f865 100644 --- a/Source/help.cpp +++ b/Source/help.cpp @@ -178,8 +178,9 @@ void DrawHelp(const Surface &out) else title = gbIsSpawn ? _("Shareware Diablo Help") : _("Diablo Help"); - const int sx = PANEL_X + PaddingLeft; - const int sy = UI_OFFSET_Y; + const Point uiPosition = GetUIRectangle().position; + const int sx = uiPosition.x + PaddingLeft; + const int sy = uiPosition.y; DrawString(out, title, { { sx, sy + PaddingTop + blankLineHeight }, { ContentTextWidth, lineHeight } }, diff --git a/Source/interfac.cpp b/Source/interfac.cpp index 939492346..cc35c387b 100644 --- a/Source/interfac.cpp +++ b/Source/interfac.cpp @@ -170,14 +170,15 @@ void InitCutscene(interface_mode uMsg) void DrawCutscene() { + const Rectangle &uiRectangle = GetUIRectangle(); const Surface &out = GlobalBackBuffer(); - DrawArt(out, { PANEL_X - (ArtCutsceneWidescreen.w() - PANEL_WIDTH) / 2, UI_OFFSET_Y }, &ArtCutsceneWidescreen); - CelDrawTo(out, { PANEL_X, 480 - 1 + UI_OFFSET_Y }, *sgpBackCel, 0); + DrawArt(out, { uiRectangle.position.x - (ArtCutsceneWidescreen.w() - uiRectangle.size.width) / 2, uiRectangle.position.y }, &ArtCutsceneWidescreen); + CelDrawTo(out, { uiRectangle.position.x, 480 - 1 + uiRectangle.position.y }, *sgpBackCel, 0); constexpr int ProgressHeight = 22; SDL_Rect rect = MakeSdlRect( - out.region.x + BarPos[progress_id][0] + PANEL_X, - out.region.y + BarPos[progress_id][1] + UI_OFFSET_Y, + out.region.x + BarPos[progress_id][0] + uiRectangle.position.x, + out.region.y + BarPos[progress_id][1] + uiRectangle.position.y, sgdwProgress, ProgressHeight); SDL_FillRect(out.surface, &rect, BarColor[progress_id]); diff --git a/Source/interfac.h b/Source/interfac.h index 08beb3c3c..56606ec9e 100644 --- a/Source/interfac.h +++ b/Source/interfac.h @@ -11,12 +11,6 @@ namespace devilution { -inline Sint16 GetUIOffsetY() -{ - return ((Sint16)((GetScreenHeight() - 480) / 2)); -} -#define UI_OFFSET_Y (GetUIOffsetY()) - enum interface_mode : uint16_t { // clang-format off WM_DIABNEXTLVL = 0x402, // WM_USER+2 diff --git a/Source/minitext.cpp b/Source/minitext.cpp index d5ee85f6a..110a6b8d4 100644 --- a/Source/minitext.cpp +++ b/Source/minitext.cpp @@ -98,7 +98,7 @@ void DrawQTextContent(const Surface &out) { int y = CalculateTextPosition(); - const int sx = PANEL_X + 48; + const int sx = GetUIRectangle().position.x + 48; const int sy = 0 - (y % LineHeight); const unsigned int skipLines = y / LineHeight; @@ -145,14 +145,15 @@ void InitQTextMsg(_speech_id m) void DrawQTextBack(const Surface &out) { - CelDrawTo(out, { PANEL_X + 24, 327 + UI_OFFSET_Y }, *pTextBoxCels, 0); - DrawHalfTransparentRectTo(out, PANEL_X + 27, UI_OFFSET_Y + 28, 585, 297); + const Point uiPosition = GetUIRectangle().position; + CelDrawTo(out, uiPosition + Displacement { 24, 327 }, *pTextBoxCels, 0); + DrawHalfTransparentRectTo(out, uiPosition.x + 27, uiPosition.y + 28, 585, 297); } void DrawQText(const Surface &out) { DrawQTextBack(out); - DrawQTextContent(out.subregionY(UI_OFFSET_Y + 49, 260)); + DrawQTextContent(out.subregionY(GetUIRectangle().position.y + 49, 260)); } } // namespace devilution diff --git a/Source/qol/chatlog.cpp b/Source/qol/chatlog.cpp index 0f939c7b4..4e9411f29 100644 --- a/Source/qol/chatlog.cpp +++ b/Source/qol/chatlog.cpp @@ -146,10 +146,11 @@ void DrawChatLog(const Surface &out) UnreadFlag = false; } + const Point uiPosition = GetUIRectangle().position; const int lineHeight = LineHeight(); const int blankLineHeight = BlankLineHeight(); - const int sx = PANEL_X + PaddingLeft; - const int sy = UI_OFFSET_Y; + const int sx = uiPosition.x + PaddingLeft; + const int sy = uiPosition.y; DrawString(out, fmt::format(_("Chat History (Messages: {:d})"), MessageCounter), { { sx, sy + PaddingTop + blankLineHeight }, { ContentTextWidth, lineHeight } }, diff --git a/Source/stores.cpp b/Source/stores.cpp index 6e5143469..53a11d49d 100644 --- a/Source/stores.cpp +++ b/Source/stores.cpp @@ -162,26 +162,28 @@ void CalculateLineHeights() void DrawSTextBack(const Surface &out) { - CelDrawTo(out, { PANEL_X + 320 + 24, 327 + UI_OFFSET_Y }, *pSTextBoxCels, 0); - DrawHalfTransparentRectTo(out, PANEL_X + 347, UI_OFFSET_Y + 28, 265, 297); + const Point uiPosition = GetUIRectangle().position; + CelDrawTo(out, { uiPosition.x + 320 + 24, 327 + uiPosition.y }, *pSTextBoxCels, 0); + DrawHalfTransparentRectTo(out, uiPosition.x + 347, uiPosition.y + 28, 265, 297); } void DrawSSlider(const Surface &out, int y1, int y2) { - int yd1 = y1 * 12 + 44 + UI_OFFSET_Y; - int yd2 = y2 * 12 + 44 + UI_OFFSET_Y; + const Point uiPosition = GetUIRectangle().position; + int yd1 = y1 * 12 + 44 + uiPosition.y; + int yd2 = y2 * 12 + 44 + uiPosition.y; if (stextscrlubtn != -1) - CelDrawTo(out, { PANEL_X + 601, yd1 }, *pSTextSlidCels, 11); + CelDrawTo(out, { uiPosition.x + 601, yd1 }, *pSTextSlidCels, 11); else - CelDrawTo(out, { PANEL_X + 601, yd1 }, *pSTextSlidCels, 9); + CelDrawTo(out, { uiPosition.x + 601, yd1 }, *pSTextSlidCels, 9); if (stextscrldbtn != -1) - CelDrawTo(out, { PANEL_X + 601, yd2 }, *pSTextSlidCels, 10); + CelDrawTo(out, { uiPosition.x + 601, yd2 }, *pSTextSlidCels, 10); else - CelDrawTo(out, { PANEL_X + 601, yd2 }, *pSTextSlidCels, 8); + CelDrawTo(out, { uiPosition.x + 601, yd2 }, *pSTextSlidCels, 8); yd1 += 12; int yd3 = yd1; for (; yd3 < yd2; yd3 += 12) { - CelDrawTo(out, { PANEL_X + 601, yd3 }, *pSTextSlidCels, 13); + CelDrawTo(out, { uiPosition.x + 601, yd3 }, *pSTextSlidCels, 13); } if (stextsel == BackButtonLine()) yd3 = stextlhold; @@ -191,7 +193,7 @@ void DrawSSlider(const Surface &out, int y1, int y2) yd3 = 1000 * (stextsval + ((yd3 - stextup) / 4)) / (storenumh - 1) * (y2 * 12 - y1 * 12 - 24) / 1000; else yd3 = 0; - CelDrawTo(out, { PANEL_X + 601, (y1 + 1) * 12 + 44 + UI_OFFSET_Y + yd3 }, *pSTextSlidCels, 12); + CelDrawTo(out, { uiPosition.x + 601, (y1 + 1) * 12 + 44 + uiPosition.y + yd3 }, *pSTextSlidCels, 12); } void AddSLine(int y) @@ -2217,12 +2219,13 @@ void FreeStoreMem() void PrintSString(const Surface &out, int margin, int line, const char *text, UiFlags flags, int price) { - int sx = PANEL_X + 32 + margin; + const Point uiPosition = GetUIRectangle().position; + int sx = uiPosition.x + 32 + margin; if (!stextsize) { sx += 320; } - const int sy = UI_OFFSET_Y + PaddingTop + stext[line].y + stext[line]._syoff; + const int sy = uiPosition.y + PaddingTop + stext[line].y + stext[line]._syoff; int width = stextsize ? 575 : 255; if (stextscrl && line >= 4 && line <= 20) { @@ -2245,6 +2248,7 @@ void PrintSString(const Surface &out, int margin, int line, const char *text, Ui void DrawSLine(const Surface &out, int sy) { + const Point uiPosition = GetUIRectangle().position; int sx = 26; int width = 587; @@ -2253,8 +2257,8 @@ void DrawSLine(const Surface &out, int sy) width -= SPANEL_WIDTH; } - BYTE *src = out.at(PANEL_LEFT + sx, UI_OFFSET_Y + 25); - BYTE *dst = out.at(PANEL_X + sx, sy); + BYTE *src = out.at(uiPosition.x + sx, uiPosition.y + 25); + BYTE *dst = out.at(uiPosition.x + sx, sy); for (int i = 0; i < 3; i++, src += out.pitch(), dst += out.pitch()) memcpy(dst, src, width); @@ -2424,9 +2428,10 @@ void DrawSText(const Surface &out) } CalculateLineHeights(); + const Point uiPosition = GetUIRectangle().position; for (int i = 0; i < STORE_LINES; i++) { if (stext[i].IsDivider()) - DrawSLine(out, UI_OFFSET_Y + PaddingTop + stext[i].y + TextHeight() / 2); + DrawSLine(out, uiPosition.y + PaddingTop + stext[i].y + TextHeight() / 2); if (stext[i].IsText()) PrintSString(out, stext[i]._sx, i, stext[i]._sstr, stext[i].flags, stext[i]._sval); } @@ -2719,22 +2724,23 @@ void StoreEnter() void CheckStoreBtn() { + const Point uiPosition = GetUIRectangle().position; if (qtextflag) { qtextflag = false; if (leveltype == DTYPE_TOWN) stream_stop(); - } else if (stextsel != -1 && MousePosition.y >= (PaddingTop + UI_OFFSET_Y) && MousePosition.y <= (320 + UI_OFFSET_Y)) { + } else if (stextsel != -1 && MousePosition.y >= (PaddingTop + uiPosition.y) && MousePosition.y <= (320 + uiPosition.y)) { if (!stextsize) { - if (MousePosition.x < 344 + PANEL_LEFT || MousePosition.x > 616 + PANEL_LEFT) + if (MousePosition.x < 344 + uiPosition.x || MousePosition.x > 616 + uiPosition.x) return; } else { - if (MousePosition.x < 24 + PANEL_LEFT || MousePosition.x > 616 + PANEL_LEFT) + if (MousePosition.x < 24 + uiPosition.x || MousePosition.x > 616 + uiPosition.x) return; } - const int relativeY = MousePosition.y - (UI_OFFSET_Y + PaddingTop); + const int relativeY = MousePosition.y - (uiPosition.y + PaddingTop); - if (stextscrl && MousePosition.x > 600 + PANEL_LEFT) { + if (stextscrl && MousePosition.x > 600 + uiPosition.x) { // Scroll bar is always measured in terms of the small line height. int y = relativeY / SmallLineHeight; if (y == 4) { diff --git a/Source/utils/display.cpp b/Source/utils/display.cpp index df1ac4390..fc190eeb1 100644 --- a/Source/utils/display.cpp +++ b/Source/utils/display.cpp @@ -58,6 +58,12 @@ Uint16 GetViewportHeight() return gnViewportHeight; } +Rectangle UIRectangle; +const Rectangle &GetUIRectangle() +{ + return UIRectangle; +} + namespace { #ifndef USE_SDL1 @@ -131,10 +137,22 @@ void FreeRenderer() } #endif +void CalculateUIRectangle() +{ + constexpr int UIWidth = 640; + constexpr int UIHeight = 480; + UIRectangle = { + { (gnScreenWidth - UIWidth) / 2, (gnScreenHeight - UIHeight) / 2 }, + { UIWidth, UIHeight } + }; +} + void AdjustToScreenGeometry(Size windowSize) { gnScreenWidth = windowSize.width; gnScreenHeight = windowSize.height; + CalculateUIRectangle(); + CalculatePanelAreas(); } Size GetPreferredWindowSize() diff --git a/Source/utils/ui_fwd.h b/Source/utils/ui_fwd.h index 1d0891324..f085e2bda 100644 --- a/Source/utils/ui_fwd.h +++ b/Source/utils/ui_fwd.h @@ -2,6 +2,7 @@ #include +#include "engine/rectangle.hpp" #include "utils/attributes.h" namespace devilution { @@ -14,6 +15,9 @@ Uint16 GetScreenWidth(); Uint16 GetScreenHeight(); Uint16 GetViewportHeight(); +/** @brief Returns the UI (Menus, Messages, Help) can use. Currently this is 640x480 like vanilla. */ +const Rectangle &GetUIRectangle(); + float GetDpiScalingFactor(); /** * @brief Set the screen to fullscreen or windowe if fullsc