From cf2bc77882b54d7f746fc0cbce065952c0b4b33d Mon Sep 17 00:00:00 2001 From: Leonid Pershin Date: Sun, 14 Jun 2026 21:57:21 +0300 Subject: [PATCH] Developer-mode setting gates the dev console GameSettings.DeveloperMode (default ON) + a toggle in the settings panel. WorldScene only stands up the dev console (and, later, the dev spawner) when it is enabled, so without dev mode the backtick key does nothing. GodCameraSystem''s console arg is now nullable (no console when dev mode off). Localized settings.devmode ru/en. Build clean. Co-Authored-By: Claude Opus 4.8 --- Mods/Core/Languages/en/ui.json | 1 + Mods/Core/Languages/ru/ui.json | 1 + src/LittleSim/App/GameSettings.cs | 3 ++ src/LittleSim/Scenes/WorldScene.cs | 60 +++++++++++++++++------------- src/LittleSim/Sim/SimSystems.cs | 4 +- src/LittleSim/UI/SettingsPanel.cs | 10 +++++ 6 files changed, 52 insertions(+), 27 deletions(-) diff --git a/Mods/Core/Languages/en/ui.json b/Mods/Core/Languages/en/ui.json index dbaca85..e5a4aa7 100644 --- a/Mods/Core/Languages/en/ui.json +++ b/Mods/Core/Languages/en/ui.json @@ -108,6 +108,7 @@ "settings.resolution": "Resolution", "settings.volume": "Volume", "settings.uiscale": "UI scale", + "settings.devmode": "Developer mode", "settings.apply": "Apply", "settings.back": "Back", "pause.title": "Paused", diff --git a/Mods/Core/Languages/ru/ui.json b/Mods/Core/Languages/ru/ui.json index ada3961..e5e1bb3 100644 --- a/Mods/Core/Languages/ru/ui.json +++ b/Mods/Core/Languages/ru/ui.json @@ -108,6 +108,7 @@ "settings.resolution": "Разрешение", "settings.volume": "Громкость", "settings.uiscale": "Масштаб UI", + "settings.devmode": "Режим разработчика", "settings.apply": "Применить", "settings.back": "Назад", "pause.title": "Пауза", diff --git a/src/LittleSim/App/GameSettings.cs b/src/LittleSim/App/GameSettings.cs index 27a0e88..0326c4d 100644 --- a/src/LittleSim/App/GameSettings.cs +++ b/src/LittleSim/App/GameSettings.cs @@ -31,6 +31,9 @@ public sealed class GameSettings /// Масштаб интерфейса (1 — обычный); применяется к Myra-десктопу всех сцен. public float UiScale { get; set; } = 1f; + + /// Режим разработчика: открывает дев-консоль (backtick) и дев-спавнер. По умолчанию включён. + public bool DeveloperMode { get; set; } = true; } /// Чтение/запись и применение их к движку. diff --git a/src/LittleSim/Scenes/WorldScene.cs b/src/LittleSim/Scenes/WorldScene.cs index a4ac37c..b548a6d 100644 --- a/src/LittleSim/Scenes/WorldScene.cs +++ b/src/LittleSim/Scenes/WorldScene.cs @@ -183,31 +183,41 @@ public sealed class WorldScene : Scene desktop.Root = Ui.Screen(hudLabel, _inspect.Panel, speedBar, _pause.Root); this.UseInspector(renderer); - var console = this.UseDevConsole(); - RegisterCommands(console, content, atlases); - console.Register( - "light", - "light [radius] — place a point light at the cursor (night shadows demo)", - (c, args) => - { - var radius = - args.Length > 0 - ? float.Parse(args[0], System.Globalization.CultureInfo.InvariantCulture) - : 120f; - var mouse = Mouse.GetState(); - var world = renderer.ScreenToWorld(new Vector2(mouse.X, mouse.Y)); - Store.CreateEntity( - Transform2D.At(world), - new PointLight - { - Radius = radius, - Color = Color.White, - Intensity = 0.9f, - } - ); - c.WriteLine($"light at {world.X:0},{world.Y:0} r{radius:0}"); - } - ); + + // Режим разработчика (настройка, по умолчанию вкл): без него дев-консоль и спавнер не поднимаются. + var devMode = GameSettingsStore.Load().DeveloperMode; + MrGameEng.DevConsole.DevConsole? console = null; + if (devMode) + { + console = this.UseDevConsole(); + RegisterCommands(console, content, atlases); + console.Register( + "light", + "light [radius] — place a point light at the cursor (night shadows demo)", + (c, args) => + { + var radius = + args.Length > 0 + ? float.Parse( + args[0], + System.Globalization.CultureInfo.InvariantCulture + ) + : 120f; + var mouse = Mouse.GetState(); + var world = renderer.ScreenToWorld(new Vector2(mouse.X, mouse.Y)); + Store.CreateEntity( + Transform2D.At(world), + new PointLight + { + Radius = radius, + Color = Color.White, + Intensity = 0.9f, + } + ); + c.WriteLine($"light at {world.X:0},{world.Y:0} r{radius:0}"); + } + ); + } UpdateSystems.Add(new PlantGrowthSystem(_plants, calendar, climate, lighting, CellSize)); UpdateSystems.Add(new PlantFruitingSystem(_plants, calendar, climate)); diff --git a/src/LittleSim/Sim/SimSystems.cs b/src/LittleSim/Sim/SimSystems.cs index 30f5f89..3abc96e 100644 --- a/src/LittleSim/Sim/SimSystems.cs +++ b/src/LittleSim/Sim/SimSystems.cs @@ -125,13 +125,13 @@ public sealed class GodCameraSystem( Entity cameraEntity, InputManager input, Renderer2D renderer, - MrGameEng.DevConsole.DevConsole console, + MrGameEng.DevConsole.DevConsole? console, Func? blocked = null ) : BaseSystem { protected override void OnUpdateGroup() { - if (console.IsOpen || blocked?.Invoke() == true) + if (console?.IsOpen == true || blocked?.Invoke() == true) { return; } diff --git a/src/LittleSim/UI/SettingsPanel.cs b/src/LittleSim/UI/SettingsPanel.cs index a1b1984..192fde6 100644 --- a/src/LittleSim/UI/SettingsPanel.cs +++ b/src/LittleSim/UI/SettingsPanel.cs @@ -98,6 +98,16 @@ internal static class SettingsPanel // Громкость — кнопки −/+ с подписью процента. column.Widgets.Add(Volume(lang.Get("settings.volume"), settings, refreshers)); + // Режим разработчика — тумблер (дев-консоль и спавнер; по умолчанию включён). + column.Widgets.Add( + Toggle( + lang.Get("settings.devmode"), + () => settings.DeveloperMode, + v => settings.DeveloperMode = v, + refreshers + ) + ); + column.Widgets.Add(new Label { Height = 8 }); var buttons = Ui.Row(10); buttons.Widgets.Add(Ui.Button(lang.Get("settings.apply"), onApply, width: 150));