From 8580720d05f46481d2309fcc7aa7911043d8e356 Mon Sep 17 00:00:00 2001 From: iisaev Date: Fri, 6 Nov 2026 18:01:22 +0100 Subject: [PATCH] feat: mark games in development in the game picker --- src/GamePickerPanel.cs | 2 + .../menu_flow/src/MenuFlowTestDriverNode.cs | 61 +++++++++++++++++++ 2 files changed, 63 insertions(+) diff --git a/src/GamePickerPanel.cs b/src/GamePickerPanel.cs index ac7f2c6..5e71716 100644 --- a/src/GamePickerPanel.cs +++ b/src/GamePickerPanel.cs @@ -184,6 +184,7 @@ namespace Cthangover.BaseMenu StretchMode = TextureRect.StretchModeEnum.KeepAspectCovered, MouseFilter = MouseFilterEnum.Ignore, }); + frame.AddChild(UiKit.DevelopmentFrame(collection.Version)); return frame; } @@ -192,6 +193,7 @@ namespace Cthangover.BaseMenu letter.HorizontalAlignment = HorizontalAlignment.Center; letter.VerticalAlignment = VerticalAlignment.Center; frame.AddChild(letter); + frame.AddChild(UiKit.DevelopmentFrame(collection.Version)); return frame; } diff --git a/test_suites/menu_flow/src/MenuFlowTestDriverNode.cs b/test_suites/menu_flow/src/MenuFlowTestDriverNode.cs index 8711678..46cff96 100644 --- a/test_suites/menu_flow/src/MenuFlowTestDriverNode.cs +++ b/test_suites/menu_flow/src/MenuFlowTestDriverNode.cs @@ -38,6 +38,9 @@ namespace Mods.MenuFlowTest private double stepAt; private bool done; private Node hub; + private string initialLocale; + private int languageIndex; + private bool languageReady; public override void _Process(double delta) { @@ -85,6 +88,7 @@ namespace Mods.MenuFlowTest if (GetTree().CurrentScene is not MainMenu) return; Check("front-end only", ActiveGame.IsFrontendOnly && !ActiveGame.IsActive); + initialLocale = TranslationServer.GetLocale(); Check("menu mods loaded", ModRegistry.Instance.Mods.ContainsKey("menu_base") && ModRegistry.Instance.Mods.ContainsKey("mod_manager")); Check("game content not loaded", !ModRegistry.Instance.Mods.ContainsKey("cthangover_game")); CheckUnloadedModTitle("cooking"); @@ -100,8 +104,28 @@ namespace Mods.MenuFlowTest { var picker = Menu.GetNodeOrNull("GamePickerPanel"); Check("Play opens the game picker", picker?.Visible == true); + if (languageIndex <= LanguageCode.Supported.Length) + { + if (!languageReady) + { + LocaleLoader.LoadLocale(languageIndex < LanguageCode.Supported.Length + ? LanguageCode.Supported[languageIndex] : initialLocale); + picker.Open(); + languageReady = true; + return; + } + if (languageIndex < LanguageCode.Supported.Length) + { + CheckPickerLanguage(picker, LanguageCode.Supported[languageIndex]); + languageIndex++; + languageReady = false; + return; + } + languageIndex++; + } Shot("game_picker"); var games = GameCatalog.Games(); + CheckDevelopmentCovers(picker, games); var newGameText = TranslationServer.Translate("menu/play/new_game").ToString(); var startButtons = Buttons(picker).Where(b => b.Text == newGameText).ToList(); Check($"one card per game ({games.Count})", games.Count >= 2 && startButtons.Count == games.Count); @@ -203,6 +227,43 @@ namespace Mods.MenuFlowTest return Buttons(hub).FirstOrDefault(b => b.Text == text && b.IsVisibleInTree()); } + private void CheckDevelopmentCovers(GamePickerPanel picker, IReadOnlyList games) + { + var frames = picker.FindChildren("DevelopmentFrame", "", true, false).OfType().ToList(); + Check("one development overlay per game cover", frames.Count == games.Count); + Check("development overlays match game versions", frames.Select(f => f.Visible).SequenceEqual( + games.Select(g => VersionHelper.IsInDevelopment(g.Collection.Version)))); + Check("game overlays have generated art and pass clicks through", frames.All(f => + f.Texture != null && f.MouseFilter == Control.MouseFilterEnum.Ignore)); + Check("game version reset keeps every built-in game playable", games.Where(g => + g.Collection.Origin == ModCollectionOrigin.BuiltIn).All(g => g.Collection.Version == "0.1.0" && g.IsReady)); + } + + private void CheckPickerLanguage(GamePickerPanel picker, string language) + { + var expectedCaptions = new[] { "В разработке", "In development", "En desarrollo", "开发中", "開発中", "개발 중", "Đang phát triển" }; + var expected = expectedCaptions[languageIndex]; + var frames = picker.FindChildren("DevelopmentFrame", "", true, false).OfType().ToList(); + Check($"{language}: development captions are translated", frames.Count > 0 && frames.All(f => + f.GetNode