[Fix] UI Logic

This commit is contained in:
2026-06-06 22:33:15 +07:00
parent f4ecf8b6f9
commit fdb22e9213
134 changed files with 5367 additions and 269 deletions
@@ -0,0 +1,34 @@
using System;
using Minesweeper.Presentation.Presenters;
using VContainer.Unity;
namespace Minesweeper.Infrastructure
{
public sealed class MinesweeperEntryPoint : IStartable, IDisposable
{
private readonly MainMenuPresenter mainMenuPresenter;
private readonly TopPanelPresenter topPanelPresenter;
private readonly GamePresenter gamePresenter;
public MinesweeperEntryPoint(MainMenuPresenter mainMenuPresenter, TopPanelPresenter topPanelPresenter, GamePresenter gamePresenter)
{
this.mainMenuPresenter = mainMenuPresenter;
this.topPanelPresenter = topPanelPresenter;
this.gamePresenter = gamePresenter;
}
public void Start()
{
topPanelPresenter.Initialize();
mainMenuPresenter.Initialize();
gamePresenter.Initialize();
}
public void Dispose()
{
gamePresenter.Dispose();
mainMenuPresenter.Dispose();
topPanelPresenter.Dispose();
}
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 5eae713b4d801be4996a70d4b630eeee
@@ -0,0 +1,104 @@
using Minesweeper.Commands;
using Minesweeper.Config;
using Minesweeper.Core;
using Minesweeper.ECS;
using Minesweeper.Presentation.Adapters;
using Minesweeper.Presentation.Factories;
using Minesweeper.Presentation.Presenters;
using Minesweeper.Presentation.ReadModels;
using Minesweeper.Presentation.Views;
using UnityEngine;
using VContainer;
using VContainer.Unity;
namespace Minesweeper.Infrastructure
{
public sealed class MinesweeperLifetimeScope : LifetimeScope
{
[SerializeField] private MinesweeperGameConfig gameConfig;
[SerializeField] private MinesweeperUiConfig uiConfig;
[SerializeField] private TopPanelView topPanelView;
[SerializeField] private MainMenuView mainMenuView;
[SerializeField] private GameView gameView;
protected override void Configure(IContainerBuilder builder)
{
builder.RegisterInstance(GetConfig());
var resolvedUiConfig = GetUiConfig();
builder.RegisterInstance(resolvedUiConfig);
builder.Register<GameStateService>(Lifetime.Singleton).As<IGameStateService>();
builder.Register<BoardService>(Lifetime.Singleton).As<IBoardService>();
builder.Register<GamePauseService>(Lifetime.Singleton).As<IGamePauseService>();
builder.Register<GameTimerService>(Lifetime.Singleton).As<IGameTimerService>().As<ITickable>();
builder.Register<BoardEcsSyncService>(Lifetime.Singleton).As<IBoardEcsSyncService>();
builder.Register<GameReadModel>(Lifetime.Singleton).As<IGameReadModel>();
builder.Register<GameStateViewAdapter>(Lifetime.Singleton).As<IGameStateViewAdapter>();
builder.Register<CellViewFactory>(Lifetime.Singleton).As<ICellViewFactory>();
if (topPanelView != null)
{
topPanelView.BindConfig(resolvedUiConfig);
builder.RegisterComponent(topPanelView).As<ITopPanelView>();
}
else
{
builder.Register<NullTopPanelView>(Lifetime.Singleton).As<ITopPanelView>();
}
if (mainMenuView != null)
{
builder.RegisterComponent(mainMenuView).As<IMainMenuView>();
}
else
{
builder.Register<NullMainMenuView>(Lifetime.Singleton).As<IMainMenuView>();
}
if (gameView != null)
{
gameView.BindConfig(resolvedUiConfig);
builder.RegisterComponent(gameView).As<IGameView>();
}
else
{
builder.Register<NullGameView>(Lifetime.Singleton).As<IGameView>();
}
builder.Register<SelectFieldCommandHandler>(Lifetime.Singleton);
builder.Register<StartGameCommandHandler>(Lifetime.Singleton);
builder.Register<OpenCellCommandHandler>(Lifetime.Singleton);
builder.Register<ToggleFlagCommandHandler>(Lifetime.Singleton);
builder.Register<RestartCommandHandler>(Lifetime.Singleton);
builder.Register<PauseCommandHandler>(Lifetime.Singleton);
builder.Register<ResumeCommandHandler>(Lifetime.Singleton);
builder.Register<GoToMenuCommandHandler>(Lifetime.Singleton);
builder.Register<GameCommandDispatcher>(Lifetime.Singleton).As<IGameCommandDispatcher>();
builder.Register<RestartKeyInputService>(Lifetime.Singleton).As<ITickable>();
builder.Register<MainMenuPresenter>(Lifetime.Singleton);
builder.Register<TopPanelPresenter>(Lifetime.Singleton);
builder.Register<GamePresenter>(Lifetime.Singleton);
builder.RegisterEntryPoint<MinesweeperEntryPoint>();
}
private MinesweeperGameConfig GetConfig()
{
if (gameConfig != null)
{
return gameConfig;
}
return ScriptableObject.CreateInstance<MinesweeperGameConfig>();
}
private MinesweeperUiConfig GetUiConfig()
{
if (uiConfig != null)
{
return uiConfig;
}
return ScriptableObject.CreateInstance<MinesweeperUiConfig>();
}
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: d4f9b0c2ad803d84382fbf03ba3096fa
@@ -0,0 +1,50 @@
using Minesweeper.Commands;
using Minesweeper.Config;
using Minesweeper.Core;
using UnityEngine.InputSystem;
using VContainer.Unity;
namespace Minesweeper.Infrastructure
{
public sealed class RestartKeyInputService : ITickable
{
private readonly IGameCommandDispatcher commandDispatcher;
private readonly MinesweeperGameConfig config;
private readonly IGameStateService gameStateService;
public RestartKeyInputService(IGameCommandDispatcher commandDispatcher, MinesweeperGameConfig config, IGameStateService gameStateService)
{
this.commandDispatcher = commandDispatcher;
this.config = config;
this.gameStateService = gameStateService;
}
public void Tick()
{
var keyboard = Keyboard.current;
if (keyboard == null || !IsRestartPressed(keyboard))
{
return;
}
if (gameStateService.Current == GameState.FieldSelection)
{
commandDispatcher.Dispatch(new StartGameCommand());
}
else
{
commandDispatcher.Dispatch(new RestartCommand());
}
}
private bool IsRestartPressed(Keyboard keyboard)
{
if (config.RestartKey == UnityEngine.KeyCode.R)
{
return keyboard.rKey.wasPressedThisFrame;
}
return false;
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: c87c15d092dd420b85a09cc786496948
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: