Files
YachtDice/Assets/Scripts/UI/Presentation/GameFlowPresenter.cs
T
2026-03-18 09:13:48 +07:00

256 lines
9.5 KiB
C#

using System;
using YachtDice.Categories;
using YachtDice.Economy;
using YachtDice.Game;
using YachtDice.Inventory;
using YachtDice.Player;
using YachtDice.Run;
using YachtDice.Shop;
namespace YachtDice.UI.Presentation
{
public sealed class GameFlowPresenter : IDisposable
{
private readonly GameLoopController _gameLoopController;
private readonly DiceManager _diceManager;
private readonly CurrencyBank _currencyBank;
private readonly ShopController _shopController;
private readonly InventoryController _inventoryController;
private readonly CategoryCatalog _categoryCatalog;
private readonly PlayerModel _playerModel;
private readonly IGameSaveService _saveService;
private readonly IScoreSummaryService _scoreSummaryService;
private readonly DicePanelPresenter _dicePanelPresenter;
private readonly ScoreCardPresenter _scoreCardPresenter;
private readonly GameInfoPresenter _gameInfoPresenter;
public GameFlowPresenter(
GameLoopController gameLoopController,
DiceManager diceManager,
CurrencyBank currencyBank,
ShopController shopController,
InventoryController inventoryController,
CategoryCatalog categoryCatalog,
PlayerModel playerModel,
IGameSaveService saveService,
IScoreSummaryService scoreSummaryService,
DicePanelPresenter dicePanelPresenter,
ScoreCardPresenter scoreCardPresenter,
GameInfoPresenter gameInfoPresenter)
{
_gameLoopController = gameLoopController;
_diceManager = diceManager;
_currencyBank = currencyBank;
_shopController = shopController;
_inventoryController = inventoryController;
_categoryCatalog = categoryCatalog;
_playerModel = playerModel;
_saveService = saveService;
_scoreSummaryService = scoreSummaryService;
_dicePanelPresenter = dicePanelPresenter;
_scoreCardPresenter = scoreCardPresenter;
_gameInfoPresenter = gameInfoPresenter;
}
public void Initialize()
{
_gameLoopController.OnTurnStarted += HandleTurnStarted;
_gameLoopController.OnRollComplete += HandleRollComplete;
_gameLoopController.OnScored += HandleScored;
_gameLoopController.OnGameOver += HandleGameOver;
_gameLoopController.OnBetStarted += HandleBetStarted;
_gameLoopController.OnShopOpened += HandleShopOpened;
_gameLoopController.OnShopClosed += HandleShopClosed;
_gameLoopController.OnStoredRollsChanged += HandleStoredRollsChanged;
_gameLoopController.OnQuotaChanged += HandleQuotaChanged;
_gameLoopController.OnCycleCompleted += HandleCycleCompleted;
_gameLoopController.OnPhaseChanged += HandlePhaseChanged;
_dicePanelPresenter.RollClicked += HandleRollClicked;
_dicePanelPresenter.DiceToggled += HandleDiceToggled;
_scoreCardPresenter.CategorySelected += HandleCategorySelected;
_gameInfoPresenter.NewGameClicked += HandleNewGameClicked;
_gameInfoPresenter.ShopClicked += HandleShopClicked;
_gameInfoPresenter.InventoryClicked += HandleInventoryClicked;
_currencyBank.OnBalanceChanged += HandleCurrencyChanged;
_playerModel.OnChanged += HandlePlayerChangedForSave;
_saveService.Load();
_gameInfoPresenter.SetCurrencyText(_currencyBank.Balance);
_gameInfoPresenter.SetShopButtonInteractable(false);
_gameLoopController.StartNewGame();
}
public void Dispose()
{
_gameLoopController.OnTurnStarted -= HandleTurnStarted;
_gameLoopController.OnRollComplete -= HandleRollComplete;
_gameLoopController.OnScored -= HandleScored;
_gameLoopController.OnGameOver -= HandleGameOver;
_gameLoopController.OnBetStarted -= HandleBetStarted;
_gameLoopController.OnShopOpened -= HandleShopOpened;
_gameLoopController.OnShopClosed -= HandleShopClosed;
_gameLoopController.OnStoredRollsChanged -= HandleStoredRollsChanged;
_gameLoopController.OnQuotaChanged -= HandleQuotaChanged;
_gameLoopController.OnCycleCompleted -= HandleCycleCompleted;
_gameLoopController.OnPhaseChanged -= HandlePhaseChanged;
_dicePanelPresenter.RollClicked -= HandleRollClicked;
_dicePanelPresenter.DiceToggled -= HandleDiceToggled;
_scoreCardPresenter.CategorySelected -= HandleCategorySelected;
_gameInfoPresenter.NewGameClicked -= HandleNewGameClicked;
_gameInfoPresenter.ShopClicked -= HandleShopClicked;
_gameInfoPresenter.InventoryClicked -= HandleInventoryClicked;
_currencyBank.OnBalanceChanged -= HandleCurrencyChanged;
if (_playerModel != null)
_playerModel.OnChanged -= HandlePlayerChangedForSave;
}
private void HandleTurnStarted(int turn)
{
UpdateRunInfoText();
_dicePanelPresenter.ResetForNewTurn();
_dicePanelPresenter.SetRollingEnabled(true);
_scoreCardPresenter.ClearAllPreviews();
}
private void HandleRollComplete(int rollNumber)
{
_dicePanelPresenter.HandleRollComplete(rollNumber);
_scoreCardPresenter.UpdatePreviewScores();
}
private void HandleScored(CategoryDefinition category, int finalScore)
{
_scoreCardPresenter.SetCategoryScored(category, finalScore);
_scoreCardPresenter.UpdateTotalDisplay(_scoreSummaryService.Calculate());
UpdateRunInfoText();
_saveService.Save();
}
private void HandleGameOver(int totalScore)
{
_dicePanelPresenter.HandleGameOver();
_scoreCardPresenter.SetAllInteractable(false);
_gameInfoPresenter.ShowGameOver(_scoreSummaryService.Calculate().DisplayTotal);
_shopController.Close();
_gameInfoPresenter.SetShopButtonInteractable(false);
_saveService.Save();
}
private void HandleRollClicked()
{
_dicePanelPresenter.PrepareForRoll();
_scoreCardPresenter.SetAllInteractable(false);
_gameLoopController.Roll();
}
private void HandleDiceToggled(int index)
{
_gameLoopController.ToggleDiceLock(index);
_dicePanelPresenter.SetDiceLocked(index, _diceManager.IsLocked(index));
}
private void HandleCategorySelected(CategoryDefinition category)
{
_gameLoopController.ScoreInCategory(category);
}
private void HandleNewGameClicked()
{
_gameInfoPresenter.HideGameOver();
_shopController.Close();
_gameInfoPresenter.SetShopButtonInteractable(false);
_scoreCardPresenter.ResetAll();
_dicePanelPresenter.ResetForNewGame();
_gameLoopController.StartNewGame();
}
private void HandleShopClicked()
{
if (!_gameLoopController.CanOpenShopManually())
return;
if (_shopController.IsOpen)
{
_shopController.Close();
_gameLoopController.CompleteShop();
}
else
{
_shopController.Open();
}
}
private void HandleInventoryClicked()
{
_inventoryController.ToggleVisibility();
}
private void HandleCurrencyChanged(int newBalance)
{
_gameInfoPresenter.SetCurrencyText(newBalance);
UpdateRunInfoText();
}
private void HandlePlayerChangedForSave()
{
_saveService.Save();
}
private void HandleBetStarted(int betIndex)
{
UpdateRunInfoText();
}
private void HandleShopOpened()
{
_shopController.Open();
_gameInfoPresenter.SetShopButtonInteractable(true);
_dicePanelPresenter.SetRollingEnabled(false);
UpdateRunInfoText();
}
private void HandleShopClosed()
{
_shopController.Close();
_gameInfoPresenter.SetShopButtonInteractable(false);
UpdateRunInfoText();
}
private void HandleStoredRollsChanged(int value)
{
UpdateRunInfoText();
}
private void HandleQuotaChanged(int value)
{
UpdateRunInfoText();
}
private void HandleCycleCompleted(int bonus, int storedRolls)
{
_scoreCardPresenter.ResetAll();
_scoreCardPresenter.UpdateTotalDisplay(_scoreSummaryService.Calculate());
UpdateRunInfoText();
}
private void HandlePhaseChanged(RunPhase phase)
{
if (phase != RunPhase.Shop)
_gameInfoPresenter.SetShopButtonInteractable(false);
UpdateRunInfoText();
}
private void UpdateRunInfoText()
{
var info = $"Bet {_gameLoopController.CurrentBet} | Stage {_gameLoopController.CurrentStage}/3 | Target {_gameLoopController.CurrentStageTarget} | Quota {_gameLoopController.CurrentBaseQuota} | Bank {_gameLoopController.StoredRolls}";
_gameInfoPresenter.SetRunInfoText(info);
}
}
}