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 <noreply@anthropic.com>
This commit is contained in:
Leonid Pershin
2026-06-14 21:57:21 +03:00
co-authored by Claude Opus 4.8
parent d44e17198b
commit cf2bc77882
6 changed files with 52 additions and 27 deletions
+1
View File
@@ -108,6 +108,7 @@
"settings.resolution": "Resolution", "settings.resolution": "Resolution",
"settings.volume": "Volume", "settings.volume": "Volume",
"settings.uiscale": "UI scale", "settings.uiscale": "UI scale",
"settings.devmode": "Developer mode",
"settings.apply": "Apply", "settings.apply": "Apply",
"settings.back": "Back", "settings.back": "Back",
"pause.title": "Paused", "pause.title": "Paused",
+1
View File
@@ -108,6 +108,7 @@
"settings.resolution": "Разрешение", "settings.resolution": "Разрешение",
"settings.volume": "Громкость", "settings.volume": "Громкость",
"settings.uiscale": "Масштаб UI", "settings.uiscale": "Масштаб UI",
"settings.devmode": "Режим разработчика",
"settings.apply": "Применить", "settings.apply": "Применить",
"settings.back": "Назад", "settings.back": "Назад",
"pause.title": "Пауза", "pause.title": "Пауза",
+3
View File
@@ -31,6 +31,9 @@ public sealed class GameSettings
/// <summary>Масштаб интерфейса (1 — обычный); применяется к Myra-десктопу всех сцен.</summary> /// <summary>Масштаб интерфейса (1 — обычный); применяется к Myra-десктопу всех сцен.</summary>
public float UiScale { get; set; } = 1f; public float UiScale { get; set; } = 1f;
/// <summary>Режим разработчика: открывает дев-консоль (backtick) и дев-спавнер. По умолчанию включён.</summary>
public bool DeveloperMode { get; set; } = true;
} }
/// <summary>Чтение/запись <see cref="GameSettings"/> и применение их к движку.</summary> /// <summary>Чтение/запись <see cref="GameSettings"/> и применение их к движку.</summary>
+35 -25
View File
@@ -183,31 +183,41 @@ public sealed class WorldScene : Scene
desktop.Root = Ui.Screen(hudLabel, _inspect.Panel, speedBar, _pause.Root); desktop.Root = Ui.Screen(hudLabel, _inspect.Panel, speedBar, _pause.Root);
this.UseInspector(renderer); this.UseInspector(renderer);
var console = this.UseDevConsole();
RegisterCommands(console, content, atlases); // Режим разработчика (настройка, по умолчанию вкл): без него дев-консоль и спавнер не поднимаются.
console.Register( var devMode = GameSettingsStore.Load().DeveloperMode;
"light", MrGameEng.DevConsole.DevConsole? console = null;
"light [radius] — place a point light at the cursor (night shadows demo)", if (devMode)
(c, args) => {
{ console = this.UseDevConsole();
var radius = RegisterCommands(console, content, atlases);
args.Length > 0 console.Register(
? float.Parse(args[0], System.Globalization.CultureInfo.InvariantCulture) "light",
: 120f; "light [radius] — place a point light at the cursor (night shadows demo)",
var mouse = Mouse.GetState(); (c, args) =>
var world = renderer.ScreenToWorld(new Vector2(mouse.X, mouse.Y)); {
Store.CreateEntity( var radius =
Transform2D.At(world), args.Length > 0
new PointLight ? float.Parse(
{ args[0],
Radius = radius, System.Globalization.CultureInfo.InvariantCulture
Color = Color.White, )
Intensity = 0.9f, : 120f;
} var mouse = Mouse.GetState();
); var world = renderer.ScreenToWorld(new Vector2(mouse.X, mouse.Y));
c.WriteLine($"light at {world.X:0},{world.Y:0} r{radius:0}"); 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 PlantGrowthSystem(_plants, calendar, climate, lighting, CellSize));
UpdateSystems.Add(new PlantFruitingSystem(_plants, calendar, climate)); UpdateSystems.Add(new PlantFruitingSystem(_plants, calendar, climate));
+2 -2
View File
@@ -125,13 +125,13 @@ public sealed class GodCameraSystem(
Entity cameraEntity, Entity cameraEntity,
InputManager input, InputManager input,
Renderer2D renderer, Renderer2D renderer,
MrGameEng.DevConsole.DevConsole console, MrGameEng.DevConsole.DevConsole? console,
Func<bool>? blocked = null Func<bool>? blocked = null
) : BaseSystem ) : BaseSystem
{ {
protected override void OnUpdateGroup() protected override void OnUpdateGroup()
{ {
if (console.IsOpen || blocked?.Invoke() == true) if (console?.IsOpen == true || blocked?.Invoke() == true)
{ {
return; return;
} }
+10
View File
@@ -98,6 +98,16 @@ internal static class SettingsPanel
// Громкость — кнопки −/+ с подписью процента. // Громкость — кнопки −/+ с подписью процента.
column.Widgets.Add(Volume(lang.Get("settings.volume"), settings, refreshers)); 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 }); column.Widgets.Add(new Label { Height = 8 });
var buttons = Ui.Row(10); var buttons = Ui.Row(10);
buttons.Widgets.Add(Ui.Button(lang.Get("settings.apply"), onApply, width: 150)); buttons.Widgets.Add(Ui.Button(lang.Get("settings.apply"), onApply, width: 150));