Draw menu carons with the game's own typeface, per font rather than per label
The previous commit claimed this was fixed; it was not. It hooked UIStyleManager.GetMenuFont, GetTranslatorFont, GetShipLogFont and GetShipLogCardFont — all four of which are dead code with no callers anywhere in Assembly-CSharp. Fonts are assigned straight onto the Text components in the scene data, so nothing the mod did was ever consulted. Three further things were wrong and are fixed here: - The language check reflected into the Localization Utility for TryGetLanguage, which the installed version does not have, so it could only ever fail. It now uses the utility's own definition instead: custom languages are numbered past Language.TOTAL. No reflection, nothing to fail silently. - The substitution was decided per label, from whether that label's own string needed a glyph, which left menus mixing two typefaces line by line. It is now decided per font: a face that cannot draw Slovak is replaced everywhere it is used. Faces that can — Futura PT for dialogue, Space Mono for the translator — are still never touched. - The menu font was assumed to be Gill Sans MT. Logging the fonts actually in use showed the menus are Adobe - SerifGothicStd, which had been listed as a stylised face to leave alone. Gill Sans is the HUD prompts. The replacement now prefers the game's own dynamic cut of the same typeface (Adobe - SerifGothicStd_Dynamic and friends), matched by name prefix so bold variants resolve too, which keeps the menu looking like vanilla. Bundled Cabin is the fallback where the game ships no dynamic sibling, and the new preferGameTypeface setting forces Cabin everywhere. Hooks are Text.OnEnable, the Text.text setter, TextTranslation.SetLanguage and scene load, plus a 2s sweep for menus built lazily after all of those. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
using HarmonyLib;
|
||||
using OWML.Common;
|
||||
using OWML.ModHelper;
|
||||
using UnityEngine;
|
||||
|
||||
namespace SlovakTranslation
|
||||
{
|
||||
@@ -47,8 +48,34 @@ namespace SlovakTranslation
|
||||
if (SlovakFont.Loaded)
|
||||
{
|
||||
new Harmony("Homer.SlovakTranslation").PatchAll();
|
||||
UnityEngine.SceneManagement.SceneManager.sceneLoaded += (scene, mode) => SlovakFont.ApplyToAll();
|
||||
ModHelper.Console.WriteLine("Slovak menu/HUD font (Cabin) loaded and patched in.", MessageType.Success);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <c>preferGameTypeface</c> — when on, a menu font that can't draw Slovak is
|
||||
/// replaced by the game's own dynamic cut of the same typeface where one exists,
|
||||
/// so the menu keeps its vanilla look. Turn it off to use the bundled Cabin
|
||||
/// everywhere instead.
|
||||
/// </summary>
|
||||
public override void Configure(IModConfig config)
|
||||
{
|
||||
SlovakFont.PreferGameTypeface = config.GetSettingsValue<bool>("preferGameTypeface");
|
||||
if (!SlovakFont.Loaded) return;
|
||||
|
||||
SlovakFont.ForgetChoices();
|
||||
SlovakFont.ApplyToAll();
|
||||
}
|
||||
|
||||
/// <summary>Labels can be built long after a scene loads, so keep sweeping.</summary>
|
||||
private float _nextSweep;
|
||||
|
||||
private void Update()
|
||||
{
|
||||
if (!SlovakFont.Loaded || Time.unscaledTime < _nextSweep) return;
|
||||
_nextSweep = Time.unscaledTime + 2f;
|
||||
SlovakFont.ApplyToAll();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user