using System;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using MrGameEng.Core;
namespace LittleSim.Web;
///
/// Веб-хост LittleSim поверх KNI (BlazorGL/WebGL) — браузерный аналог
/// MrGameEng.Host.GameHost: владеет EngineContext ядра, гонит GameClock и фазы сцены.
/// Цикл тикается из requestAnimationFrame (см. Pages/Index.razor.cs). Когда графика
/// движка научится собираться под KNI, этот класс переедет в MrGameEng.Host.Web.
///
public class LittleSimWebGame : Game
{
/// Контекст ядра движка, общий со сценами и системами.
public EngineContext Context { get; } = new EngineContext();
private GraphicsDeviceManager _graphics;
private SpriteBatch _spriteBatch = null!;
private Texture2D _pixel = null!;
private WorldViewScene _scene = null!;
/// Игра-наблюдатель: мира не создаёт, ждёт из UI.
public LittleSimWebGame()
{
_graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
}
/// Состояние соединения со сценой-наблюдателем — читает оверлей подключения.
public ConnectionStatus Status => _scene?.Status ?? ConnectionStatus.Idle;
/// Число реплицированных жителей — для статуса в оверлее.
public int EntityCount => _scene?.EntityCount ?? 0;
/// Подключиться к серверу (вызывается из Blazor-оверлея).
public void Connect(Uri server) => _scene?.Connect(server);
///
protected override void Initialize()
{
base.Initialize();
_scene = new WorldViewScene(() => _spriteBatch, () => _pixel);
Context.Scenes.Switch(_scene);
}
///
protected override void LoadContent()
{
_spriteBatch = new SpriteBatch(GraphicsDevice);
_pixel = new Texture2D(GraphicsDevice, 1, 1);
_pixel.SetData(new[] { Color.White });
}
///
protected override void Update(GameTime gameTime)
{
Context.Clock.Advance((float)gameTime.ElapsedGameTime.TotalSeconds);
Context.Scenes.Update(Context.Clock);
base.Update(gameTime);
}
///
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(new Color(12, 16, 24));
Context.Scenes.Draw(Context.Clock);
base.Draw(gameTime);
}
}