diff --git a/src/menu/menudef.cpp b/src/menu/menudef.cpp index a0113de27..d32dce5c5 100644 --- a/src/menu/menudef.cpp +++ b/src/menu/menudef.cpp @@ -47,6 +47,7 @@ #include "i_soundfont.h" #include "i_system.h" #include "v_video.h" +#include "gstrings.h" void ClearSaveGames(); @@ -1105,6 +1106,7 @@ void M_StartupEpisodeMenu(FGameStartup *gs) } + int posx = (int)ld->mXpos; int posy = (int)ld->mYpos; int topy = posy; @@ -1132,6 +1134,23 @@ void M_StartupEpisodeMenu(FGameStartup *gs) } if (!isOld) ld->mSelectedItem = ld->mItems.Size(); + + for (unsigned i = 0; i < AllEpisodes.Size(); i++) + { + DMenuItemBase *it = nullptr; + if (AllEpisodes[i].mPicName.IsNotEmpty()) + { + FTextureID tex = GetMenuTexture(AllEpisodes[i].mPicName); + if (AllEpisodes[i].mEpisodeName.IsEmpty() || TexMan.OkForLocalization(tex, AllEpisodes[i].mEpisodeName)) + continue; // We do not measure patch based entries. They are assumed to fit + } + const char *c = AllEpisodes[i].mEpisodeName; + if (*c == '$') c = GStrings(c + 1); + int textwidth = ld->mFont->StringWidth(c); + int textright = posx + textwidth; + if (posx + textright > 320) posx = std::max(0, 320 - textright); + } + for(unsigned i = 0; i < AllEpisodes.Size(); i++) { DMenuItemBase *it = nullptr; @@ -1139,11 +1158,11 @@ void M_StartupEpisodeMenu(FGameStartup *gs) { FTextureID tex = GetMenuTexture(AllEpisodes[i].mPicName); if (AllEpisodes[i].mEpisodeName.IsEmpty() || TexMan.OkForLocalization(tex, AllEpisodes[i].mEpisodeName)) - it = CreateListMenuItemPatch(ld->mXpos, posy, ld->mLinespacing, AllEpisodes[i].mShortcut, tex, NAME_Skillmenu, i); + it = CreateListMenuItemPatch(posx, posy, ld->mLinespacing, AllEpisodes[i].mShortcut, tex, NAME_Skillmenu, i); } if (it == nullptr) { - it = CreateListMenuItemText(ld->mXpos, posy, ld->mLinespacing, AllEpisodes[i].mShortcut, + it = CreateListMenuItemText(posx, posy, ld->mLinespacing, AllEpisodes[i].mShortcut, AllEpisodes[i].mEpisodeName, ld->mFont, ld->mFontColor, ld->mFontColor2, NAME_Skillmenu, i); } ld->mItems.Push(it); diff --git a/src/v_video.cpp b/src/v_video.cpp index 212ae1f0a..227d8b84d 100644 --- a/src/v_video.cpp +++ b/src/v_video.cpp @@ -544,6 +544,14 @@ void V_UpdateModeSize (int width, int height) // The optimal scale will always be to fit a virtual 640 pixel wide display onto the screen. // Exceptions are made for a few ranges where the available virtual width is > 480. + // This reference size is being used so that on 800x450 (small 16:9) a scale of 2 gets used. + + CleanXfac = std::min(screen->GetWidth() / 400, screen->GetHeight() / 240); + if (CleanXfac >= 4) CleanXfac--; // Otherwise we do not have enough space for the episode/skill menus in some languages. + CleanYfac = CleanXfac; + CleanWidth = screen->GetWidth() / CleanXfac; + CleanHeight = screen->GetHeight() / CleanYfac; + int w = screen->GetWidth(); int factor; if (w < 640) factor = 1; @@ -551,10 +559,6 @@ void V_UpdateModeSize (int width, int height) else if (w >= 1600 && w < 1920) factor = 3; else factor = w / 640; - CleanXfac = CleanYfac = factor; - CleanWidth = width / CleanXfac; - CleanHeight = height / CleanYfac; - CleanYfac_1 = CleanXfac_1 = MAX(1, int (CleanXfac * 0.7)); CleanWidth_1 = width / CleanXfac_1; CleanHeight_1 = height / CleanYfac_1;