From 48fcdacf06a6760831ec3f0375f96930b61d7066 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 21 Feb 2019 00:35:27 +0100 Subject: [PATCH] - more work on graphics substitutiion * added a CVAR that sets how localizable graphics need to be dealt with. * pass the substitution string to OkForLocalization so that proper checks can be performed. * increased item spacing on Doom's list menus to 18 from 16 pixels, because otherwise the diacritic letters would not fit. 20 would have been more ideal but 18 was the limit without compromising its visual style * added a second text-only main menu because here the spacing cannot be changed. Doing so would render any single-patch main menu non-functional. So here the rules are that if substitution takes place, it will swap out the entire menu class. * fixed some issues with the summary screen's "entering" and "finished" graphics. --- src/gamedata/g_mapinfo.cpp | 2 +- src/gamedata/gi.cpp | 4 -- src/gamedata/gi.h | 2 - src/gamedata/textures/texturemanager.cpp | 36 ++++++++-- src/gamedata/textures/textures.h | 1 + src/menu/menu.cpp | 34 +++++++++- src/menu/menu.h | 5 +- src/menu/menudef.cpp | 37 +++++++--- src/utility/namedef.h | 1 + wadsrc/static/mapinfo/chex.txt | 2 - wadsrc/static/mapinfo/doomcommon.txt | 2 - wadsrc/static/menudef.txt | 58 ++++++++++++---- wadsrc/static/zscript/base.txt | 4 +- wadsrc/static/zscript/menu/listmenuitems.txt | 38 ++--------- .../static/zscript/statscreen/statscreen.txt | 68 ++++++++++--------- .../zscript/statscreen/statscreen_sp.txt | 9 ++- 16 files changed, 191 insertions(+), 112 deletions(-) diff --git a/src/gamedata/g_mapinfo.cpp b/src/gamedata/g_mapinfo.cpp index fc84aa0d4..488ac4f0d 100644 --- a/src/gamedata/g_mapinfo.cpp +++ b/src/gamedata/g_mapinfo.cpp @@ -838,7 +838,7 @@ void FMapInfoParser::ParseCluster() auto fn = Wads.GetWadName(fileno); if (fn && (!stricmp(fn, "HEXEN.WAD") || !stricmp(fn, "HEXDD.WAD"))) { - FStringf key("TXT_%.5s_%s", fn, clusterinfo->ExitText); + FStringf key("TXT_%.5s_%s", fn, clusterinfo->ExitText.GetChars()); if (GStrings.exists(key)) { clusterinfo->ExitText = key; diff --git a/src/gamedata/gi.cpp b/src/gamedata/gi.cpp index 2c639d3c9..07a46147e 100644 --- a/src/gamedata/gi.cpp +++ b/src/gamedata/gi.cpp @@ -59,8 +59,6 @@ DEFINE_FIELD_X(GameInfoStruct, gameinfo_t, mBackButton) DEFINE_FIELD_X(GameInfoStruct, gameinfo_t, mStatscreenMapNameFont) DEFINE_FIELD_X(GameInfoStruct, gameinfo_t, mStatscreenEnteringFont) DEFINE_FIELD_X(GameInfoStruct, gameinfo_t, mStatscreenFinishedFont) -DEFINE_FIELD_X(GameInfoStruct, gameinfo_t, mStatscreenEnteringPatch) -DEFINE_FIELD_X(GameInfoStruct, gameinfo_t, mStatscreenFinishedPatch) DEFINE_FIELD_X(GameInfoStruct, gameinfo_t, gibfactor) DEFINE_FIELD_X(GameInfoStruct, gameinfo_t, intermissioncounter) DEFINE_FIELD_X(GameInfoStruct, gameinfo_t, statusscreen_single) @@ -425,8 +423,6 @@ void FMapInfoParser::ParseGameInfo() GAMEINFOKEY_FONT(mStatscreenMapNameFont, "statscreen_mapnamefont") GAMEINFOKEY_FONT(mStatscreenFinishedFont, "statscreen_finishedfont") GAMEINFOKEY_FONT(mStatscreenEnteringFont, "statscreen_enteringfont") - GAMEINFOKEY_PATCH(mStatscreenFinishedPatch, "statscreen_finishedpatch") - GAMEINFOKEY_PATCH(mStatscreenEnteringPatch, "statscreen_enteringpatch") GAMEINFOKEY_BOOL(norandomplayerclass, "norandomplayerclass") GAMEINFOKEY_BOOL(forcekillscripts, "forcekillscripts") // [JM] Force kill scripts on thing death. (MF7_NOKILLSCRIPTS overrides.) GAMEINFOKEY_STRING(Dialogue, "dialogue") diff --git a/src/gamedata/gi.h b/src/gamedata/gi.h index 77f45d1cf..4f27a6969 100644 --- a/src/gamedata/gi.h +++ b/src/gamedata/gi.h @@ -190,8 +190,6 @@ struct gameinfo_t FGIFont mStatscreenMapNameFont; FGIFont mStatscreenFinishedFont; FGIFont mStatscreenEnteringFont; - FGIFont mStatscreenFinishedPatch; - FGIFont mStatscreenEnteringPatch; bool norandomplayerclass; bool forcekillscripts; FName statusscreen_single; diff --git a/src/gamedata/textures/texturemanager.cpp b/src/gamedata/textures/texturemanager.cpp index ebcb35498..047dadc2f 100644 --- a/src/gamedata/textures/texturemanager.cpp +++ b/src/gamedata/textures/texturemanager.cpp @@ -304,13 +304,6 @@ DEFINE_ACTION_FUNCTION_NATIVE(_TexMan, CheckForTexture, CheckForTexture) ACTION_RETURN_INT(CheckForTexture(name, type, flags)); } -DEFINE_ACTION_FUNCTION(_TexMan, OkForLocalization) -{ - PARAM_PROLOGUE; - PARAM_INT(name); - ACTION_RETURN_INT(true); // work for later. We need the definition to implement the language support -} - //========================================================================== // // FTextureManager :: ListTextures @@ -400,6 +393,35 @@ FTexture *FTextureManager::FindTexture(const char *texname, ETextureType usetype return GetTexture(texnum.GetIndex()); } +//========================================================================== +// +// FTextureManager :: OkForLocalization +// +//========================================================================== +CVAR(Int, cl_localizationmode,0, CVAR_ARCHIVE) + +bool FTextureManager::OkForLocalization(FTextureID texnum, const char *substitute) +{ + if (!texnum.isValid()) return false; + + // Todo: Some decisions must be made here whether this texture is ok to use with the current locale settings. + return !cl_localizationmode; +} + +static int OkForLocalization(int index, const FString &substitute) +{ + return TexMan.OkForLocalization(FSetTextureID(index), substitute); +} + +DEFINE_ACTION_FUNCTION_NATIVE(_TexMan, OkForLocalization, OkForLocalization) +{ + PARAM_PROLOGUE; + PARAM_INT(name); + PARAM_STRING(subst) + ACTION_RETURN_INT(OkForLocalization(name, subst)); +} + + //========================================================================== // // FTextureManager :: AddTexture diff --git a/src/gamedata/textures/textures.h b/src/gamedata/textures/textures.h index 442f3b489..3a9678549 100644 --- a/src/gamedata/textures/textures.h +++ b/src/gamedata/textures/textures.h @@ -562,6 +562,7 @@ public: } FTexture *FindTexture(const char *texname, ETextureType usetype = ETextureType::MiscPatch, BITFIELD flags = TEXMAN_TryAny); + bool OkForLocalization(FTextureID texnum, const char *substitute); void FlushAll(); diff --git a/src/menu/menu.cpp b/src/menu/menu.cpp index 19cb91557..7106443d0 100644 --- a/src/menu/menu.cpp +++ b/src/menu/menu.cpp @@ -52,6 +52,7 @@ #include "vm.h" #include "events.h" #include "v_video.h" +#include "i_system.h" #include "scripting/types.h" int DMenu::InMenu; @@ -404,11 +405,38 @@ DEFINE_ACTION_FUNCTION(DMenu, ActivateMenu) // //============================================================================= +EXTERN_CVAR(Int, cl_localizationmode) + + void M_SetMenu(FName menu, int param) { // some menus need some special treatment switch (menu) { + case NAME_Mainmenu: + if (gameinfo.gametype & GAME_DoomStrifeChex) + { + // For these games we must check up-front if they get localized because in that case another template must be used. + DMenuDescriptor **desc = MenuDescriptors.CheckKey(NAME_Playerclassmenu); + if (desc != nullptr) + { + if ((*desc)->IsKindOf(RUNTIME_CLASS(DListMenuDescriptor))) + { + DListMenuDescriptor *ld = static_cast(*desc); + if (ld->mFromEngine && cl_localizationmode != 0) + { + // This assumes that replacing one graphic will replace all of them. + // So this only checks the "New game" entry for localization capability. + FTextureID texid = TexMan.CheckForTexture("M_NGAME", ETextureType::MiscPatch); + if (!TexMan.OkForLocalization(texid, "$MNU_NEWGAME")) + { + menu = NAME_MainmenuTextOnly; + } + } + } + } + } + break; case NAME_Episodemenu: // sent from the player class menu GameStartupInfo.Skill = -1; @@ -416,6 +444,7 @@ void M_SetMenu(FName menu, int param) GameStartupInfo.PlayerClass = param == -1000? nullptr : param == -1? "Random" : GetPrintableDisplayName(PlayerClasses[param].Type).GetChars(); + M_StartupEpisodeMenu(&GameStartupInfo); // needs player class name from class menu (later) break; case NAME_Skillmenu: @@ -1265,13 +1294,12 @@ DMenuItemBase * CreateOptionMenuItemCommand(const char *label, FName cmd, bool c return (DMenuItemBase*)p; } -DMenuItemBase * CreateListMenuItemPatch(double x, double y, int height, int hotkey, FTextureID tex, FName command, int param, const char *label, FFont *font, int color) +DMenuItemBase * CreateListMenuItemPatch(double x, double y, int height, int hotkey, FTextureID tex, FName command, int param) { auto c = PClass::FindClass("ListMenuItemPatchItem"); auto p = c->CreateNew(); FString keystr = FString(char(hotkey)); - FString labelstr = label; - VMValue params[] = { p, x, y, height, tex.GetIndex(), &keystr, command.GetIndex(), param, &labelstr, font, color }; + VMValue params[] = { p, x, y, height, tex.GetIndex(), &keystr, command.GetIndex(), param }; auto f = dyn_cast(c->FindSymbol("InitDirect", false)); VMCall(f->Variants[0].Implementation, params, countof(params), nullptr, 0); return (DMenuItemBase*)p; diff --git a/src/menu/menu.h b/src/menu/menu.h index 0ac367d1f..ae7894082 100644 --- a/src/menu/menu.h +++ b/src/menu/menu.h @@ -149,6 +149,7 @@ public: EColorRange mFontColor; EColorRange mFontColor2; bool mCenter; + bool mFromEngine; void Reset() { @@ -164,6 +165,7 @@ public: mFont = NULL; mFontColor = CR_UNTRANSLATED; mFontColor2 = CR_UNTRANSLATED; + mFromEngine = false; } size_t PropagateMark() override; @@ -339,6 +341,7 @@ void M_ActivateMenu(DMenu *menu); void M_ClearMenus (); void M_PreviousMenu (); void M_ParseMenuDefs(); +void M_StartupEpisodeMenu(FGameStartup *gs); void M_StartupSkillMenu(FGameStartup *gs); void M_StartControlPanel (bool makeSound); void M_SetMenu(FName menu, int param = -1); @@ -352,7 +355,7 @@ DMenuItemBase * CreateOptionMenuItemStaticText(const char *name, int v = -1); DMenuItemBase * CreateOptionMenuItemSubmenu(const char *label, FName cmd, int center); DMenuItemBase * CreateOptionMenuItemControl(const char *label, FName cmd, FKeyBindings *bindings); DMenuItemBase * CreateOptionMenuItemJoyConfigMenu(const char *label, IJoystickConfig *joy); -DMenuItemBase * CreateListMenuItemPatch(double x, double y, int height, int hotkey, FTextureID tex, FName command, int param, const char *label, FFont *font, int color); +DMenuItemBase * CreateListMenuItemPatch(double x, double y, int height, int hotkey, FTextureID tex, FName command, int param); DMenuItemBase * CreateListMenuItemText(double x, double y, int height, int hotkey, const char *text, FFont *font, PalEntry color1, PalEntry color2, FName command, int param); DMenuItemBase * CreateOptionMenuItemCommand(const char *label, FName cmd, bool centered = false); diff --git a/src/menu/menudef.cpp b/src/menu/menudef.cpp index 80f47417a..26a42d539 100644 --- a/src/menu/menudef.cpp +++ b/src/menu/menudef.cpp @@ -645,6 +645,7 @@ static void ParseListMenu(FScanner &sc) desc->mWLeft = 0; desc->mWRight = 0; desc->mCenter = false; + desc->mFromEngine = Wads.GetLumpFile(sc.LumpNum) == 0; // flags menu if the definition is from the IWAD. ParseListMenuBody(sc, desc); ReplaceMenu(sc, desc); @@ -1078,16 +1079,31 @@ void M_ParseMenuDefs() // //============================================================================= -static void BuildEpisodeMenu() +void M_StartupEpisodeMenu(FGameStartup *gs) { // Build episode menu bool success = false; + bool isOld = false; DMenuDescriptor **desc = MenuDescriptors.CheckKey(NAME_Episodemenu); if (desc != nullptr) { if ((*desc)->IsKindOf(RUNTIME_CLASS(DListMenuDescriptor))) { DListMenuDescriptor *ld = static_cast(*desc); + + // Delete previous contents + for(unsigned i=0; imItems.Size(); i++) + { + FName n = ld->mItems[i]->mAction; + if (n == NAME_Skillmenu) + { + isOld = true; + ld->mItems.Resize(i); + break; + } + } + + int posy = (int)ld->mYpos; int topy = posy; @@ -1114,16 +1130,17 @@ static void BuildEpisodeMenu() posy -= topdelta; } - ld->mSelectedItem = ld->mItems.Size(); + if (!isOld) ld->mSelectedItem = ld->mItems.Size(); for(unsigned i = 0; i < AllEpisodes.Size(); i++) { - DMenuItemBase *it; + DMenuItemBase *it = nullptr; if (AllEpisodes[i].mPicName.IsNotEmpty()) { FTextureID tex = GetMenuTexture(AllEpisodes[i].mPicName); - it = CreateListMenuItemPatch(ld->mXpos, posy, ld->mLinespacing, AllEpisodes[i].mShortcut, tex, NAME_Skillmenu, i, AllEpisodes[i].mEpisodeName, ld->mFont, ld->mFontColor); + 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); } - else + if (it == nullptr) { it = CreateListMenuItemText(ld->mXpos, posy, ld->mLinespacing, AllEpisodes[i].mShortcut, AllEpisodes[i].mEpisodeName, ld->mFont, ld->mFontColor, ld->mFontColor2, NAME_Skillmenu, i); @@ -1142,6 +1159,7 @@ static void BuildEpisodeMenu() } } } + else return; // do not recreate the option menu variant, because it is always text based. } if (!success) { @@ -1186,6 +1204,7 @@ static void BuildPlayerclassMenu() { DListMenuDescriptor *ld = static_cast(*desc); // add player display + ld->mSelectedItem = ld->mItems.Size(); int posy = (int)ld->mYpos; @@ -1482,7 +1501,6 @@ static void InitKeySections() void M_CreateMenus() { - BuildEpisodeMenu(); BuildPlayerclassMenu(); InitCrosshairsList(); InitMusicMenus(); @@ -1617,7 +1635,7 @@ void M_StartupSkillMenu(FGameStartup *gs) for(unsigned int i = 0; i < MenuSkills.Size(); i++) { FSkillInfo &skill = *MenuSkills[i]; - DMenuItemBase *li; + DMenuItemBase *li = nullptr; // Using a different name for skills that must be confirmed makes handling this easier. FName action = (skill.MustConfirm && !AllEpisodes[gs->Episode].mNoSkill) ? NAME_StartgameConfirm : NAME_Startgame; @@ -1632,9 +1650,10 @@ void M_StartupSkillMenu(FGameStartup *gs) if (skill.PicName.Len() != 0 && pItemText == nullptr) { FTextureID tex = GetMenuTexture(skill.PicName); - li = CreateListMenuItemPatch(ld->mXpos, y, ld->mLinespacing, skill.Shortcut, tex, action, SkillIndices[i], skill.MenuName, ld->mFont, color); + if (skill.MenuName.IsEmpty() || TexMan.OkForLocalization(tex, skill.MenuName)) + li = CreateListMenuItemPatch(ld->mXpos, y, ld->mLinespacing, skill.Shortcut, tex, action, SkillIndices[i]); } - else + if (li == nullptr) { li = CreateListMenuItemText(x, y, ld->mLinespacing, skill.Shortcut, pItemText? *pItemText : skill.MenuName, ld->mFont, color,ld->mFontColor2, action, SkillIndices[i]); diff --git a/src/utility/namedef.h b/src/utility/namedef.h index 9fb39bfc6..470a58a25 100644 --- a/src/utility/namedef.h +++ b/src/utility/namedef.h @@ -747,6 +747,7 @@ xx(Pagename) // Special menus xx(Mainmenu) +xx(MainmenuTextOnly) xx(Episodemenu) xx(Playerclassmenu) xx(HexenDefaultPlayerclassmenu) diff --git a/wadsrc/static/mapinfo/chex.txt b/wadsrc/static/mapinfo/chex.txt index 9027065e8..2c3f25318 100644 --- a/wadsrc/static/mapinfo/chex.txt +++ b/wadsrc/static/mapinfo/chex.txt @@ -65,8 +65,6 @@ gameinfo defaultendsequence = "Inter_Pic1" maparrow = "maparrows/arrow.txt", "maparrows/ddtarrow.txt" statscreen_mapnamefont = "BigFont" - statscreen_finishedpatch = "WIF" - statscreen_enteringpatch = "WIENTER" statscreen_finishedfont = "BigFont", "green" statscreen_enteringfont = "BigFont", "green" statscreen_coop = "CoopStatusScreen" diff --git a/wadsrc/static/mapinfo/doomcommon.txt b/wadsrc/static/mapinfo/doomcommon.txt index b3541b91a..212dd0dab 100644 --- a/wadsrc/static/mapinfo/doomcommon.txt +++ b/wadsrc/static/mapinfo/doomcommon.txt @@ -65,8 +65,6 @@ gameinfo defaultendsequence = "Inter_Cast" maparrow = "maparrows/arrow.txt", "maparrows/ddtarrow.txt" statscreen_mapnamefont = "BigFont" - statscreen_finishedpatch = "WIF" - statscreen_enteringpatch = "WIENTER" statscreen_finishedfont = "BigFont", "red" statscreen_enteringfont = "BigFont", "red" statscreen_coop = "CoopStatusScreen" diff --git a/wadsrc/static/menudef.txt b/wadsrc/static/menudef.txt index 759a0466f..fb0372201 100644 --- a/wadsrc/static/menudef.txt +++ b/wadsrc/static/menudef.txt @@ -11,27 +11,25 @@ DEFAULTLISTMENU { Font "BigFont", "Untranslated" + LineSpacing 20 IfGame(Doom) { Selector "M_SKULL1", -32, -5 - Linespacing 16 Font "BigUpper", "Red" + LineSpacing 18 } IfGame(Chex) { Selector "M_SKULL1", -32, -5 - Linespacing 16 Font "BigFont", "Green" } IfGame(Strife) { Selector "M_CURS1", -28, -5 - Linespacing 19 } IfGame(Heretic, Hexen) { Selector "M_SLCTR1", -28, -1 - Linespacing 20 } } @@ -45,6 +43,7 @@ LISTMENU "MainMenu" { IfGame(Doom, Chex) { + LineSpacing 16 // This must account for some single-graphic replacements, so it cannot be widened StaticPatch 94, 2, "M_DOOM" Position 97, 72 IfOption(ReadThis) @@ -74,24 +73,24 @@ LISTMENU "MainMenu" IfGame(Doom, Strife, Chex) { - PatchItem "M_NGAME", "n", "PlayerclassMenu", 0, "$MNU_NEWGAME" + PatchItem "M_NGAME", "n", "PlayerclassMenu" ifOption(SwapMenu) { - PatchItem "M_LOADG", "l", "LoadGameMenu", 0, "$MNU_LOADGAME" - PatchItem "M_SAVEG", "s", "SaveGameMenu",0, "$MNU_SAVEGAME" - PatchItem "M_OPTION","o", "OptionsMenu", 0, "$MNU_OPTIONS" + PatchItem "M_LOADG", "l", "LoadGameMenu", 0 + PatchItem "M_SAVEG", "s", "SaveGameMenu",0 + PatchItem "M_OPTION","o", "OptionsMenu", 0 } else { - PatchItem "M_OPTION","o", "OptionsMenu", 0, "$MNU_OPTIONS" - PatchItem "M_LOADG", "l", "LoadGameMenu", 0, "$MNU_LOADGAME" - PatchItem "M_SAVEG", "s", "SaveGameMenu", 0, "$MNU_SAVEGAME" + PatchItem "M_OPTION","o", "OptionsMenu", 0 + PatchItem "M_LOADG", "l", "LoadGameMenu", 0 + PatchItem "M_SAVEG", "s", "SaveGameMenu", 0 } ifOption(ReadThis) { - PatchItem "M_RDTHIS","r", "ReadThisMenu", 0, "$MNU_INFO" + PatchItem "M_RDTHIS","r", "ReadThisMenu", 0 } - PatchItem "M_QUITG", "q", "QuitMenu", 0, "$MNU_QUITGAME" + PatchItem "M_QUITG", "q", "QuitMenu", 0 } IfGame(Heretic, Hexen) @@ -104,6 +103,39 @@ LISTMENU "MainMenu" } } +//------------------------------------------------------------------------------------------- +// +// Text only variant of the main menu for Doom, Strife and Chex Quest to be used with localized content. +// +//------------------------------------------------------------------------------------------- + +LISTMENU "MainMenuTextOnly" +{ + IfGame(Doom, Chex) + { + StaticPatch 94, 2, "M_DOOM" + Position 97, 72 + IfOption(ReadThis) + { + Position 97, 64 + } + } + IfGame(Strife) + { + StaticPatch 84, 2, "M_STRIFE" + Position 97, 45 + } + + TextItem "$MNU_NEWGAME", "n", "PlayerclassMenu" + TextItem "$MNU_OPTIONS", "o", "OptionsMenu" + TextItem "$MNU_GAMEFILES", "g", "GameFilesMenu" + IfOption(ReadThis) + { + TextItem "$MNU_INFO", "i", "ReadThisMenu" + } + TextItem "$MNU_QUITGAME", "q", "QuitMenu" +} + //------------------------------------------------------------------------------------------- // // Important note about the following template menus: diff --git a/wadsrc/static/zscript/base.txt b/wadsrc/static/zscript/base.txt index c65dfb9bf..6841ce6bd 100644 --- a/wadsrc/static/zscript/base.txt +++ b/wadsrc/static/zscript/base.txt @@ -105,7 +105,7 @@ struct TexMan native static Vector2 GetScaledSize(TextureID tex); native static Vector2 GetScaledOffset(TextureID tex); native static int CheckRealHeight(TextureID tex); - native static bool OkForLocalization(TextureID patch); + native static bool OkForLocalization(TextureID patch, String textSubstitute); native static void SetCameraToTexture(Actor viewpoint, String texture, double fov); } @@ -374,8 +374,6 @@ struct GameInfoStruct native native GIFont mStatscreenMapNameFont; native GIFont mStatscreenEnteringFont; native GIFont mStatscreenFinishedFont; - native GIFont mStatscreenEnteringPatch; - native GIFont mStatscreenFinishedPatch; native double gibfactor; native bool intermissioncounter; native Name mSliderColor; diff --git a/wadsrc/static/zscript/menu/listmenuitems.txt b/wadsrc/static/zscript/menu/listmenuitems.txt index b1c8e6992..f12d3a7c4 100644 --- a/wadsrc/static/zscript/menu/listmenuitems.txt +++ b/wadsrc/static/zscript/menu/listmenuitems.txt @@ -93,7 +93,7 @@ class ListMenuItemStaticPatch : ListMenuItem Vector2 vec = TexMan.GetScaledSize(mTexture); if (mYpos >= 0) { - if (mSubstitute == "" || TexMan.OkForLocalization(mTexture)) + if (mSubstitute == "" || TexMan.OkForLocalization(mTexture, mSubstitute)) { if (mCentered) x -= vec.X / 2; screen.DrawTexture (mTexture, true, x, mYpos, DTA_Clean, true); @@ -107,7 +107,7 @@ class ListMenuItemStaticPatch : ListMenuItem else { x = (mXpos - 160) * CleanXfac + (Screen.GetWidth()>>1); - if (mSubstitute == "" || TexMan.OkForLocalization(mTexture)) + if (mSubstitute == "" || TexMan.OkForLocalization(mTexture, mSubstitute)) { if (mCentered) x -= (vec.X * CleanXfac)/2; screen.DrawTexture (mTexture, true, x, -mYpos*CleanYfac, DTA_CleanNoMove, true); @@ -303,53 +303,29 @@ class ListMenuItemTextItem : ListMenuItemSelectable class ListMenuItemPatchItem : ListMenuItemSelectable { TextureID mTexture; - String mSubstitute; - Font mFont; - int mColor; - - void Init(ListMenuDescriptor desc, TextureID patch, String hotkey, Name child, int param = 0, String subst = "") + + void Init(ListMenuDescriptor desc, TextureID patch, String hotkey, Name child, int param = 0) { Super.Init(desc.mXpos, desc.mYpos, desc.mLinespacing, child, param); mHotkey = hotkey.CharCodeAt(0); mTexture = patch; - mSubstitute = subst; - mFont = desc.mFont; - mColor = desc.mFontColor; } - void InitDirect(double x, double y, int height, TextureID patch, String hotkey, Name child, int param = 0, String subst = "", Font fnt = null, int col = Font.CR_UNTRANSLATED) + void InitDirect(double x, double y, int height, TextureID patch, String hotkey, Name child, int param = 0) { Super.Init(x, y, height, child, param); mHotkey = hotkey.CharCodeAt(0); mTexture = patch; - mSubstitute = subst; - mFont = fnt; - mColor = col; } override void Drawer(bool selected) { - if (mSubstitute == "" || TexMan.OkForLocalization(mTexture)) - { - screen.DrawTexture (mTexture, true, mXpos, mYpos, DTA_Clean, true); - } - else - { - screen.DrawText(mFont, mColor, mXpos, mYpos, mSubstitute, DTA_Clean, true); - } - + screen.DrawTexture (mTexture, true, mXpos, mYpos, DTA_Clean, true); } override int GetWidth() { - if (mSubstitute == "" || TexMan.OkForLocalization(mTexture)) - { - return TexMan.GetSize(mTexture); - } - else - { - return max(1, mFont.StringWidth(StringTable.Localize(mSubstitute))); - } + return TexMan.GetSize(mTexture); } } diff --git a/wadsrc/static/zscript/statscreen/statscreen.txt b/wadsrc/static/zscript/statscreen/statscreen.txt index 6a16508c3..1cf100198 100644 --- a/wadsrc/static/zscript/statscreen/statscreen.txt +++ b/wadsrc/static/zscript/statscreen/statscreen.txt @@ -8,30 +8,17 @@ class InterBackground native play version("2.5") native virtual void drawBackground(int CurState, bool drawsplat, bool snl_pointeron); } +// This is obsolete. Hopefully this was never used... struct PatchInfo play version("2.5") { Font mFont; - TextureID mPatch; + deprecated("3.8") TextureID mPatch; int mColor; - void Init(GIFont gifont, GIFont gipatch = null) + void Init(GIFont gifont) { - if (gipatch != null) - { - mPatch = TexMan.CheckForTexture(gipatch.fontname, TexMan.Type_MiscPatch); - if (TexMan.OkForLocalization(mPatch)) - { - mColor = mPatch.isValid() ? Font.CR_UNTRANSLATED : Font.CR_UNDEFINED; - mFont = NULL; - } - else mPatch.setInvalid(); - } - if (!mPatch.isValid()) - { - mFont = Font.GetFont(gifont.fontname); - mColor = Font.FindFontColor(gifont.color); - mPatch.SetInvalid(); - } + mFont = Font.GetFont(gifont.fontname); + mColor = Font.FindFontColor(gifont.color); if (mFont == NULL) { mFont = BigFont; @@ -115,6 +102,8 @@ class StatusScreen abstract play version("2.5") TextureID timepic; TextureID par; TextureID sucks; + TextureID finishedPatch; + TextureID enteringPatch; // [RH] Info to dynamically generate the level name graphics String lnametexts[2]; @@ -183,28 +172,43 @@ class StatusScreen abstract play version("2.5") //==================================================================== // - // Draws a text, either as patch or as string from the string table + // Only kept so that mods that were accessing it continue to compile // //==================================================================== - int DrawPatchText(int y, PatchInfo pinfo, String stringname) + deprecated("3.8") int DrawPatchText(int y, PatchInfo pinfo, String stringname) { String string = Stringtable.Localize(stringname); int midx = screen.GetWidth() / 2; - if (pinfo.mPatch.isValid()) + screen.DrawText(pinfo.mFont, pinfo.mColor, midx - pinfo.mFont.StringWidth(string) * CleanXfac/2, y, string, DTA_CleanNoMove, true); + return y + pinfo.mFont.GetHeight() * CleanYfac; + } + + //==================================================================== + // + // Draws a text, either as patch or as string from the string table + // + //==================================================================== + + int DrawPatchOrText(int y, PatchInfo pinfo, TextureID patch, String stringname) + { + String string = Stringtable.Localize(stringname); + int midx = screen.GetWidth() / 2; + + if (TexMan.OkForLocalization(patch, stringname)) { - let size = TexMan.GetScaledSize(pinfo.mPatch); - screen.DrawTexture(pinfo.mPatch, true, midx - size.X * CleanXfac/2, y, DTA_CleanNoMove, true); + let size = TexMan.GetScaledSize(patch); + screen.DrawTexture(patch, true, midx - size.X * CleanXfac/2, y, DTA_CleanNoMove, true); return y + int(size.Y * CleanYfac); } - else + else { screen.DrawText(pinfo.mFont, pinfo.mColor, midx - pinfo.mFont.StringWidth(string) * CleanXfac/2, y, string, DTA_CleanNoMove, true); return y + pinfo.mFont.GetHeight() * CleanYfac; } } - + //==================================================================== // @@ -215,7 +219,7 @@ class StatusScreen abstract play version("2.5") // //==================================================================== - int drawLF () + virtual int drawLF () { int y = TITLEY * CleanYfac; @@ -230,7 +234,7 @@ class StatusScreen abstract play version("2.5") if (y < (statsy - finished.mFont.GetHeight()*3/4) * CleanYfac) { // don't draw 'finished' if the level name is too tall - y = DrawPatchText(y, finished, "$WI_FINISHED"); + y = DrawPatchOrText(y, finished, finishedPatch, "$WI_FINISHED"); } return y; } @@ -245,11 +249,11 @@ class StatusScreen abstract play version("2.5") // //==================================================================== - void drawEL () + virtual void drawEL () { int y = TITLEY * CleanYfac; - y = DrawPatchText(y, entering, "$WI_ENTERING"); + y = DrawPatchOrText(y, entering, enteringPatch, "$WI_ENTERING"); y += entering.mFont.GetHeight() * CleanYfac / 4; DrawName(y, wbs.LName1, lnametexts[1]); } @@ -688,8 +692,8 @@ class StatusScreen abstract play version("2.5") me = wbs.pnum; for (int i = 0; i < MAXPLAYERS; i++) Plrs[i] = wbs.plyr[i]; - entering.Init(gameinfo.mStatscreenEnteringFont, gameinfo.mStatscreenEnteringPatch); - finished.Init(gameinfo.mStatscreenFinishedFont, gameinfo.mStatscreenFinishedPatch); + entering.Init(gameinfo.mStatscreenEnteringFont); + finished.Init(gameinfo.mStatscreenFinishedFont); mapname.Init(gameinfo.mStatscreenMapNameFont); Kills = TexMan.CheckForTexture("WIOSTK", TexMan.Type_MiscPatch); // "kills" @@ -699,6 +703,8 @@ class StatusScreen abstract play version("2.5") Timepic = TexMan.CheckForTexture("WITIME", TexMan.Type_MiscPatch); // "time" Sucks = TexMan.CheckForTexture("WISUCKS", TexMan.Type_MiscPatch); // "sucks" Par = TexMan.CheckForTexture("WIPAR", TexMan.Type_MiscPatch); // "par" + enteringPatch = TexMan.CheckForTexture("WIENTER", TexMan.Type_MiscPatch); // "entering" + finishedPatch = TexMan.CheckForTexture("WIF", TexMan.Type_MiscPatch); // "finished" lnametexts[0] = wbstartstruct.thisname; lnametexts[1] = wbstartstruct.nextname; diff --git a/wadsrc/static/zscript/statscreen/statscreen_sp.txt b/wadsrc/static/zscript/statscreen/statscreen_sp.txt index e1bcd0b62..15606fd78 100644 --- a/wadsrc/static/zscript/statscreen/statscreen_sp.txt +++ b/wadsrc/static/zscript/statscreen/statscreen_sp.txt @@ -142,8 +142,11 @@ class DoomStatusScreen : StatusScreen let tcolor = Font.CR_RED; // For visual consistency, only use the patches here if all are present. - bool useGfx = TexMan.OkForLocalization(Kills) && TexMan.OkForLocalization(Items) && TexMan.OkForLocalization(P_secret) && TexMan.OkForLocalization(Timepic) && - (!wbs.partime || TexMan.OkForLocalization(Par)); + bool useGfx = TexMan.OkForLocalization(Kills, "$TXT_IMKILLS") + && TexMan.OkForLocalization(Items, "$TXT_IMITEMS") + && TexMan.OkForLocalization(P_secret, "$TXT_IMSECRETS") + && TexMan.OkForLocalization(Timepic, "$TXT_IMTIME") + && (!wbs.partime || TexMan.OkForLocalization(Par, "$TXT_IMPAR")); Font printFont; @@ -178,7 +181,7 @@ class DoomStatusScreen : StatusScreen { // "sucks" int x = 160 - SP_TIMEX; int y = SP_TIMEY; - if (useGfx && TexMan.OkForLocalization(Sucks)) + if (useGfx && TexMan.OkForLocalization(Sucks, "$TXT_IMSUCKS")) { let size = TexMan.GetScaledSize(Sucks); screen.DrawTexture (Sucks, true, x - size.X, y - size.Y - 2, DTA_Clean, true);