Adopt the engine Core/Host split; add LittleSim.Server headless prototype
Engine bump: MrGameEng.Core is now platform-free (Friflo only), the windowed MonoGame host lives in the new MrGameEng.Host library, and the core gains HeadlessHost — a fixed-timestep loop without a window or GPU. Game side: scenes switch to Transitions.Fade from the Host library, WorldScene reads the graphics device via Context.GetGraphicsDevice(), GameContent.Load(buildAtlases: false) skips atlas building for headless runs. LittleSim.Server is the dedicated-server seed and the showcase for HeadlessHost: it loads mods/defs without textures and fast-forwards the world calendar and climate on a fixed tick (~3.6M ticks/s in Debug): dotnet run --project src/LittleSim.Server -- --days 10 --tps 60 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Fable 5
parent
bfe1b139f0
commit
8a7e2cce52
@@ -16,6 +16,8 @@ Game design docs live in `docs/` and are written in **Russian**. Engine rules li
|
||||
```
|
||||
engine/ mrgameeng git submodule (own repo, own CLAUDE.md)
|
||||
src/LittleSim the game (net8.0); references engine projects directly
|
||||
src/LittleSim.Server dedicated-server prototype: the world headless (engine HeadlessHost),
|
||||
loads mods/defs without atlases; the future network server grows here
|
||||
Mods/Core the game's own content as a mod: About, Defs, Languages, Textures
|
||||
Cache/ runtime-built atlases (gitignored)
|
||||
docs/ концепт, симуляция, моды, roadmap (Russian)
|
||||
@@ -28,6 +30,7 @@ LittleSim.sln game + engine sources + engine tests — one window for everythin
|
||||
git submodule update --init # after fresh clone
|
||||
dotnet build LittleSim.sln
|
||||
dotnet run --project src/LittleSim -c Release # measure perf in Release only
|
||||
dotnet run --project src/LittleSim.Server -- --days 10 --tps 60 # headless fast-forward
|
||||
dotnet test LittleSim.sln # runs the engine test suites
|
||||
```
|
||||
|
||||
|
||||
@@ -41,6 +41,12 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MrGameEng.UI.Tests", "engin
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MrGameEng.Audio.Tests", "engine\tests\MrGameEng.Audio.Tests\MrGameEng.Audio.Tests.csproj", "{E0E37D87-4F62-41E9-9CD1-3E7432301508}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MrGameEng.Host", "engine\src\MrGameEng.Host\MrGameEng.Host.csproj", "{D4222C26-40D8-4465-9B26-CD6BD0722EC0}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MrGameEng.Host.Tests", "engine\tests\MrGameEng.Host.Tests\MrGameEng.Host.Tests.csproj", "{41F0249B-106E-4D56-B022-73D2C2D74807}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LittleSim.Server", "src\LittleSim.Server\LittleSim.Server.csproj", "{BEFB468B-6784-468E-9B60-EB44AB078D15}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
@@ -231,6 +237,42 @@ Global
|
||||
{E0E37D87-4F62-41E9-9CD1-3E7432301508}.Release|x64.Build.0 = Release|Any CPU
|
||||
{E0E37D87-4F62-41E9-9CD1-3E7432301508}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{E0E37D87-4F62-41E9-9CD1-3E7432301508}.Release|x86.Build.0 = Release|Any CPU
|
||||
{D4222C26-40D8-4465-9B26-CD6BD0722EC0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{D4222C26-40D8-4465-9B26-CD6BD0722EC0}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{D4222C26-40D8-4465-9B26-CD6BD0722EC0}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{D4222C26-40D8-4465-9B26-CD6BD0722EC0}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{D4222C26-40D8-4465-9B26-CD6BD0722EC0}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{D4222C26-40D8-4465-9B26-CD6BD0722EC0}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{D4222C26-40D8-4465-9B26-CD6BD0722EC0}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{D4222C26-40D8-4465-9B26-CD6BD0722EC0}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{D4222C26-40D8-4465-9B26-CD6BD0722EC0}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{D4222C26-40D8-4465-9B26-CD6BD0722EC0}.Release|x64.Build.0 = Release|Any CPU
|
||||
{D4222C26-40D8-4465-9B26-CD6BD0722EC0}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{D4222C26-40D8-4465-9B26-CD6BD0722EC0}.Release|x86.Build.0 = Release|Any CPU
|
||||
{41F0249B-106E-4D56-B022-73D2C2D74807}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{41F0249B-106E-4D56-B022-73D2C2D74807}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{41F0249B-106E-4D56-B022-73D2C2D74807}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{41F0249B-106E-4D56-B022-73D2C2D74807}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{41F0249B-106E-4D56-B022-73D2C2D74807}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{41F0249B-106E-4D56-B022-73D2C2D74807}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{41F0249B-106E-4D56-B022-73D2C2D74807}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{41F0249B-106E-4D56-B022-73D2C2D74807}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{41F0249B-106E-4D56-B022-73D2C2D74807}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{41F0249B-106E-4D56-B022-73D2C2D74807}.Release|x64.Build.0 = Release|Any CPU
|
||||
{41F0249B-106E-4D56-B022-73D2C2D74807}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{41F0249B-106E-4D56-B022-73D2C2D74807}.Release|x86.Build.0 = Release|Any CPU
|
||||
{BEFB468B-6784-468E-9B60-EB44AB078D15}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{BEFB468B-6784-468E-9B60-EB44AB078D15}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{BEFB468B-6784-468E-9B60-EB44AB078D15}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{BEFB468B-6784-468E-9B60-EB44AB078D15}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{BEFB468B-6784-468E-9B60-EB44AB078D15}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{BEFB468B-6784-468E-9B60-EB44AB078D15}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{BEFB468B-6784-468E-9B60-EB44AB078D15}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{BEFB468B-6784-468E-9B60-EB44AB078D15}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{BEFB468B-6784-468E-9B60-EB44AB078D15}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{BEFB468B-6784-468E-9B60-EB44AB078D15}.Release|x64.Build.0 = Release|Any CPU
|
||||
{BEFB468B-6784-468E-9B60-EB44AB078D15}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{BEFB468B-6784-468E-9B60-EB44AB078D15}.Release|x86.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
@@ -253,5 +295,8 @@ Global
|
||||
{86ECA4A0-46A2-45F4-8CF4-8FB8BB5DC050} = {CD3B5CE5-C23F-38B4-04AA-A303F94731A5}
|
||||
{BC64F7AF-0FC3-4608-A4FF-1273AB8F2ABD} = {CD3B5CE5-C23F-38B4-04AA-A303F94731A5}
|
||||
{E0E37D87-4F62-41E9-9CD1-3E7432301508} = {CD3B5CE5-C23F-38B4-04AA-A303F94731A5}
|
||||
{D4222C26-40D8-4465-9B26-CD6BD0722EC0} = {F4A69A46-AF86-AB4E-7D23-4CCCB7B9A519}
|
||||
{41F0249B-106E-4D56-B022-73D2C2D74807} = {CD3B5CE5-C23F-38B4-04AA-A303F94731A5}
|
||||
{BEFB468B-6784-468E-9B60-EB44AB078D15} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B}
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
|
||||
+1
-1
Submodule engine updated: d0104df304...2ac074004a
@@ -0,0 +1,46 @@
|
||||
using Friflo.Engine.ECS.Systems;
|
||||
using LittleSim.Content;
|
||||
using LittleSim.Scenes;
|
||||
using MrGameEng.Core;
|
||||
|
||||
namespace LittleSim.Server;
|
||||
|
||||
/// <summary>
|
||||
/// Серверная сцена-зародыш: календарь и климат мира идут на фиксированном тике
|
||||
/// <see cref="HeadlessHost"/>, без окна, GPU и текстур. Демонстрирует headless-режим
|
||||
/// движка; дальше сюда переедет полная симуляция мира (растения, жители) и сетевой слой.
|
||||
/// </summary>
|
||||
internal sealed class HeadlessWorldScene : Scene
|
||||
{
|
||||
private readonly GameContent _content;
|
||||
|
||||
public HeadlessWorldScene(GameContent content) => _content = content;
|
||||
|
||||
protected override void OnLoad()
|
||||
{
|
||||
Context.Services.Add(_content);
|
||||
var calendar = Context.UseCalendar(WorldScene.SecondsPerDay);
|
||||
var climate = Context.UseClimate(ClimateSettings.Default);
|
||||
UpdateSystems.Add(new DayReportSystem(calendar, climate));
|
||||
}
|
||||
|
||||
/// <summary>Пишет строку состояния мира в лог на рассвете каждого игрового дня.</summary>
|
||||
private sealed class DayReportSystem(Calendar calendar, Climate climate) : BaseSystem
|
||||
{
|
||||
private int _lastDay;
|
||||
|
||||
protected override void OnUpdateGroup()
|
||||
{
|
||||
if (calendar.Day == _lastDay)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
_lastDay = calendar.Day;
|
||||
Log.Info(
|
||||
$"День {calendar.Day} | год {climate.Year}, день года {climate.DayOfYear + 1}, "
|
||||
+ $"{climate.Season} | {climate.Temperature:+0.0;-0.0;0.0} °C"
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\LittleSim\LittleSim.csproj" />
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
@@ -0,0 +1,44 @@
|
||||
using System.Diagnostics;
|
||||
using LittleSim.Content;
|
||||
using LittleSim.Scenes;
|
||||
using LittleSim.Server;
|
||||
using MrGameEng.Core;
|
||||
|
||||
// Дедикейтед-сервер LittleSim (прототип): мир без окна и GPU на HeadlessHost движка.
|
||||
// Пока умеет загрузить моды/дефы (без атласов) и прогнать календарь и климат на
|
||||
// фиксированном тике. Использование:
|
||||
// dotnet run --project src/LittleSim.Server [-- --days N] [--tps N]
|
||||
|
||||
var days = ReadOption("--days", 10);
|
||||
var ticksPerSecond = ReadOption("--tps", 60);
|
||||
|
||||
Log.MessageLogged += (level, message) => Console.WriteLine($"[{level}] {message}");
|
||||
|
||||
var content = GameContent.Load(buildAtlases: false);
|
||||
Log.Info(
|
||||
$"Моды: {string.Join(", ", content.Mods.Select(m => m.ToString()))} | "
|
||||
+ $"дефов: {content.Defs.All<TerrainDef>().Count} террейна, "
|
||||
+ $"{content.Defs.All<PlantDef>().Count} растений, "
|
||||
+ $"{content.Defs.All<PawnDef>().Count} жителей"
|
||||
);
|
||||
|
||||
using var host = new HeadlessHost(
|
||||
new HeadlessHostOptions { TicksPerSecond = ticksPerSecond, Realtime = false },
|
||||
new HeadlessWorldScene(content)
|
||||
);
|
||||
|
||||
var ticks = (long)((double)days * WorldScene.SecondsPerDay * ticksPerSecond);
|
||||
var stopwatch = Stopwatch.StartNew();
|
||||
host.RunTicks(ticks);
|
||||
Log.Info(
|
||||
$"{days} игровых дней за {stopwatch.Elapsed.TotalSeconds:F1} с реального времени "
|
||||
+ $"({ticks} тиков, {ticks / Math.Max(stopwatch.Elapsed.TotalSeconds, 0.001):F0} тиков/с)"
|
||||
);
|
||||
|
||||
int ReadOption(string name, int fallback)
|
||||
{
|
||||
var index = Array.IndexOf(args, name);
|
||||
return index >= 0 && index + 1 < args.Length && int.TryParse(args[index + 1], out var value)
|
||||
? value
|
||||
: fallback;
|
||||
}
|
||||
@@ -44,8 +44,10 @@ public sealed class GameContent
|
||||
/// <summary>
|
||||
/// Находит папку Mods (вверх по дереву от исполняемого файла), загружает моды, дефы и
|
||||
/// языки и инкрементально собирает атласы из смерженного дерева текстур всех модов.
|
||||
/// С <paramref name="buildAtlases"/> = false атласы не собираются — headless-режим
|
||||
/// (дедикейтед-сервер) текстур не рисует.
|
||||
/// </summary>
|
||||
public static GameContent Load()
|
||||
public static GameContent Load(bool buildAtlases = true)
|
||||
{
|
||||
var modsRoot =
|
||||
ModLoader.FindModsRoot(AppContext.BaseDirectory)
|
||||
@@ -71,6 +73,8 @@ public sealed class GameContent
|
||||
"Cache",
|
||||
"Atlases"
|
||||
);
|
||||
if (buildAtlases)
|
||||
{
|
||||
var textures = ModContentTree.Build(mods, "Textures", ".png", ".jpg", ".jpeg", ".bmp");
|
||||
var result = AtlasBuilder.Build(
|
||||
new AtlasBuildOptions
|
||||
@@ -84,6 +88,11 @@ public sealed class GameContent
|
||||
Log.Info(
|
||||
$"Atlases: {built} built, {result.Groups.Count - built} up to date ({result.Groups.Count} total)"
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
Log.Info("Atlases: skipped (headless)");
|
||||
}
|
||||
|
||||
return new GameContent(
|
||||
mods,
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\engine\src\MrGameEng.Core\MrGameEng.Core.csproj" />
|
||||
<ProjectReference Include="..\..\engine\src\MrGameEng.Host\MrGameEng.Host.csproj" />
|
||||
<ProjectReference Include="..\..\engine\src\MrGameEng.Graphics\MrGameEng.Graphics.csproj" />
|
||||
<ProjectReference Include="..\..\engine\src\MrGameEng.Audio\MrGameEng.Audio.csproj" />
|
||||
<ProjectReference Include="..\..\engine\src\MrGameEng.Content\MrGameEng.Content.csproj" />
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
using LittleSim.Scenes;
|
||||
using Microsoft.Xna.Framework;
|
||||
using MrGameEng.Core;
|
||||
using MrGameEng.Host;
|
||||
|
||||
// Контент Core-мода грузится уже в окне — на загрузочном экране (BootScene), в фоне.
|
||||
using var host = new GameHost(
|
||||
|
||||
@@ -5,6 +5,7 @@ using LittleSim.UI;
|
||||
using Microsoft.Xna.Framework;
|
||||
using MrGameEng.Audio;
|
||||
using MrGameEng.Core;
|
||||
using MrGameEng.Host;
|
||||
using MrGameEng.UI;
|
||||
using Myra.Graphics2D.UI;
|
||||
|
||||
@@ -46,7 +47,7 @@ public sealed class BootScene : Scene
|
||||
desktop.Root = Ui.Screen(_label);
|
||||
|
||||
// Сборка атласов и дефов — без GPU, поэтому безопасно вне главного потока.
|
||||
_load = Task.Run(GameContent.Load);
|
||||
_load = Task.Run(() => GameContent.Load());
|
||||
UpdateSystems.Add(new CallbackSystem(Tick));
|
||||
}
|
||||
|
||||
@@ -73,6 +74,6 @@ public sealed class BootScene : Scene
|
||||
Context.Services.Add(content);
|
||||
Context.Services.Add(new ModAtlases(content.AtlasCacheDirectory));
|
||||
content.Languages.SetLanguage(_settings.Language);
|
||||
Context.Scenes.Switch(new MainMenuScene(), Transition.Fade(0.6f));
|
||||
Context.Scenes.Switch(new MainMenuScene(), Transitions.Fade(0.6f));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ using LittleSim.Content;
|
||||
using LittleSim.UI;
|
||||
using Microsoft.Xna.Framework.Input;
|
||||
using MrGameEng.Core;
|
||||
using MrGameEng.Host;
|
||||
using MrGameEng.Input;
|
||||
using MrGameEng.UI;
|
||||
|
||||
@@ -40,7 +41,7 @@ public sealed class CreditsScene : Scene
|
||||
{
|
||||
if (!Context.Scenes.IsTransitioning)
|
||||
{
|
||||
Context.Scenes.Switch(new MainMenuScene(), Transition.Fade(0.4f));
|
||||
Context.Scenes.Switch(new MainMenuScene(), Transitions.Fade(0.4f));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@ using LittleSim.Content;
|
||||
using LittleSim.UI;
|
||||
using Microsoft.Xna.Framework.Input;
|
||||
using MrGameEng.Core;
|
||||
using MrGameEng.Host;
|
||||
using MrGameEng.Input;
|
||||
using MrGameEng.UI;
|
||||
using Myra.Graphics2D.UI;
|
||||
@@ -73,7 +74,7 @@ public sealed class LoadGameScene : Scene
|
||||
{
|
||||
Context.Scenes.Switch(
|
||||
new WorldScene(save.ToConfig(), save),
|
||||
Transition.Fade(0.6f)
|
||||
Transitions.Fade(0.6f)
|
||||
);
|
||||
}
|
||||
},
|
||||
@@ -104,7 +105,7 @@ public sealed class LoadGameScene : Scene
|
||||
{
|
||||
if (!Context.Scenes.IsTransitioning)
|
||||
{
|
||||
Context.Scenes.Switch(new MainMenuScene(), Transition.Fade(0.4f));
|
||||
Context.Scenes.Switch(new MainMenuScene(), Transitions.Fade(0.4f));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ using LittleSim.Content;
|
||||
using LittleSim.UI;
|
||||
using Microsoft.Xna.Framework;
|
||||
using MrGameEng.Core;
|
||||
using MrGameEng.Host;
|
||||
using MrGameEng.UI;
|
||||
|
||||
namespace LittleSim.Scenes;
|
||||
@@ -37,7 +38,7 @@ public sealed class MainMenuScene : Scene
|
||||
{
|
||||
if (!Context.Scenes.IsTransitioning)
|
||||
{
|
||||
Context.Scenes.Switch(scene, Transition.Fade(0.4f));
|
||||
Context.Scenes.Switch(scene, Transitions.Fade(0.4f));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@ using LittleSim.Content;
|
||||
using LittleSim.UI;
|
||||
using Microsoft.Xna.Framework.Input;
|
||||
using MrGameEng.Core;
|
||||
using MrGameEng.Host;
|
||||
using MrGameEng.Input;
|
||||
using MrGameEng.UI;
|
||||
using Myra.Graphics2D.UI;
|
||||
@@ -153,14 +154,14 @@ public sealed class NewWorldScene : Scene
|
||||
Seed = seed,
|
||||
SmoothPasses = _smoothing,
|
||||
};
|
||||
Context.Scenes.Switch(new WorldScene(config), Transition.Fade(0.6f));
|
||||
Context.Scenes.Switch(new WorldScene(config), Transitions.Fade(0.6f));
|
||||
}
|
||||
|
||||
private void Back()
|
||||
{
|
||||
if (!Context.Scenes.IsTransitioning)
|
||||
{
|
||||
Context.Scenes.Switch(new MainMenuScene(), Transition.Fade(0.4f));
|
||||
Context.Scenes.Switch(new MainMenuScene(), Transitions.Fade(0.4f));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@ using LittleSim.UI;
|
||||
using Microsoft.Xna.Framework;
|
||||
using MrGameEng.Audio;
|
||||
using MrGameEng.Core;
|
||||
using MrGameEng.Host;
|
||||
using Myra.Graphics2D.Brushes;
|
||||
using Myra.Graphics2D.UI;
|
||||
|
||||
|
||||
@@ -5,6 +5,7 @@ using Microsoft.Xna.Framework;
|
||||
using Microsoft.Xna.Framework.Input;
|
||||
using MrGameEng.Audio;
|
||||
using MrGameEng.Core;
|
||||
using MrGameEng.Host;
|
||||
using MrGameEng.Input;
|
||||
using MrGameEng.UI;
|
||||
using Myra.Graphics2D.UI;
|
||||
@@ -59,7 +60,7 @@ public sealed class SettingsScene : Scene
|
||||
{
|
||||
if (!Context.Scenes.IsTransitioning)
|
||||
{
|
||||
Context.Scenes.Switch(new MainMenuScene(), Transition.Fade(0.4f));
|
||||
Context.Scenes.Switch(new MainMenuScene(), Transitions.Fade(0.4f));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,6 +11,7 @@ using MrGameEng.Assets;
|
||||
using MrGameEng.Core;
|
||||
using MrGameEng.DevConsole;
|
||||
using MrGameEng.Graphics;
|
||||
using MrGameEng.Host;
|
||||
using MrGameEng.Input;
|
||||
using MrGameEng.Inspector;
|
||||
using MrGameEng.Lighting;
|
||||
@@ -63,7 +64,7 @@ public sealed class WorldScene : Scene
|
||||
var assets = Context.Services.GetOrDefault<AssetManager>() ?? Context.UseAssets();
|
||||
var content = Context.Services.Get<GameContent>();
|
||||
var atlases = Context.Services.Get<ModAtlases>();
|
||||
var device = Context.GraphicsDevice;
|
||||
var device = Context.GetGraphicsDevice();
|
||||
var input = this.UseInput();
|
||||
_speed = Context.Services.Get<GameSpeed>();
|
||||
_speed.SetStep(0); // новый мир/загрузка стартуют на x1
|
||||
@@ -277,7 +278,7 @@ public sealed class WorldScene : Scene
|
||||
if (!Context.Scenes.IsTransitioning)
|
||||
{
|
||||
_speed.Resume();
|
||||
Context.Scenes.Switch(scene, Transition.Fade(0.5f));
|
||||
Context.Scenes.Switch(scene, Transitions.Fade(0.5f));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -298,7 +299,7 @@ public sealed class WorldScene : Scene
|
||||
c.WriteLine($"regenerating world, seed {seed}");
|
||||
Context.Scenes.Switch(
|
||||
new WorldScene(_config with { Seed = seed }),
|
||||
Transition.Fade(0.6f)
|
||||
Transitions.Fade(0.6f)
|
||||
);
|
||||
}
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user