using System; using System.Linq; using UnityEngine; using UnityEngine.InputSystem; using UnityEngine.UIElements; namespace Ironspore { public sealed partial class GameHud : MonoBehaviour { GameSession game; VisualElement root; Label mission, prompt, status, notice, telemetry; ProgressBar armor, energy, cargo; VisualElement cross, controlsHint; CombatInstruments instruments; enum View { Hangar, Field, Cargo, Part, Routes, Pause, Settings } View view; int partSlot, partIndex; PanelSettings panelSettings; VisualElement languageControl, languageMenu, languageDismiss; Button languageButton; int lastLanguageActivationFrame = -1; int lastLanguageNavigationFrame = -1; Label hangarNotice; SettingsScreen settingsScreen; int menuInputFrame = -1; public bool SettingsOpen => view == View.Settings; public bool MenuInputConsumedThisFrame => menuInputFrame == Time.frameCount; string K(string action) => game.Settings.Bindings.Display(action); static string L(string key, params object[] args) => GameLocalization.Text(key, args); public void Initialize(GameSession session) { game = session; var document = gameObject.AddComponent(); var settings = panelSettings = Instantiate(game.uiPanel); settings.scaleMode = PanelScaleMode.ScaleWithScreenSize; settings.referenceResolution = new Vector2Int(1920, 1080); document.panelSettings = settings; root = document.rootVisualElement; root.styleSheets.Add(game.uiStyle); root.pickingMode = PickingMode.Ignore; root.style.unityFontDefinition = FontDefinition.FromSDFFont(game.localization.uiFont); root.RegisterCallback(DragMove, TrickleDown.TrickleDown); root.RegisterCallback(DragEnd, TrickleDown.TrickleDown); root.RegisterCallback(_ => ResetDrag(), TrickleDown.TrickleDown); root.RegisterCallback(HandleLanguageKey, TrickleDown.TrickleDown); GameLocalization.Changed += RefreshLocale; settingsScreen = new SettingsScreen(game.Settings, () => game.Action("Pause").WasPressedThisFrame()); } void HandleLanguageKey(KeyDownEvent evt) { if (view != View.Hangar) return; if (languageMenu != null && evt.keyCode == KeyCode.Escape) { CloseLanguageMenu(); evt.StopImmediatePropagation(); return; } if (languageMenu != null && evt.keyCode == KeyCode.Tab) { MoveLanguageFocus(evt.shiftKey); evt.StopImmediatePropagation(); return; } if (evt.keyCode != KeyCode.Return && evt.keyCode != KeyCode.KeypadEnter && evt.keyCode != KeyCode.Space) return; if (ActivateFocusedLanguage()) evt.StopImmediatePropagation(); } void MoveLanguageFocus(bool reverse) { if (lastLanguageNavigationFrame == Time.frameCount) return; lastLanguageNavigationFrame = Time.frameCount; var options = languageMenu.Query